From 0b27b6bec377ec40f7715569b47731501d9b4da1 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 1 Sep 2021 23:27:47 +0200 Subject: [PATCH] Mob API: Merge mobs_mc and mcl_mobs into one mod DO NOT USE IN PRODUCTION, DO NOT START OLD WORLDS WITHOUT A BACKUP These are the first steps of the new mob API. The game does actually start, but mobs do not work yet. You will also get some warnings about mob spawners, but don't worry about that. This is really just some 'first impression' of how the mob API is gonna look like. Some things are already complete, like the agression system. AI and attacking have not been worked on yet. mobs_mc and mcl_mobs have actually been merged into one piece but I will probably change that again in the future actually, and split the different mobs into different mods. There are also a few usefull things like the universal mount API and a more general purpose smoke API, but all of this is still far from complete. I'll put some work into the API this week but probably not next week, then I'll see but don't expect this to be done before 2022. I'll work on it, but I'll do it slowly and progressively to not get burned out again and to still have enough time to graduate from school in the meantime. --- mods/CORE/mcl_damage/init.lua | 10 +- mods/CORE/mcl_particles/init.lua | 96 +- .../textures/mcl_particles_blood.png} | Bin mods/CORE/mcl_sounds/README.txt | 2 + .../mcl_sounds}/sounds/attributes.txt | 0 .../mcl_sounds}/sounds/default_punch.1.ogg | Bin .../mcl_sounds}/sounds/default_punch.2.ogg | Bin .../mcl_sounds}/sounds/default_punch.3.ogg | Bin .../mcl_sounds/sounds/mcl_sounds_poof.ogg} | Bin mods/CORE/mcl_util/init.lua | 28 +- mods/ENTITIES/mcl_boats/init.lua | 110 +- mods/ENTITIES/mcl_burning/api.lua | 34 +- mods/ENTITIES/mcl_burning/init.lua | 34 + mods/ENTITIES/mcl_burning/mod.conf | 1 + .../mcl_mobs/{license.txt => LICENSE-API.txt} | 0 .../LICENSE-MEDIA.md} | 4 +- mods/ENTITIES/mcl_mobs/README.md | 33 + .../backup_code_api.lua => api.old.lua} | 0 mods/ENTITIES/mcl_mobs/api.txt | 4 +- mods/ENTITIES/mcl_mobs/api/ai/ai.lua | 29 + .../mcl_mobs/api/ai/attack/explode.lua | 74 ++ .../api/ai/attack/projectile_common.lua | 31 + .../mcl_mobs/api/ai/attack/projectile_fly.lua | 72 + .../api/ai/attack/projectile_land.lua | 52 + .../ENTITIES/mcl_mobs/api/ai/attack/punch.lua | 87 ++ mods/ENTITIES/mcl_mobs/api/ai/climb.lua | 22 + mods/ENTITIES/mcl_mobs/api/ai/float.lua | 13 + mods/ENTITIES/mcl_mobs/api/ai/fly.lua | 214 +++ mods/ENTITIES/mcl_mobs/api/ai/follow.lua | 31 + mods/ENTITIES/mcl_mobs/api/ai/jump.lua | 169 +++ mods/ENTITIES/mcl_mobs/api/ai/land.lua | 436 +++++++ mods/ENTITIES/mcl_mobs/api/ai/step_height.lua | 9 + mods/ENTITIES/mcl_mobs/api/ai/swim.lua | 206 +++ mods/ENTITIES/mcl_mobs/api/anger.lua | 205 +++ mods/ENTITIES/mcl_mobs/api/api.lua | 761 ----------- mods/ENTITIES/mcl_mobs/api/arrow.lua | 158 +++ mods/ENTITIES/mcl_mobs/api/baby.lua | 26 + mods/ENTITIES/mcl_mobs/api/breeding.lua | 27 + mods/ENTITIES/mcl_mobs/api/common.lua | 115 ++ mods/ENTITIES/mcl_mobs/api/damage.lua | 80 ++ mods/ENTITIES/mcl_mobs/api/data.lua | 57 + mods/ENTITIES/mcl_mobs/api/death.lua | 49 + mods/ENTITIES/mcl_mobs/api/despawn.lua | 24 + mods/ENTITIES/mcl_mobs/api/easteregg.lua | 34 + mods/ENTITIES/mcl_mobs/api/eggs.lua | 110 ++ mods/ENTITIES/mcl_mobs/api/env/breath.lua | 22 + mods/ENTITIES/mcl_mobs/api/env/collision.lua | 65 + mods/ENTITIES/mcl_mobs/api/env/env.lua | 23 + .../ENTITIES/mcl_mobs/api/env/fall_damage.lua | 8 + mods/ENTITIES/mcl_mobs/api/env/sunlight.lua | 15 + .../mcl_mobs/api/graphics/animation.lua | 64 + .../mcl_mobs/api/graphics/collisionbox.lua | 21 + .../mcl_mobs/api/graphics/eye_height.lua | 9 + .../head_logic.lua => graphics/head.lua} | 19 +- mods/ENTITIES/mcl_mobs/api/graphics/mesh.lua | 6 + .../mcl_mobs/api/graphics/nametag.lua | 7 + .../mcl_mobs/api/graphics/rotation.lua | 110 ++ .../mcl_mobs/api/graphics/textures.lua | 17 + .../mcl_mobs/api/graphics/visual_size.lua | 21 + mods/ENTITIES/mcl_mobs/api/interaction.lua | 59 + mods/ENTITIES/mcl_mobs/api/knockback.lua | 35 + mods/ENTITIES/mcl_mobs/api/loot.lua | 62 + mods/ENTITIES/mcl_mobs/api/main.lua | 60 + .../mcl_mobs/api/mob_functions/ai.lua | 1153 ----------------- .../mcl_mobs/api/mob_functions/animation.lua | 259 ---- .../attack_type_instructions.lua | 351 ----- .../mcl_mobs/api/mob_functions/breeding.lua | 184 --- .../mcl_mobs/api/mob_functions/collision.lua | 140 -- .../api/mob_functions/death_logic.lua | 160 --- .../api/mob_functions/environment.lua | 260 ---- .../api/mob_functions/interaction.lua | 291 ----- .../api/mob_functions/mob_effects.lua | 152 --- .../mcl_mobs/api/mob_functions/movement.lua | 391 ------ .../api/mob_functions/projectile_handling.lua | 44 - .../mcl_mobs/api/mob_functions/set_up.lua | 226 ---- .../api/mob_functions/sound_handling.lua | 59 - mods/ENTITIES/mcl_mobs/api/mount.lua | 194 +-- mods/ENTITIES/mcl_mobs/api/movement.lua | 57 + mods/ENTITIES/mcl_mobs/api/properties.lua | 8 + mods/ENTITIES/mcl_mobs/api/register.lua | 84 ++ mods/ENTITIES/mcl_mobs/api/sound.lua | 32 + .../mcl_mobs/api/{spawning.lua => spawn.lua} | 109 +- .../3_shared.lua => mcl_mobs/api/taming.lua} | 9 +- mods/ENTITIES/mcl_mobs/api/util.lua | 114 ++ mods/ENTITIES/mcl_mobs/api_files.txt | 51 + mods/ENTITIES/mcl_mobs/crafts.lua | 16 - mods/ENTITIES/mcl_mobs/init.lua | 59 +- mods/ENTITIES/mcl_mobs/locale/mcl_mobs.de.tr | 70 +- mods/ENTITIES/mcl_mobs/locale/mcl_mobs.es.tr | 68 +- mods/ENTITIES/mcl_mobs/locale/mcl_mobs.fr.tr | 70 +- mods/ENTITIES/mcl_mobs/locale/mcl_mobs.ru.tr | 70 +- mods/ENTITIES/mcl_mobs/locale/template.txt | 69 +- .../mobs/0_gameconfig.lua} | 196 ++- .../{mobs_mc => mcl_mobs/mobs}/2_throwing.lua | 8 +- .../{mobs_mc => mcl_mobs/mobs}/bat.lua | 29 +- .../{mobs_mc => mcl_mobs/mobs}/blaze.lua | 79 +- .../{mobs_mc => mcl_mobs/mobs}/chicken.lua | 0 .../mobs/cow.lua} | 0 .../{mobs_mc => mcl_mobs/mobs}/creeper.lua | 155 +-- .../mobs/elder_guardian.lua} | 0 .../mobs}/ender_dragon.lua | 0 .../{mobs_mc => mcl_mobs/mobs}/enderman.lua | 2 +- .../{mobs_mc => mcl_mobs/mobs}/endermite.lua | 0 .../mobs/evoker.lua} | 0 .../{mobs_mc => mcl_mobs/mobs}/gameconfig.md | 0 .../{mobs_mc => mcl_mobs/mobs}/ghast.lua | 6 +- .../{mobs_mc => mcl_mobs/mobs}/guardian.lua | 0 .../{mobs_mc => mcl_mobs/mobs}/horse.lua | 1 - .../mobs/illusioner.lua} | 0 .../{mobs_mc => mcl_mobs/mobs}/init.lua | 43 - .../{mobs_mc => mcl_mobs/mobs}/iron_golem.lua | 0 .../{mobs_mc => mcl_mobs/mobs}/llama.lua | 9 +- .../{mobs_mc => mcl_mobs/mobs}/ocelot.lua | 0 .../{mobs_mc => mcl_mobs/mobs}/parrot.lua | 1 - .../{mobs_mc => mcl_mobs/mobs}/pig.lua | 3 +- .../{mobs_mc => mcl_mobs/mobs}/polar_bear.lua | 0 .../{mobs_mc => mcl_mobs/mobs}/rabbit.lua | 2 +- .../{mobs_mc => mcl_mobs/mobs}/sheep.lua | 61 +- .../{mobs_mc => mcl_mobs/mobs}/shulker.lua | 2 +- .../{mobs_mc => mcl_mobs/mobs}/silverfish.lua | 0 .../mobs/skeleton.lua} | 2 +- .../mobs/slime.lua} | 8 +- .../{mobs_mc => mcl_mobs/mobs}/snowman.lua | 0 .../{mobs_mc => mcl_mobs/mobs}/spider.lua | 0 .../{mobs_mc => mcl_mobs/mobs}/squid.lua | 1 - .../{mobs_mc => mcl_mobs/mobs}/vex.lua | 0 .../{mobs_mc => mcl_mobs/mobs}/villager.lua | 0 .../mobs/vindicator.lua} | 0 .../{mobs_mc => mcl_mobs/mobs}/witch.lua | 0 .../{mobs_mc => mcl_mobs/mobs}/wither.lua | 3 +- .../mobs/wither_skeleton.lua} | 2 +- .../{mobs_mc => mcl_mobs/mobs}/wolf.lua | 0 .../{mobs_mc => mcl_mobs/mobs}/zombie.lua | 10 +- .../mobs/zombie_pigman.lua} | 2 +- .../mobs/zombie_villager.lua} | 14 +- mods/ENTITIES/mcl_mobs/mod.conf | 8 +- .../models/attributes.txt | 0 .../models/mcl_mobs_bat.b3d} | Bin .../models/mcl_mobs_blaze.b3d} | Bin .../models/mcl_mobs_cat.b3d} | Bin .../models/mcl_mobs_chicken.b3d} | Bin .../models/mcl_mobs_cow.b3d} | Bin .../models/mcl_mobs_creeper.b3d} | Bin .../models/mcl_mobs_dragon.b3d} | Bin .../models/mcl_mobs_enderman.b3d} | Bin .../models/mcl_mobs_endermite.b3d} | Bin .../models/mcl_mobs_evoker.b3d} | Bin .../models/mcl_mobs_ghast.b3d} | Bin .../models/mcl_mobs_guardian.b3d} | Bin .../models/mcl_mobs_horse.b3d} | Bin .../models/mcl_mobs_illusioner.b3d} | Bin .../models/mcl_mobs_iron_golem.b3d} | Bin .../models/mcl_mobs_llama.b3d} | Bin .../models/mcl_mobs_magmacube.b3d} | Bin .../models/mcl_mobs_mooshroom.b3d} | Bin .../models/mcl_mobs_parrot.b3d} | Bin .../models/mcl_mobs_pig.b3d} | Bin .../models/mcl_mobs_polarbear.b3d} | Bin .../models/mcl_mobs_rabbit.b3d} | Bin .../models/mcl_mobs_sheepfur.b3d} | Bin .../models/mcl_mobs_shulker.b3d} | Bin .../models/mcl_mobs_silverfish.b3d} | Bin .../models/mcl_mobs_skeleton.b3d} | Bin .../models/mcl_mobs_slime.b3d} | Bin .../models/mcl_mobs_snowman.b3d} | Bin .../models/mcl_mobs_spider.b3d} | Bin .../models/mcl_mobs_squid.b3d} | Bin .../models/mcl_mobs_stray.b3d} | Bin .../models/mcl_mobs_vex.b3d} | Bin .../models/mcl_mobs_villager.b3d} | Bin .../models/mcl_mobs_villager_zombie.b3d} | Bin .../models/mcl_mobs_vindicator.b3d} | Bin .../models/mcl_mobs_witch.b3d} | Bin .../models/mcl_mobs_wither.b3d} | Bin .../models/mcl_mobs_witherskeleton.b3d} | Bin .../models/mcl_mobs_wolf.b3d} | Bin .../models/mcl_mobs_zombie.b3d} | Bin .../models/mcl_mobs_zombie_pigman.b3d} | Bin mods/ENTITIES/mcl_mobs/readme.MD | 74 -- .../sounds/mcl_mobs_animal_eat_generic.ogg} | Bin .../sounds/mcl_mobs_bat_death.ogg} | Bin .../sounds/mcl_mobs_bat_hurt.1.ogg} | Bin .../sounds/mcl_mobs_bat_hurt.2.ogg} | Bin .../sounds/mcl_mobs_bat_hurt.3.ogg} | Bin .../sounds/mcl_mobs_bat_idle.ogg} | Bin .../sounds/mcl_mobs_bear_attack.1.ogg} | Bin .../sounds/mcl_mobs_bear_attack.2.ogg} | Bin .../sounds/mcl_mobs_bear_death.1.ogg} | Bin .../sounds/mcl_mobs_bear_growl.1.ogg} | Bin .../sounds/mcl_mobs_bear_growl.2.ogg} | Bin .../sounds/mcl_mobs_bear_growl.3.ogg} | Bin .../sounds/mcl_mobs_bear_hurt.1.ogg} | Bin .../sounds/mcl_mobs_bear_random.1.ogg} | Bin .../sounds/mcl_mobs_bear_random.2.ogg} | Bin .../sounds/mcl_mobs_bear_random.3.ogg} | Bin .../sounds/mcl_mobs_blaze_breath.ogg} | Bin .../sounds/mcl_mobs_blaze_died.ogg} | Bin .../sounds/mcl_mobs_blaze_hurt.ogg} | Bin .../sounds/mcl_mobs_cat_hiss.ogg} | Bin .../sounds/mcl_mobs_cat_idle.1.ogg} | Bin .../sounds/mcl_mobs_cat_idle.2.ogg} | Bin .../sounds/mcl_mobs_chicken_buck.1.ogg} | Bin .../sounds/mcl_mobs_chicken_buck.2.ogg} | Bin .../sounds/mcl_mobs_chicken_buck.3.ogg} | Bin .../sounds/mcl_mobs_chicken_child.ogg} | Bin .../sounds/mcl_mobs_chicken_hurt.ogg} | Bin .../sounds/mcl_mobs_chicken_lay_egg.ogg} | Bin .../sounds/mcl_mobs_cow.ogg} | Bin .../sounds/mcl_mobs_cow_hurt.ogg} | Bin .../sounds/mcl_mobs_cow_milk.ogg} | Bin .../sounds/mcl_mobs_cow_mushroom_stew.ogg} | Bin .../sounds/mcl_mobs_creeper_death.ogg} | Bin .../sounds/mcl_mobs_creeper_hurt.ogg} | Bin .../sounds/mcl_mobs_donkey_death.ogg} | Bin .../sounds/mcl_mobs_donkey_hurt.ogg} | Bin .../sounds/mcl_mobs_donkey_random.1.ogg} | Bin .../sounds/mcl_mobs_donkey_random.2.ogg} | Bin .../sounds/mcl_mobs_ender_dragon_attack.ogg} | Bin .../sounds/mcl_mobs_ender_dragon_shoot.ogg} | Bin .../sounds/mcl_mobs_enderman.ogg} | Bin .../sounds/mcl_mobs_enderman_death.ogg} | Bin .../sounds/mcl_mobs_enderman_hurt.1.ogg} | Bin .../sounds/mcl_mobs_enderman_hurt.2.ogg} | Bin .../sounds/mcl_mobs_enderman_hurt.3.ogg} | Bin .../sounds/mcl_mobs_enderman_random.1.ogg} | Bin .../mcl_mobs_enderman_teleport_dst.ogg} | Bin .../mcl_mobs_enderman_teleport_src.ogg} | Bin .../sounds/mcl_mobs_endermite_death.1.ogg} | Bin .../sounds/mcl_mobs_endermite_death.2.ogg} | Bin .../sounds/mcl_mobs_endermite_hurt.1.ogg} | Bin .../sounds/mcl_mobs_endermite_hurt.2.ogg} | Bin .../sounds/mcl_mobs_endermite_hurt.3.ogg} | Bin .../sounds/mcl_mobs_endermite_random.1.ogg} | Bin .../sounds/mcl_mobs_fireball.ogg} | Bin .../sounds/mcl_mobs_ghast.ogg} | Bin .../sounds/mcl_mobs_guardian_death.ogg} | Bin .../sounds/mcl_mobs_guardian_hurt.1.ogg} | Bin .../sounds/mcl_mobs_guardian_hurt.2.ogg} | Bin .../sounds/mcl_mobs_guardian_random.1.ogg} | Bin .../sounds/mcl_mobs_guardian_random.2.ogg} | Bin .../sounds/mcl_mobs_guardian_random.3.ogg} | Bin .../sounds/mcl_mobs_horse_death.ogg} | Bin .../sounds/mcl_mobs_horse_hurt.ogg} | Bin .../sounds/mcl_mobs_horse_random.1.ogg} | Bin .../sounds/mcl_mobs_horse_random.2.ogg} | Bin .../sounds/mcl_mobs_llama.ogg} | Bin .../sounds/mcl_mobs_magma_cube_attack.ogg} | Bin .../sounds/mcl_mobs_magma_cube_big.ogg} | Bin .../sounds/mcl_mobs_magma_cube_small.ogg} | Bin .../sounds/mcl_mobs_ocelot_hurt.ogg} | Bin .../sounds/mcl_mobs_parrot_death.ogg} | Bin .../sounds/mcl_mobs_parrot_hurt.ogg} | Bin .../sounds/mcl_mobs_parrot_random.1.ogg} | Bin .../sounds/mcl_mobs_parrot_random.2.ogg} | Bin .../sounds/mcl_mobs_pig.ogg} | Bin .../sounds/mcl_mobs_pig_angry.ogg} | Bin .../sounds/mcl_mobs_rabbit_attack.1.ogg} | Bin .../sounds/mcl_mobs_rabbit_attack.2.ogg} | Bin .../sounds/mcl_mobs_rabbit_death.1.ogg} | Bin .../sounds/mcl_mobs_rabbit_death.2.ogg} | Bin .../sounds/mcl_mobs_rabbit_death.3.ogg} | Bin .../sounds/mcl_mobs_rabbit_hurt.1.ogg} | Bin .../sounds/mcl_mobs_rabbit_hurt.2.ogg} | Bin .../sounds/mcl_mobs_rabbit_hurt.3.ogg} | Bin .../sounds/mcl_mobs_rabbit_random.1.ogg} | Bin .../sounds/mcl_mobs_rabbit_random.2.ogg} | Bin .../sounds/mcl_mobs_rabbit_random.3.ogg} | Bin .../sounds/mcl_mobs_rabbit_random.4.ogg} | Bin .../sounds/mcl_mobs_sheep.ogg} | Bin .../sounds/mcl_mobs_silverfish_death.ogg} | Bin .../sounds/mcl_mobs_silverfish_hurt.ogg} | Bin .../sounds/mcl_mobs_silverfish_idle.ogg} | Bin .../sounds/mcl_mobs_skeleton_death.ogg} | Bin .../sounds/mcl_mobs_skeleton_hurt.ogg} | Bin .../sounds/mcl_mobs_skeleton_random.1.ogg} | Bin .../sounds/mcl_mobs_skeleton_random.2.ogg} | Bin .../sounds/mcl_mobs_slime_attack.ogg} | Bin .../sounds/mcl_mobs_slime_damage.ogg} | Bin .../sounds/mcl_mobs_slime_death.ogg} | Bin .../sounds/mcl_mobs_slime_jump.ogg} | Bin .../sounds/mcl_mobs_slime_land.ogg} | Bin .../sounds/mcl_mobs_snowman_death.1.ogg} | Bin .../sounds/mcl_mobs_snowman_death.2.ogg} | Bin .../sounds/mcl_mobs_snowman_death.3.ogg} | Bin .../sounds/mcl_mobs_snowman_hurt.1.ogg} | Bin .../sounds/mcl_mobs_snowman_hurt.2.ogg} | Bin .../sounds/mcl_mobs_snowman_hurt.3.ogg} | Bin .../sounds/mcl_mobs_spider.ogg} | Bin .../sounds/mcl_mobs_spider_attack.1.ogg} | Bin .../sounds/mcl_mobs_spider_attack.2.ogg} | Bin .../sounds/mcl_mobs_spider_death.ogg} | Bin .../sounds/mcl_mobs_spider_hurt.1.ogg} | Bin .../sounds/mcl_mobs_spider_hurt.2.ogg} | Bin .../sounds/mcl_mobs_spider_hurt.3.ogg} | Bin .../sounds/mcl_mobs_spider_random.ogg} | Bin .../sounds/mcl_mobs_squid_death.1.ogg} | Bin .../sounds/mcl_mobs_squid_flop.1.ogg} | Bin .../sounds/mcl_mobs_squid_flop.2.ogg} | Bin .../sounds/mcl_mobs_squid_flop.3.ogg} | Bin .../sounds/mcl_mobs_squid_flop.4.ogg} | Bin .../sounds/mcl_mobs_squid_hurt.1.ogg} | Bin .../sounds/mcl_mobs_squid_hurt.2.ogg} | Bin .../sounds/mcl_mobs_vex_death.ogg} | Bin .../sounds/mcl_mobs_vex_hurt.ogg} | Bin .../sounds/mcl_mobs_villager.1.ogg} | Bin .../sounds/mcl_mobs_villager.2.ogg} | Bin .../sounds/mcl_mobs_villager.3.ogg} | Bin .../sounds/mcl_mobs_villager.4.ogg} | Bin .../sounds/mcl_mobs_villager.5.ogg} | Bin .../sounds/mcl_mobs_villager.6.ogg} | Bin .../sounds/mcl_mobs_villager_hurt.1.ogg} | Bin .../sounds/mcl_mobs_wither_spawn.ogg} | Bin .../sounds/mcl_mobs_wolf_bark.1.ogg} | Bin .../sounds/mcl_mobs_wolf_bark.2.ogg} | Bin .../sounds/mcl_mobs_wolf_bark.3.ogg} | Bin .../sounds/mcl_mobs_wolf_death.ogg} | Bin .../sounds/mcl_mobs_wolf_growl.ogg} | Bin .../sounds/mcl_mobs_wolf_hurt.1.ogg} | Bin .../sounds/mcl_mobs_wolf_hurt.2.ogg} | Bin .../sounds/mcl_mobs_wolf_hurt.3.ogg} | Bin .../sounds/mcl_mobs_wolf_take_bone.ogg} | Bin .../sounds/mcl_mobs_zombie_death.ogg} | Bin .../sounds/mcl_mobs_zombie_growl.ogg} | Bin .../sounds/mcl_mobs_zombie_hurt.ogg} | Bin .../sounds/mcl_mobs_zombiepig_death.1.ogg} | Bin .../sounds/mcl_mobs_zombiepig_death.2.ogg} | Bin .../sounds/mcl_mobs_zombiepig_hurt.1.ogg} | Bin .../sounds/mcl_mobs_zombiepig_hurt.2.ogg} | Bin .../sounds/mcl_mobs_zombiepig_hurt.3.ogg} | Bin .../sounds/mcl_mobs_zombiepig_random.1.ogg} | Bin .../sounds/mcl_mobs_zombiepig_war_cry.1.ogg} | Bin .../mcl_mobs_TEMP_wither_projectile.png} | Bin .../textures/mcl_mobs_bat.png} | Bin .../textures/mcl_mobs_blaze.png} | Bin .../textures/mcl_mobs_cat_black.png} | Bin .../textures/mcl_mobs_cat_ocelot.png} | Bin .../textures/mcl_mobs_cat_red.png} | Bin .../textures/mcl_mobs_cat_siamese.png} | Bin .../textures/mcl_mobs_cave_spider.png} | Bin .../textures/mcl_mobs_chicken.png} | Bin .../textures/mcl_mobs_chicken_egg.png} | Bin .../textures/mcl_mobs_cow.png} | Bin .../textures/mcl_mobs_creeper.png} | Bin .../textures/mcl_mobs_creeper_charge.png} | Bin .../textures/mcl_mobs_donkey.png} | Bin .../textures/mcl_mobs_dragon.png} | Bin .../textures/mcl_mobs_dragon_fireball.png} | Bin .../textures/mcl_mobs_endergolem.png} | Bin .../textures/mcl_mobs_enderman.png} | Bin .../textures/mcl_mobs_enderman_block.png} | Bin .../mcl_mobs_enderman_cactus_background.png} | Bin .../textures/mcl_mobs_enderman_eyes.png} | Bin .../textures/mcl_mobs_endermite.png} | Bin .../textures/mcl_mobs_evoker.png} | Bin .../textures/mcl_mobs_ghast.png} | Bin .../textures/mcl_mobs_ghast_firing.png} | Bin .../textures/mcl_mobs_guardian.png} | Bin .../textures/mcl_mobs_guardian_elder.png} | Bin .../mcl_mobs_horse_armor_diamond.png} | Bin .../textures/mcl_mobs_horse_armor_gold.png} | Bin .../textures/mcl_mobs_horse_armor_iron.png} | Bin .../textures/mcl_mobs_horse_black.png} | Bin .../textures/mcl_mobs_horse_brown.png} | Bin .../textures/mcl_mobs_horse_chestnut.png} | Bin .../textures/mcl_mobs_horse_creamy.png} | Bin .../textures/mcl_mobs_horse_darkbrown.png} | Bin .../textures/mcl_mobs_horse_gray.png} | Bin .../mcl_mobs_horse_markings_blackdots.png} | Bin .../mcl_mobs_horse_markings_white.png} | Bin .../mcl_mobs_horse_markings_whitedots.png} | Bin .../mcl_mobs_horse_markings_whitefield.png} | Bin .../textures/mcl_mobs_horse_skeleton.png} | Bin .../textures/mcl_mobs_horse_white.png} | Bin .../textures/mcl_mobs_husk.png} | Bin .../textures/mcl_mobs_illusionist.png} | Bin .../textures/mcl_mobs_iron_golem.png} | Bin .../textures/mcl_mobs_llama.png} | Bin .../textures/mcl_mobs_llama_brown.png} | Bin .../textures/mcl_mobs_llama_chest.png} | Bin .../textures/mcl_mobs_llama_creamy.png} | Bin .../textures/mcl_mobs_llama_decor_black.png} | Bin .../textures/mcl_mobs_llama_decor_blue.png} | Bin .../textures/mcl_mobs_llama_decor_brown.png} | Bin .../textures/mcl_mobs_llama_decor_cyan.png} | Bin .../textures/mcl_mobs_llama_decor_gray.png} | Bin .../textures/mcl_mobs_llama_decor_green.png} | Bin .../mcl_mobs_llama_decor_light_blue.png} | Bin .../mcl_mobs_llama_decor_light_gray.png} | Bin .../textures/mcl_mobs_llama_decor_lime.png} | Bin .../mcl_mobs_llama_decor_magenta.png} | Bin .../textures/mcl_mobs_llama_decor_orange.png} | Bin .../textures/mcl_mobs_llama_decor_pink.png} | Bin .../textures/mcl_mobs_llama_decor_purple.png} | Bin .../textures/mcl_mobs_llama_decor_red.png} | Bin .../textures/mcl_mobs_llama_decor_white.png} | Bin .../textures/mcl_mobs_llama_decor_yellow.png} | Bin .../textures/mcl_mobs_llama_gray.png} | Bin .../textures/mcl_mobs_llama_white.png} | Bin .../textures/mcl_mobs_magmacube.png} | Bin .../textures/mcl_mobs_mooshroom.png} | Bin .../textures/mcl_mobs_mooshroom_brown.png} | Bin .../textures/mcl_mobs_mule.png} | Bin .../textures/mcl_mobs_mushroom_brown.png} | Bin .../textures/mcl_mobs_mushroom_red.png} | Bin .../textures/mcl_mobs_parrot_blue.png} | Bin .../textures/mcl_mobs_parrot_green.png} | Bin .../textures/mcl_mobs_parrot_grey.png} | Bin .../textures/mcl_mobs_parrot_red_blue.png} | Bin .../textures/mcl_mobs_parrot_yellow_blue.png} | Bin .../textures/mcl_mobs_pig.png} | Bin .../textures/mcl_mobs_pig_saddle.png} | Bin .../textures/mcl_mobs_polarbear.png} | Bin .../textures/mcl_mobs_rabbit_black.png} | Bin .../textures/mcl_mobs_rabbit_brown.png} | Bin .../textures/mcl_mobs_rabbit_caerbannog.png} | Bin .../textures/mcl_mobs_rabbit_gold.png} | Bin .../textures/mcl_mobs_rabbit_salt.png} | Bin .../textures/mcl_mobs_rabbit_toast.png} | Bin .../textures/mcl_mobs_rabbit_white.png} | Bin .../mcl_mobs_rabbit_white_splotched.png} | Bin .../textures/mcl_mobs_sheep.png} | Bin .../textures/mcl_mobs_sheep_fur.png} | Bin .../textures/mcl_mobs_shulker_black.png} | Bin .../textures/mcl_mobs_shulker_blue.png} | Bin .../textures/mcl_mobs_shulker_brown.png} | Bin .../textures/mcl_mobs_shulker_cyan.png} | Bin .../textures/mcl_mobs_shulker_gray.png} | Bin .../textures/mcl_mobs_shulker_green.png} | Bin .../textures/mcl_mobs_shulker_light_blue.png} | Bin .../textures/mcl_mobs_shulker_lime.png} | Bin .../textures/mcl_mobs_shulker_magenta.png} | Bin .../textures/mcl_mobs_shulker_orange.png} | Bin .../textures/mcl_mobs_shulker_pink.png} | Bin .../textures/mcl_mobs_shulker_purple.png} | Bin .../textures/mcl_mobs_shulker_red.png} | Bin .../textures/mcl_mobs_shulker_silver.png} | Bin .../textures/mcl_mobs_shulker_white.png} | Bin .../textures/mcl_mobs_shulker_yellow.png} | Bin .../textures/mcl_mobs_shulkerbullet.png} | Bin .../textures/mcl_mobs_silverfish.png} | Bin .../textures/mcl_mobs_skeleton.png} | Bin .../textures/mcl_mobs_slime.png} | Bin .../textures/mcl_mobs_snowman.png} | Bin .../textures/mcl_mobs_spawn_icon_bat.png} | Bin .../textures/mcl_mobs_spawn_icon_blaze.png} | Bin .../textures/mcl_mobs_spawn_icon_cat.png} | Bin .../mcl_mobs_spawn_icon_cave_spider.png} | Bin .../textures/mcl_mobs_spawn_icon_chicken.png} | Bin .../textures/mcl_mobs_spawn_icon_cow.png} | Bin .../textures/mcl_mobs_spawn_icon_creeper.png} | Bin .../textures/mcl_mobs_spawn_icon_donkey.png} | Bin .../textures/mcl_mobs_spawn_icon_dragon.png} | Bin .../mcl_mobs_spawn_icon_enderman.png} | Bin .../mcl_mobs_spawn_icon_endermite.png} | Bin .../textures/mcl_mobs_spawn_icon_evoker.png} | Bin .../textures/mcl_mobs_spawn_icon_ghast.png} | Bin .../mcl_mobs_spawn_icon_guardian.png} | Bin .../mcl_mobs_spawn_icon_guardian_elder.png} | Bin .../textures/mcl_mobs_spawn_icon_horse.png} | Bin .../mcl_mobs_spawn_icon_horse_skeleton.png} | Bin .../mcl_mobs_spawn_icon_horse_zombie.png} | Bin .../textures/mcl_mobs_spawn_icon_husk.png} | Bin .../mcl_mobs_spawn_icon_illusioner.png} | Bin .../mcl_mobs_spawn_icon_iron_golem.png} | Bin .../textures/mcl_mobs_spawn_icon_llama.png} | Bin .../mcl_mobs_spawn_icon_magmacube.png} | Bin .../mcl_mobs_spawn_icon_mooshroom.png} | Bin .../textures/mcl_mobs_spawn_icon_mule.png} | Bin .../textures/mcl_mobs_spawn_icon_parrot.png} | Bin .../textures/mcl_mobs_spawn_icon_pig.png} | Bin .../mcl_mobs_spawn_icon_polarbear.png} | Bin .../textures/mcl_mobs_spawn_icon_rabbit.png} | Bin .../textures/mcl_mobs_spawn_icon_sheep.png} | Bin .../textures/mcl_mobs_spawn_icon_shulker.png} | Bin .../mcl_mobs_spawn_icon_silverfish.png} | Bin .../mcl_mobs_spawn_icon_skeleton.png} | Bin .../textures/mcl_mobs_spawn_icon_slime.png} | Bin .../textures/mcl_mobs_spawn_icon_snowman.png} | Bin .../textures/mcl_mobs_spawn_icon_spider.png} | Bin .../textures/mcl_mobs_spawn_icon_squid.png} | Bin .../textures/mcl_mobs_spawn_icon_stray.png} | Bin .../textures/mcl_mobs_spawn_icon_vex.png} | Bin .../mcl_mobs_spawn_icon_villager.png} | Bin .../mcl_mobs_spawn_icon_vindicator.png} | Bin .../textures/mcl_mobs_spawn_icon_witch.png} | Bin .../textures/mcl_mobs_spawn_icon_wither.png} | Bin .../mcl_mobs_spawn_icon_witherskeleton.png} | Bin .../textures/mcl_mobs_spawn_icon_wolf.png} | Bin .../textures/mcl_mobs_spawn_icon_zombie.png} | Bin .../mcl_mobs_spawn_icon_zombie_pigman.png} | Bin .../mcl_mobs_spawn_icon_zombie_villager.png} | Bin .../textures/mcl_mobs_spider.png} | Bin .../textures/mcl_mobs_spider_eyes.png} | Bin .../textures/mcl_mobs_spit.png} | Bin .../textures/mcl_mobs_squid.png} | Bin .../textures/mcl_mobs_stray.png} | Bin .../textures/mcl_mobs_stray_overlay.png} | Bin .../mcl_mobs_trading_formspec_bg.png} | Bin .../mcl_mobs_trading_formspec_disabled.png} | Bin .../textures/mcl_mobs_vex.png} | Bin .../textures/mcl_mobs_vex_charging.png} | Bin .../textures/mcl_mobs_villager.png} | Bin .../textures/mcl_mobs_villager_butcher.png} | Bin .../textures/mcl_mobs_villager_farmer.png} | Bin .../textures/mcl_mobs_villager_librarian.png} | Bin .../textures/mcl_mobs_villager_priest.png} | Bin .../textures/mcl_mobs_villager_smith.png} | Bin .../textures/mcl_mobs_vindicator.png} | Bin .../textures/mcl_mobs_witch.png} | Bin .../textures/mcl_mobs_wither.png} | Bin .../textures/mcl_mobs_wither_half_health.png} | Bin .../textures/mcl_mobs_wither_skeleton.png} | Bin .../textures/mcl_mobs_wolf.png} | Bin .../textures/mcl_mobs_wolf_angry.png} | Bin .../textures/mcl_mobs_wolf_collar.png} | Bin .../textures/mcl_mobs_wolf_icon_roam.png} | Bin .../textures/mcl_mobs_wolf_icon_sit.png} | Bin .../textures/mcl_mobs_wolf_tame.png} | Bin .../textures/mcl_mobs_zombie.png} | Bin .../textures/mcl_mobs_zombie_butcher.png} | Bin .../textures/mcl_mobs_zombie_farmer.png} | Bin .../textures/mcl_mobs_zombie_hearteyes.png | Bin 0 -> 10354 bytes .../textures/mcl_mobs_zombie_librarian.png} | Bin .../textures/mcl_mobs_zombie_pigman.png} | Bin .../textures/mcl_mobs_zombie_priest.png} | Bin .../textures/mcl_mobs_zombie_smith.png} | Bin .../textures/mcl_mobs_zombie_villager.png} | Bin mods/ENTITIES/mcl_mobs/todo.txt | 1 - mods/ENTITIES/mcl_mount/init.lua | 81 ++ mods/ENTITIES/mcl_mount/mod.conf | 3 + mods/ENTITIES/mobs_mc/0_gameconfig.lua | 335 ----- mods/ENTITIES/mobs_mc/1_items_default.lua | 587 --------- mods/ENTITIES/mobs_mc/4_heads.lua | 62 - mods/ENTITIES/mobs_mc/5_spawn_abm_check.lua | 20 - mods/ENTITIES/mobs_mc/LICENSE | 674 ---------- mods/ENTITIES/mobs_mc/README.md | 89 -- mods/ENTITIES/mobs_mc/agent.lua | 39 - mods/ENTITIES/mobs_mc/depends.txt | 1 - mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr | 76 -- mods/ENTITIES/mobs_mc/locale/mobs_mc.es.tr | 75 -- mods/ENTITIES/mobs_mc/locale/mobs_mc.fr.tr | 76 -- mods/ENTITIES/mobs_mc/locale/mobs_mc.ru.tr | 76 -- mods/ENTITIES/mobs_mc/locale/template.txt | 75 -- mods/ENTITIES/mobs_mc/mod.conf | 6 - .../ENTITIES/mobs_mc/models/mobs_mc_agent.b3d | Bin 41853 -> 0 bytes .../textures/mobs_mc_arrow_particle.png | Bin 186 -> 0 bytes mods/ENTITIES/mobs_mc_gameconfig/mod.conf | 4 - mods/ENVIRONMENT/lightning/init.lua | 24 +- .../mcl_base_textures/textures/empty.png} | Bin mods/HUD/mcl_bossbars/init.lua | 2 +- mods/HUD/mcl_inventory/creative.lua | 2 +- .../REDSTONE/mesecons_pressureplates/init.lua | 2 +- mods/ITEMS/mcl_beds/functions.lua | 22 +- mods/ITEMS/mcl_bows/arrow.lua | 16 +- mods/ITEMS/mcl_bows/bow.lua | 11 +- mods/ITEMS/mcl_chests/init.lua | 42 +- .../mcl_chests/textures/mcl_chests_blank.png | Bin 570 -> 0 bytes mods/ITEMS/mcl_core/crafting.lua | 4 +- mods/ITEMS/mcl_core/nodes_misc.lua | 6 +- mods/ITEMS/mcl_enchanting/enchantments.lua | 21 +- mods/ITEMS/mcl_end/end_crystal.lua | 2 +- mods/ITEMS/mcl_farming/mod.conf | 2 +- mods/ITEMS/mcl_farming/pumpkin.lua | 10 +- mods/ITEMS/mcl_fire/fire_charge.lua | 2 +- mods/ITEMS/mcl_fire/init.lua | 10 +- mods/ITEMS/mcl_heads/init.lua | 6 +- mods/ITEMS/mcl_mobitems/init.lua | 61 + .../mcl_mobitems/locale/mcl_mobitems.de.tr | 13 + .../mcl_mobitems/locale/mcl_mobitems.es.tr | 10 + .../mcl_mobitems/locale/mcl_mobitems.fr.tr | 20 +- .../mcl_mobitems/locale/mcl_mobitems.ru.tr | 13 + mods/ITEMS/mcl_mobitems/locale/template.txt | 13 + .../mcl_mobitems_diamond_horse_armor.png} | Bin .../mcl_mobitems_gold_horse_armor.png} | Bin .../mcl_mobitems_iron_horse_armor.png} | Bin .../textures/mcl_mobitems_nametag.png} | Bin mods/ITEMS/mcl_mobspawners/init.lua | 33 +- mods/ITEMS/mcl_monster_eggs/init.lua | 2 +- mods/ITEMS/mcl_monster_eggs/mod.conf | 2 +- mods/ITEMS/mcl_potions/functions.lua | 10 +- mods/ITEMS/mcl_potions/init.lua | 4 +- mods/ITEMS/mcl_potions/lingering.lua | 2 +- mods/ITEMS/mcl_potions/splash.lua | 2 +- mods/ITEMS/mcl_potions/tipped_arrow.lua | 10 +- mods/ITEMS/mcl_throwing/register.lua | 8 +- mods/ITEMS/mcl_torches/api.lua | 10 +- mods/ITEMS/mcl_totems/init.lua | 28 +- mods/ITEMS/mcl_totems/locale/mcl_totems.de.tr | 5 + mods/ITEMS/mcl_totems/locale/mcl_totems.es.tr | 4 + mods/ITEMS/mcl_totems/locale/mcl_totems.fr.tr | 5 + mods/ITEMS/mcl_totems/locale/mcl_totems.ru.tr | 5 + mods/ITEMS/mcl_totems/locale/template.txt | 5 + mods/ITEMS/mcl_totems/mod.conf | 2 +- .../mcl_totems}/sounds/mcl_totems_totem.ogg | Bin .../mcl_totems}/textures/mcl_totems_totem.png | Bin mods/MAPGEN/mcl_dungeons/init.lua | 16 +- mods/MAPGEN/mcl_dungeons/mod.conf | 2 +- mods/MAPGEN/mcl_mapgen_core/init.lua | 2 +- mods/MAPGEN/mcl_structures/init.lua | 8 +- mods/MAPGEN/mcl_villages/init.lua | 19 - mods/MAPGEN/mcl_villages/mod.conf | 2 +- mods/MAPGEN/mcl_villages/utils.lua | 6 +- mods/MAPGEN/tsm_railcorridors/gameconfig.lua | 2 +- mods/MISC/mcl_commands/kill.lua | 2 +- mods/MISC/mcl_commands/summon.lua | 4 +- mods/PLAYER/mcl_player/init.lua | 5 +- mods/PLAYER/mcl_playerplus/init.lua | 2 +- 607 files changed, 4664 insertions(+), 7678 deletions(-) rename mods/{ENTITIES/mcl_mobs/textures/mobs_blood.png => CORE/mcl_particles/textures/mcl_particles_blood.png} (100%) rename mods/{ENTITIES/mcl_mobs => CORE/mcl_sounds}/sounds/attributes.txt (100%) rename mods/{ENTITIES/mcl_mobs => CORE/mcl_sounds}/sounds/default_punch.1.ogg (100%) rename mods/{ENTITIES/mcl_mobs => CORE/mcl_sounds}/sounds/default_punch.2.ogg (100%) rename mods/{ENTITIES/mcl_mobs => CORE/mcl_sounds}/sounds/default_punch.3.ogg (100%) rename mods/{ENTITIES/mcl_mobs/sounds/mcl_mobs_mob_poof.ogg => CORE/mcl_sounds/sounds/mcl_sounds_poof.ogg} (100%) rename mods/ENTITIES/mcl_mobs/{license.txt => LICENSE-API.txt} (100%) rename mods/ENTITIES/{mobs_mc/LICENSE-media.md => mcl_mobs/LICENSE-MEDIA.md} (99%) create mode 100644 mods/ENTITIES/mcl_mobs/README.md rename mods/ENTITIES/mcl_mobs/{api/mob_functions/backup_code_api.lua => api.old.lua} (100%) create mode 100644 mods/ENTITIES/mcl_mobs/api/ai/ai.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/ai/attack/explode.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/ai/attack/projectile_common.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/ai/attack/projectile_fly.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/ai/attack/projectile_land.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/ai/attack/punch.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/ai/climb.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/ai/float.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/ai/fly.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/ai/follow.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/ai/jump.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/ai/land.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/ai/step_height.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/ai/swim.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/anger.lua delete mode 100644 mods/ENTITIES/mcl_mobs/api/api.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/arrow.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/baby.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/breeding.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/common.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/damage.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/data.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/death.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/despawn.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/easteregg.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/eggs.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/env/breath.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/env/collision.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/env/env.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/env/fall_damage.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/env/sunlight.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/graphics/animation.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/graphics/collisionbox.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/graphics/eye_height.lua rename mods/ENTITIES/mcl_mobs/api/{mob_functions/head_logic.lua => graphics/head.lua} (89%) create mode 100644 mods/ENTITIES/mcl_mobs/api/graphics/mesh.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/graphics/nametag.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/graphics/rotation.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/graphics/textures.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/graphics/visual_size.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/interaction.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/knockback.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/loot.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/main.lua delete mode 100644 mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua delete mode 100644 mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua delete mode 100644 mods/ENTITIES/mcl_mobs/api/mob_functions/attack_type_instructions.lua delete mode 100644 mods/ENTITIES/mcl_mobs/api/mob_functions/breeding.lua delete mode 100644 mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua delete mode 100644 mods/ENTITIES/mcl_mobs/api/mob_functions/death_logic.lua delete mode 100644 mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua delete mode 100644 mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua delete mode 100644 mods/ENTITIES/mcl_mobs/api/mob_functions/mob_effects.lua delete mode 100644 mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua delete mode 100644 mods/ENTITIES/mcl_mobs/api/mob_functions/projectile_handling.lua delete mode 100644 mods/ENTITIES/mcl_mobs/api/mob_functions/set_up.lua delete mode 100644 mods/ENTITIES/mcl_mobs/api/mob_functions/sound_handling.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/movement.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/properties.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/register.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/sound.lua rename mods/ENTITIES/mcl_mobs/api/{spawning.lua => spawn.lua} (85%) rename mods/ENTITIES/{mobs_mc/3_shared.lua => mcl_mobs/api/taming.lua} (97%) create mode 100644 mods/ENTITIES/mcl_mobs/api/util.lua create mode 100644 mods/ENTITIES/mcl_mobs/api_files.txt delete mode 100644 mods/ENTITIES/mcl_mobs/crafts.lua rename mods/ENTITIES/{mobs_mc_gameconfig/init.lua => mcl_mobs/mobs/0_gameconfig.lua} (57%) rename mods/ENTITIES/{mobs_mc => mcl_mobs/mobs}/2_throwing.lua (99%) rename mods/ENTITIES/{mobs_mc => mcl_mobs/mobs}/bat.lua (84%) rename mods/ENTITIES/{mobs_mc => mcl_mobs/mobs}/blaze.lua (78%) rename mods/ENTITIES/{mobs_mc => mcl_mobs/mobs}/chicken.lua (100%) rename mods/ENTITIES/{mobs_mc/cow+mooshroom.lua => mcl_mobs/mobs/cow.lua} (100%) rename mods/ENTITIES/{mobs_mc => mcl_mobs/mobs}/creeper.lua (60%) rename mods/ENTITIES/{mobs_mc/guardian_elder.lua => mcl_mobs/mobs/elder_guardian.lua} (100%) rename mods/ENTITIES/{mobs_mc => mcl_mobs/mobs}/ender_dragon.lua (100%) rename mods/ENTITIES/{mobs_mc => mcl_mobs/mobs}/enderman.lua (99%) rename mods/ENTITIES/{mobs_mc => mcl_mobs/mobs}/endermite.lua (100%) rename mods/ENTITIES/{mobs_mc/villager_evoker.lua => mcl_mobs/mobs/evoker.lua} (100%) rename mods/ENTITIES/{mobs_mc => mcl_mobs/mobs}/gameconfig.md (100%) rename mods/ENTITIES/{mobs_mc => mcl_mobs/mobs}/ghast.lua (97%) rename mods/ENTITIES/{mobs_mc => mcl_mobs/mobs}/guardian.lua (100%) rename mods/ENTITIES/{mobs_mc => mcl_mobs/mobs}/horse.lua (99%) rename mods/ENTITIES/{mobs_mc/villager_illusioner.lua => mcl_mobs/mobs/illusioner.lua} (100%) rename mods/ENTITIES/{mobs_mc => mcl_mobs/mobs}/init.lua (76%) rename mods/ENTITIES/{mobs_mc => mcl_mobs/mobs}/iron_golem.lua (100%) rename mods/ENTITIES/{mobs_mc => mcl_mobs/mobs}/llama.lua (98%) rename mods/ENTITIES/{mobs_mc => mcl_mobs/mobs}/ocelot.lua (100%) rename mods/ENTITIES/{mobs_mc => mcl_mobs/mobs}/parrot.lua (99%) rename mods/ENTITIES/{mobs_mc => mcl_mobs/mobs}/pig.lua (98%) rename mods/ENTITIES/{mobs_mc => mcl_mobs/mobs}/polar_bear.lua (100%) rename mods/ENTITIES/{mobs_mc => mcl_mobs/mobs}/rabbit.lua (99%) rename mods/ENTITIES/{mobs_mc => mcl_mobs/mobs}/sheep.lua (88%) rename mods/ENTITIES/{mobs_mc => mcl_mobs/mobs}/shulker.lua (98%) rename mods/ENTITIES/{mobs_mc => mcl_mobs/mobs}/silverfish.lua (100%) rename mods/ENTITIES/{mobs_mc/skeleton+stray.lua => mcl_mobs/mobs/skeleton.lua} (99%) rename mods/ENTITIES/{mobs_mc/slime+magma_cube.lua => mcl_mobs/mobs/slime.lua} (99%) rename mods/ENTITIES/{mobs_mc => mcl_mobs/mobs}/snowman.lua (100%) rename mods/ENTITIES/{mobs_mc => mcl_mobs/mobs}/spider.lua (100%) rename mods/ENTITIES/{mobs_mc => mcl_mobs/mobs}/squid.lua (99%) rename mods/ENTITIES/{mobs_mc => mcl_mobs/mobs}/vex.lua (100%) rename mods/ENTITIES/{mobs_mc => mcl_mobs/mobs}/villager.lua (100%) rename mods/ENTITIES/{mobs_mc/villager_vindicator.lua => mcl_mobs/mobs/vindicator.lua} (100%) rename mods/ENTITIES/{mobs_mc => mcl_mobs/mobs}/witch.lua (100%) rename mods/ENTITIES/{mobs_mc => mcl_mobs/mobs}/wither.lua (97%) rename mods/ENTITIES/{mobs_mc/skeleton_wither.lua => mcl_mobs/mobs/wither_skeleton.lua} (98%) rename mods/ENTITIES/{mobs_mc => mcl_mobs/mobs}/wolf.lua (100%) rename mods/ENTITIES/{mobs_mc => mcl_mobs/mobs}/zombie.lua (97%) rename mods/ENTITIES/{mobs_mc/zombiepig.lua => mcl_mobs/mobs/zombie_pigman.lua} (98%) rename mods/ENTITIES/{mobs_mc/villager_zombie.lua => mcl_mobs/mobs/zombie_villager.lua} (92%) rename mods/ENTITIES/{mobs_mc => mcl_mobs}/models/attributes.txt (100%) rename mods/ENTITIES/{mobs_mc/models/mobs_mc_bat.b3d => mcl_mobs/models/mcl_mobs_bat.b3d} (100%) rename mods/ENTITIES/{mobs_mc/models/mobs_mc_blaze.b3d => mcl_mobs/models/mcl_mobs_blaze.b3d} (100%) rename mods/ENTITIES/{mobs_mc/models/mobs_mc_cat.b3d => mcl_mobs/models/mcl_mobs_cat.b3d} (100%) rename mods/ENTITIES/{mobs_mc/models/mobs_mc_chicken.b3d => mcl_mobs/models/mcl_mobs_chicken.b3d} (100%) rename mods/ENTITIES/{mobs_mc/models/mobs_mc_cow.b3d => mcl_mobs/models/mcl_mobs_cow.b3d} (100%) rename mods/ENTITIES/{mobs_mc/models/mobs_mc_creeper.b3d => mcl_mobs/models/mcl_mobs_creeper.b3d} (100%) rename mods/ENTITIES/{mobs_mc/models/mobs_mc_dragon.b3d => mcl_mobs/models/mcl_mobs_dragon.b3d} (100%) rename mods/ENTITIES/{mobs_mc/models/mobs_mc_enderman.b3d => mcl_mobs/models/mcl_mobs_enderman.b3d} (100%) rename mods/ENTITIES/{mobs_mc/models/mobs_mc_endermite.b3d => mcl_mobs/models/mcl_mobs_endermite.b3d} (100%) rename mods/ENTITIES/{mobs_mc/models/mobs_mc_evoker.b3d => mcl_mobs/models/mcl_mobs_evoker.b3d} (100%) rename mods/ENTITIES/{mobs_mc/models/mobs_mc_ghast.b3d => mcl_mobs/models/mcl_mobs_ghast.b3d} (100%) rename mods/ENTITIES/{mobs_mc/models/mobs_mc_guardian.b3d => mcl_mobs/models/mcl_mobs_guardian.b3d} (100%) rename mods/ENTITIES/{mobs_mc/models/mobs_mc_horse.b3d => mcl_mobs/models/mcl_mobs_horse.b3d} (100%) rename mods/ENTITIES/{mobs_mc/models/mobs_mc_illusioner.b3d => mcl_mobs/models/mcl_mobs_illusioner.b3d} (100%) rename mods/ENTITIES/{mobs_mc/models/mobs_mc_iron_golem.b3d => mcl_mobs/models/mcl_mobs_iron_golem.b3d} (100%) rename mods/ENTITIES/{mobs_mc/models/mobs_mc_llama.b3d => mcl_mobs/models/mcl_mobs_llama.b3d} (100%) rename mods/ENTITIES/{mobs_mc/models/mobs_mc_magmacube.b3d => mcl_mobs/models/mcl_mobs_magmacube.b3d} (100%) rename mods/ENTITIES/{mobs_mc/models/mobs_mc_mooshroom.b3d => mcl_mobs/models/mcl_mobs_mooshroom.b3d} (100%) rename mods/ENTITIES/{mobs_mc/models/mobs_mc_parrot.b3d => mcl_mobs/models/mcl_mobs_parrot.b3d} (100%) rename mods/ENTITIES/{mobs_mc/models/mobs_mc_pig.b3d => mcl_mobs/models/mcl_mobs_pig.b3d} (100%) rename mods/ENTITIES/{mobs_mc/models/mobs_mc_polarbear.b3d => mcl_mobs/models/mcl_mobs_polarbear.b3d} (100%) rename mods/ENTITIES/{mobs_mc/models/mobs_mc_rabbit.b3d => mcl_mobs/models/mcl_mobs_rabbit.b3d} (100%) rename mods/ENTITIES/{mobs_mc/models/mobs_mc_sheepfur.b3d => mcl_mobs/models/mcl_mobs_sheepfur.b3d} (100%) rename mods/ENTITIES/{mobs_mc/models/mobs_mc_shulker.b3d => mcl_mobs/models/mcl_mobs_shulker.b3d} (100%) rename mods/ENTITIES/{mobs_mc/models/mobs_mc_silverfish.b3d => mcl_mobs/models/mcl_mobs_silverfish.b3d} (100%) rename mods/ENTITIES/{mobs_mc/models/mobs_mc_skeleton.b3d => mcl_mobs/models/mcl_mobs_skeleton.b3d} (100%) rename mods/ENTITIES/{mobs_mc/models/mobs_mc_slime.b3d => mcl_mobs/models/mcl_mobs_slime.b3d} (100%) rename mods/ENTITIES/{mobs_mc/models/mobs_mc_snowman.b3d => mcl_mobs/models/mcl_mobs_snowman.b3d} (100%) rename mods/ENTITIES/{mobs_mc/models/mobs_mc_spider.b3d => mcl_mobs/models/mcl_mobs_spider.b3d} (100%) rename mods/ENTITIES/{mobs_mc/models/mobs_mc_squid.b3d => mcl_mobs/models/mcl_mobs_squid.b3d} (100%) rename mods/ENTITIES/{mobs_mc/models/mobs_mc_stray.b3d => mcl_mobs/models/mcl_mobs_stray.b3d} (100%) rename mods/ENTITIES/{mobs_mc/models/mobs_mc_vex.b3d => mcl_mobs/models/mcl_mobs_vex.b3d} (100%) rename mods/ENTITIES/{mobs_mc/models/mobs_mc_villager.b3d => mcl_mobs/models/mcl_mobs_villager.b3d} (100%) rename mods/ENTITIES/{mobs_mc/models/mobs_mc_villager_zombie.b3d => mcl_mobs/models/mcl_mobs_villager_zombie.b3d} (100%) rename mods/ENTITIES/{mobs_mc/models/mobs_mc_vindicator.b3d => mcl_mobs/models/mcl_mobs_vindicator.b3d} (100%) rename mods/ENTITIES/{mobs_mc/models/mobs_mc_witch.b3d => mcl_mobs/models/mcl_mobs_witch.b3d} (100%) rename mods/ENTITIES/{mobs_mc/models/mobs_mc_wither.b3d => mcl_mobs/models/mcl_mobs_wither.b3d} (100%) rename mods/ENTITIES/{mobs_mc/models/mobs_mc_witherskeleton.b3d => mcl_mobs/models/mcl_mobs_witherskeleton.b3d} (100%) rename mods/ENTITIES/{mobs_mc/models/mobs_mc_wolf.b3d => mcl_mobs/models/mcl_mobs_wolf.b3d} (100%) rename mods/ENTITIES/{mobs_mc/models/mobs_mc_zombie.b3d => mcl_mobs/models/mcl_mobs_zombie.b3d} (100%) rename mods/ENTITIES/{mobs_mc/models/mobs_mc_zombie_pigman.b3d => mcl_mobs/models/mcl_mobs_zombie_pigman.b3d} (100%) delete mode 100644 mods/ENTITIES/mcl_mobs/readme.MD rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_animal_eat_generic.ogg => mcl_mobs/sounds/mcl_mobs_animal_eat_generic.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_bat_death.ogg => mcl_mobs/sounds/mcl_mobs_bat_death.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_bat_hurt.1.ogg => mcl_mobs/sounds/mcl_mobs_bat_hurt.1.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_bat_hurt.2.ogg => mcl_mobs/sounds/mcl_mobs_bat_hurt.2.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_bat_hurt.3.ogg => mcl_mobs/sounds/mcl_mobs_bat_hurt.3.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_bat_idle.ogg => mcl_mobs/sounds/mcl_mobs_bat_idle.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_bear_attack.1.ogg => mcl_mobs/sounds/mcl_mobs_bear_attack.1.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_bear_attack.2.ogg => mcl_mobs/sounds/mcl_mobs_bear_attack.2.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_bear_death.1.ogg => mcl_mobs/sounds/mcl_mobs_bear_death.1.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_bear_growl.1.ogg => mcl_mobs/sounds/mcl_mobs_bear_growl.1.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_bear_growl.2.ogg => mcl_mobs/sounds/mcl_mobs_bear_growl.2.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_bear_growl.3.ogg => mcl_mobs/sounds/mcl_mobs_bear_growl.3.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_bear_hurt.1.ogg => mcl_mobs/sounds/mcl_mobs_bear_hurt.1.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_bear_random.1.ogg => mcl_mobs/sounds/mcl_mobs_bear_random.1.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_bear_random.2.ogg => mcl_mobs/sounds/mcl_mobs_bear_random.2.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_bear_random.3.ogg => mcl_mobs/sounds/mcl_mobs_bear_random.3.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_blaze_breath.ogg => mcl_mobs/sounds/mcl_mobs_blaze_breath.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_blaze_died.ogg => mcl_mobs/sounds/mcl_mobs_blaze_died.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_blaze_hurt.ogg => mcl_mobs/sounds/mcl_mobs_blaze_hurt.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_cat_hiss.ogg => mcl_mobs/sounds/mcl_mobs_cat_hiss.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_cat_idle.1.ogg => mcl_mobs/sounds/mcl_mobs_cat_idle.1.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_cat_idle.2.ogg => mcl_mobs/sounds/mcl_mobs_cat_idle.2.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_chicken_buck.1.ogg => mcl_mobs/sounds/mcl_mobs_chicken_buck.1.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_chicken_buck.2.ogg => mcl_mobs/sounds/mcl_mobs_chicken_buck.2.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_chicken_buck.3.ogg => mcl_mobs/sounds/mcl_mobs_chicken_buck.3.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_chicken_child.ogg => mcl_mobs/sounds/mcl_mobs_chicken_child.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_chicken_hurt.ogg => mcl_mobs/sounds/mcl_mobs_chicken_hurt.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_chicken_lay_egg.ogg => mcl_mobs/sounds/mcl_mobs_chicken_lay_egg.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_cow.ogg => mcl_mobs/sounds/mcl_mobs_cow.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_cow_hurt.ogg => mcl_mobs/sounds/mcl_mobs_cow_hurt.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_cow_milk.ogg => mcl_mobs/sounds/mcl_mobs_cow_milk.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_cow_mushroom_stew.ogg => mcl_mobs/sounds/mcl_mobs_cow_mushroom_stew.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_creeper_death.ogg => mcl_mobs/sounds/mcl_mobs_creeper_death.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_creeper_hurt.ogg => mcl_mobs/sounds/mcl_mobs_creeper_hurt.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_donkey_death.ogg => mcl_mobs/sounds/mcl_mobs_donkey_death.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_donkey_hurt.ogg => mcl_mobs/sounds/mcl_mobs_donkey_hurt.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_donkey_random.1.ogg => mcl_mobs/sounds/mcl_mobs_donkey_random.1.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_donkey_random.2.ogg => mcl_mobs/sounds/mcl_mobs_donkey_random.2.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_ender_dragon_attack.ogg => mcl_mobs/sounds/mcl_mobs_ender_dragon_attack.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_ender_dragon_shoot.ogg => mcl_mobs/sounds/mcl_mobs_ender_dragon_shoot.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_sandmonster.ogg => mcl_mobs/sounds/mcl_mobs_enderman.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_enderman_death.ogg => mcl_mobs/sounds/mcl_mobs_enderman_death.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_enderman_hurt.1.ogg => mcl_mobs/sounds/mcl_mobs_enderman_hurt.1.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_enderman_hurt.2.ogg => mcl_mobs/sounds/mcl_mobs_enderman_hurt.2.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_enderman_hurt.3.ogg => mcl_mobs/sounds/mcl_mobs_enderman_hurt.3.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_enderman_random.1.ogg => mcl_mobs/sounds/mcl_mobs_enderman_random.1.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_enderman_teleport_dst.ogg => mcl_mobs/sounds/mcl_mobs_enderman_teleport_dst.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_enderman_teleport_src.ogg => mcl_mobs/sounds/mcl_mobs_enderman_teleport_src.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_endermite_death.1.ogg => mcl_mobs/sounds/mcl_mobs_endermite_death.1.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_endermite_death.2.ogg => mcl_mobs/sounds/mcl_mobs_endermite_death.2.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_endermite_hurt.1.ogg => mcl_mobs/sounds/mcl_mobs_endermite_hurt.1.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_endermite_hurt.2.ogg => mcl_mobs/sounds/mcl_mobs_endermite_hurt.2.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_endermite_hurt.3.ogg => mcl_mobs/sounds/mcl_mobs_endermite_hurt.3.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_endermite_random.1.ogg => mcl_mobs/sounds/mcl_mobs_endermite_random.1.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_fireball.ogg => mcl_mobs/sounds/mcl_mobs_fireball.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_eerie.ogg => mcl_mobs/sounds/mcl_mobs_ghast.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_guardian_death.ogg => mcl_mobs/sounds/mcl_mobs_guardian_death.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_guardian_hurt.1.ogg => mcl_mobs/sounds/mcl_mobs_guardian_hurt.1.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_guardian_hurt.2.ogg => mcl_mobs/sounds/mcl_mobs_guardian_hurt.2.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_guardian_random.1.ogg => mcl_mobs/sounds/mcl_mobs_guardian_random.1.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_guardian_random.2.ogg => mcl_mobs/sounds/mcl_mobs_guardian_random.2.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_guardian_random.3.ogg => mcl_mobs/sounds/mcl_mobs_guardian_random.3.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_horse_death.ogg => mcl_mobs/sounds/mcl_mobs_horse_death.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_horse_hurt.ogg => mcl_mobs/sounds/mcl_mobs_horse_hurt.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_horse_random.1.ogg => mcl_mobs/sounds/mcl_mobs_horse_random.1.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_horse_random.2.ogg => mcl_mobs/sounds/mcl_mobs_horse_random.2.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_llama.ogg => mcl_mobs/sounds/mcl_mobs_llama.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_magma_cube_attack.ogg => mcl_mobs/sounds/mcl_mobs_magma_cube_attack.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_magma_cube_big.ogg => mcl_mobs/sounds/mcl_mobs_magma_cube_big.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_magma_cube_small.ogg => mcl_mobs/sounds/mcl_mobs_magma_cube_small.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_ocelot_hurt.ogg => mcl_mobs/sounds/mcl_mobs_ocelot_hurt.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_parrot_death.ogg => mcl_mobs/sounds/mcl_mobs_parrot_death.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_parrot_hurt.ogg => mcl_mobs/sounds/mcl_mobs_parrot_hurt.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_parrot_random.1.ogg => mcl_mobs/sounds/mcl_mobs_parrot_random.1.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_parrot_random.2.ogg => mcl_mobs/sounds/mcl_mobs_parrot_random.2.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_pig.ogg => mcl_mobs/sounds/mcl_mobs_pig.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_pig_angry.ogg => mcl_mobs/sounds/mcl_mobs_pig_angry.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_rabbit_attack.1.ogg => mcl_mobs/sounds/mcl_mobs_rabbit_attack.1.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_rabbit_attack.2.ogg => mcl_mobs/sounds/mcl_mobs_rabbit_attack.2.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_rabbit_death.1.ogg => mcl_mobs/sounds/mcl_mobs_rabbit_death.1.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_rabbit_death.2.ogg => mcl_mobs/sounds/mcl_mobs_rabbit_death.2.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_rabbit_death.3.ogg => mcl_mobs/sounds/mcl_mobs_rabbit_death.3.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_rabbit_hurt.1.ogg => mcl_mobs/sounds/mcl_mobs_rabbit_hurt.1.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_rabbit_hurt.2.ogg => mcl_mobs/sounds/mcl_mobs_rabbit_hurt.2.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_rabbit_hurt.3.ogg => mcl_mobs/sounds/mcl_mobs_rabbit_hurt.3.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_rabbit_random.1.ogg => mcl_mobs/sounds/mcl_mobs_rabbit_random.1.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_rabbit_random.2.ogg => mcl_mobs/sounds/mcl_mobs_rabbit_random.2.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_rabbit_random.3.ogg => mcl_mobs/sounds/mcl_mobs_rabbit_random.3.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_rabbit_random.4.ogg => mcl_mobs/sounds/mcl_mobs_rabbit_random.4.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_sheep.ogg => mcl_mobs/sounds/mcl_mobs_sheep.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_silverfish_death.ogg => mcl_mobs/sounds/mcl_mobs_silverfish_death.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_silverfish_hurt.ogg => mcl_mobs/sounds/mcl_mobs_silverfish_hurt.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_silverfish_idle.ogg => mcl_mobs/sounds/mcl_mobs_silverfish_idle.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_skeleton_death.ogg => mcl_mobs/sounds/mcl_mobs_skeleton_death.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_skeleton_hurt.ogg => mcl_mobs/sounds/mcl_mobs_skeleton_hurt.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_skeleton_random.1.ogg => mcl_mobs/sounds/mcl_mobs_skeleton_random.1.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_skeleton_random.2.ogg => mcl_mobs/sounds/mcl_mobs_skeleton_random.2.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/green_slime_attack.ogg => mcl_mobs/sounds/mcl_mobs_slime_attack.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/green_slime_damage.ogg => mcl_mobs/sounds/mcl_mobs_slime_damage.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/green_slime_death.ogg => mcl_mobs/sounds/mcl_mobs_slime_death.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/green_slime_jump.ogg => mcl_mobs/sounds/mcl_mobs_slime_jump.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/green_slime_land.ogg => mcl_mobs/sounds/mcl_mobs_slime_land.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_snowman_death.1.ogg => mcl_mobs/sounds/mcl_mobs_snowman_death.1.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_snowman_death.2.ogg => mcl_mobs/sounds/mcl_mobs_snowman_death.2.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_snowman_death.3.ogg => mcl_mobs/sounds/mcl_mobs_snowman_death.3.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_snowman_hurt.1.ogg => mcl_mobs/sounds/mcl_mobs_snowman_hurt.1.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_snowman_hurt.2.ogg => mcl_mobs/sounds/mcl_mobs_snowman_hurt.2.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_snowman_hurt.3.ogg => mcl_mobs/sounds/mcl_mobs_snowman_hurt.3.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_spider.ogg => mcl_mobs/sounds/mcl_mobs_spider.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_spider_attack.1.ogg => mcl_mobs/sounds/mcl_mobs_spider_attack.1.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_spider_attack.2.ogg => mcl_mobs/sounds/mcl_mobs_spider_attack.2.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_spider_death.ogg => mcl_mobs/sounds/mcl_mobs_spider_death.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_spider_hurt.1.ogg => mcl_mobs/sounds/mcl_mobs_spider_hurt.1.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_spider_hurt.2.ogg => mcl_mobs/sounds/mcl_mobs_spider_hurt.2.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_spider_hurt.3.ogg => mcl_mobs/sounds/mcl_mobs_spider_hurt.3.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_spider_random.ogg => mcl_mobs/sounds/mcl_mobs_spider_random.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_squid_death.1.ogg => mcl_mobs/sounds/mcl_mobs_squid_death.1.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_squid_flop.1.ogg => mcl_mobs/sounds/mcl_mobs_squid_flop.1.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_squid_flop.2.ogg => mcl_mobs/sounds/mcl_mobs_squid_flop.2.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_squid_flop.3.ogg => mcl_mobs/sounds/mcl_mobs_squid_flop.3.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_squid_flop.4.ogg => mcl_mobs/sounds/mcl_mobs_squid_flop.4.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_squid_hurt.1.ogg => mcl_mobs/sounds/mcl_mobs_squid_hurt.1.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_squid_hurt.2.ogg => mcl_mobs/sounds/mcl_mobs_squid_hurt.2.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_vex_death.ogg => mcl_mobs/sounds/mcl_mobs_vex_death.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_vex_hurt.ogg => mcl_mobs/sounds/mcl_mobs_vex_hurt.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_villager.1.ogg => mcl_mobs/sounds/mcl_mobs_villager.1.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_villager.2.ogg => mcl_mobs/sounds/mcl_mobs_villager.2.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_villager.3.ogg => mcl_mobs/sounds/mcl_mobs_villager.3.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_villager.4.ogg => mcl_mobs/sounds/mcl_mobs_villager.4.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_villager.5.ogg => mcl_mobs/sounds/mcl_mobs_villager.5.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_villager.6.ogg => mcl_mobs/sounds/mcl_mobs_villager.6.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_villager_hurt.1.ogg => mcl_mobs/sounds/mcl_mobs_villager_hurt.1.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_wither_spawn.ogg => mcl_mobs/sounds/mcl_mobs_wither_spawn.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_wolf_bark.1.ogg => mcl_mobs/sounds/mcl_mobs_wolf_bark.1.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_wolf_bark.2.ogg => mcl_mobs/sounds/mcl_mobs_wolf_bark.2.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_wolf_bark.3.ogg => mcl_mobs/sounds/mcl_mobs_wolf_bark.3.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_wolf_death.ogg => mcl_mobs/sounds/mcl_mobs_wolf_death.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_wolf_growl.ogg => mcl_mobs/sounds/mcl_mobs_wolf_growl.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_wolf_hurt.1.ogg => mcl_mobs/sounds/mcl_mobs_wolf_hurt.1.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_wolf_hurt.2.ogg => mcl_mobs/sounds/mcl_mobs_wolf_hurt.2.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_wolf_hurt.3.ogg => mcl_mobs/sounds/mcl_mobs_wolf_hurt.3.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_wolf_take_bone.ogg => mcl_mobs/sounds/mcl_mobs_wolf_take_bone.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_zombie_death.ogg => mcl_mobs/sounds/mcl_mobs_zombie_death.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_zombie_growl.ogg => mcl_mobs/sounds/mcl_mobs_zombie_growl.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_zombie_hurt.ogg => mcl_mobs/sounds/mcl_mobs_zombie_hurt.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_zombiepig_death.1.ogg => mcl_mobs/sounds/mcl_mobs_zombiepig_death.1.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_zombiepig_death.2.ogg => mcl_mobs/sounds/mcl_mobs_zombiepig_death.2.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_zombiepig_hurt.1.ogg => mcl_mobs/sounds/mcl_mobs_zombiepig_hurt.1.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_zombiepig_hurt.2.ogg => mcl_mobs/sounds/mcl_mobs_zombiepig_hurt.2.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_zombiepig_hurt.3.ogg => mcl_mobs/sounds/mcl_mobs_zombiepig_hurt.3.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_zombiepig_random.1.ogg => mcl_mobs/sounds/mcl_mobs_zombiepig_random.1.ogg} (100%) rename mods/ENTITIES/{mobs_mc/sounds/mobs_mc_zombiepig_war_cry.1.ogg => mcl_mobs/sounds/mcl_mobs_zombiepig_war_cry.1.ogg} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_TEMP_wither_projectile.png => mcl_mobs/textures/mcl_mobs_TEMP_wither_projectile.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_bat.png => mcl_mobs/textures/mcl_mobs_bat.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_blaze.png => mcl_mobs/textures/mcl_mobs_blaze.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_cat_black.png => mcl_mobs/textures/mcl_mobs_cat_black.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_cat_ocelot.png => mcl_mobs/textures/mcl_mobs_cat_ocelot.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_cat_red.png => mcl_mobs/textures/mcl_mobs_cat_red.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_cat_siamese.png => mcl_mobs/textures/mcl_mobs_cat_siamese.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_cave_spider.png => mcl_mobs/textures/mcl_mobs_cave_spider.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_chicken.png => mcl_mobs/textures/mcl_mobs_chicken.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_chicken_egg.png => mcl_mobs/textures/mcl_mobs_chicken_egg.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_cow.png => mcl_mobs/textures/mcl_mobs_cow.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_creeper.png => mcl_mobs/textures/mcl_mobs_creeper.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_creeper_charge.png => mcl_mobs/textures/mcl_mobs_creeper_charge.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_donkey.png => mcl_mobs/textures/mcl_mobs_donkey.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_dragon.png => mcl_mobs/textures/mcl_mobs_dragon.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_dragon_fireball.png => mcl_mobs/textures/mcl_mobs_dragon_fireball.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_endergolem.png => mcl_mobs/textures/mcl_mobs_endergolem.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_enderman.png => mcl_mobs/textures/mcl_mobs_enderman.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_enderman_block.png => mcl_mobs/textures/mcl_mobs_enderman_block.png} (100%) rename mods/ENTITIES/{mobs_mc_gameconfig/textures/mobs_mc_gameconfig_enderman_cactus_background.png => mcl_mobs/textures/mcl_mobs_enderman_cactus_background.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_enderman_eyes.png => mcl_mobs/textures/mcl_mobs_enderman_eyes.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_endermite.png => mcl_mobs/textures/mcl_mobs_endermite.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_evoker.png => mcl_mobs/textures/mcl_mobs_evoker.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_ghast.png => mcl_mobs/textures/mcl_mobs_ghast.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_ghast_firing.png => mcl_mobs/textures/mcl_mobs_ghast_firing.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_guardian.png => mcl_mobs/textures/mcl_mobs_guardian.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_guardian_elder.png => mcl_mobs/textures/mcl_mobs_guardian_elder.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_horse_armor_diamond.png => mcl_mobs/textures/mcl_mobs_horse_armor_diamond.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_horse_armor_gold.png => mcl_mobs/textures/mcl_mobs_horse_armor_gold.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_horse_armor_iron.png => mcl_mobs/textures/mcl_mobs_horse_armor_iron.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_horse_black.png => mcl_mobs/textures/mcl_mobs_horse_black.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_horse_brown.png => mcl_mobs/textures/mcl_mobs_horse_brown.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_horse_chestnut.png => mcl_mobs/textures/mcl_mobs_horse_chestnut.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_horse_creamy.png => mcl_mobs/textures/mcl_mobs_horse_creamy.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_horse_darkbrown.png => mcl_mobs/textures/mcl_mobs_horse_darkbrown.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_horse_gray.png => mcl_mobs/textures/mcl_mobs_horse_gray.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_horse_markings_blackdots.png => mcl_mobs/textures/mcl_mobs_horse_markings_blackdots.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_horse_markings_white.png => mcl_mobs/textures/mcl_mobs_horse_markings_white.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_horse_markings_whitedots.png => mcl_mobs/textures/mcl_mobs_horse_markings_whitedots.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_horse_markings_whitefield.png => mcl_mobs/textures/mcl_mobs_horse_markings_whitefield.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_horse_skeleton.png => mcl_mobs/textures/mcl_mobs_horse_skeleton.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_horse_white.png => mcl_mobs/textures/mcl_mobs_horse_white.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_husk.png => mcl_mobs/textures/mcl_mobs_husk.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_illusionist.png => mcl_mobs/textures/mcl_mobs_illusionist.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_iron_golem.png => mcl_mobs/textures/mcl_mobs_iron_golem.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_llama.png => mcl_mobs/textures/mcl_mobs_llama.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_llama_brown.png => mcl_mobs/textures/mcl_mobs_llama_brown.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_llama_chest.png => mcl_mobs/textures/mcl_mobs_llama_chest.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_llama_creamy.png => mcl_mobs/textures/mcl_mobs_llama_creamy.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_llama_decor_black.png => mcl_mobs/textures/mcl_mobs_llama_decor_black.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_llama_decor_blue.png => mcl_mobs/textures/mcl_mobs_llama_decor_blue.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_llama_decor_brown.png => mcl_mobs/textures/mcl_mobs_llama_decor_brown.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_llama_decor_cyan.png => mcl_mobs/textures/mcl_mobs_llama_decor_cyan.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_llama_decor_gray.png => mcl_mobs/textures/mcl_mobs_llama_decor_gray.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_llama_decor_green.png => mcl_mobs/textures/mcl_mobs_llama_decor_green.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_llama_decor_light_blue.png => mcl_mobs/textures/mcl_mobs_llama_decor_light_blue.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_llama_decor_light_gray.png => mcl_mobs/textures/mcl_mobs_llama_decor_light_gray.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_llama_decor_lime.png => mcl_mobs/textures/mcl_mobs_llama_decor_lime.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_llama_decor_magenta.png => mcl_mobs/textures/mcl_mobs_llama_decor_magenta.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_llama_decor_orange.png => mcl_mobs/textures/mcl_mobs_llama_decor_orange.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_llama_decor_pink.png => mcl_mobs/textures/mcl_mobs_llama_decor_pink.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_llama_decor_purple.png => mcl_mobs/textures/mcl_mobs_llama_decor_purple.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_llama_decor_red.png => mcl_mobs/textures/mcl_mobs_llama_decor_red.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_llama_decor_white.png => mcl_mobs/textures/mcl_mobs_llama_decor_white.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_llama_decor_yellow.png => mcl_mobs/textures/mcl_mobs_llama_decor_yellow.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_llama_gray.png => mcl_mobs/textures/mcl_mobs_llama_gray.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_llama_white.png => mcl_mobs/textures/mcl_mobs_llama_white.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_magmacube.png => mcl_mobs/textures/mcl_mobs_magmacube.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_mooshroom.png => mcl_mobs/textures/mcl_mobs_mooshroom.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_mooshroom_brown.png => mcl_mobs/textures/mcl_mobs_mooshroom_brown.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_mule.png => mcl_mobs/textures/mcl_mobs_mule.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_mushroom_brown.png => mcl_mobs/textures/mcl_mobs_mushroom_brown.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_mushroom_red.png => mcl_mobs/textures/mcl_mobs_mushroom_red.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_parrot_blue.png => mcl_mobs/textures/mcl_mobs_parrot_blue.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_parrot_green.png => mcl_mobs/textures/mcl_mobs_parrot_green.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_parrot_grey.png => mcl_mobs/textures/mcl_mobs_parrot_grey.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_parrot_red_blue.png => mcl_mobs/textures/mcl_mobs_parrot_red_blue.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_parrot_yellow_blue.png => mcl_mobs/textures/mcl_mobs_parrot_yellow_blue.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_pig.png => mcl_mobs/textures/mcl_mobs_pig.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_pig_saddle.png => mcl_mobs/textures/mcl_mobs_pig_saddle.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_polarbear.png => mcl_mobs/textures/mcl_mobs_polarbear.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_rabbit_black.png => mcl_mobs/textures/mcl_mobs_rabbit_black.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_rabbit_brown.png => mcl_mobs/textures/mcl_mobs_rabbit_brown.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_rabbit_caerbannog.png => mcl_mobs/textures/mcl_mobs_rabbit_caerbannog.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_rabbit_gold.png => mcl_mobs/textures/mcl_mobs_rabbit_gold.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_rabbit_salt.png => mcl_mobs/textures/mcl_mobs_rabbit_salt.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_rabbit_toast.png => mcl_mobs/textures/mcl_mobs_rabbit_toast.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_rabbit_white.png => mcl_mobs/textures/mcl_mobs_rabbit_white.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_rabbit_white_splotched.png => mcl_mobs/textures/mcl_mobs_rabbit_white_splotched.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_sheep.png => mcl_mobs/textures/mcl_mobs_sheep.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_sheep_fur.png => mcl_mobs/textures/mcl_mobs_sheep_fur.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_shulker_black.png => mcl_mobs/textures/mcl_mobs_shulker_black.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_shulker_blue.png => mcl_mobs/textures/mcl_mobs_shulker_blue.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_shulker_brown.png => mcl_mobs/textures/mcl_mobs_shulker_brown.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_shulker_cyan.png => mcl_mobs/textures/mcl_mobs_shulker_cyan.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_shulker_gray.png => mcl_mobs/textures/mcl_mobs_shulker_gray.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_shulker_green.png => mcl_mobs/textures/mcl_mobs_shulker_green.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_shulker_light_blue.png => mcl_mobs/textures/mcl_mobs_shulker_light_blue.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_shulker_lime.png => mcl_mobs/textures/mcl_mobs_shulker_lime.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_shulker_magenta.png => mcl_mobs/textures/mcl_mobs_shulker_magenta.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_shulker_orange.png => mcl_mobs/textures/mcl_mobs_shulker_orange.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_shulker_pink.png => mcl_mobs/textures/mcl_mobs_shulker_pink.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_shulker_purple.png => mcl_mobs/textures/mcl_mobs_shulker_purple.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_shulker_red.png => mcl_mobs/textures/mcl_mobs_shulker_red.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_shulker_silver.png => mcl_mobs/textures/mcl_mobs_shulker_silver.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_shulker_white.png => mcl_mobs/textures/mcl_mobs_shulker_white.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_shulker_yellow.png => mcl_mobs/textures/mcl_mobs_shulker_yellow.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_shulkerbullet.png => mcl_mobs/textures/mcl_mobs_shulkerbullet.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_silverfish.png => mcl_mobs/textures/mcl_mobs_silverfish.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_skeleton.png => mcl_mobs/textures/mcl_mobs_skeleton.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_slime.png => mcl_mobs/textures/mcl_mobs_slime.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_snowman.png => mcl_mobs/textures/mcl_mobs_snowman.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_bat.png => mcl_mobs/textures/mcl_mobs_spawn_icon_bat.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_blaze.png => mcl_mobs/textures/mcl_mobs_spawn_icon_blaze.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_cat.png => mcl_mobs/textures/mcl_mobs_spawn_icon_cat.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_cave_spider.png => mcl_mobs/textures/mcl_mobs_spawn_icon_cave_spider.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_chicken.png => mcl_mobs/textures/mcl_mobs_spawn_icon_chicken.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_cow.png => mcl_mobs/textures/mcl_mobs_spawn_icon_cow.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_creeper.png => mcl_mobs/textures/mcl_mobs_spawn_icon_creeper.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_donkey.png => mcl_mobs/textures/mcl_mobs_spawn_icon_donkey.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_dragon.png => mcl_mobs/textures/mcl_mobs_spawn_icon_dragon.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_enderman.png => mcl_mobs/textures/mcl_mobs_spawn_icon_enderman.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_endermite.png => mcl_mobs/textures/mcl_mobs_spawn_icon_endermite.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_evoker.png => mcl_mobs/textures/mcl_mobs_spawn_icon_evoker.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_ghast.png => mcl_mobs/textures/mcl_mobs_spawn_icon_ghast.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_guardian.png => mcl_mobs/textures/mcl_mobs_spawn_icon_guardian.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_guardian_elder.png => mcl_mobs/textures/mcl_mobs_spawn_icon_guardian_elder.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_horse.png => mcl_mobs/textures/mcl_mobs_spawn_icon_horse.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_horse_skeleton.png => mcl_mobs/textures/mcl_mobs_spawn_icon_horse_skeleton.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_horse_zombie.png => mcl_mobs/textures/mcl_mobs_spawn_icon_horse_zombie.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_husk.png => mcl_mobs/textures/mcl_mobs_spawn_icon_husk.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_illusioner.png => mcl_mobs/textures/mcl_mobs_spawn_icon_illusioner.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_iron_golem.png => mcl_mobs/textures/mcl_mobs_spawn_icon_iron_golem.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_llama.png => mcl_mobs/textures/mcl_mobs_spawn_icon_llama.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_magmacube.png => mcl_mobs/textures/mcl_mobs_spawn_icon_magmacube.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_mooshroom.png => mcl_mobs/textures/mcl_mobs_spawn_icon_mooshroom.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_mule.png => mcl_mobs/textures/mcl_mobs_spawn_icon_mule.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_parrot.png => mcl_mobs/textures/mcl_mobs_spawn_icon_parrot.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_pig.png => mcl_mobs/textures/mcl_mobs_spawn_icon_pig.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_polarbear.png => mcl_mobs/textures/mcl_mobs_spawn_icon_polarbear.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_rabbit.png => mcl_mobs/textures/mcl_mobs_spawn_icon_rabbit.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_sheep.png => mcl_mobs/textures/mcl_mobs_spawn_icon_sheep.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_shulker.png => mcl_mobs/textures/mcl_mobs_spawn_icon_shulker.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_silverfish.png => mcl_mobs/textures/mcl_mobs_spawn_icon_silverfish.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_skeleton.png => mcl_mobs/textures/mcl_mobs_spawn_icon_skeleton.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_slime.png => mcl_mobs/textures/mcl_mobs_spawn_icon_slime.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_snowman.png => mcl_mobs/textures/mcl_mobs_spawn_icon_snowman.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_spider.png => mcl_mobs/textures/mcl_mobs_spawn_icon_spider.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_squid.png => mcl_mobs/textures/mcl_mobs_spawn_icon_squid.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_stray.png => mcl_mobs/textures/mcl_mobs_spawn_icon_stray.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_vex.png => mcl_mobs/textures/mcl_mobs_spawn_icon_vex.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_villager.png => mcl_mobs/textures/mcl_mobs_spawn_icon_villager.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_vindicator.png => mcl_mobs/textures/mcl_mobs_spawn_icon_vindicator.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_witch.png => mcl_mobs/textures/mcl_mobs_spawn_icon_witch.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_wither.png => mcl_mobs/textures/mcl_mobs_spawn_icon_wither.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_witherskeleton.png => mcl_mobs/textures/mcl_mobs_spawn_icon_witherskeleton.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_wolf.png => mcl_mobs/textures/mcl_mobs_spawn_icon_wolf.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_zombie.png => mcl_mobs/textures/mcl_mobs_spawn_icon_zombie.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_zombie_pigman.png => mcl_mobs/textures/mcl_mobs_spawn_icon_zombie_pigman.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spawn_icon_zombie_villager.png => mcl_mobs/textures/mcl_mobs_spawn_icon_zombie_villager.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spider.png => mcl_mobs/textures/mcl_mobs_spider.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spider_eyes.png => mcl_mobs/textures/mcl_mobs_spider_eyes.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_spit.png => mcl_mobs/textures/mcl_mobs_spit.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_squid.png => mcl_mobs/textures/mcl_mobs_squid.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_stray.png => mcl_mobs/textures/mcl_mobs_stray.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_stray_overlay.png => mcl_mobs/textures/mcl_mobs_stray_overlay.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_trading_formspec_bg.png => mcl_mobs/textures/mcl_mobs_trading_formspec_bg.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_trading_formspec_disabled.png => mcl_mobs/textures/mcl_mobs_trading_formspec_disabled.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_vex.png => mcl_mobs/textures/mcl_mobs_vex.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_vex_charging.png => mcl_mobs/textures/mcl_mobs_vex_charging.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_villager.png => mcl_mobs/textures/mcl_mobs_villager.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_villager_butcher.png => mcl_mobs/textures/mcl_mobs_villager_butcher.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_villager_farmer.png => mcl_mobs/textures/mcl_mobs_villager_farmer.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_villager_librarian.png => mcl_mobs/textures/mcl_mobs_villager_librarian.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_villager_priest.png => mcl_mobs/textures/mcl_mobs_villager_priest.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_villager_smith.png => mcl_mobs/textures/mcl_mobs_villager_smith.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_vindicator.png => mcl_mobs/textures/mcl_mobs_vindicator.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_witch.png => mcl_mobs/textures/mcl_mobs_witch.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_wither.png => mcl_mobs/textures/mcl_mobs_wither.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_wither_half_health.png => mcl_mobs/textures/mcl_mobs_wither_half_health.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_wither_skeleton.png => mcl_mobs/textures/mcl_mobs_wither_skeleton.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_wolf.png => mcl_mobs/textures/mcl_mobs_wolf.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_wolf_angry.png => mcl_mobs/textures/mcl_mobs_wolf_angry.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_wolf_collar.png => mcl_mobs/textures/mcl_mobs_wolf_collar.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_wolf_icon_roam.png => mcl_mobs/textures/mcl_mobs_wolf_icon_roam.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_wolf_icon_sit.png => mcl_mobs/textures/mcl_mobs_wolf_icon_sit.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_wolf_tame.png => mcl_mobs/textures/mcl_mobs_wolf_tame.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_zombie.png => mcl_mobs/textures/mcl_mobs_zombie.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_zombie_butcher.png => mcl_mobs/textures/mcl_mobs_zombie_butcher.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_zombie_farmer.png => mcl_mobs/textures/mcl_mobs_zombie_farmer.png} (100%) create mode 100644 mods/ENTITIES/mcl_mobs/textures/mcl_mobs_zombie_hearteyes.png rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_zombie_librarian.png => mcl_mobs/textures/mcl_mobs_zombie_librarian.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_zombie_pigman.png => mcl_mobs/textures/mcl_mobs_zombie_pigman.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_zombie_priest.png => mcl_mobs/textures/mcl_mobs_zombie_priest.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_zombie_smith.png => mcl_mobs/textures/mcl_mobs_zombie_smith.png} (100%) rename mods/ENTITIES/{mobs_mc/textures/mobs_mc_zombie_villager.png => mcl_mobs/textures/mcl_mobs_zombie_villager.png} (100%) delete mode 100644 mods/ENTITIES/mcl_mobs/todo.txt create mode 100644 mods/ENTITIES/mcl_mount/init.lua create mode 100644 mods/ENTITIES/mcl_mount/mod.conf delete mode 100644 mods/ENTITIES/mobs_mc/0_gameconfig.lua delete mode 100644 mods/ENTITIES/mobs_mc/1_items_default.lua delete mode 100644 mods/ENTITIES/mobs_mc/4_heads.lua delete mode 100644 mods/ENTITIES/mobs_mc/5_spawn_abm_check.lua delete mode 100644 mods/ENTITIES/mobs_mc/LICENSE delete mode 100644 mods/ENTITIES/mobs_mc/README.md delete mode 100644 mods/ENTITIES/mobs_mc/agent.lua delete mode 100644 mods/ENTITIES/mobs_mc/depends.txt delete mode 100644 mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr delete mode 100644 mods/ENTITIES/mobs_mc/locale/mobs_mc.es.tr delete mode 100644 mods/ENTITIES/mobs_mc/locale/mobs_mc.fr.tr delete mode 100644 mods/ENTITIES/mobs_mc/locale/mobs_mc.ru.tr delete mode 100644 mods/ENTITIES/mobs_mc/locale/template.txt delete mode 100644 mods/ENTITIES/mobs_mc/mod.conf delete mode 100644 mods/ENTITIES/mobs_mc/models/mobs_mc_agent.b3d delete mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_arrow_particle.png delete mode 100644 mods/ENTITIES/mobs_mc_gameconfig/mod.conf rename mods/{ENTITIES/mobs_mc/textures/mobs_mc_empty.png => HUD/mcl_base_textures/textures/empty.png} (100%) delete mode 100644 mods/ITEMS/mcl_chests/textures/mcl_chests_blank.png rename mods/{ENTITIES/mobs_mc/textures/mobs_mc_diamond_horse_armor.png => ITEMS/mcl_mobitems/textures/mcl_mobitems_diamond_horse_armor.png} (100%) rename mods/{ENTITIES/mobs_mc/textures/mobs_mc_gold_horse_armor.png => ITEMS/mcl_mobitems/textures/mcl_mobitems_gold_horse_armor.png} (100%) rename mods/{ENTITIES/mobs_mc/textures/mobs_mc_iron_horse_armor.png => ITEMS/mcl_mobitems/textures/mcl_mobitems_iron_horse_armor.png} (100%) rename mods/{ENTITIES/mcl_mobs/textures/mobs_nametag.png => ITEMS/mcl_mobitems/textures/mcl_mobitems_nametag.png} (100%) create mode 100644 mods/ITEMS/mcl_totems/locale/mcl_totems.de.tr create mode 100644 mods/ITEMS/mcl_totems/locale/mcl_totems.es.tr create mode 100644 mods/ITEMS/mcl_totems/locale/mcl_totems.fr.tr create mode 100644 mods/ITEMS/mcl_totems/locale/mcl_totems.ru.tr create mode 100644 mods/ITEMS/mcl_totems/locale/template.txt rename mods/{ENTITIES/mobs_mc => ITEMS/mcl_totems}/sounds/mcl_totems_totem.ogg (100%) rename mods/{ENTITIES/mobs_mc => ITEMS/mcl_totems}/textures/mcl_totems_totem.png (100%) diff --git a/mods/CORE/mcl_damage/init.lua b/mods/CORE/mcl_damage/init.lua index 8b2acbb35..f17f776d1 100644 --- a/mods/CORE/mcl_damage/init.lua +++ b/mods/CORE/mcl_damage/init.lua @@ -13,7 +13,7 @@ mcl_damage = { starve = {bypasses_armor = true, bypasses_magic = true}, cactus = {}, fall = {bypasses_armor = true}, - fly_into_wall = {bypasses_armor = true}, -- unused + fly_into_wall = {bypasses_armor = true}, out_of_world = {bypasses_armor = true, bypasses_magic = true, bypasses_invulnerability = true}, generic = {bypasses_armor = true}, magic = {is_magic = true, bypasses_armor = true}, @@ -28,7 +28,7 @@ mcl_damage = { fireball = {is_projectile = true, is_fire = true}, thorns = {is_magic = true}, explosion = {is_explosion = true}, - cramming = {bypasses_armor = true}, -- unused + cramming = {bypasses_armor = true}, fireworks = {is_explosion = true}, -- unused } } @@ -74,11 +74,11 @@ function mcl_damage.from_punch(mcl_reason, object) mcl_reason.direct = object local luaentity = mcl_reason.direct:get_luaentity() if luaentity then - if luaentity._is_arrow then + if luaentity.is_arrow then mcl_reason.type = "arrow" - elseif luaentity._is_fireball then + elseif luaentity.is_fireball then mcl_reason.type = "fireball" - elseif luaentity._cmi_is_mob then + elseif luaentity.is_mob then mcl_reason.type = "mob" end mcl_reason.source = mcl_reason.source or luaentity._source_object diff --git a/mods/CORE/mcl_particles/init.lua b/mods/CORE/mcl_particles/init.lua index 48e9db8df..457f1a661 100644 --- a/mods/CORE/mcl_particles/init.lua +++ b/mods/CORE/mcl_particles/init.lua @@ -69,55 +69,61 @@ end -- 3 exptime variants because the animation is not tied to particle expiration time. -- 3 colorized variants to imitate minecraft's -local smoke_pdef_cached = {} -function mcl_particles.spawn_smoke(pos, name, smoke_pdef_base) - local min = math.min - local new_minpos = vector.add(pos, smoke_pdef_base.minrelpos) - local new_maxpos = vector.add(pos, smoke_pdef_base.maxrelpos) +function mcl_particles.get_smoke_def(def_base) + local defs = {} - -- populate the cache - if smoke_pdef_cached[name] then - for i, smoke_pdef in ipairs(smoke_pdef_cached[name]) do - smoke_pdef.minpos = new_minpos - smoke_pdef.maxpos = new_maxpos - mcl_particles.add_node_particlespawner(pos, smoke_pdef, "high") - end - -- cache already populated - else - smoke_pdef_cached[name] = {} + local def = table.copy(def_base) + def.amount = def.amount / 9 + def.time = 0 + def.animation = { + type = "vertical_frames", + aspect_w = 8, + aspect_h = 8, + -- length = 3 exptime variants + } + def.collisiondetection = true - local smoke_pdef = table.copy(smoke_pdef_base) - smoke_pdef.amount = smoke_pdef_base.amount / 9 - smoke_pdef.time = 0 - smoke_pdef.animation = { - type = "vertical_frames", - aspect_w = 8, - aspect_h = 8, - -- length = 3 exptime variants - } - smoke_pdef.collisiondetection = true - smoke_pdef.minpos = new_minpos - smoke_pdef.maxpos = new_maxpos + -- the last frame plays for 1/8 * N seconds, so we can take advantage of it + -- to have varying exptime for each variant. + local exptimes = {0.175, 0.375, 1.0} + local colorizes = {"199", "209", "243"} -- round(78%, 82%, 90% of 256) - 1 + for _, exptime in ipairs(exptimes) do + for _, colorize in ipairs(colorizes) do + def.maxexptime = exptime * def_base.maxexptime + def.animation.length = exptime + 0.1 + -- minexptime must be set such that the last frame is actully rendered, + -- even if its very short. Larger exptime -> larger range + def.minexptime = math.min(exptime, (7.0 / 8.0 * (exptime + 0.1) + 0.1)) + def.texture = "mcl_particles_smoke_anim.png^[colorize:#000000:" .. colorize - -- the last frame plays for 1/8 * N seconds, so we can take advantage of it - -- to have varying exptime for each variant. - local exptimes = { 0.175, 0.375, 1.0 } - local colorizes = { "199", "209", "243" } -- round(78%, 82%, 90% of 256) - 1 - - for _,exptime in ipairs(exptimes) do - for _,colorize in ipairs(colorizes) do - smoke_pdef.maxexptime = exptime * smoke_pdef_base.maxexptime - smoke_pdef.animation.length = exptime + 0.1 - -- minexptime must be set such that the last frame is actully rendered, - -- even if its very short. Larger exptime -> larger range - smoke_pdef.minexptime = min(exptime, (7.0/8.0 * (exptime + 0.1) + 0.1)) - smoke_pdef.texture = "mcl_particles_smoke_anim.png^[colorize:#000000:" ..colorize - - mcl_particles.add_node_particlespawner(pos, smoke_pdef, "high") - - table.insert(smoke_pdef_cached[name], table.copy(smoke_pdef)) - end + table.insert(defs, table.copy(def)) end end + + return defs +end + +function mcl_particles.add_node_smoke_particlespawner(pos, defs) + local minpos = vector.add(pos, defs[1].minrelpos) + local maxpos = vector.add(pos, defs[1].maxrelpos) + + for i, def in ipairs(defs) do + def.minpos = minpos + def.maxpos = maxpos + def.attached = nil + mcl_particles.add_node_particlespawner(pos, def, "high") + end +end + +function mcl_particles.add_object_smoke_particlespawner(obj, defs) + local minpos = defs[1].minrelpos + local maxpos = defs[1].maxrelpos + + for i, def in ipairs(defs) do + def.minpos = def.minrelpos + def.maxpos = def.maxrelpos + def.attached = obj + minetest.add_particlespawner(def) + end end diff --git a/mods/ENTITIES/mcl_mobs/textures/mobs_blood.png b/mods/CORE/mcl_particles/textures/mcl_particles_blood.png similarity index 100% rename from mods/ENTITIES/mcl_mobs/textures/mobs_blood.png rename to mods/CORE/mcl_particles/textures/mcl_particles_blood.png diff --git a/mods/CORE/mcl_sounds/README.txt b/mods/CORE/mcl_sounds/README.txt index 9fc2ba28f..26191c807 100644 --- a/mods/CORE/mcl_sounds/README.txt +++ b/mods/CORE/mcl_sounds/README.txt @@ -17,6 +17,8 @@ Glass breaking sounds (CC BY 3.0): default_tool_breaks.ogg by EdgardEdition (CC BY 3.0), http://www.freesound.org/people/EdgardEdition +mcl_sounds_poof.ogg by Planman (CC 0), https://freesound.org/people/Planman/sounds/208111/ + Mito551 (sounds) (CC BY-SA 3.0): default_dig_choppy.ogg default_dig_cracky.ogg diff --git a/mods/ENTITIES/mcl_mobs/sounds/attributes.txt b/mods/CORE/mcl_sounds/sounds/attributes.txt similarity index 100% rename from mods/ENTITIES/mcl_mobs/sounds/attributes.txt rename to mods/CORE/mcl_sounds/sounds/attributes.txt diff --git a/mods/ENTITIES/mcl_mobs/sounds/default_punch.1.ogg b/mods/CORE/mcl_sounds/sounds/default_punch.1.ogg similarity index 100% rename from mods/ENTITIES/mcl_mobs/sounds/default_punch.1.ogg rename to mods/CORE/mcl_sounds/sounds/default_punch.1.ogg diff --git a/mods/ENTITIES/mcl_mobs/sounds/default_punch.2.ogg b/mods/CORE/mcl_sounds/sounds/default_punch.2.ogg similarity index 100% rename from mods/ENTITIES/mcl_mobs/sounds/default_punch.2.ogg rename to mods/CORE/mcl_sounds/sounds/default_punch.2.ogg diff --git a/mods/ENTITIES/mcl_mobs/sounds/default_punch.3.ogg b/mods/CORE/mcl_sounds/sounds/default_punch.3.ogg similarity index 100% rename from mods/ENTITIES/mcl_mobs/sounds/default_punch.3.ogg rename to mods/CORE/mcl_sounds/sounds/default_punch.3.ogg diff --git a/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_mob_poof.ogg b/mods/CORE/mcl_sounds/sounds/mcl_sounds_poof.ogg similarity index 100% rename from mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_mob_poof.ogg rename to mods/CORE/mcl_sounds/sounds/mcl_sounds_poof.ogg diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua index 1bf3add38..dbaaf067a 100644 --- a/mods/CORE/mcl_util/init.lua +++ b/mods/CORE/mcl_util/init.lua @@ -477,32 +477,22 @@ end function mcl_util.deal_damage(target, damage, mcl_reason) local luaentity = target:get_luaentity() - if luaentity then - if luaentity.deal_damage then - luaentity:deal_damage(damage, mcl_reason or {type = "generic"}) - return - elseif luaentity._cmi_is_mob then - -- local puncher = mcl_reason and mcl_reason.direct or target - -- target:punch(puncher, 1.0, {full_punch_interval = 1.0, damage_groups = {fleshy = damage}}, vector.direction(puncher:get_pos(), target:get_pos()), damage) - if luaentity.health > 0 then - luaentity.health = luaentity.health - damage - end - return + if luaentity and luaentity.deal_damage then + luaentity:deal_damage(damage, mcl_reason or {type = "generic"}) + else + local hp = target:get_hp() + + if hp > 0 then + target:set_hp(hp - damage, {_mcl_reason = mcl_reason}) end end - - local hp = target:get_hp() - - if hp > 0 then - target:set_hp(hp - damage, {_mcl_reason = mcl_reason}) - end end function mcl_util.get_hp(obj) local luaentity = obj:get_luaentity() - if luaentity and luaentity._cmi_is_mob then - return luaentity.health + if luaentity and luaentity.is_mob then + return luaentity.data.health else return obj:get_hp() end diff --git a/mods/ENTITIES/mcl_boats/init.lua b/mods/ENTITIES/mcl_boats/init.lua index 5facec28a..433096df1 100644 --- a/mods/ENTITIES/mcl_boats/init.lua +++ b/mods/ENTITIES/mcl_boats/init.lua @@ -12,51 +12,40 @@ local function is_group(pos, group) return minetest.get_item_group(nn, group) ~= 0 end -local is_water = flowlib.is_water - -local function is_ice(pos) - return is_group(pos, "ice") -end - -local function get_sign(i) - if i == 0 then - return 0 - else - return i / math.abs(i) - end -end - local function get_velocity(v, yaw, y) - local x = -math.sin(yaw) * v - local z = math.cos(yaw) * v - return {x = x, y = y, z = z} + return vector.add(vector.new(0, y, 0), vector.multiply(minetest.yaw_to_dir(yaw), v)) end local function get_v(v) return math.sqrt(v.x ^ 2 + v.z ^ 2) end -local function check_object(obj) - return obj and (obj:is_player() or obj:get_luaentity()) and obj +function get_sign(i) + if not i or i == 0 then + return 0 + else + return i / math.abs(i) + end end -local function get_visual_size(obj) - return obj:is_player() and {x = 1, y = 1, z = 1} or obj:get_luaentity()._old_visual_size or obj:get_properties().visual_size +local is_water = flowlib.is_water + +local function is_ice(pos) + return is_group(pos, "ice") end local function set_attach(boat) - boat._driver:set_attach(boat.object, "", - {x = 0, y = 0.42, z = -1}, {x = 0, y = 0, z = 0}) + boat._driver:set_attach(boat.object, "", vector.new(0, 0.42, -1), vector.new(0, 0, 0)) end local function set_double_attach(boat) - boat._driver:set_attach(boat.object, "", - {x = 0, y = 0.42, z = 0.8}, {x = 0, y = 0, z = 0}) - boat._passenger:set_attach(boat.object, "", - {x = 0, y = 0.42, z = -2.2}, {x = 0, y = 0, z = 0}) + boat._driver:set_attach(boat.object, "", vector.new(0, 0.42, 0.8), vector.new(0, 0, 0)) + boat._passenger:set_attach(boat.object, "", vector.new(0, 0.42, -2.2), vector.new(0, 0, 0)) end -local function attach_object(self, obj) +local function enter_boat(self, obj) + mcl_mount.mount(obj, self.object) + if self._driver then if self._driver:is_player() then self._passenger = obj @@ -69,39 +58,6 @@ local function attach_object(self, obj) self._driver = obj set_attach(self) end - - local visual_size = get_visual_size(obj) - local yaw = self.object:get_yaw() - obj:set_properties({visual_size = vector.divide(visual_size, boat_visual_size)}) - - if obj:is_player() then - local name = obj:get_player_name() - mcl_player.player_attached[name] = true - minetest.after(0.2, function(name) - local player = minetest.get_player_by_name(name) - if player then - mcl_player.player_set_animation(player, "sit" , 30) - end - end, name) - obj:set_look_horizontal(yaw) - mcl_tmp_message.message(obj, S("Sneak to dismount")) - else - obj:get_luaentity()._old_visual_size = visual_size - end -end - -local function detach_object(obj, change_pos) - obj:set_detach() - obj:set_properties({visual_size = get_visual_size(obj)}) - if obj:is_player() then - mcl_player.player_attached[obj:get_player_name()] = false - mcl_player.player_set_animation(obj, "stand" , 30) - else - obj:get_luaentity()._old_visual_size = nil - end - if change_pos then - obj:set_pos(vector.add(obj:get_pos(), vector.new(0, 0.2, 0))) - end end -- @@ -131,16 +87,13 @@ local boat = { _damage_anim = 0, } -minetest.register_on_respawnplayer(detach_object) - function boat.on_rightclick(self, clicker) if self._passenger or not clicker or clicker:get_attach() then return end - attach_object(self, clicker) + enter_boat(self, clicker) end - function boat.on_activate(self, staticdata, dtime_s) self.object:set_armor_groups({fleshy = 100}) local data = minetest.deserialize(staticdata) @@ -172,10 +125,10 @@ function boat.on_death(self, killer) minetest.add_item(self.object:get_pos(), self._itemstring) end if self._driver then - detach_object(self._driver) + mcl_mount.throw_off(self._driver) end if self._passenger then - detach_object(self._passenger) + mcl_mount.throw_off(self._passenger) end self._driver = nil self._passenger = nil @@ -235,19 +188,13 @@ function boat.on_step(self, dtime, moveresult) local had_passenger = self._passenger - self._driver = check_object(self._driver) - self._passenger = check_object(self._passenger) + self._driver = self._driver and self._driver:get_attach() == self.object and self._driver + self._passenger = self._passenger and self._passenger:get_attach() == self.object and self._passenger if self._passenger then if not self._driver then self._driver = self._passenger self._passenger = nil - else - local ctrl = self._passenger:get_player_control() - if ctrl and ctrl.sneak then - detach_object(self._passenger, true) - self._passenger = nil - end end end @@ -256,13 +203,8 @@ function boat.on_step(self, dtime, moveresult) set_attach(self) end local ctrl = self._driver:get_player_control() - if ctrl and ctrl.sneak then - detach_object(self._driver, true) - self._driver = nil - return - end local yaw = self.object:get_yaw() - if ctrl.up then + if ctrl and ctrl.up then -- Forwards self._v = self._v + 0.1 * v_factor @@ -271,7 +213,7 @@ function boat.on_step(self, dtime, moveresult) self.object:set_animation({x=0, y=40}, paddling_speed, 0, true) self._animation = 1 end - elseif ctrl.down then + elseif ctrl and ctrl.down then -- Backwards self._v = self._v - 0.1 * v_factor @@ -309,8 +251,8 @@ function boat.on_step(self, dtime, moveresult) for _, obj in pairs(minetest.get_objects_inside_radius(self.object:get_pos(), 1.3)) do local entity = obj:get_luaentity() - if entity and entity._cmi_is_mob then - attach_object(self, obj) + if entity and entity.is_mob then + enter_boat(self, obj) break end end diff --git a/mods/ENTITIES/mcl_burning/api.lua b/mods/ENTITIES/mcl_burning/api.lua index 78814a2c7..71697ab2a 100644 --- a/mods/ENTITIES/mcl_burning/api.lua +++ b/mods/ENTITIES/mcl_burning/api.lua @@ -1,7 +1,17 @@ local S = minetest.get_translator("mcl_burning") function mcl_burning.get_storage(obj) - return obj:is_player() and mcl_burning.storage[obj] or obj:get_luaentity() + if obj:is_player() then + return mcl_burning.storage[obj] + else + local luaentity = obj:get_luaentity() + + if luaentity.is_mob then + return luaentity.data + end + + return luaentity + end end function mcl_burning.is_burning(obj) @@ -82,21 +92,8 @@ function mcl_burning.set_on_fire(obj, burn_time) storage.fire_damage_timer = 0 local fire_entity = minetest.add_entity(obj:get_pos(), "mcl_burning:fire") - local minp, maxp = mcl_burning.get_collisionbox(obj, false, storage) - local obj_size = obj:get_properties().visual_size - - local vertical_grow_factor = 1.2 - local horizontal_grow_factor = 1.1 - local grow_vector = vector.new(horizontal_grow_factor, vertical_grow_factor, horizontal_grow_factor) - - local size = vector.subtract(maxp, minp) - size = vector.multiply(size, grow_vector) - size = vector.divide(size, obj_size) - local offset = vector.new(0, size.y * 10 / 2, 0) - - fire_entity:set_properties({visual_size = size}) - fire_entity:set_attach(obj, "", offset, {x = 0, y = 0, z = 0}) local fire_luaentity = fire_entity:get_luaentity() + fire_luaentity:update_visual_size(obj, storage) fire_luaentity:update_frame(obj, storage) for _, other in pairs(minetest.get_objects_inside_radius(fire_entity:get_pos(), 0)) do @@ -136,12 +133,7 @@ function mcl_burning.tick(obj, dtime, storage) if storage.fire_damage_timer >= 1 then storage.fire_damage_timer = 0 - - local luaentity = obj:get_luaentity() - - if not luaentity or not luaentity.fire_damage_resistant then - mcl_util.deal_damage(obj, 1, {type = "on_fire"}) - end + mcl_util.deal_damage(obj, 1, {type = "on_fire"}) end end end diff --git a/mods/ENTITIES/mcl_burning/init.lua b/mods/ENTITIES/mcl_burning/init.lua index e223b3566..3092a3b65 100644 --- a/mods/ENTITIES/mcl_burning/init.lua +++ b/mods/ENTITIES/mcl_burning/init.lua @@ -35,6 +35,21 @@ minetest.register_globalstep(function(dtime) end end) +mcl_damage.register_modifier(function(obj, damage, reason) + if reason.is_fire then + local luaentity = obj:get_luaentity() + if luaentity and luaentity.no_fire_damage then + return 0 + end + end +end, -200) + +mcl_damage.register_on_damage(function(obj, damage, reason) + if reason.direct and mcl_burning.is_burning(obj) then + mcl_burning.set_on_fire(obj, 5) + end +end) + minetest.register_on_respawnplayer(function(player) mcl_burning.extinguish(player) end) @@ -113,4 +128,23 @@ minetest.register_entity("mcl_burning:fire", { parent:hud_change(storage.fire_hud_id, "text", "mcl_burning_hud_flame_animated.png" .. frame_overlay) end end, + update_visual_size = function(self, parent, storage) + parent = parent or self.object:get_attach() + storage = storage or mcl_burning.get_storage(parent) + + local minp, maxp = mcl_burning.get_collisionbox(parent, false, storage) + local obj_size = parent:get_properties().visual_size + + local vertical_grow_factor = 1.2 + local horizontal_grow_factor = 1.1 + local grow_vector = vector.new(horizontal_grow_factor, vertical_grow_factor, horizontal_grow_factor) + + local size = vector.subtract(maxp, minp) + size = vector.multiply(size, grow_vector) + size = vector.divide(size, obj_size) + local offset = vector.new(0, size.y * 10 / 2, 0) + + self.object:set_properties({visual_size = size}) + self.object:set_attach(parent, "", offset) + end, }) diff --git a/mods/ENTITIES/mcl_burning/mod.conf b/mods/ENTITIES/mcl_burning/mod.conf index c64959cbb..e2e917bbd 100644 --- a/mods/ENTITIES/mcl_burning/mod.conf +++ b/mods/ENTITIES/mcl_burning/mod.conf @@ -1,3 +1,4 @@ name = mcl_burning description = Burning Objects for MineClone2 author = Fleckenstein +depends = mcl_damage diff --git a/mods/ENTITIES/mcl_mobs/license.txt b/mods/ENTITIES/mcl_mobs/LICENSE-API.txt similarity index 100% rename from mods/ENTITIES/mcl_mobs/license.txt rename to mods/ENTITIES/mcl_mobs/LICENSE-API.txt diff --git a/mods/ENTITIES/mobs_mc/LICENSE-media.md b/mods/ENTITIES/mcl_mobs/LICENSE-MEDIA.md similarity index 99% rename from mods/ENTITIES/mobs_mc/LICENSE-media.md rename to mods/ENTITIES/mcl_mobs/LICENSE-MEDIA.md index dad31abb8..65f1f8896 100644 --- a/mods/ENTITIES/mobs_mc/LICENSE-media.md +++ b/mods/ENTITIES/mcl_mobs/LICENSE-MEDIA.md @@ -1,4 +1,4 @@ -# Credits licensing for media files in `mobs_mc` +# Credits licensing for media files in `mcl_mobs` ## Licenses used @@ -69,7 +69,7 @@ Origin of those models: * `mobs_mc_chicken.png` * `mobs_mc_wither.png` * `mobs_mc_wither_skeleton.png` - * `mobs_mc_TEMP_wither_projectile.png` + * `mobs_mc_TEMP_wither_projectile.png` * Gerold55 * `mobs_mc_mooshroom_brown.png` (CC0) * `mobs_mc_mushroom_brown.png` (CC0) diff --git a/mods/ENTITIES/mcl_mobs/README.md b/mods/ENTITIES/mcl_mobs/README.md new file mode 100644 index 000000000..d7ffef303 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/README.md @@ -0,0 +1,33 @@ +# MineClone2 Mobs + +This is a merged version of Mobs redo MineClone2 Edition (API) and mobs_mc (Mobs content). +The API was rewritten by jordan4ibanez and later Fleckenstein from Mobs redo MineClone2 Edition and merged with mobs_mc by Fleckenstein. +Mobs redo MineClone2 Edition was built by Wuzzy2 and contributors from Mobs Redo. Mobs redo was built by TenPlus1 from Simple Mobs by PilzAdam and mobs_mc was built by maikerumine. + +Seems like we've come a long way since 2012. + +## Credits + +* Fleckenstein: Rewrite of jordan's work, merged mobs_mc and mcl_mobs +* jordan4ibanez: Rewrite of the mcl_mobs API +* [maikerumine](https://github.com/maikerumine): Creator of mobs_mc (Coding behaviour, spawning, drops, and misc) +* TenPlus1: Built the original Mobs Redo API +* PilzAdam: Created Simple Mobs which Mobs Redo is based on together with KrupnoPavel, Zeg9, ExeterDad and AspireMint +* [Wuzzy2](https://github.com/Wuzzy2): Zombies, husks, item textures, and code, created Mobs redo MineClone2 Edition +* [toby109tt](https://github.com/tobyplowy): Mapping fixes - better 2D planes +* [22i](https://github.com/22i): Models (done in Blender) and mob icons for spawn eggs +* [XSSheep](https://www.planetminecraft.com/member/xssheep/): Mob and item textures (from [Pixel Perfection](https://www.planetminecraft.com/texture_pack/131pixel-perfection/)) +* MysticTempest: More mob textures +* See `LICENSE-MEDIA.md` for detailed credits about each file + +## Licensing + +* Media: MIT, CC0, CC BY 3.0 CC BY-SA 4.0, LGPLv2.1, GPLv3. See `LICENSE-MEDIA.md` for details +* License of mobs_mc code: GPLv3 +* Mobs Redo: See `LICENSE-API.txt` + +### Links + +* [`mobs_mc`](https://github.com/maikerumine/mobs_mc) +* [Blender models](https://github.com/22i/minecraft-voxel-blender-models) +* [How to recreate mobs from textures with Blender and Gimp](http://imgur.com/a/Iqg88) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/backup_code_api.lua b/mods/ENTITIES/mcl_mobs/api.old.lua similarity index 100% rename from mods/ENTITIES/mcl_mobs/api/mob_functions/backup_code_api.lua rename to mods/ENTITIES/mcl_mobs/api.old.lua diff --git a/mods/ENTITIES/mcl_mobs/api.txt b/mods/ENTITIES/mcl_mobs/api.txt index 2d8cef5b0..d2dcd5b46 100644 --- a/mods/ENTITIES/mcl_mobs/api.txt +++ b/mods/ENTITIES/mcl_mobs/api.txt @@ -1,6 +1,8 @@ Mobs Redo: MineClone 2 Edition API documentation + +IMPORTANT NOTE: This is completely outdated and needs to be rewritten ============================== Welcome to the world of mobs in Minetest and hopefully an easy guide to defining @@ -641,7 +643,7 @@ mobs:register_mob("mob_horse:horse", { visual_size = {x = 1.20, y = 1.20}, mesh = "mobs_horse.x", collisionbox = {-0.4, -0.01, -0.4, 0.4, 1.25, 0.4}, - animation = { + animation = { speed_normal = 15, speed_run = 30, stand_start = 25, diff --git a/mods/ENTITIES/mcl_mobs/api/ai/ai.lua b/mods/ENTITIES/mcl_mobs/api/ai/ai.lua new file mode 100644 index 000000000..fc5047310 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/ai/ai.lua @@ -0,0 +1,29 @@ +function mcl_mobs.mob:ai_step(dtime) + --[[ + if self.has_head then + mobs.do_head_logic(self,dtime) + end + --]] + + self:float_step() + + if self.jump_only then + jump_state_switch(self, dtime) + jump_state_execution(self, dtime) + --swimming + elseif self.swim then + swim_state_switch(self, dtime) + swim_state_execution(self, dtime) + --flying + elseif self.fly then + fly_state_switch(self, dtime) + fly_state_execution(self, dtime) + --regular mobs that walk around + else + land_state_switch(self, dtime) + land_state_execution(self, dtime) + end + + --make it so mobs do not glitch out when walking around/jumping + self:swap_auto_step_height_adjust() +end diff --git a/mods/ENTITIES/mcl_mobs/api/ai/attack/explode.lua b/mods/ENTITIES/mcl_mobs/api/ai/attack/explode.lua new file mode 100644 index 000000000..11253a9c9 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/ai/attack/explode.lua @@ -0,0 +1,74 @@ +--[[ + +mobs.explode_attack_walk = function(self,dtime) + + --this needs an exception + if self.attacking == nil or not self.attacking:is_player() then + self.attacking = nil + return + end + + self:look_at(self.attack) + + local distance_from_attacking = vector.distance(self.object:get_pos(), self.attacking:get_pos()) + + --make mob walk up to player within 2 nodes distance then start exploding + if distance_from_attacking >= self.reach and + --don't allow explosion to cancel unless out of the reach boundary + not (self.explosion_animation ~= nil and self.explosion_animation > 0 and distance_from_attacking <= self.defuse_reach) then + + mobs.set_velocity(self, self.run_velocity) + mobs.set_mob_animation(self,"run") + + mobs.reverse_explosion_animation(self,dtime) + else + mobs.set_velocity(self,0) + + --this is the only way I can reference this without dumping extra data on all mobs + if not self.explosion_animation then + self.explosion_animation = 0 + end + + --play ignite sound + if self.explosion_animation == 0 then + mobs.play_sound(self,"attack") + end + + mobs.set_mob_animation(self,"stand") + + mobs.handle_explosion_animation(self) + + self.explosion_animation = self.explosion_animation + (dtime/2.5) + end + + --make explosive mobs jump + --check for nodes to jump over + --explosive mobs will just ride against walls for now + local node_in_front_of = mobs.jump_check(self) + if node_in_front_of == 1 then + mobs.jump(self) + end + + + --do biggening explosion thing + if self.explosion_animation and self.explosion_animation > self.explosion_timer then + mcl_explosions.explode(self.object:get_pos(), self.explosion_strength,{ drop_chance = 1.0 }) + self.object:remove() + end +end + + +--this is a small helper function to make working with explosion animations easier +mobs.reverse_explosion_animation = function(self,dtime) + + --if explosion animation was greater than 0 then reverse it + if self.explosion_animation ~= nil and self.explosion_animation > 0 then + self.explosion_animation = self.explosion_animation - dtime + if self.explosion_animation < 0 then + self.explosion_animation = 0 + end + end + + mobs.handle_explosion_animation(self) +end +--]] diff --git a/mods/ENTITIES/mcl_mobs/api/ai/attack/projectile_common.lua b/mods/ENTITIES/mcl_mobs/api/ai/attack/projectile_common.lua new file mode 100644 index 000000000..9562167d5 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/ai/attack/projectile_common.lua @@ -0,0 +1,31 @@ +--[[ + +mobs.shoot_projectile_handling = function(arrow_item, pos, dir, yaw, shooter, power, damage, is_critical, bow_stack, collectable, gravity) + local obj = mcl_bows.shoot_arrow(arrow_item, pos, dir, yaw, shooter, power, damage, is_critical, bow_stack, collectable, gravity, true) + + --play custom shoot sound + if shooter ~= nil and shooter.shoot_sound then + minetest.sound_play(shooter.shoot_sound, {pos=pos, max_hear_distance=16}, true) + end + + return obj +end + +--do internal per mob projectile calculations +mobs.shoot_projectile = function(self) + + local pos1 = self.object:get_pos() + --add mob eye height + pos1.y = pos1.y + self.eye_height + + local pos2 = self.attacking:get_pos() + --add player eye height + pos2.y = pos2.y + mcl_mobs.util.get_eye_height(self.attacking) + + --get direction + local dir = vector.direction(pos1,pos2) + + --call internal shoot_arrow function + self.shoot_arrow(self,pos1,dir) +end +]]-- diff --git a/mods/ENTITIES/mcl_mobs/api/ai/attack/projectile_fly.lua b/mods/ENTITIES/mcl_mobs/api/ai/attack/projectile_fly.lua new file mode 100644 index 000000000..bf0241621 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/ai/attack/projectile_fly.lua @@ -0,0 +1,72 @@ +--[[ +local random_pitch_multiplier = {-1,1} + +mobs.projectile_attack_fly = function(self, dtime) + + --this needs an exception + if self.attacking == nil or not self.attacking:is_player() then + self.attacking = nil + return + end + + --this is specifically for random ghast movement + if self.fly_random_while_attack then + + --enable rotation locking + mobs.movement_rotation_lock(self) + + self.walk_timer = self.walk_timer - dtime + + --reset the walk timer + if self.walk_timer <= 0 then + --re-randomize the walk timer + self.walk_timer = math.random(1,6) + math.random() + --set the mob into a random direction + self.yaw = (math.random() * (math.pi * 2)) + --create a truly random pitch, since there is no easy access to pitch math that I can find + self.pitch = math.random() * math.random(1,3) * random_pitch_multiplier[math.random(1,2)] + end + + mobs.set_fly_velocity(self, self.run_velocity) + + else + + self:look_at(self.attack) + + local distance_from_attacking = vector.distance(self.object:get_pos(), self.attacking:get_pos()) + + if distance_from_attacking >= self.reach then + mobs.set_pitch_while_attacking(self) + mobs.set_fly_velocity(self, self.run_velocity) + mobs.set_mob_animation(self,"run") + else + mobs.set_pitch_while_attacking(self) + mobs.set_fly_velocity(self, 0) + mobs.set_mob_animation(self,"stand") + end + end + + + --do this to not load data into other mobs + if not self.projectile_timer then + self.projectile_timer = math.random(self.projectile_cooldown_min, self.projectile_cooldown_max) + end + + --run projectile timer + if self.projectile_timer > 0 then + self.projectile_timer = self.projectile_timer - dtime + + --shoot + if self.projectile_timer <= 0 then + + if self.fly_random_while_attack then + self:look_at(self.attack) + self.walk_timer = 0 + end + --reset timer + self.projectile_timer = math.random(self.projectile_cooldown_min, self.projectile_cooldown_max) + mobs.shoot_projectile(self) + end + end +end +]]-- diff --git a/mods/ENTITIES/mcl_mobs/api/ai/attack/projectile_land.lua b/mods/ENTITIES/mcl_mobs/api/ai/attack/projectile_land.lua new file mode 100644 index 000000000..7fb5c2dd7 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/ai/attack/projectile_land.lua @@ -0,0 +1,52 @@ +--[[ + +mobs.projectile_attack_walk = function(self,dtime) + + --this needs an exception + if self.attacking == nil or not self.attacking:is_player() then + self.attacking = nil + return + end + + self:look_at(self.attack) + + local distance_from_attacking = vector.distance(self.object:get_pos(), self.attacking:get_pos()) + + + if distance_from_attacking >= self.reach then + mobs.set_velocity(self, self.run_velocity) + mobs.set_mob_animation(self,"run") + else + mobs.set_velocity(self,0) + mobs.set_mob_animation(self,"stand") + end + + --do this to not load data into other mobs + if not self.projectile_timer then + self.projectile_timer = math.random(self.projectile_cooldown_min, self.projectile_cooldown_max) + end + + --run projectile timer + if self.projectile_timer > 0 then + self.projectile_timer = self.projectile_timer - dtime + + --shoot + if self.projectile_timer <= 0 then + --reset timer + self.projectile_timer = math.random(self.projectile_cooldown_min, self.projectile_cooldown_max) + mobs.shoot_projectile(self) + end + end + + --make shooty mobs jump + --check for nodes to jump over + --explosive mobs will just ride against walls for now + local node_in_front_of = mobs.jump_check(self) + if node_in_front_of == 1 then + mobs.jump(self) + end + +end + + +]]-- diff --git a/mods/ENTITIES/mcl_mobs/api/ai/attack/punch.lua b/mods/ENTITIES/mcl_mobs/api/ai/attack/punch.lua new file mode 100644 index 000000000..8d2463b64 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/ai/attack/punch.lua @@ -0,0 +1,87 @@ +--[[ +mobs.punch_attack_walk = function(self,dtime) + + --this needs an exception + if self.attacking == nil or not self.attacking:is_player() then + self.attacking = nil + return + end + + local distance_from_attacking = mobs.get_2d_distance(self.object:get_pos(), self.attacking:get_pos()) + + if distance_from_attacking >= self.minimum_follow_distance then + mobs.set_velocity(self, self.run_velocity) + mobs.set_mob_animation(self, "run") + else + mobs.set_velocity(self, 0) + mobs.set_mob_animation(self, "stand") + end + + self:look_at(self.attack) + + --make punchy mobs jump + --check for nodes to jump over + --explosive mobs will just ride against walls for now + local node_in_front_of = mobs.jump_check(self) + + if node_in_front_of == 1 then + mobs.jump(self) + end + + --mobs that can climb over stuff + if self.always_climb and node_in_front_of > 0 then + mobs.climb(self) + end + + + --auto reset punch_timer + if not self.punch_timer then + self.punch_timer = 0 + end + + if self.punch_timer > 0 then + self.punch_timer = self.punch_timer - dtime + end +end + +mobs.punch_attack = function(self) + + self.attacking:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups = {fleshy = self.damage} + }, nil) + + self.punch_timer = self.punch_timer_cooloff + + + --knockback + local pos1 = self.object:get_pos() + pos1.y = 0 + local pos2 = self.attacking:get_pos() + pos2.y = 0 + local dir = vector.direction(pos1,pos2) + + dir = vector.multiply(dir,3) + + if self.attacking:get_velocity().y <= 1 then + dir.y = 5 + end + + self.attacking:add_velocity(dir) +end +--]] +--[[ +--integrate mob punching into collision detection +local check_for_attack = false + +if self.attack_type == "punch" and self.hostile and self.attacking then + check_for_attack = true +end + +if check_for_attack and self.punch_timer <= 0 then + if object == self.attacking then + mobs.punch_attack(self) + end +end + +]]-- diff --git a/mods/ENTITIES/mcl_mobs/api/ai/climb.lua b/mods/ENTITIES/mcl_mobs/api/ai/climb.lua new file mode 100644 index 000000000..ccc34b20b --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/ai/climb.lua @@ -0,0 +1,22 @@ +--[[ +mobs.climb = function(self) + + local current_velocity = self.object:get_velocity() + + local goal_velocity = { + x = 0, + y = DEFAULT_CLIMB_SPEED, + z = 0, + } + + local new_velocity_addition = vector.subtract(goal_velocity,current_velocity) + + new_velocity_addition.x = 0 + new_velocity_addition.z = 0 + + --smooths out mobs a bit + if vector.length(new_velocity_addition) >= 0.0001 then + self.object:add_velocity(new_velocity_addition) + end +end +]] diff --git a/mods/ENTITIES/mcl_mobs/api/ai/float.lua b/mods/ENTITIES/mcl_mobs/api/ai/float.lua new file mode 100644 index 000000000..760507c59 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/ai/float.lua @@ -0,0 +1,13 @@ +function mcl_mobs.mob:float_step() + local vertical_speed + + if self.node_type ~= self.last_node_type then + if self.node_type == "air" then + vertical_speed = self.def.float_in_air + elseif self.node_type == "water" then + vertical_speed = self.def.float_in_water + elseif self.node_type == "lava" then + vertical_speed = self.def.float_in_lava + end + end +end diff --git a/mods/ENTITIES/mcl_mobs/api/ai/fly.lua b/mods/ENTITIES/mcl_mobs/api/ai/fly.lua new file mode 100644 index 000000000..f1481c207 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/ai/fly.lua @@ -0,0 +1,214 @@ + +--[[ +______ _ +| ___| | +| |_ | |_ _ +| _| | | | | | +| | | | |_| | +\_| |_|\__, | + __/ | + |___/ +]]-- + +--[[ +-- state switching logic (stand, walk, run, attacks) +local fly_state_list_wandering = {"stand", "fly"} + +local function fly_state_switch(self, dtime) + + if self.hostile and self.attacking then + self.state = "attack" + return + end + + self.state_timer = self.state_timer - dtime + if self.state_timer <= 0 then + self.state_timer = math.random(4, 10) + math.random() + self.state = fly_state_list_wandering[math.random(1, #fly_state_list_wandering)] + end +end + +--check if a mob needs to turn while flying +local function fly_turn_check(self, dtime) + + local pos = self.object:get_pos() + pos.y = pos.y + 0.1 + local dir = minetest.yaw_to_dir(self.yaw) + + local collisionbox = self.object:get_properties().collisionbox + local radius = collisionbox[4] + 0.5 + + vector.multiply(dir, radius) + + local test_dir = vector.add(pos,dir) + + return minetest.get_item_group(minetest.get_node(test_dir).name, "solid") ~= 0 +end + +--this is to swap the built in engine acceleration modifier +local function fly_physics_swapper(self, inside_fly_node) + + --should be flyming, gravity is applied, switch to floating + if inside_fly_node and self.object:get_acceleration().y ~= 0 then + self.object:set_acceleration(vector.new(0, 0, 0)) + --not be fly, gravity isn't applied, switch to falling + elseif not inside_fly_node and self.object:get_acceleration().y == 0 then + self.pitch = 0 + self.object:set_acceleration(vector.new(0, -self.gravity, 0)) + end +end + +local random_pitch_multiplier = {-1, 1} +-- states are executed here +local function fly_state_execution(self, dtime) + local pos = self.object:get_pos() + pos.y = pos.y + 0.1 + local current_node = minetest.get_node(pos).name + local inside_fly_node = minetest.get_item_group(current_node, "solid") == 0 + + local float_now = false + --recheck if in water or lava + if minetest.get_item_group(current_node, "water") ~= 0 or minetest.get_item_group(current_node, "lava") ~= 0 then + inside_fly_node = false + float_now = true + end + + --turn gravity on or off + fly_physics_swapper(self, inside_fly_node) + + --fly properly if inside fly node + if inside_fly_node then + if self.state == "stand" then + + --do animation + self:set_animation("stand") + + self:set_fly_velocity(0) + + if self.tilt_fly then + self:set_static_pitch() + end + + self:lock_yaw() + + elseif self.state == "fly" then + + self.walk_timer = self.walk_timer - dtime + + --reset the walk timer + if self.walk_timer <= 0 then + + --re-randomize the walk timer + self.walk_timer = math.random(1, 6) + math.random() + + --set the mob into a random direction + self.yaw = (math.random() * (math.pi * 2)) + + --create a truly random pitch, since there is no easy access to pitch math that I can find + self.pitch = math.random() * math.random(1, 3) * random_pitch_multiplier[math.random(1,2)] + end + + --do animation + self:set_animation("walk") + + --do a quick turn to make mob continuously move + --if in a bird cage or something + if fly_turn_check(self, dtime) then + quick_rotate(self, dtime) + end + + if self.tilt_fly then + self:set_dynamic_pitch() + end + + self:set_fly_velocity(self.walk_velocity) + + --enable rotation locking + self:movement_rotation_lock() + + elseif self.state == "attack" then + + --execute mob attack type + --if self.attack_type == "explode" then + + --mobs.explode_attack_fly(self, dtime) + + --elseif self.attack_type == "punch" then + + --mobs.punch_attack_fly(self,dtime) + + if self.attack_type == "projectile" then + + self:projectile_attack_fly(dtime) + + end + end + else + --make the mob float + if self.floats and float_now then + self:set_velocity(0) + + self:float() + + if self.tilt_fly then + self:set_static_pitch() + end + end + end +end + + +-- move mob in facing direction +--this has been modified to be internal +--internal = lua (self.yaw) +--engine = c++ (self.object:get_yaw()) +mobs.set_fly_velocity = function(self, v) + + local yaw = (self.yaw or 0) + local pitch = (self.pitch or 0) + + if v == 0 then + pitch = 0 + end + + local current_velocity = self.object:get_velocity() + + local goal_velocity = { + x = (math.sin(yaw) * -v), + y = pitch, + z = (math.cos(yaw) * v), + } + + + local new_velocity_addition = vector.subtract(goal_velocity,current_velocity) + + if vector.length(new_velocity_addition) > vector.length(goal_velocity) then + vector.multiply(new_velocity_addition, (vector.length(goal_velocity) / vector.length(new_velocity_addition))) + end + + --smooths out mobs a bit + if vector.length(new_velocity_addition) >= 0.0001 then + self.object:add_velocity(new_velocity_addition) + end +end + +--a quick and simple pitch calculation between two vector positions +mobs.calculate_pitch = function(pos1, pos2) + + if pos1 == nil or pos2 == nil then + return false + end + + return(minetest.dir_to_yaw(vector.new(vector.distance(vector.new(pos1.x,0,pos1.z),vector.new(pos2.x,0,pos2.z)),0,pos1.y - pos2.y)) + HALF_PI) +end + +--make mobs fly up or down based on their y difference +mobs.set_pitch_while_attacking = function(self) + local pos1 = self.object:get_pos() + local pos2 = self.attacking:get_pos() + + local pitch = mobs.calculate_pitch(pos2,pos1) + + self.pitch = pitch +end +]]-- diff --git a/mods/ENTITIES/mcl_mobs/api/ai/follow.lua b/mods/ENTITIES/mcl_mobs/api/ai/follow.lua new file mode 100644 index 000000000..08b323a23 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/ai/follow.lua @@ -0,0 +1,31 @@ +function mcl_mobs.mob:check_following() + --ignore + if not self.follow then + self.following_person = nil + return false + end + + --hey look, this thing works for passive mobs too! + local follower = mobs.detect_closest_player_within_radius(self,true,self.view_range,self.eye_height) + + --check if the follower is a player incase they log out + if follower and follower:is_player() then + local stack = follower:get_wielded_item() + --safety check + if not stack then + self.following_person = nil + return(false) + end + + local item_name = stack:get_name() + --all checks have passed, that guy has some good looking food + if item_name == self.follow then + self.following_person = follower + return(true) + end + end + + --everything failed + self.following_person = nil + return(false) +end diff --git a/mods/ENTITIES/mcl_mobs/api/ai/jump.lua b/mods/ENTITIES/mcl_mobs/api/ai/jump.lua new file mode 100644 index 000000000..31205d2fd --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/ai/jump.lua @@ -0,0 +1,169 @@ +--[[ + +--check if a mob needs to jump +mobs.jump_check = function(self,dtime) + + local pos = self.object:get_pos() + pos.y = pos.y + 0.1 + local dir = minetest.yaw_to_dir(self.yaw) + + local collisionbox = self.object:get_properties().collisionbox + local radius = collisionbox[4] + 0.5 + + vector.multiply(dir, radius) + + --only jump if there's a node and a non-solid node above it + local test_dir = vector.add(pos,dir) + + local green_flag_1 = minetest.get_item_group(minetest.get_node(test_dir).name, "solid") ~= 0 + + test_dir.y = test_dir.y + 1 + + local green_flag_2 = minetest.get_item_group(minetest.get_node(test_dir).name, "solid") == 0 + + if green_flag_1 and green_flag_2 then + --can jump over node + return(1) + elseif green_flag_1 and not green_flag_2 then + --wall in front of mob + return(2) + end + + --nothing to jump over + return(0) +end + +--check if a mob needs to turn while jumping +local function jump_turn_check(self, dtime) + + local pos = self.object:get_pos() + pos.y = pos.y + 0.1 + local dir = minetest.yaw_to_dir(self.yaw) + + local collisionbox = self.object:get_properties().collisionbox + local radius = collisionbox[4] + 0.5 + + vector.multiply(dir, radius) + + local test_dir = vector.add(pos,dir) + + return minetest.get_item_group(minetest.get_node(test_dir).name, "solid") ~= 0 +end + +-- state switching logic (stand, jump, run, attacks) +local jump_state_list_wandering = {"stand", "jump"} + +local function jump_state_switch(self, dtime) + self.state_timer = self.state_timer - dtime + if self.state_timer <= 0 then + self.state_timer = math.random(4, 10) + math.random() + self.state = jump_state_list_wandering[math.random(1, #jump_state_list_wandering)] + end +end + +-- states are executed here +local function jump_state_execution(self, dtime) + + local pos = self.object:get_pos() + local collisionbox = self.object:get_properties().collisionbox + --get the center of the mob + pos.y = pos.y + (collisionbox[2] + collisionbox[5] / 2) + local current_node = minetest.get_node(pos).name + + local float_now = false + + --recheck if in water or lava + if minetest.get_item_group(current_node, "water") ~= 0 or minetest.get_item_group(current_node, "lava") ~= 0 then + float_now = true + end + + if self.state == "stand" then + + --do animation + self:set_animation("stand") + + --set the velocity of the mob + self:set_velocity(0) + + self:lock_yaw() + + elseif self.state == "jump" then + + self.walk_timer = self.walk_timer - dtime + + --reset the jump timer + if self.walk_timer <= 0 then + + --re-randomize the jump timer + self.walk_timer = math.random(1, 6) + math.random() + + --set the mob into a random direction + self.yaw = (math.random() * (math.pi * 2)) + end + + --do animation + self:set_animation("walk") + + --enable rotation locking + self:movement_rotation_lock() + + --jumping mobs are more loosey goosey + if node_in_front_of == 1 then + quick_rotate(self, dtime) + end + + --only move forward if path is clear + self:jump_move(self.walk_velocity) + + elseif self.state == "run" then + + print("run") + + elseif self.state == "attack" then + + print("attack") + + end + + if float_now then + self:float() + end +end + +--special mob jump movement +mobs.jump_move = function(self, velocity) + + if self.object:get_velocity().y ~= 0 or not self.old_velocity or (self.old_velocity and self.old_velocity.y > 0) then + return + end + + --make the mob stick for a split second + mobs.set_velocity(self,0) + + --fallback velocity to allow modularity + jump_height = DEFAULT_JUMP_HEIGHT + + local yaw = (self.yaw or 0) + + local current_velocity = self.object:get_velocity() + + local goal_velocity = { + x = (math.sin(yaw) * -velocity), + y = jump_height, + z = (math.cos(yaw) * velocity), + } + + + local new_velocity_addition = vector.subtract(goal_velocity,current_velocity) + + if vector.length(new_velocity_addition) > vector.length(goal_velocity) then + vector.multiply(new_velocity_addition, (vector.length(goal_velocity) / vector.length(new_velocity_addition))) + end + + --smooths out mobs a bit + if vector.length(new_velocity_addition) >= 0.0001 then + self.object:add_velocity(new_velocity_addition) + end +end + +]]-- diff --git a/mods/ENTITIES/mcl_mobs/api/ai/land.lua b/mods/ENTITIES/mcl_mobs/api/ai/land.lua new file mode 100644 index 000000000..81cdc5b64 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/ai/land.lua @@ -0,0 +1,436 @@ + +--[[ + _ _ +| | | | +| | __ _ _ __ __| | +| | / _` | '_ \ / _` | +| |___| (_| | | | | (_| | +\_____/\__,_|_| |_|\__,_| +]]-- + +--[[ +--this is basically reverse jump_check +local function cliff_check(self, dtime) + --mobs will flip out if they are falling without this + if self.object:get_velocity().y ~= 0 then + return false + end + + local pos = self.object:get_pos() + local dir = minetest.yaw_to_dir(self.yaw) + local collisionbox = self.properties.collisionbox + local radius = collisionbox[4] + 0.5 + + dir = vector.multiply(dir, radius) + + local free_fall, blocker = minetest.line_of_sight( + {x = pos.x + dir.x, y = pos.y, z = pos.z + dir.z}, + {x = pos.x + dir.x, y = pos.y - self.def.fear_height, z = pos.z + dir.z}) + + return free_fall +end + +-- state switching logic (stand, walk, run, attacks) +local land_state_list_wandering = {"stand", "walk"} + +local function land_state_switch(self, dtime) + + --do math before sure not attacking, following, or running away so continue + --doing random walking for mobs if all states are not met + self.state_timer = self.state_timer - dtime + + --only run away + if self.def.skittish and self.state == "run" then + self.run_timer = self.run_timer - dtime + if self.run_timer > 0 then + return + end + --continue + end + + --ignore everything else if breeding + if self.breed_lookout_timer and self.breed_lookout_timer > 0 then + self.state = "breed" + return + --reset the state timer to get the mob out of + --the breed state + elseif self.state == "breed" then + self.state_timer = 0 + end + + --ignore everything else if following + if self:check_following() and self.breed_lookout_timer == 0 and self.breed_timer == 0 then + self.state = "follow" + return + --reset the state timer to get the mob out of + --the follow state - not the cleanest option + --but the easiest + elseif self.state == "follow" then + self.state_timer = 0 + end + + --only attack + if self.def.hostile and self.attacking then + self.state = "attack" + return + end + + --if finally reached here then do random wander + if self.state_timer <= 0 then + self.state_timer = math.random(4, 10) + math.random() + self.state = land_state_list_wandering[math.random(1, #land_state_list_wandering)] + end + +end + +-- states are executed here +local function land_state_execution(self, dtime) + + --[[ -- this is a debug which shows the timer and makes mobs breed 100 times faster + print(self.breed_timer) + if self.breed_timer > 0 then + self.breed_timer = self.breed_timer - (dtime * 100) + if self.breed_timer <= 0 then + self.breed_timer = 0 + end + end + ] ]-- + + --timer to time out looking for mate + if self.breed_lookout_timer > 0 then + self.breed_lookout_timer = self.breed_lookout_timer - dtime + --looking for mate failed + if self.breed_lookout_timer < 0 then + self.breed_lookout_timer = 0 + end + end + + --cool off after breeding + if self.breed_timer > 0 then + self.breed_timer = self.breed_timer - dtime + --do this to skip the first check, using as switch + if self.breed_timer <= 0 then + self.breed_timer = 0 + end + end + + local pos = self.object:get_pos() + local collisionbox = self.properties.collisionbox + --get the center of the mob + pos.y = pos.y + (collisionbox[2] + collisionbox[5] / 2) + local current_node = minetest.get_node(pos).name + local float_now = false + + --recheck if in water or lava + if minetest.get_item_group(current_node, "water") ~= 0 or minetest.get_item_group(current_node, "lava") ~= 0 then + float_now = true + end + + --calculate fall damage + if self.fall_damage then + self:calculate_fall_damage() + end + + if self.state == "stand" then + + --do animation + self:set_animation("stand") + + --set the velocity of the mob + self:set_velocity(0) + + --animation fixes for explosive mobs + if self.attack_type == "explode" then + self:reverse_explosion_animation(dtime) + end + + self:lock_yaw() + elseif self.state == "follow" then + + --always look at players + self:look_at(self.following_person) + + --check distance + local distance_from_follow_person = vector.distance(self.object:get_pos(), self.following_person:get_pos()) + local distance_2d = mobs.get_2d_distance(self.object:get_pos(), self.following_person:get_pos()) + + --don't push the player if too close + --don't spin around randomly + if self.follow_distance < distance_from_follow_person and self.minimum_follow_distance < distance_2d then + self:set_animation("run") + self:set_velocity(self.run_velocity) + + if self:jump_check() == 1 then + self:jump(self) + end + else + self:set_mob_animation("stand") + self:set_velocity(0) + end + + elseif self.state == "walk" then + + self.walk_timer = self.walk_timer - dtime + + --reset the walk timer + if self.walk_timer <= 0 then + + --re-randomize the walk timer + self.walk_timer = math.random(1, 6) + math.random() + + --set the mob into a random direction + self.yaw = (math.random() * (math.pi * 2)) + end + + --do animation + self:set_animation("walk") + + --enable rotation locking + self:movement_rotation_lock() + + --check for nodes to jump over + local node_in_front_of = self:jump_check() + + if node_in_front_of == 1 then + + self:jump() + + --turn if on the edge of cliff + --(this is written like this because unlike + --jump_check which simply tells the mob to jump + --this requires a mob to turn, removing the + --ease of a full implementation for it in a single + --function) + elseif node_in_front_of == 2 or (self.fear_height ~= 0 and cliff_check(self, dtime)) then + --turn 45 degrees if so + quick_rotate(self,dtime) + --stop the mob so it doesn't fall off + self:set_velocity(0) + end + + --only move forward if path is clear + if node_in_front_of == 0 or node_in_front_of == 1 then + --set the velocity of the mob + self:set_velocity(self.walk_velocity) + end + + --animation fixes for explosive mobs + if self.attack_type == "explode" then + self:reverse_explosion_animation(dtime) + end + + elseif self.state == "run" then + + --do animation + self:set_animation("run") + + --enable rotation locking + self:movement_rotation_lock() + + --check for nodes to jump over + local node_in_front_of = self:jump_check() + + if node_in_front_of == 1 then + + self:jump() + + --turn if on the edge of cliff + --(this is written like this because unlike + --jump_check which simply tells the mob to jump + --this requires a mob to turn, removing the + --ease of a full implementation for it in a single + --function) + elseif node_in_front_of == 2 or (self.fear_height ~= 0 and cliff_check(self, dtime)) then + --turn 45 degrees if so + quick_rotate(self, dtime) + --stop the mob so it doesn't fall off + self:set_velocity(0) + end + + --only move forward if path is clear + if node_in_front_of == 0 or node_in_front_of == 1 then + --set the velocity of the mob + self:set_velocity(self.run_velocity) + end + + elseif self.state == "attack" then + + --execute mob attack type + if self.attack_type == "explode" then + + self:explode_attack_walk(dtime) + + elseif self.attack_type == "punch" then + + self:punch_attack_walk(dtime) + + elseif self.attack_type == "projectile" then + + self:projectile_attack_walk(dtime) + + end + elseif self.state == "breed" then + + minetest.add_particlespawner({ + amount = 2, + time = 0.0001, + minpos = vector.add(pos, min), + maxpos = vector.add(pos, max), + minvel = vector.new(-1,1,-1), + maxvel = vector.new(1,3,1), + minexptime = 0.7, + maxexptime = 1, + minsize = 1, + maxsize = 2, + collisiondetection = false, + vertical = false, + texture = "heart.png", + }) + + local mate = self:look_for_mate() + + --found a mate + if mate then + self:look_at(mate) + self:set_velocity(self.walk_velocity) + + --smoosh together basically + if vector.distance(self.object:get_pos(), mate:get_pos()) <= self.breed_distance then + self:set_animation("stand") + if self.special_breed_timer == 0 then + self.special_breed_timer = 2 --breeding takes 2 seconds + end + + self.special_breed_timer = self.special_breed_timer - dtime + if self.special_breed_timer <= 0 then + + --pop a baby out, it's a miracle! + local baby_pos = vector.divide(vector.add(self.object:get_pos(), mate:get_pos()), 2) + local baby_mob = minetest.add_entity(pos, self.name, minetest.serialize({baby = true, grow_up_timer = self.grow_up_goal, bred = true})) + + self:play_sound_specific("item_drop_pickup") + + self.special_breed_timer = 0 + self.breed_lookout_timer = 0 + self.breed_timer = self.breed_timer_cooloff + + local mate_entity = mate:get_luaentity() + mate_entity.special_breed_timer = 0 + mate_entity.breed_lookout_timer = 0 + mate_entity.breed_timer = self.breed_timer_cooloff -- can reuse because it's the same mob + end + else + self:set_animation("walk") + end + --couldn't find a mate, just stand there until the player pushes it towards one + --or the timer runs out + else + self:set_mob_animation("stand") + self:set_velocity(0) + end + + end + + if float_now then + self:float() + else + local acceleration = self.object:get_acceleration() + if acceleration and acceleration.y == 0 then + self.object:set_acceleration(vector.new(0, -self.gravity, 0)) + end + end +end + + +-- move mob in facing direction +--this has been modified to be internal +--internal = lua (self.yaw) +--engine = c++ (self.object:get_yaw()) +mobs.set_velocity = function(self, v) + + local yaw = (self.yaw or 0) + + local current_velocity = self.object:get_velocity() + + local goal_velocity = { + x = (math.sin(yaw) * -v), + y = 0, + z = (math.cos(yaw) * v), + } + + + local new_velocity_addition = vector.subtract(goal_velocity,current_velocity) + + if vector.length(new_velocity_addition) > vector.length(goal_velocity) then + vector.multiply(new_velocity_addition, (vector.length(goal_velocity) / vector.length(new_velocity_addition))) + end + + new_velocity_addition.y = 0 + + --smooths out mobs a bit + if vector.length(new_velocity_addition) >= 0.0001 then + self.object:add_velocity(new_velocity_addition) + end +end + + + +-- calculate mob velocity +mobs.get_velocity = function(self) + + local v = self.object:get_velocity() + + v.y = 0 + + if v then + return vector.length(v) + end + + return 0 +end + +--make mobs jump +mobs.jump = function(self, velocity) + + if self.object:get_velocity().y ~= 0 or not self.old_velocity or (self.old_velocity and self.old_velocity.y > 0) then + return + end + + --fallback velocity to allow modularity + velocity = velocity or DEFAULT_JUMP_HEIGHT + + self.object:add_velocity(vector.new(0,velocity,0)) +end + +--make mobs fall slowly +mobs.mob_fall_slow = function(self) + + local current_velocity = self.object:get_velocity() + + local goal_velocity = { + x = 0, + y = -2, + z = 0, + } + + + local new_velocity_addition = vector.subtract(goal_velocity,current_velocity) + + new_velocity_addition.x = 0 + new_velocity_addition.z = 0 + + if vector.length(new_velocity_addition) > vector.length(goal_velocity) then + vector.multiply(new_velocity_addition, (vector.length(goal_velocity) / vector.length(new_velocity_addition))) + end + + new_velocity_addition.x = 0 + new_velocity_addition.z = 0 + + --smooths out mobs a bit + if vector.length(new_velocity_addition) >= 0.0001 then + self.object:add_velocity(new_velocity_addition) + end + +end + +]]-- diff --git a/mods/ENTITIES/mcl_mobs/api/ai/step_height.lua b/mods/ENTITIES/mcl_mobs/api/ai/step_height.lua new file mode 100644 index 000000000..ea3e70691 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/ai/step_height.lua @@ -0,0 +1,9 @@ +function mcl_mobs.mob:swap_auto_step_height_adjust() + local y_vel = self.object:get_velocity().y + + if y_vel == 0 and self.stepheight ~= self.stepheight_backup then + self.stepheight = self.stepheight_backup + elseif y_vel ~= 0 and self.stepheight ~= 0 then + self.stepheight = 0 + end +end diff --git a/mods/ENTITIES/mcl_mobs/api/ai/swim.lua b/mods/ENTITIES/mcl_mobs/api/ai/swim.lua new file mode 100644 index 000000000..244948ba4 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/ai/swim.lua @@ -0,0 +1,206 @@ + +--[[ + _____ _ +/ ___| (_) +\ `--.__ ___ _ __ ___ + `--. \ \ /\ / / | '_ ` _ \ +/\__/ /\ V V /| | | | | | | +\____/ \_/\_/ |_|_| |_| |_| +]]-- + +--[[ + +-- state switching logic (stand, walk, run, attacks) +local swim_state_list_wandering = {"stand", "swim"} + +local function swim_state_switch(self, dtime) + self.state_timer = self.state_timer - dtime + if self.state_timer <= 0 then + self.state_timer = math.random(4,10) + math.random() + self.state = swim_state_list_wandering[math.random(1, #swim_state_list_wandering)] + end +end + +--check if a mob needs to turn while swimming +local swim_turn_check = function(self,dtime) + + local pos = self.object:get_pos() + pos.y = pos.y + 0.1 + local dir = minetest_yaw_to_dir(self.yaw) + + local collisionbox = self.object:get_properties().collisionbox + local radius = collisionbox[4] + 0.5 + + vector.multiply(dir, radius) + + local test_dir = vector.add(pos,dir) + + return minetest_get_item_group(minetest_get_node(test_dir).name, "solid") ~= 0 +end + +--this is to swap the built in engine acceleration modifier +local function swim_physics_swapper(self, inside_swim_node) + + --should be swimming, gravity is applied, switch to floating + if inside_swim_node and self.object:get_acceleration().y ~= 0 then + self.object:set_acceleration(vector.new(0, 0, 0)) + --not be swim, gravity isn't applied, switch to falling + elseif not inside_swim_node and self.object:get_acceleration().y == 0 then + self.pitch = 0 + self.object:set_acceleration(vector.new(0, -self.gravity, 0)) + end +end + +local random_pitch_multiplier = {-1,1} +-- states are executed here +local function swim_state_execution(self, dtime) + + local pos = self.object:get_pos() + + pos.y = pos.y + self.object:get_properties().collisionbox[5] + local current_node = minetest_get_node(pos).name + local inside_swim_node = false + + --quick scan everything to see if inside swim node + for _,id in pairs(self.swim_in) do + if id == current_node then + inside_swim_node = true + break + end + end + + --turn gravity on or off + swim_physics_swapper(self, inside_swim_node) + + --swim properly if inside swim node + if inside_swim_node then + + if self.state == "stand" then + + --do animation + self:set_animation("stand") + + self:set_swim_velocity(0) + + if self.tilt_swim then + self:set_static_pitch() + end + + self:lock_yaw() + + elseif self.state == "swim" then + + self.walk_timer = self.walk_timer - dtime + + --reset the walk timer + if self.walk_timer <= 0 then + + --re-randomize the walk timer + self.walk_timer = math.random(1, 6) + math.random() + + --set the mob into a random direction + self.yaw = (math.random() * (math.pi * 2)) + + --create a truly random pitch, since there is no easy access to pitch math that I can find + self.pitch = math.random() * math.random(1, 3) * random_pitch_multiplier[math.random(1, 2)] + end + + --do animation + self:set_animation("walk") + + --do a quick turn to make mob continuously move + --if in a fish tank or something + if swim_turn_check(self, dtime) then + quick_rotate(self, dtime) + end + + self:set_swim_velocity(self.walk_velocity) + + --only enable tilt swimming if enabled + if self.tilt_swim then + self:set_dynamic_pitch() + end + + --enable rotation locking + self:movement_rotation_lock() + end + --flop around if not inside swim node + else + --do animation + self:set_mob_animation("stand") + + self:flop() + + if self.tilt_swim then + self:set_static_pitch() + end + end + +end + + +--make mobs flop +mobs.flop = function(self, velocity) + + if self.object:get_velocity().y ~= 0 or not self.old_velocity or (self.old_velocity and self.old_velocity.y > 0) then + return false + end + + mobs.set_velocity(self, 0) + + --fallback velocity to allow modularity + velocity = velocity or DEFAULT_JUMP_HEIGHT + + --create a random direction (2d yaw) + local dir = DOUBLE_PI * math.random() + + --create a random force value + local force = math.random(0,3) + math.random() + + --convert the yaw to a direction vector then multiply it times the force + local final_additional_force = vector.multiply(minetest_yaw_to_dir(dir), force) + + --place in the "flop" velocity to make the mob flop + final_additional_force.y = velocity + + self.object:add_velocity(final_additional_force) + + return true +end + + + +-- move mob in facing direction +--this has been modified to be internal +--internal = lua (self.yaw) +--engine = c++ (self.object:get_yaw()) +mobs.set_swim_velocity = function(self, v) + + local yaw = (self.yaw or 0) + local pitch = (self.pitch or 0) + + if v == 0 then + pitch = 0 + end + + local current_velocity = self.object:get_velocity() + + local goal_velocity = { + x = (math.sin(yaw) * -v), + y = pitch, + z = (math.cos(yaw) * v), + } + + + local new_velocity_addition = vector.subtract(goal_velocity,current_velocity) + + if vector.length(new_velocity_addition) > vector.length(goal_velocity) then + vector.multiply(new_velocity_addition, (vector.length(goal_velocity) / vector.length(new_velocity_addition))) + end + + --smooths out mobs a bit + if vector.length(new_velocity_addition) >= 0.0001 then + self.object:add_velocity(new_velocity_addition) + end +end +]]-- diff --git a/mods/ENTITIES/mcl_mobs/api/anger.lua b/mods/ENTITIES/mcl_mobs/api/anger.lua new file mode 100644 index 000000000..5985df096 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/anger.lua @@ -0,0 +1,205 @@ +--[[ +Implementation of the Minecraft 1.16 Anger System (copied from https://www.minecraft.net/ru-ru/article/nether-update-java, with modifications): + +Forgive dead players + + If this gamerule is disabled, then angered mobs will stay angry even if the targeted player dies + If both forgiveDeadPlayers and universalAnger are enabled, an angered neutral mob will stop being angry when their target dies. They won't seek any new targets after that + +Neutral mob anger + + When hurt by a player, the neutral mob will target that player and try to kill it + The mob will stay angry until the player is dead or out of sight for a while + Anger is persistent, so a player can't escape by temporarily logging out or switching dimension + If a targeted player dies near the angered mob, it will stop being angry (unless forgiveDeadPlayers is disabled) + Neutral mobs also get angry at other mobs who hurt them. However, that anger is not persistent + Angered neutral mobs will only attack the offending player, not innocent bystanders + Some mobs spread anger (wolf, Zombie Pigman). If a player attacks one, all nearby mobs of the same type will get angry at that player + +Universal anger + +Universal anger is basically guilt by association. A neutral mob attacked by players will be angry at players in general, regardless of who attacked them. More specifically: + + A neutral mob attacked by a player will target the nearest player, even if that player wasn't the attacker + Every time the neutral mob is hit by a player it will update its attack target to the nearest player + Players can use this to make neutral mobs attack other players. Who would ever do something that devious? + Universal anger does not apply when a neutral mob is attacked by another mob - only when it is attacked by a player + Universal anger is persistent. The angered mob will stay angry even if the player logs out and logs in, or jumps through a portal and back + mcl_mobs.mobs that spread anger will also spread universal anger. So if a player attacks a Zombie Pigman, all other Zombie Pigmen within sight will be universally angry and attack their nearest player + An angered neutral mob will stop being angry if it can't see any eligible target for a while +--]] + +function mcl_mobs.mob:anger_on_staticdata() + if self.anger_persistent then + self.data.anger_target_name = self.anger_target_name + self.data.anger_hurt_timestamp = self.anger_hurt_timestamp + end +end + +function mcl_mobs.mob:anger_on_activate() + if self.data.anger_target_name then + self.anger = true + self.anger_persistent = true + self.anger_target_name = self.data.anger_target_name + self.anger_hurt_timestamp = self.data.anger_hurt_timestamp + + self.data.anger_target_name = nil + self.data.anger_hurt_timestamp = nil + end +end + +function mcl_mobs.mob:get_anger_attack_target() + if not self.anger then + return + end + + -- if the mob is universally angry and the current target is unreachable, search a new one + local search_new_target = self.anger_universal and ( + not self.anger_current_target -- does a current target even exist? + or not self.anger_current_target:is_player() -- universal anger only applies to players, so this is just a check whether the ObjectRef is still valid + or not self:can_see(self.anger_current_target) -- dimension check is not done since it is covered by the view distance check + ) + + if search_new_target then + self.anger_current_target = self:get_player_in_sight() + if self.anger_current_target then + self:debug("found new universal anger target: " .. self.anger_current_target:get_player_name()) + end + end + + -- if the anger is not persistant (e.g. enderman provocation, angry at mobs) + if not self.anger_persistent then + -- calm down if either the target ObjectRef is invalid or changed its dimension + if not self.anger_target:is_player() and not self.anger_target:get_luaentity() or not self:same_dimension_as(self.anger_target) then + self:debug("non persistent anger target unreachable, calming down" .. (self.anger_target_name and "[anger_target_name = " .. self.anger_target_name .. "]" or "")) + return nil, true + end + end + + -- if this is a player, special rules apply (don't use anger_target:is_player() since the player may have logged out so it's not a valid check) + if self.anger_target_name then + -- check if player logged out (if the player had already logged out in the last step anger_target will be nil, else it will be a dangling ObjectRef that can be validated by calling is_player()) + if not self.anger_target or not self.anger_target:is_player() then + if self.anger_target then + self:debug("anger target logged out: " .. self.anger_target_name) + end + -- in case the player relogged (if the player did not relog anger_target becomes nil and this is run in the next step as well) + self.anger_target = minetest.get_player_by_name(self.anger_target_name) + if self.anger_target then + self:debug("anger target relogged: " .. self.anger_target_name) + end + end + -- if forgiveDeadPlayers is true (it is by default) + if self.anger_target and minetest.settings:get_bool("mclForgiveDeadPlayers", true) then + -- check death timestamp of player and forget about the player in case it was killed + if self.anger_target:get_meta():get_int("mcl_mobs:last_death") >= self.hurt_timestamp then + self:debug("forgave " .. self.anger_target_name .. " since they died") + return nil, true + end + end + end + + -- the actual target we want to attack + local target + + -- note: dont use a selfmade ternary expression (v = x and a or b, in other languages that have real ternary expressions this would be v = x ? a : b) here + -- because anger_current_target might be nil and we don't care about the original player if they are not in the area (anger_current_target is only nil if there is absolutely no player in the area) + if self.anger_universal then + target = self.anger_current_target + else + target = self.anger_target + -- if the target is out of reach, it counts as not existant in terms of the reset timer + if target and not self:can_see(target) then + target = nil + if not self.anger_calm_timer then + self:debug("cannot see anger target " .. self.anger_target_name .. " anymore") + end + end + end + + if not target and not self.anger_calm_timer then + -- start to calm down if noone to attack in sight + self:debug("anger target " .. (self.anger_universal and self.anger_target_name .. " " or "") .. "is not reachable anymore, starting calm timer") + self.anger_calm_timer = mcl_mobs.const.calm_down_timer + elseif target and self.anger_calm_timer then + -- stop calming down if there is someone in sight again + self:debug("anger target " .. (self.anger_universal and self.anger_target_name .. " " or "") .. "is reachable again, resetting calm timer") + self.anger_calm_timer = nil + end + + if target then + return target + end + + -- wait for the mob to calm down if there is no target, then clear variables + -- do_timer returns true if the timer has not elapsed yet + if not self:do_timer("anger_calm") then + self:debug("calmed down") + self.anger = nil + self.anger_target = nil + self.anger_target_name = nil + self.anger_universal = nil + self.anger_current_target = nil + self.anger_persistent = nil + self.anger_hurt_timestamp = nil + end +end + +function mcl_mobs.mob:get_angry_raw(target, target_name, timestamp, universal, persistent) + if self.owner == target_name then + return false + end + + self:debug("getting angry at " .. (target_name or tostring(target)) + .. " persistent: " .. (persistent and "yes" or "no") + .. " universal: " .. (universal and "yes" or "no") + ) + + self.anger = true + self.anger_target = target -- even if universally angry, still remember the actual cause to apply forgiveDeadPlayers properly. anger_current_target is used to get the actual attack target + self.anger_target_name = target_name -- remember player name separately to work around the ObjectRef becoming invalid when the player logs out + -- the persistent field is used to optionally forget about the player when they log out or change dimension (e.g. provoking endermen by looking at them) or for when attacked by another mob + self.anger_persistent = persistent + self.anger_hurt_timestamp = timestamp + + if universal then + self.anger_universal = true + -- set this to nil because then universal anger is enabled every mob will look for a new target everytime a provocation happens + self.anger_current_target = nil + end + + return true +end + +function mcl_mobs.mob:get_angry(target) + local timestamp = os.time() + local is_player = target:is_player() + + local universal = is_player and minetest.settings:get_bool("mclUniversalAnger") + local target_name = is_player and target:get_player_name() or "" + local persistent = not is_player + + self:debug("provoked by " .. (target_name or tostring(target)) + .. " persistent: " .. (persistent and "yes" or "no") + .. " universal: " .. (universal and "yes" or "no") + ) + + if not self:get_angry_raw(target, target_name, timestamp, universal, persistent) then + return false + end + + if self.def.group_attack then + for _, obj in pairs(minetest.get_objects_inside_radius(self.object:get_pos(), self.def.view_range)) do + local luaentity = obj:get_luaentity() + if luaentity and self.def.group_attack[luaentity.name] then + luaentity:get_angry_raw(target, target_name, timestamp, universal_anger, persistent) + end + end + end + + return true +end + +minetest.register_on_dieplayer(function(player) + player:get_meta():set_int("mcl_mobs:last_death", os.time()) +end) diff --git a/mods/ENTITIES/mcl_mobs/api/api.lua b/mods/ENTITIES/mcl_mobs/api/api.lua deleted file mode 100644 index d413bae72..000000000 --- a/mods/ENTITIES/mcl_mobs/api/api.lua +++ /dev/null @@ -1,761 +0,0 @@ --- API for Mobs Redo: MineClone 2 Delux 2.0 DRM Free Early Access Super Extreme Edition - --- mobs library -mobs = {} - --- lua locals - can grab from this to easily plop them into the api lua files - ---localize minetest functions -local minetest_settings = minetest.settings -local minetest_get_objects_inside_radius = minetest.get_objects_inside_radius -local minetest_get_modpath = minetest.get_modpath -local minetest_registered_nodes = minetest.registered_nodes -local minetest_get_node = minetest.get_node -local minetest_get_item_group = minetest.get_item_group -local minetest_registered_entities = minetest.registered_entities -local minetest_line_of_sight = minetest.line_of_sight -local minetest_after = minetest.after -local minetest_sound_play = minetest.sound_play -local minetest_add_particlespawner = minetest.add_particlespawner -local minetest_registered_items = minetest.registered_items -local minetest_set_node = minetest.set_node -local minetest_add_item = minetest.add_item -local minetest_get_craft_result = minetest.get_craft_result -local minetest_find_path = minetest.find_path -local minetest_is_protected = minetest.is_protected -local minetest_is_creative_enabled = minetest.is_creative_enabled -local minetest_find_node_near = minetest.find_node_near -local minetest_find_nodes_in_area_under_air = minetest.find_nodes_in_area_under_air -local minetest_raycast = minetest.raycast -local minetest_get_us_time = minetest.get_us_time -local minetest_add_entity = minetest.add_entity -local minetest_get_natural_light = minetest.get_natural_light -local minetest_get_node_or_nil = minetest.get_node_or_nil - --- localize math functions -local math_pi = math.pi -local math_sin = math.sin -local math_cos = math.cos -local math_abs = math.abs -local math_min = math.min -local math_max = math.max -local math_atan = math.atan -local math_random = math.random -local math_floor = math.floor - --- localize vector functions -local vector_new = vector.new -local vector_add = vector.add -local vector_length = vector.length -local vector_direction = vector.direction -local vector_normalize = vector.normalize -local vector_multiply = vector.multiply -local vector_divide = vector.divide - --- mob constants -local BREED_TIME = 30 -local BREED_TIME_AGAIN = 300 -local CHILD_GROW_TIME = 60*20 -local DEATH_DELAY = 0.5 -local DEFAULT_FALL_SPEED = -10 -local FLOP_HEIGHT = 5.0 -local FLOP_HOR_SPEED = 1.5 -local GRAVITY = minetest_settings:get("movement_gravity")-- + 9.81 - - -local MOB_CAP = {} -MOB_CAP.hostile = 70 -MOB_CAP.passive = 10 -MOB_CAP.ambient = 15 -MOB_CAP.water = 15 - --- Load main settings -local damage_enabled = minetest_settings:get_bool("enable_damage") -local disable_blood = minetest_settings:get_bool("mobs_disable_blood") -local mobs_drop_items = minetest_settings:get_bool("mobs_drop_items") ~= false -local mobs_griefing = minetest_settings:get_bool("mobs_griefing") ~= false -local spawn_protected = minetest_settings:get_bool("mobs_spawn_protected") ~= false -local remove_far = true -local difficulty = tonumber(minetest_settings:get("mob_difficulty")) or 1.0 -local show_health = false -local max_per_block = tonumber(minetest_settings:get("max_objects_per_block") or 64) -local mobs_spawn_chance = tonumber(minetest_settings:get("mobs_spawn_chance") or 2.5) - --- pathfinding settings -local enable_pathfinding = true -local stuck_timeout = 3 -- how long before mob gets stuck in place and starts searching -local stuck_path_timeout = 10 -- how long will mob follow path before giving up - --- default nodes -local node_ice = "mcl_core:ice" -local node_snowblock = "mcl_core:snowblock" -local node_snow = "mcl_core:snow" -mobs.fallback_node = minetest.registered_aliases["mapgen_dirt"] or "mcl_core:dirt" - -local mod_weather = minetest_get_modpath("mcl_weather") ~= nil -local mod_explosions = minetest_get_modpath("mcl_explosions") ~= nil -local mod_mobspawners = minetest_get_modpath("mcl_mobspawners") ~= nil -local mod_hunger = minetest_get_modpath("mcl_hunger") ~= nil -local mod_worlds = minetest_get_modpath("mcl_worlds") ~= nil -local mod_armor = minetest_get_modpath("mcl_armor") ~= nil -local mod_experience = minetest_get_modpath("mcl_experience") ~= nil - - --- random locals I found -local los_switcher = false -local height_switcher = false - --- Get translator -local S = minetest.get_translator("mcl_mobs") - --- CMI support check -local use_cmi = minetest.global_exists("cmi") - - --- Invisibility mod check -mobs.invis = {} -if minetest.global_exists("invisibility") then - mobs.invis = invisibility -end - - --- creative check -function mobs.is_creative(name) - return minetest_is_creative_enabled(name) -end - - -local atan = function(x) - if not x or x ~= x then - return 0 - else - return math_atan(x) - end -end - - - - --- Shows helpful debug info above each mob -local mobs_debug = minetest_settings:get_bool("mobs_debug", false) - --- Peaceful mode message so players will know there are no monsters -if minetest_settings:get_bool("only_peaceful_mobs", false) then - minetest.register_on_joinplayer(function(player) - minetest.chat_send_player(player:get_player_name(), - S("Peaceful mode active! No monsters will spawn.")) - end) -end - - -local api_path = minetest.get_modpath(minetest.get_current_modname()).."/api/mob_functions/" - ---ignite all parts of the api -dofile(api_path .. "ai.lua") -dofile(api_path .. "animation.lua") -dofile(api_path .. "collision.lua") -dofile(api_path .. "environment.lua") -dofile(api_path .. "interaction.lua") -dofile(api_path .. "movement.lua") -dofile(api_path .. "set_up.lua") -dofile(api_path .. "attack_type_instructions.lua") -dofile(api_path .. "sound_handling.lua") -dofile(api_path .. "death_logic.lua") -dofile(api_path .. "mob_effects.lua") -dofile(api_path .. "projectile_handling.lua") -dofile(api_path .. "breeding.lua") -dofile(api_path .. "head_logic.lua") - - -mobs.spawning_mobs = {} - - - - --- register mob entity -function mobs:register_mob(name, def) - - local collisionbox = def.collisionbox or {-0.25, -0.25, -0.25, 0.25, 0.25, 0.25} - - -- Workaround for : - -- Increase upper Y limit to avoid mobs glitching through solid nodes. - -- FIXME: Remove workaround if it's no longer needed. - - if collisionbox[5] < 0.79 then - collisionbox[5] = 0.79 - end - - mobs.spawning_mobs[name] = true - - local function scale_difficulty(value, default, min, special) - if (not value) or (value == default) or (value == special) then - return default - else - return math_max(min, value * difficulty) - end - end - - minetest.register_entity(name, { - description = def.description, - use_texture_alpha = def.use_texture_alpha, - stepheight = def.stepheight or 0.6, - stepheight_backup = def.stepheight or 0.6, - name = name, - type = def.type, - attack_type = def.attack_type, - fly = def.fly, - fly_in = def.fly_in or {"air", "__airlike"}, - owner = def.owner or "", - order = def.order or "", - on_die = def.on_die, - spawn_small_alternative = def.spawn_small_alternative, - do_custom = def.do_custom, - jump_height = def.jump_height or 4, -- was 6 - rotate = def.rotate or 0, -- 0=front, 90=side, 180=back, 270=side2 - hp_min = scale_difficulty(def.hp_min, 5, 1), - hp_max = scale_difficulty(def.hp_max, 10, 1), - xp_min = def.xp_min or 1, - xp_max = def.xp_max or 5, - breath_max = def.breath_max or 6, - breathes_in_water = def.breathes_in_water or false, - physical = true, - collisionbox = collisionbox, - collide_with_objects = def.collide_with_objects or false, - selectionbox = def.selectionbox or def.collisionbox, - visual = def.visual, - visual_size = def.visual_size or {x = 1, y = 1}, - mesh = def.mesh, - makes_footstep_sound = def.makes_footstep_sound or false, - view_range = def.view_range or 16, - walk_velocity = def.walk_velocity or 1, - run_velocity = def.run_velocity or 2, - damage = scale_difficulty(def.damage, 0, 0), - light_damage = def.light_damage or 0, - sunlight_damage = def.sunlight_damage or 0, - water_damage = def.water_damage or 0, - lava_damage = def.lava_damage or 8, - fire_damage = def.fire_damage or 1, - suffocation = def.suffocation or true, - fall_damage = def.fall_damage or 1, - fall_speed = def.fall_speed or DEFAULT_FALL_SPEED, -- must be lower than -2 - drops = def.drops or {}, - armor = def.armor or 100, - on_rightclick = mobs.create_mob_on_rightclick(def.on_rightclick), - arrow = def.arrow, - shoot_interval = def.shoot_interval, - sounds = def.sounds or {}, - animation = def.animation, - jump = def.jump ~= false, - walk_chance = def.walk_chance or 50, - attacks_monsters = def.attacks_monsters or false, - group_attack = def.group_attack or false, - passive = def.passive or false, - knock_back = def.knock_back ~= false, - shoot_offset = def.shoot_offset or 0, - floats = def.floats or 1, -- floats in water by default - floats_on_lava = def.floats_on_lava or 0, - replace_rate = def.replace_rate, - replace_what = def.replace_what, - replace_with = def.replace_with, - replace_offset = def.replace_offset or 0, - on_replace = def.on_replace, - timer = 0, - state_timer = 0, - env_damage_timer = 0, - tamed = false, - pause_timer = 0, - gotten = false, - reach = def.reach or 3, - htimer = 0, - texture_list = def.textures, - child_texture = def.child_texture, - docile_by_day = def.docile_by_day or false, - time_of_day = 0.5, - fear_height = def.fear_height or 0, - runaway = def.runaway, - runaway_timer = 0, - pathfinding = def.pathfinding, - immune_to = def.immune_to or {}, - explosion_radius = def.explosion_radius, -- LEGACY - explosion_damage_radius = def.explosion_damage_radius, -- LEGACY - explosiontimer_reset_radius = def.explosiontimer_reset_radius, - explosion_timer = def.explosion_timer or 3, - allow_fuse_reset = def.allow_fuse_reset ~= false, - stop_to_explode = def.stop_to_explode ~= false, - custom_attack = def.custom_attack, - double_melee_attack = def.double_melee_attack, - dogshoot_switch = def.dogshoot_switch, - dogshoot_count = 0, - dogshoot_count_max = def.dogshoot_count_max or 5, - dogshoot_count2_max = def.dogshoot_count2_max or (def.dogshoot_count_max or 5), - attack_animals = def.attack_animals or false, - specific_attack = def.specific_attack, - runaway_from = def.runaway_from, - owner_loyal = def.owner_loyal, - facing_fence = false, - - _cmi_is_mob = true, - - pushable = def.pushable or true, - - --j4i stuff - yaw = 0, - automatic_face_movement_dir = def.rotate or 0, -- 0=front, 90=side, 180=back, 270=side2 - automatic_face_movement_max_rotation_per_sec = 360, --degrees - backface_culling = true, - walk_timer = 0, - stand_timer = 0, - current_animation = "", - gravity = GRAVITY, - swim = def.swim, - swim_in = def.swim_in or {mobs_mc.items.water_source, "mcl_core:water_flowing", mobs_mc.items.river_water_source}, - pitch_switch = "static", - jump_only = def.jump_only, - hostile = def.hostile, - neutral = def.neutral, - attacking = nil, - visual_size_origin = def.visual_size or {x = 1, y = 1, z = 1}, - punch_timer_cooloff = def.punch_timer_cooloff or 0.5, - death_animation_timer = 0, - hostile_cooldown = def.hostile_cooldown or 15, - tilt_fly = def.tilt_fly, - tilt_swim = def.tilt_swim, - fall_slow = def.fall_slow, - projectile_cooldown_min = def.projectile_cooldown_min or 2, - projectile_cooldown_max = def.projectile_cooldown_max or 6, - skittish = def.skittish, - - minimum_follow_distance = def.minimum_follow_distance or 0.5, --make mobs not freak out when underneath - - memory = 0, -- memory timer if chasing/following - fly_random_while_attack = def.fly_random_while_attack, - - --for spiders - always_climb = def.always_climb, - - --despawn mechanic variables - lifetimer_reset = 30, --30 seconds - lifetimer = 30, --30 seconds - - --breeding stuff - breed_timer = 0, - breed_lookout_timer = 0, - breed_distance = def.breed_distance or 1.5, --how far away mobs have to be to begin actual breeding - breed_lookout_timer_goal = 30, --30 seconds (this timer is for how long the mob looks for a mate) - breed_timer_cooloff = 5*60, -- 5 minutes (this timer is for how long the mob has to wait before being bred again) - bred = false, - follow = def.follow, --this item is also used for the breeding mechanism - follow_distance = def.follow_distance or 2, - baby_size = def.baby_size or 0.5, - baby = false, - grow_up_timer = 0, - grow_up_goal = 20*60, --in 20 minutes the mob grows up - special_breed_timer = 0, --this is used for the AHEM AHEM part of breeding - - backup_visual_size = def.visual_size, - backup_collisionbox = collisionbox, - backup_selectionbox = def.selectionbox or def.collisionbox, - - - --fire timer - burn_timer = 0, - - ignores_cobwebs = def.ignores_cobwebs, - breath = def.breath_max or 6, - - random_sound_timer_min = 3, - random_sound_timer_max = 10, - - - --head code variables - --defaults are for the cow's default - --because I don't know what else to set them - --to :P - - has_head = def.has_head or false, - head_bone = def.head_bone, - - --you must use these to adjust the mob's head positions - - --has_head is used as a logic gate (quick easy check) - has_head = def.has_head or false, - --head_bone is the actual bone in the model which the head - --is attached to for animation - head_bone = def.head_bone or "head", - - --this part controls the base position of the head calculations - --localized to the mob's visual yaw when gotten (self.object:get_yaw()) - --you can enable the debug in /mob_functions/head_logic.lua by uncommenting the - --particle spawner code - head_height_offset = def.head_height_offset or 1.0525, - head_direction_offset = def.head_direction_offset or 0.5, - - --this part controls the visual of the head - head_bone_pos_y = def.head_bone_pos_y or 3.6, - head_bone_pos_z = def.head_bone_pos_z or -0.6, - head_pitch_modifier = def.head_pitch_modifier or 0, - - --these variables are switches in case the model - --moves the wrong way - swap_y_with_x = def.swap_y_with_x or false, - reverse_head_yaw = def.reverse_head_yaw or false, - - --END HEAD CODE VARIABLES - - --end j4i stuff - - -- MCL2 extensions - teleport = mobs.teleport, - do_teleport = def.do_teleport, - spawn_class = def.spawn_class, - ignores_nametag = def.ignores_nametag or false, - rain_damage = def.rain_damage or 0, - glow = def.glow, - --can_despawn = can_despawn, - child = def.child or false, - texture_mods = {}, - shoot_arrow = def.shoot_arrow, - sounds_child = def.sounds_child, - explosion_strength = def.explosion_strength, - suffocation_timer = 0, - follow_velocity = def.follow_velocity or 2.4, - instant_death = def.instant_death or false, - fire_resistant = def.fire_resistant or false, - fire_damage_resistant = def.fire_damage_resistant or false, - ignited_by_sunlight = def.ignited_by_sunlight or false, - eye_height = def.eye_height or 1.5, - defuse_reach = def.defuse_reach or 4, - -- End of MCL2 extensions - - on_spawn = def.on_spawn, - - --on_blast = def.on_blast or do_tnt, - - on_step = mobs.mob_step, - - --do_punch = def.do_punch, - - on_punch = mobs.mob_punch, - - --on_breed = def.on_breed, - - --on_grown = def.on_grown, - - --on_detach_child = mob_detach_child, - - on_activate = function(self, staticdata, dtime) - self.object:set_acceleration(vector_new(0,-GRAVITY, 0)) - return mobs.mob_activate(self, staticdata, def, dtime) - end, - - get_staticdata = function(self) - return mobs.mob_staticdata(self) - end, - - --harmed_by_heal = def.harmed_by_heal, - }) - - if minetest_get_modpath("doc_identifier") ~= nil then - doc.sub.identifier.register_object(name, "basics", "mobs") - end - -end -- END mobs:register_mob function - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --- register arrow for shoot attack -function mobs:register_arrow(name, def) - - -- errorcheck - if not name or not def then - print("failed to register arrow entity") - return - end - - minetest.register_entity(name.."_entity", { - - physical = false, - visual = def.visual, - visual_size = def.visual_size, - textures = def.textures, - velocity = def.velocity, - hit_player = def.hit_player, - hit_node = def.hit_node, - hit_mob = def.hit_mob, - hit_object = def.hit_object, - drop = def.drop or false, -- drops arrow as registered item when true - collisionbox = {0, 0, 0, 0, 0, 0}, -- remove box around arrows - timer = 0, - switch = 0, - owner_id = def.owner_id, - rotate = def.rotate, - speed = def.speed or nil, - on_step = function(self) - - local vel = self.object:get_velocity() - - local pos = self.object:get_pos() - - if self.timer > 150 - or not mobs.within_limits(pos, 0) then - mcl_burning.extinguish(self.object) - self.object:remove(); - return - end - - -- does arrow have a tail (fireball) - if def.tail - and def.tail == 1 - and def.tail_texture then - - --do this to prevent clipping through main entity sprite - local pos_adjustment = vector_multiply(vector_normalize(vel), -1) - local divider = def.tail_distance_divider or 1 - pos_adjustment = vector_divide(pos_adjustment, divider) - local new_pos = vector_add(pos, pos_adjustment) - minetest.add_particle({ - pos = new_pos, - velocity = {x = 0, y = 0, z = 0}, - acceleration = {x = 0, y = 0, z = 0}, - expirationtime = def.expire or 0.25, - collisiondetection = false, - texture = def.tail_texture, - size = def.tail_size or 5, - glow = def.glow or 0, - }) - end - - if self.hit_node then - - local node = minetest_get_node(pos).name - - if minetest_registered_nodes[node].walkable then - - self.hit_node(self, pos, node) - - if self.drop == true then - - pos.y = pos.y + 1 - - self.lastpos = (self.lastpos or pos) - - minetest_add_item(self.lastpos, self.object:get_luaentity().name) - end - - self.object:remove(); - - return - end - end - - if self.hit_player or self.hit_mob or self.hit_object then - - for _,player in pairs(minetest_get_objects_inside_radius(pos, 1.5)) do - - if self.hit_player - and player:is_player() then - - if self.hit_player then - self.hit_player(self, player) - else - mobs.arrow_hit(self, player) - end - - self.object:remove(); - return - end - - --[[ - local entity = player:get_luaentity() - - if entity - and self.hit_mob - and entity._cmi_is_mob == true - and tostring(player) ~= self.owner_id - and entity.name ~= self.object:get_luaentity().name - and (self._shooter and entity.name ~= self._shooter:get_luaentity().name) then - - --self.hit_mob(self, player) - self.object:remove(); - return - end - ]]-- - - --[[ - if entity - and self.hit_object - and (not entity._cmi_is_mob) - and tostring(player) ~= self.owner_id - and entity.name ~= self.object:get_luaentity().name - and (self._shooter and entity.name ~= self._shooter:get_luaentity().name) then - - --self.hit_object(self, player) - self.object:remove(); - return - end - ]]-- - end - end - - self.lastpos = pos - end - }) -end - --- Register spawn eggs - --- Note: This also introduces the “spawn_egg” group: --- * spawn_egg=1: Spawn egg (generic mob, no metadata) --- * spawn_egg=2: Spawn egg (captured/tamed mob, metadata) -function mobs:register_egg(mob, desc, background, addegg, no_creative) - - local grp = {spawn_egg = 1} - - -- do NOT add this egg to creative inventory (e.g. dungeon master) - if no_creative == true then - grp.not_in_creative_inventory = 1 - end - - local invimg = background - - if addegg == 1 then - invimg = "mobs_chicken_egg.png^(" .. invimg .. - "^[mask:mobs_chicken_egg_overlay.png)" - end - - -- register old stackable mob egg - minetest.register_craftitem(mob, { - - description = desc, - inventory_image = invimg, - groups = grp, - - _doc_items_longdesc = S("This allows you to place a single mob."), - _doc_items_usagehelp = S("Just place it where you want the mob to appear. Animals will spawn tamed, unless you hold down the sneak key while placing. If you place this on a mob spawner, you change the mob it spawns."), - - on_place = function(itemstack, placer, pointed_thing) - - local pos = pointed_thing.above - - -- am I clicking on something with existing on_rightclick function? - local under = minetest_get_node(pointed_thing.under) - local def = minetest_registered_nodes[under.name] - if def and def.on_rightclick then - return def.on_rightclick(pointed_thing.under, under, placer, itemstack) - end - - if pos - --and within_limits(pos, 0) - and not minetest_is_protected(pos, placer:get_player_name()) then - - local name = placer:get_player_name() - local privs = minetest.get_player_privs(name) - if mod_mobspawners and under.name == "mcl_mobspawners:spawner" then - if minetest_is_protected(pointed_thing.under, name) then - minetest.record_protection_violation(pointed_thing.under, name) - return itemstack - end - if not privs.maphack then - minetest.chat_send_player(name, S("You need the “maphack” privilege to change the mob spawner.")) - return itemstack - end - mcl_mobspawners.setup_spawner(pointed_thing.under, itemstack:get_name()) - if not mobs.is_creative(name) then - itemstack:take_item() - end - return itemstack - end - - if not minetest_registered_entities[mob] then - return itemstack - end - - if minetest_settings:get_bool("only_peaceful_mobs", false) - and minetest_registered_entities[mob].type == "monster" then - minetest.chat_send_player(name, S("Only peaceful mobs allowed!")) - return itemstack - end - - local mob = minetest_add_entity(pos, mob) - minetest.log("action", "Mob spawned: "..name.." at "..minetest.pos_to_string(pos)) - local ent = mob:get_luaentity() - - -- don't set owner if monster or sneak pressed - --[[ - if ent.type ~= "monster" - and not placer:get_player_control().sneak then - ent.owner = placer:get_player_name() - ent.tamed = true - end - ]]-- - - -- set nametag - local nametag = itemstack:get_meta():get_string("name") - if nametag ~= "" then - if string.len(nametag) > MAX_MOB_NAME_LENGTH then - nametag = string.sub(nametag, 1, MAX_MOB_NAME_LENGTH) - end - ent.nametag = nametag - update_tag(ent) - end - - -- if not in creative then take item - if not mobs.is_creative(placer:get_player_name()) then - itemstack:take_item() - end - end - - return itemstack - end, - }) - -end - - diff --git a/mods/ENTITIES/mcl_mobs/api/arrow.lua b/mods/ENTITIES/mcl_mobs/api/arrow.lua new file mode 100644 index 000000000..cd34822bb --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/arrow.lua @@ -0,0 +1,158 @@ +--[[ +function mcl_mobs.register_arrow(name, def) + minetest.register_entity(name.."_entity", { + + physical = false, + visual = def.visual, + visual_size = def.visual_size, + textures = def.textures, + velocity = def.velocity, + hit_player = def.hit_player, + hit_node = def.hit_node, + hit_mob = def.hit_mob, + hit_object = def.hit_object, + drop = def.drop or false, -- drops arrow as registered item when true + collisionbox = {0, 0, 0, 0, 0, 0}, -- remove box around arrows + timer = 0, + switch = 0, + owner_id = def.owner_id, + rotate = def.rotate, + speed = def.speed or nil, + on_step = function(self) + + local vel = self.object:get_velocity() + + local pos = self.object:get_pos() + + if self.timer > 150 + or not mobs.within_limits(pos, 0) then + mcl_burning.extinguish(self.object) + self.object:remove(); + return + end + + -- does arrow have a tail (fireball) + if def.tail + and def.tail == 1 + and def.tail_texture then + + --do this to prevent clipping through main entity sprite + local pos_adjustment = vector.multiply(vector.normalize(vel), -1) + local divider = def.tail_distance_divider or 1 + pos_adjustment = vector.divide(pos_adjustment, divider) + local new_pos = vector.add(pos, pos_adjustment) + minetest.add_particle({ + pos = new_pos, + velocity = {x = 0, y = 0, z = 0}, + acceleration = {x = 0, y = 0, z = 0}, + expirationtime = def.expire or 0.25, + collisiondetection = false, + texture = def.tail_texture, + size = def.tail_size or 5, + glow = def.glow or 0, + }) + end + + if self.hit_node then + + local node = minetest.get_node(pos).name + + if minetest.registered_nodes[node].walkable then + + self.hit_node(self, pos, node) + + if self.drop == true then + + pos.y = pos.y + 1 + + self.lastpos = (self.lastpos or pos) + + minetest.add_item(self.lastpos, self.object:get_luaentity().name) + end + + self.object:remove(); + + return + end + end + + if self.hit_player or self.hit_mob or self.hit_object then + + for _,player in pairs(minetest.get_objects_inside_radius(pos, 1.5)) do + + if self.hit_player + and player:is_player() then + + if self.hit_player then + self.hit_player(self, player) + else + mobs.arrow_hit(self, player) + end + + self.object:remove(); + return + end + + --[[ + local entity = player:get_luaentity() + + if entity + and self.hit_mob + and entity._cmi_is_mob == true + and tostring(player) ~= self.owner_id + and entity.name ~= self.object:get_luaentity().name + and (self._shooter and entity.name ~= self._shooter:get_luaentity().name) then + + --self.hit_mob(self, player) + self.object:remove(); + return + end + ] ]-- + + --[[ + if entity + and self.hit_object + and (not entity._cmi_is_mob) + and tostring(player) ~= self.owner_id + and entity.name ~= self.object:get_luaentity().name + and (self._shooter and entity.name ~= self._shooter:get_luaentity().name) then + + --self.hit_object(self, player) + self.object:remove(); + return + end + ] ]-- + end + end + + self.lastpos = pos + end + }) +end + + +--this is used for arrow collisions +mobs.arrow_hit = function(self, player) + + player:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups = {fleshy = self._damage} + }, nil) + + + --knockback + local pos1 = self.object:get_pos() + pos1.y = 0 + local pos2 = player:get_pos() + pos2.y = 0 + local dir = vector.direction(pos1,pos2) + + dir = vector.multiply(dir,3) + + if player:get_velocity().y <= 1 then + dir.y = 5 + end + + player:add_velocity(dir) +end +]]-- diff --git a/mods/ENTITIES/mcl_mobs/api/baby.lua b/mods/ENTITIES/mcl_mobs/api/baby.lua new file mode 100644 index 000000000..47e9ba0d6 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/baby.lua @@ -0,0 +1,26 @@ +function mcl_mobs.mob:baby_step() + if not self:do_timer("grow_up", true) then + self:baby_grow_up() + end +end + +function mcl_mobs.mob:baby_grow_up() + self:debug("growing up") + self.data.baby = nil + + if self.def.on_grow_up then + self.def.on_grow_up(self) + end + + self:update_textures() + self:update_visual_size() + self:update_eye_height() + self:update_collisionbox() +end + +function mcl_mobs.mob:boost() + self:debug("grow up boost") + self.data.grow_up_timer = self.data.grow_up_timer - self.data.grow_up_timer * mcl_mobs.const.grow_up_boost + -- ToDo: check whether the Minecraft wiki terminology is right about 10% or whether they actually mean 10 percent points + -- (10 percent would be 0.1 * self.data.grow_up_timer, 10 percent points would be 0.1 * self.def.grow_up_goal) +end diff --git a/mods/ENTITIES/mcl_mobs/api/breeding.lua b/mods/ENTITIES/mcl_mobs/api/breeding.lua new file mode 100644 index 000000000..9283b35f5 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/breeding.lua @@ -0,0 +1,27 @@ +function mcl_mobs.mob:start_breed_giveup_timer() + self.breed_giveup_timer = mcl_mobs.const.breed_giveup_timer +end + +function mcl_mobs.mob:breeding_on_activate() + if self.data.breeding then + self:start_breed_giveup_timer() + end +end + +function mcl_mobs.mob:init_breeding() + self:debug("initializing breeding") + self.data.bred = true + self.data.breeding = true + self:start_breed_giveup_timer() +end + +-- looking for hot singles in the area +function mcl_mobs.mob:find_mate() + return self:get_near_object(self.def.view_range, function(self, obj) + local luaentity = obj:get_luaentity() + return luaentity -- dont fook with hoomans + and luaentity.name == self.name -- this is MineClone, not Animal Crossing + and not luaentity.data.bred -- no polygamy pls + and not luaentity.data.baby -- no pedophila pls + end) +end diff --git a/mods/ENTITIES/mcl_mobs/api/common.lua b/mods/ENTITIES/mcl_mobs/api/common.lua new file mode 100644 index 000000000..e150afaa0 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/common.lua @@ -0,0 +1,115 @@ +function mcl_mobs.mob:debug(msg) + if mcl_mobs.const.debug then + minetest.log("[mcl_mobs] " .. tostring(self.object) .. "[" .. self.name .. "]: " .. msg) + end +end + +function mcl_mobs.mob:do_timer(name, persistent) + local k = name .. "_timer" + local t = persistent and self.data or self + local v = t[k] + + if not v then + return + end + + local r = true + + v = v - self.dtime + if v <= 0 then + self:debug(k .. " elapsed") + v = nil + r = false + end + + t[k] = v + + return r +end + +function mcl_mobs.mob:same_dimension_as(obj) + return mcl_worlds.pos_to_dimension(obj:get_pos()) == mcl_worlds.pos_to_dimension(self.object:get_pos()) +end + +function mcl_mobs.mob:can_see(obj) + return vector.distance(obj:get_pos(), self.object:get_pos()) <= self.def.view_range +end + +function mcl_mobs.mob:get_player_in_sight() + return self:get_near_player(self.def.view_range) +end + +function mcl_mobs.mob:is_player_near(radius) + for _, player in pairs(minetest.get_connected_players()) do + if vector.distance(pos, player:get_pos()) < radius then + return true + end + end + return false +end + +function mcl_mobs.mob:get_near_player(radius, condition) + local pos = self.object:get_pos() + local eye_pos = vector.new(pos.x, pos.y + self.eye_height, pos.z) + + local nearest_player + local nearest_distance = radius -- this is very big brain right there, I feel genious + + for _, player in pairs(minetest.get_connected_players()) do + if player:get_hp() > 0 then + local player_pos = obj:get_pos() + if vector.distance(pos, player_pos) < nearest_distance and (not condition or condition(self, player)) and minetest.line_of_sight(eye_pos, vector.new(player_pos.x, player_pos.y + player:get_properties().eye_height, player_pos.z)) then + nearest_player = player + nearest_distance = distance + end + end + end + + return nearest_player +end + +-- I know this repeats some things from the get_near_player function but things need to be optimized so these 2 functions actually differ (believe me, even tho it looks ugly, it makes sense) +function mcl_mobs.mob:get_near_object(radius, condition) + local eye_pos = self.object:get_pos() + eye_pos.y = eye_pos.y + self.eye_height + + for _, obj in ipairs(minetest.get_objects_inside_radius(pos, radius)) do + if obj ~= self.object and mcl_util.get_hp(obj) > 0 and (not condition or condition(self, obj)) then + local obj_eye_pos = obj:get_pos() + obj_eye_pos.y = obj_eye_pos.y + mcl_mobs.util.get_eye_height(obj) + if minetest.line_of_sight(eye_pos, obj_eye_pos) then + return obj + end + end + end +end + +-- this function gets a definition field DYNAMICALLY (if the field is a function, call it and return the result, else return the field directly) +function mcl_mobs.mob:evaluate(key, ...) + local value = self.def[key] + + if value then + if type(value) == "function" then + value = value(self, ...) + end + return value + end +end + +--[[ +--a teleport functoin +mobs.teleport = function(self, target) + if self.do_teleport then + if self.do_teleport(self, target) == false then + return + end + end +end + +--a simple helper function for mobs following +mobs.get_2d_distance = function(pos1,pos2) + pos1.y = 0 + pos2.y = 0 + return(vector.distance(pos1, pos2)) +end +]]-- diff --git a/mods/ENTITIES/mcl_mobs/api/damage.lua b/mods/ENTITIES/mcl_mobs/api/damage.lua new file mode 100644 index 000000000..06456507f --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/damage.lua @@ -0,0 +1,80 @@ +function mcl_mobs.mob:deal_damage(damage, reason) + if self.dead or self.data.invulnerable then + return 0 + end + + if reason.flags.is_fire and self.def.fire_damage_resistant then + return 0 + end + + damage = mcl_damage.run_modifiers(self.object, damage, reason) + + if damage > 0 then + mcl_damage.run_damage_callbacks(self.object, damage, reason) + self.data.health = self.data.health - damage + self.stun_timer = mcl_mobs.const.stun_timer + self:update_movement() + self.object:set_texture_mod("^[colorize:red:120") + + if self.data.health < 0 then + self:die(reason) + else + self:play_sound("damage") + end + end + + return damage +end + +function mcl_mobs.mob:on_punch(puncher, time_from_last_punch, tool_capabilities, direction, damage) + if damage < 0 then + return + end + + local reason = {} + mcl_damage.from_punch(reason, puncher) + mcl_damage.finish_reason(reason) + + if self.def.on_punch then + local args = {puncher = puncher, time_from_last_punch = time_from_last_punch, tool_capabilities = tool_capabilities, direction = direction} + if self.def.on_punch(self, damage, reason, args) == false then + return true + end + end + + self:get_angry(reason.source) + + -- PANIC AND RUN + if self.def.skittish then + self.state = "run" + + self.run_timer = mcl_mobs.const.run_timer + + local pos1 = self.object:get_pos() + pos1.y = 0 + local pos2 = reason.source:get_pos() + pos2.y = 0 + + + local dir = vector.direction(pos2, pos1) + + self.yaw = minetest.dir_to_yaw(direction) + end + + if reason.type == "player" then + mcl_hunger.exhaust(puncher:get_player_name(), mcl_hunger.EXHAUST_ATTACK) + end + + damage = self:deal_damage(damage, reason) + + if damage > 0 then + self:play_sound_specific("default_punch") + self:knockback(reason.source) + end + + return true +end + +function mcl_mobs.mob:update_armor_groups() + self.object:set_armor_groups(self.def.armor_groups) +end diff --git a/mods/ENTITIES/mcl_mobs/api/data.lua b/mods/ENTITIES/mcl_mobs/api/data.lua new file mode 100644 index 000000000..328219055 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/data.lua @@ -0,0 +1,57 @@ +function mcl_mobs.mob:get_staticdata() + if self.dead then + self.object:remove() + return + end + + self:anger_on_staticdata() + + if self.def.on_staticdata then + if self.def.on_staticdata(self) == false then + self.object:remove() + return + end + end + + return minetest.serialize(self.data) +end + +function mcl_mobs.mob:on_activate(staticdata, def, dtime) + self.is_mob = true + self.def = mcl_mobs.registered_mobs[self.name] -- just access the mob def instead of spamming the luaentity itself with a copy of every single definition field that is never mutated + self.description = def.description -- external mods might want to access this + + self.data = minetest.deserialize(staticdata) or {} + + self.data.health = self.data.health or math.random(self.def.health_min, self.def.health_max) + self.data.breath = self.data.breath or self.def.breath_max + self.data.yaw = self.data.yaw or 0 + + self:reload_properties() + self:backup_movement() + + self:anger_on_activate() + self:despawn_on_activate() + self:breeding_on_activate() + + self:set_animation("stand") + self:update_collisionbox() + self:update_eye_height() + self:update_mesh() + self:update_nametag() + self:update_roll() + self:update_textures() + self:update_visual_size() + + if self.def.on_spawn and not self.data.on_spawn_run then + self.def.on_spawn(self) + self.data.on_spawn_run = true + end + + if self.def.on_activate then + if self.def.on_activate(self, staticdata, def, dtime) == false then + self.object:remove() + return + end + end +end diff --git a/mods/ENTITIES/mcl_mobs/api/death.lua b/mods/ENTITIES/mcl_mobs/api/death.lua new file mode 100644 index 000000000..088144001 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/death.lua @@ -0,0 +1,49 @@ +function mcl_mobs.mob:die(reason) + self.dead = true + self.death_timer = mcl_mobs.const.death_timer + + for _, obj in pairs(self.object:get_children()) do + mcl_mount.throw_off(obj) + end + + if minetest.settings:get_bool("doMobDrops", true) then + self:drop_loot(reason) + end + + self:play_sound("death") + self:set_animation("death") + self:set_properties({pointable = false}) + self:update_acceleration() + + if self.def.on_death then + self.def.on_death(self, reason) + end +end + +function mcl_mobs.mob:death_step() + if self:do_timer("death") then + self:update_roll() + else + local pos = self.object:get_pos() + + minetest.add_particlespawner({ + amount = 50, + time = 0.0001, + minpos = vector.add(pos, self.collisionbox.min), + maxpos = vector.add(pos, self.collisionbox.max), + minvel = vector.new(-0.5, 0.5, -0.5), + maxvel = vector.new(0.5, 1.0, 0.5), + minexptime = 1.1, + maxexptime = 1.5, + minsize = 1, + maxsize = 2, + collisiondetection = false, + vertical = false, + texture = "mcl_particles_mob_death.png", + }) + + self:play_sound_specific("mcl_sounds_poof") + + self.object:remove() -- RIP + end +end diff --git a/mods/ENTITIES/mcl_mobs/api/despawn.lua b/mods/ENTITIES/mcl_mobs/api/despawn.lua new file mode 100644 index 000000000..017171145 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/despawn.lua @@ -0,0 +1,24 @@ +function mcl_mobs.mob:despawn_on_activate() + self.data.can_despawn = self.data.can_despawn ~= false and self.def.can_despawn + if self.data.can_despawn then + self.life_timer = life_timer -- how much time is left until next despawn check + end +end + +function mcl_mobs.mob:despawn_step() + if not self:do_timer("life") then + self.life_timer = life_timer + return not self:check_despawn() + end + return true +end + +function mcl_mobs.mob:check_despawn() + self:debug("checking for nearby players") + if not self:is_player_near(despawn_radius) then + self:debug("despawning") + self.object:remove() + return true + end + return false +end diff --git a/mods/ENTITIES/mcl_mobs/api/easteregg.lua b/mods/ENTITIES/mcl_mobs/api/easteregg.lua new file mode 100644 index 000000000..db8b8ee3a --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/easteregg.lua @@ -0,0 +1,34 @@ +function mcl_mobs.mob:update_easteregg() + local old_easteregg = self.easteregg or {} + local eastereggs = table.key_value_swap(mcl_mobs.eastereggs) + + local easteregg_name = eastereggs[self.data.nametag] + local easteregg = old_easteregg + + if old_easteregg.name ~= easteregg_name then + easteregg = { + name = easteregg_name, + [easteregg_name] = true, + } + end + + if easteregg.rainbow ~= old_easteregg.rainbow then + if easteregg.rainbow then + easteregg.hue = 0 + end + elseif easteregg.upside_down ~= old_easteregg.upside_down then + self:update_roll() + self:update_collisionbox() + end + + self.easteregg = easteregg +end + +function mcl_mobs.mob:easteregg_step() + if self.easteregg.rainbow then + self.easteregg.hue = self.easteregg.hue + 60 * self.dtime + self:update_textures() + elseif self.easteregg.spin then + self.data.yaw = self.data.yaw + 180 * dtime + end +end diff --git a/mods/ENTITIES/mcl_mobs/api/eggs.lua b/mods/ENTITIES/mcl_mobs/api/eggs.lua new file mode 100644 index 000000000..9d293a53b --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/eggs.lua @@ -0,0 +1,110 @@ +-- Register spawn eggs + +--[[ +-- Note: This also introduces the “spawn_egg” group: +-- * spawn_egg=1: Spawn egg (generic mob, no metadata) +-- * spawn_egg=2: Spawn egg (captured/tamed mob, metadata) +function mobs:register_egg(mob, desc, background, addegg, no_creative) + + local grp = {spawn_egg = 1} + + -- do NOT add this egg to creative inventory (e.g. dungeon master) + if no_creative == true then + grp.not_in_creative_inventory = 1 + end + + local invimg = background + + if addegg == 1 then + invimg = "mobs_chicken_egg.png^(" .. invimg .. + "^[mask:mobs_chicken_egg_overlay.png)" + end + + -- register old stackable mob egg + minetest.register_craftitem(mob, { + + description = desc, + inventory_image = invimg, + groups = grp, + + _doc_items_longdesc = S("This allows you to place a single mob."), + _doc_items_usagehelp = S("Just place it where you want the mob to appear. Animals will spawn tamed, unless you hold down the sneak key while placing. If you place this on a mob spawner, you change the mob it spawns."), + + on_place = function(itemstack, placer, pointed_thing) + + local pos = pointed_thing.above + + -- am I clicking on something with existing on_rightclick function? + local under = minetest.get_node(pointed_thing.under) + local def = minetest.registered_nodes[under.name] + if def and def.on_rightclick then + return def.on_rightclick(pointed_thing.under, under, placer, itemstack) + end + + if pos + --and within_limits(pos, 0) + and not minetest.is_protected(pos, placer:get_player_name()) then + + local name = placer:get_player_name() + local privs = minetest.get_player_privs(name) + if mod_mobspawners and under.name == "mcl_mobspawners:spawner" then + if minetest.is_protected(pointed_thing.under, name) then + minetest.record_protection_violation(pointed_thing.under, name) + return itemstack + end + if not privs.maphack then + minetest.chat_send_player(name, S("You need the “maphack” privilege to change the mob spawner.")) + return itemstack + end + mcl_mobspawners.setup_spawner(pointed_thing.under, itemstack:get_name()) + if not mobs.is_creative(name) then + itemstack:take_item() + end + return itemstack + end + + if not minetest.registered_entities[mob] then + return itemstack + end + + if minetest.settings:get_bool("only_peaceful_mobs", false) + and minetest.registered_entities[mob].type == "monster" then + minetest.chat_send_player(name, S("Only peaceful mobs allowed!")) + return itemstack + end + + local mob = minetest.add_entity(pos, mob) + minetest.log("action", "mcl_mobs.mob spawned: "..name.." at "..minetest.pos_to_string(pos)) + local ent = mob:get_luaentity() + + -- don't set owner if monster or sneak pressed + --[[ + if ent.type ~= "monster" + and not placer:get_player_control().sneak then + ent.owner = placer:get_player_name() + ent.tamed = true + end + ] ]-- + + -- set nametag + local nametag = itemstack:get_meta():get_string("name") + if nametag ~= "" then + if string.len(nametag) > MAX_MOB_NAME_LENGTH then + nametag = string.sub(nametag, 1, MAX_MOB_NAME_LENGTH) + end + ent.nametag = nametag + update_tag(ent) + end + + -- if not in creative then take item + if not mobs.is_creative(placer:get_player_name()) then + itemstack:take_item() + end + end + + return itemstack + end, + }) + +end +]]-- diff --git a/mods/ENTITIES/mcl_mobs/api/env/breath.lua b/mods/ENTITIES/mcl_mobs/api/env/breath.lua new file mode 100644 index 000000000..328d1cdcd --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/env/breath.lua @@ -0,0 +1,22 @@ +function mcl_mobs.mob:breath_step() + local pos = self.object:get_pos() + + pos.y = pos.y + self.eye_height + + local node = minetest.get_node(pos).name + + if minetest.get_item_group(node, "water") ~= 0 then + self.data.breath = self.data.breath - self.dtime + + if self.data.breath <= 0 then + self:deal_damage(4, {type = "drowning"}) + self.data.breath = 1 + end + + elseif self.data.breath < self.def.breath_max then + self.data.breath = self.data.breath + self.dtime + if self.data.breath > self.def.breath_max then + self.data.breath = self.def.breath_max + end + end +end diff --git a/mods/ENTITIES/mcl_mobs/api/env/collision.lua b/mods/ENTITIES/mcl_mobs/api/env/collision.lua new file mode 100644 index 000000000..a960aae9d --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/env/collision.lua @@ -0,0 +1,65 @@ +function mcl_mobs.mob:collision_step() + local own_box, own_pos, own_boundary = mcl_mobs.util.get_collision_data(self.object) + + local radius = math.max(own_boundary, own_box[5]) + local max_cramming = tonumber(minetest.settings:get("mclMaxEntityCramming")) or mcl_mobs.const.max_entity_cramming + local parent = self.object:get_attach() + + for _, obj in pairs(minetest.get_objects_inside_radius(own_pos, radius * 1.25)) do + if obj ~= self.object and obj ~= parent and obj:get_attach() ~= self.object then + local luaentity = obj:get_luaentity() + + if not luaentity and obj:get_hp() > 0 or luaentity and luaentity.is_mob and not luaentity.dead then + max_cramming = max_cramming - 1 + + if max_cramming <= 0 then + local target, source = self.object, obj + -- hurt adults before babies + if self.data.baby and luaentity then + target, source = source, target -- how the turntables... + end + mcl_util.deal_damage(target, mcl_util.get_hp(target), {type = "cramming", source = source}) + return + end + + local obj_box, obj_pos, obj_boundary = mcl_mobs.util.get_collision_data(obj) + + -- this is checking the difference of the object collided with's possision + -- if positive top of other object is inside (y axis) of current object + + local y_base_diff = obj_pos.y + obj_box[5] - own_pos.y + local y_top_diff = own_pos.y + own_box[5] - obj_pos.y + + local distance = vector.distance( + vector.new(own_pos.x, 0, own_pos.z), + vector.new(obj_pos.x, 0, obj_pos.z) + ) + + local combined_boundary = own_boundary + obj_boundary + + if distance <= combined_boundary and y_base_diff >= 0 and y_top_diff >= 0 then + local dir = vector.direction(own_pos, obj_pos) + dir.y = 0 + + -- eliminate mob being stuck in corners + if dir.x == 0 and dir.z == 0 then + -- slightly adjust mob position to prevent equal length + -- corner/wall sticking + dir.x = dir.x + math.random() / 10 * (math.round(math.random()) * 2 - 1) + dir.z = dir.z + math.random() / 10 * (math.round(math.random()) * 2 - 1) + end + + local obj_vel = vector.multiply(dir, 0.5 * (1 - distance / combined_boundary) * 1.5) + local own_vel = vector.multiply(obj_vel, -10) + + if not luaentity then + obj_vel = vector.multiply(obj_vel, 2.5) + end + + obj:add_velocity(obj_vel) + self.object:add_velocity(own_vel) + end + end + end + end +end diff --git a/mods/ENTITIES/mcl_mobs/api/env/env.lua b/mods/ENTITIES/mcl_mobs/api/env/env.lua new file mode 100644 index 000000000..d9e6506ab --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/env/env.lua @@ -0,0 +1,23 @@ +function mcl_mobs.mob:env_step() + self:fall_damage_step() + + if not self.def.breathes_in_water then + self:breath_step() + end + + mcl_burning.tick(self.object, dtime, self.data) + + if self.dead then + return false + end + + if self.def.ignited_by_sunlight then + self:sunlight_step() + end + + if not self.def.unpushable then + self:collision_step() + end + + return true +end diff --git a/mods/ENTITIES/mcl_mobs/api/env/fall_damage.lua b/mods/ENTITIES/mcl_mobs/api/env/fall_damage.lua new file mode 100644 index 000000000..1c9126792 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/env/fall_damage.lua @@ -0,0 +1,8 @@ +function mcl_mobs.mob:fall_damage_step() + -- ToDo: fall damage based on distance, not velocity + local velocity = self.object:get_velocity() + + if self.last_velocity.y < -7 and velocity.y == 0 then + self:deal_damage(math.abs(self.last_velocity.y + 7) * 2, {type = "fall"}) + end +end diff --git a/mods/ENTITIES/mcl_mobs/api/env/sunlight.lua b/mods/ENTITIES/mcl_mobs/api/env/sunlight.lua new file mode 100644 index 000000000..e6c34c41f --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/env/sunlight.lua @@ -0,0 +1,15 @@ +function mcl_mobs.mob:sunlight_step() + if self.data.burn_time then + return + end + + local pos = self.object:get_pos() + pos.y = pos.y + 0.1 + + if mcl_worlds.pos_to_dimension(pos) == "overworld" then + local ok, light = pcall(minetest.get_natural_light or minetest.get_node_light, pos, minetest.get_timeofday()) + if ok and light >= minetest.LIGHT_MAX then + mcl_burning.set_on_fire(self.object, math.huge) + end + end +end diff --git a/mods/ENTITIES/mcl_mobs/api/graphics/animation.lua b/mods/ENTITIES/mcl_mobs/api/graphics/animation.lua new file mode 100644 index 000000000..4c5b0fc37 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/graphics/animation.lua @@ -0,0 +1,64 @@ +-- set defined animation +function mcl_mobs.mob:set_animation(anim, fixed_frame) + + if not self.animation or not anim then + return + end + + if self.state == "die" and anim ~= "die" and anim ~= "stand" then + return + end + + + if (not self.animation[anim .. "_start"] or not self.animation[anim .. "_end"]) then + return + end + + --animations break if they are constantly set + --so we put this return gate to check if it is + --already at the animation we are trying to implement + if self.current_animation == anim then + return + end + + local a_start = self.animation[anim .. "_start"] + local a_end + + if fixed_frame then + a_end = a_start + else + a_end = self.animation[anim .. "_end"] + end + + self.object:set_animation({ + x = a_start, + y = a_end}, + self.animation[anim .. "_speed"] or self.animation.speed_normal or 15, + 0, self.animation[anim .. "_loop"] ~= false) + + + self.current_animation = anim +end + +--this is a helper function for mobs explosion animation +function mcl_mobs.mob:handle_explosion_animation() + + --secondary catch-all + if not self.explosion_animation then + self.explosion_animation = 0 + end + + --the timer works from 0 for sense of a 0 based counting + --but this just bumps it up so it's usable in here + local explosion_timer_adjust = self.explosion_animation + 1 + + + local visual_size_modified = table.copy(self.visual_size_origin) + + visual_size_modified.x = visual_size_modified.x * (explosion_timer_adjust ^ 3) + visual_size_modified.y = visual_size_modified.y * explosion_timer_adjust + + self.object:set_properties({visual_size = visual_size_modified}) +end + + diff --git a/mods/ENTITIES/mcl_mobs/api/graphics/collisionbox.lua b/mods/ENTITIES/mcl_mobs/api/graphics/collisionbox.lua new file mode 100644 index 000000000..7da2ccf8e --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/graphics/collisionbox.lua @@ -0,0 +1,21 @@ +function mcl_mobs.mob:update_collisionbox() + local box = self.def.collisionbox + + if self.baby and self.def.baby_size then + box = mcl_mobs.util.scale_size(box, self.def.baby_size) + end + + if self.easteregg.upside_down then + box[2], box[5] = -box[5], -box[2] + end + + self.collisionbox = { + min = vector.new(box[1], box[2], box[3]), + max = vector.new(box[4], box[5], box[6]), + } + + self:set_properties({collisionbox = box}) + + self.collisionbox_cache = nil + mcl_mount.update_children_visual_size(self.object) +end diff --git a/mods/ENTITIES/mcl_mobs/api/graphics/eye_height.lua b/mods/ENTITIES/mcl_mobs/api/graphics/eye_height.lua new file mode 100644 index 000000000..fdf2381ba --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/graphics/eye_height.lua @@ -0,0 +1,9 @@ +function mcl_mobs.mob:update_eye_height() + local eye_height = self.def.eye_height + + if self.data.baby and self.def.baby_size then + eye_height = eye_height * self.def.baby_size + end + + self.eye_height = eye_height +end diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/head_logic.lua b/mods/ENTITIES/mcl_mobs/api/graphics/head.lua similarity index 89% rename from mods/ENTITIES/mcl_mobs/api/mob_functions/head_logic.lua rename to mods/ENTITIES/mcl_mobs/api/graphics/head.lua index 0fc94ffe6..66a9bbbe8 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/head_logic.lua +++ b/mods/ENTITIES/mcl_mobs/api/graphics/head.lua @@ -1,4 +1,6 @@ -local vector_new = vector.new + +--[[ +local vector.new = vector.new --converts yaw to degrees @@ -43,7 +45,7 @@ mobs.do_head_logic = function(self,dtime) }) - local bone_pos = vector_new(0,0,0) + local bone_pos = vector.new(0,0,0) --(horizontal) @@ -60,7 +62,7 @@ mobs.do_head_logic = function(self,dtime) --bone_rot.z = bone_rot.z + (dtime * 10) - local head_yaw + local head_yaw head_yaw = minetest.dir_to_yaw(vector.direction(pos,look_at)) - body_yaw if self.reverse_head_yaw then @@ -89,9 +91,9 @@ mobs.do_head_logic = function(self,dtime) local head_pitch = 0 - --DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG + --DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG --head_yaw = 0 - --DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG + --DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG if not check_failed then head_pitch = minetest.dir_to_yaw(vector.new(vector.distance(vector.new(pos.x,0,pos.z),vector.new(look_at.x,0,look_at.z)),0,pos.y-look_at.y))+(math.pi/2) @@ -102,11 +104,12 @@ mobs.do_head_logic = function(self,dtime) end if self.swap_y_with_x then - self.object:set_bone_position(self.head_bone, bone_pos, vector_new(degrees(head_pitch),degrees(head_yaw),0)) + self.object:set_bone_position(self.head_bone, bone_pos, vector.new(degrees(head_pitch),degrees(head_yaw),0)) else - self.object:set_bone_position(self.head_bone, bone_pos, vector_new(degrees(head_pitch),0,degrees(head_yaw))) + self.object:set_bone_position(self.head_bone, bone_pos, vector.new(degrees(head_pitch),0,degrees(head_yaw))) end --set_bone_position([bone, position, rotation]) -end \ No newline at end of file +end +--]] diff --git a/mods/ENTITIES/mcl_mobs/api/graphics/mesh.lua b/mods/ENTITIES/mcl_mobs/api/graphics/mesh.lua new file mode 100644 index 000000000..4472ceb98 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/graphics/mesh.lua @@ -0,0 +1,6 @@ +function mcl_mobs.mob:update_mesh() + self:set_properties({ + visual = "mesh", + mesh = self.def.model, + }) +end diff --git a/mods/ENTITIES/mcl_mobs/api/graphics/nametag.lua b/mods/ENTITIES/mcl_mobs/api/graphics/nametag.lua new file mode 100644 index 000000000..52bf32e36 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/graphics/nametag.lua @@ -0,0 +1,7 @@ +function mcl_mobs.mob:update_nametag() + self:update_easteregg() + + self:set_properties({ + nametag = self.data.nametag, + }) +end diff --git a/mods/ENTITIES/mcl_mobs/api/graphics/rotation.lua b/mods/ENTITIES/mcl_mobs/api/graphics/rotation.lua new file mode 100644 index 000000000..8eee69392 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/graphics/rotation.lua @@ -0,0 +1,110 @@ +-- this is used when a mob is following player and for when mobs breed +function mcl_mobs.mob:look_at(obj) + self:lock_yaw() + + -- turn positions into pseudo 2d vectors + local pos1 = self.object:get_pos() + pos1.y = 0 + + local pos2 = obj:get_pos() + pos2.y = 0 + + local new_direction = vector.direction(pos1, pos2) + local new_yaw = minetest.dir_to_yaw(new_direction) + + self.object:set_yaw(new_yaw) + self.yaw = new_yaw +end + +-- this allows auto facedir rotation while making it so mobs +-- don't look like wet noodles flopping around +function mcl_mobs.mob:movement_rotation_lock() + local current_engine_yaw = self.object:get_yaw() + local current_lua_yaw = self.yaw + + if current_engine_yaw > math.pi * 2 then + current_engine_yaw = current_engine_yaw - math.pi * 2 + end + + local diff = math.abs(current_engine_yaw - current_lua_yaw) + + if diff <= 0.05 then + self:lock_yaw() + elseif diff > 0.05 then + self:unlock_yaw() + end +end + +-- this is used to unlock a mob's yaw after attacking +function mcl_mobs.mob:unlock_yaw() + if not self.properties.automatic_face_movement_dir then + self:set_properties({automatic_face_movement_dir = self.def.rotate}) + end +end + +-- this is used to lock a mob's yaw when they're standing +function mcl_mobs.mob:lock_yaw() + if self.properties.automatic_face_movement_dir then + self:set_properties({automatic_face_movement_dir = false}) + end +end + +function mcl_mobs.mob:calculate_pitch(self) + local pos = self.object:get_pos() + local pos2 = self.old_pos + + if pos == nil or pos2 == nil then + return false + end + + return minetest.dir_to_yaw(vector.new(vector.distance(vector.new(pos.x, 0, pos.z), vector.new(pos2.x, 0, pos2.z)), 0, pos.y - pos2.y)) + math.pi / 2 +end + +--this is a helper function used to make mobs pitch rotation dynamically flow when flying/swimming +function mcl_mobs.mob:set_dynamic_pitch() + local pitch = self:calculate_pitch() + + if not pitch then + return + end + + local rotation = self.object:get_rotation() + rotation.x = pitch + self.object:set_rotation(rotation) + + self.dynamic_pitch = true +end + +--this is a helper function used to make mobs pitch rotation reset when flying/swimming +function mcl_mobs.mob:set_static_pitch() + if not self.dynamic_pitch then + return + end + + local current_rotation = self.object:get_rotation() + current_rotation.x = 0 + self.object:set_rotation(current_rotation) + + self.dynamic_pitch = nil +end + +function mcl_mobs.mob:quick_rotate() + self.yaw = self.yaw + math.pi * 2 * 0.03125 + if self.yaw > math.pi * 2 then + self.yaw = self.yaw - math.pi * 2 + end +end + +function mcl_mobs.mob:update_roll() + local roll = 0 + + if self.dead then + roll = math.pi * math.min(0.5, 1 - self.death_timer / mcl_mobs.const.death_timer) + elseif self.easteregg.upside_down then + roll = math.pi + end + + local rotation = self.object:get_rotation() + rotation.z = roll + self.object:set_rotation(rotation) +end diff --git a/mods/ENTITIES/mcl_mobs/api/graphics/textures.lua b/mods/ENTITIES/mcl_mobs/api/graphics/textures.lua new file mode 100644 index 000000000..267fb969c --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/graphics/textures.lua @@ -0,0 +1,17 @@ +function mcl_mobs.mob:get_special_textures() + if self.baby then + return self:evaluate("baby_textures") + elseif self.gotten then + return self:evaluate("gotten_textures") + elseif self.easteregg.rainbow then + return self:evaluate("rainbow_textures", mcl_mobs.util.color_from_hue(self.easteregg.hue)) + end +end + +function mcl_mobs.mob:get_textures() + return self:get_special_textures() or self:calculate_textures(self.def.textures) +end + +function mcl_mobs.mob:update_textures() + self:set_properties({textures = self:get_textures()}) +end diff --git a/mods/ENTITIES/mcl_mobs/api/graphics/visual_size.lua b/mods/ENTITIES/mcl_mobs/api/graphics/visual_size.lua new file mode 100644 index 000000000..fa3f7dab2 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/graphics/visual_size.lua @@ -0,0 +1,21 @@ +function mcl_mobs.mob:update_visual_size() + local size = self.def.visual_size + + if self.data.size then + mcl_mobs.util.scale_size(size, self.data.size) + end + + if self.data.baby and self.def.baby_size then + mcl_mobs.util.scale_size(size, self.def.baby_size) + end + + local parent = self.object:get_attach() + + if parent then + size = vector.divide(size, parent:get_properties().visual_size) + end + + self:set_properties({visual_size = size}) + + mcl_mount.update_children_visual_size(self.object) +end diff --git a/mods/ENTITIES/mcl_mobs/api/interaction.lua b/mods/ENTITIES/mcl_mobs/api/interaction.lua new file mode 100644 index 000000000..5d22b71af --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/interaction.lua @@ -0,0 +1,59 @@ +function mcl_mobs.mob:on_rightclick(clicker) + local itemstack = clicker:get_wielded_item() + + if self:on_rightclick_handler(clicker, itemstack) then + clicker:set_wielded_item(itemstack) + end +end + +function mcl_mobs.mob:feed(clicker, itemname) + if self.data.heal_with[itemname] and self.data.health < self.def.health_max then + self:heal() + elseif self.def.boost_with[itemname] and self.data.baby then + self:boost() + elseif self.def.breed_with[itemname] and not self.data.bred then + self:init_breeding() + elseif self.data.tame_with[itemname] and not self.def.tamed then + self:tame(clicker) + else + return false + end + + return true +end + +function mcl_mobs.mob:on_rightclick_handler(clicker, itemstack) + if self.dead then + return false + end + + if self.def.on_rightclick then + if self.def.on_rightclick(clicker, itemstack) then + return true + end + end + + local itemname = itemstack:get_name() + + if not self.def.ignores_nametag and itemname == "mcl_mobitems:nametag" then + local tag = item:get_meta():get_string("name") + if tag ~= "" then + self.data.nametag = tag + self:update_nametag() + + return mcl_mobs.util.take_item(clicker, itemstack) + end + end + + if self:feed(clicker, itemstack) then + mcl_mobs.util.take_item(clicker, itemname) + self:play_sound_specific("mobs_mc_animal_eat_generic") + return true + end + + if not self.data.gotten and self.def.get_with[itemname] and self.def.get(self, clicker, itemstack) then + self.data.gotten = true + self.data.gotten_timer = self:evaluate("gotten_cooldown") + return true + end +end diff --git a/mods/ENTITIES/mcl_mobs/api/knockback.lua b/mods/ENTITIES/mcl_mobs/api/knockback.lua new file mode 100644 index 000000000..8ff898c0b --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/knockback.lua @@ -0,0 +1,35 @@ +function mcl_mobs.mob:knockback(hitter) + if self.def.knockback_multiplier == 0 then + return + end + + if hitter:get_attach() == self.object then + return + end + + local velocity = self.object:get_velocity() + + local pos1 = self.object:get_pos() + pos1.y = 0 + local pos2 = hitter:get_pos() + pos2.y = 0 + local dir = vector.direction(pos2, pos1) + + local up = mcl_mobs.const.knockback_up + + if velocity.y ~= 0 then + up = 0 + end + + local multiplier = mcl_mobs.const.knockback + + local knockback_level = mcl_enchanting.get_enchantment(mcl_util.get_wield_item(hitter), "knockback") + if knockback_level > 0 then + multiplier = multiplier + knockback_level * 3 + end + + dir = vector.multiply(dir, multiplier * self.def.knockback_multiplier) + dir.y = up * self.def.knockback_multiplier + + self.object:add_velocity(dir) +end diff --git a/mods/ENTITIES/mcl_mobs/api/loot.lua b/mods/ENTITIES/mcl_mobs/api/loot.lua new file mode 100644 index 000000000..b2e756285 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/loot.lua @@ -0,0 +1,62 @@ +function mcl_mobs.mob:drop_loot(reason) + if self.data.baby and self.def.type ~= "monster" then + return + end + + local enchantments = reason.source and mcl_enchanting.get_enchantments(mcl_util.get_wield_item(reason.source)) or {} + + local cooked = self.data.burn_time or enchantments.fire_aspect + local looting = enchantments.looting or 0 + + mcl_experience.throw_experience(self.object:get_pos(), math.random(self.def.xp_min, self.def.xp_max)) + + local pos = self.object:get_pos() + + for _, dropdef in pairs(self:evaluate("drops")) do + local chance = 1 / dropdef.chance + local looting_type = dropdef.looting + + if looting > 0 then + local chance_function = dropdef.looting_chance_function + if chance_function then + chance = chance_function(looting_level) + elseif looting_type == "rare" then + chance = chance + (dropdef.looting_factor or 0.01) * looting_level + end + end + + local count = 0 + + local do_common_looting = looting > 0 and looting_type == "common" + + if math.random() < chance then + num = math.random(dropdef.min or 1, dropdef.max or 1) + elseif not dropdef.looting_ignore_chance then + do_common_looting = false + end + + if do_common_looting then + num = num + math.floor(math.random(0, looting_level) + 0.5) + end + + if count > 0 then + local item = dropdef.name + + if cooked and dropdef.cookable then + local output = minetest.get_craft_result({method = "cooking", width = 1, items = {item}}) + + if output and output.item and not output.item:is_empty() then + item = output.item:get_name() + end + end + + for x = 1, count do + minetest.add_item(pos, ItemStack(item)):set_velocity({ + x = math.random(-10, 10) / 9, + y = 6, + z = math.random(-10, 10) / 9, + }) + end + end + end +end diff --git a/mods/ENTITIES/mcl_mobs/api/main.lua b/mods/ENTITIES/mcl_mobs/api/main.lua new file mode 100644 index 000000000..b8fbeaa2f --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/main.lua @@ -0,0 +1,60 @@ +function mcl_mobs.mob:on_step(dtime, moveresult) + self.dtime = dtime + self:reload_properties() + + local stunned = self.stun_timer and self:do_timer("stun") + + -- can be true (currently stunned), nil (not stunned) or false (stopped being stunned in this tick, which is what we want to check for here) + if stunned == false then + self.object:set_texture_mod("") + end + + self:update_node_type() + self:movement_step() + + if self.dead then + self:death_step() + return + end + + if self.def.hostile and not minetest.settings:get_bool("mclPeacefulMode") then + self:debug("peaceful mode active, removing") + self:deal_damage(self.data.health, {type = "out_of_world"}) + end + + if self.data.can_despawn then + if not self:despawn_step() then + return + end + end + + if self.def.on_step then + if self.def.on_step(self, dtime, moveresult) == false then + return + end + end + + if not self.data.silent then + self:sound_step() + end + + self:easteregg_step() + + if not self:env_step() then + return + end + + if self.data.baby then + self:baby_step() + end + + if self.data.gotten and not self:do_timer("gotten", true) then + self.data.gotten = nil + end + + if not self.data.no_ai and not stunned then + self:ai_step() + end + + self:backup_movement() +end diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua deleted file mode 100644 index eda7e8871..000000000 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ /dev/null @@ -1,1153 +0,0 @@ -local math_random = math.random -local math_pi = math.pi -local math_floor = math.floor -local math_round = math.round - -local vector_multiply = vector.multiply -local vector_add = vector.add -local vector_new = vector.new -local vector_distance = vector.distance - -local minetest_yaw_to_dir = minetest.yaw_to_dir -local minetest_get_item_group = minetest.get_item_group -local minetest_get_node = minetest.get_node -local minetest_line_of_sight = minetest.line_of_sight -local minetest_get_node_light = minetest.get_node_light - -local DOUBLE_PI = math.pi * 2 -local THIRTY_SECONDTH_PI = DOUBLE_PI * 0.03125 - - ---a simple helper function which is too small to move into movement.lua -local quick_rotate = function(self,dtime) - self.yaw = self.yaw + THIRTY_SECONDTH_PI - if self.yaw > DOUBLE_PI then - self.yaw = self.yaw - DOUBLE_PI - end -end - ---a simple helper function for rounding ---http://lua-users.org/wiki/SimpleRound -function round2(num, numDecimalPlaces) - return tonumber(string.format("%." .. (numDecimalPlaces or 0) .. "f", num)) -end - - ---[[ - _ _ -| | | | -| | __ _ _ __ __| | -| | / _` | '_ \ / _` | -| |___| (_| | | | | (_| | -\_____/\__,_|_| |_|\__,_| -]]-- - ---this is basically reverse jump_check -local cliff_check = function(self,dtime) - --mobs will flip out if they are falling without this - if self.object:get_velocity().y ~= 0 then - return false - end - - local pos = self.object:get_pos() - local dir = minetest_yaw_to_dir(self.yaw) - local collisionbox = self.object:get_properties().collisionbox - local radius = collisionbox[4] + 0.5 - - dir = vector_multiply(dir,radius) - - local free_fall, blocker = minetest_line_of_sight( - {x = pos.x + dir.x, y = pos.y, z = pos.z + dir.z}, - {x = pos.x + dir.x, y = pos.y - self.fear_height, z = pos.z + dir.z}) - - return free_fall -end - - --- state switching logic (stand, walk, run, attacks) -local land_state_list_wandering = {"stand", "walk"} - -local land_state_switch = function(self, dtime) - - --do math before sure not attacking, following, or running away so continue - --doing random walking for mobs if all states are not met - self.state_timer = self.state_timer - dtime - - --only run away - if self.skittish and self.state == "run" then - self.run_timer = self.run_timer - dtime - if self.run_timer > 0 then - return - end - --continue - end - - --ignore everything else if breeding - if self.breed_lookout_timer and self.breed_lookout_timer > 0 then - self.state = "breed" - return - --reset the state timer to get the mob out of - --the breed state - elseif self.state == "breed" then - self.state_timer = 0 - end - - --ignore everything else if following - if mobs.check_following(self) and - (not self.breed_lookout_timer or (self.breed_lookout_timer and self.breed_lookout_timer == 0)) and - (not self.breed_timer or (self.breed_timer and self.breed_timer == 0)) then - self.state = "follow" - return - --reset the state timer to get the mob out of - --the follow state - not the cleanest option - --but the easiest - elseif self.state == "follow" then - self.state_timer = 0 - end - - --only attack - if self.hostile and self.attacking then - self.state = "attack" - return - end - - --if finally reached here then do random wander - if self.state_timer <= 0 then - self.state_timer = math.random(4,10) + math.random() - self.state = land_state_list_wandering[math.random(1,#land_state_list_wandering)] - end - -end - --- states are executed here -local land_state_execution = function(self,dtime) - - --[[ -- this is a debug which shows the timer and makes mobs breed 100 times faster - print(self.breed_timer) - if self.breed_timer > 0 then - self.breed_timer = self.breed_timer - (dtime * 100) - if self.breed_timer <= 0 then - self.breed_timer = 0 - end - end - ]]-- - - --no collisionbox exception - if not self.object:get_properties() then - return - end - - - --timer to time out looking for mate - if self.breed_lookout_timer and self.breed_lookout_timer > 0 then - self.breed_lookout_timer = self.breed_lookout_timer - dtime - --looking for mate failed - if self.breed_lookout_timer <= 0 then - self.breed_lookout_timer = 0 - end - end - - --cool off after breeding - if self.breed_timer and self.breed_timer > 0 then - self.breed_timer = self.breed_timer - dtime - --do this to skip the first check, using as switch - if self.breed_timer <= 0 then - self.breed_timer = 0 - end - end - - - local pos = self.object:get_pos() - local collisionbox = self.object:get_properties().collisionbox - --get the center of the mob - pos.y = pos.y + (collisionbox[2] + collisionbox[5] / 2) - local current_node = minetest_get_node(pos).name - local float_now = false - - --recheck if in water or lava - if minetest_get_item_group(current_node, "water") ~= 0 or minetest_get_item_group(current_node, "lava") ~= 0 then - float_now = true - end - - --make slow falling mobs fall slow - if self.fall_slow then - local velocity = self.object:get_velocity() - if velocity then - if velocity.y < 0 then - --lua is acting really weird so we have to help it - if round2(self.object:get_acceleration().y, 1) == -self.gravity then - self.object:set_acceleration(vector_new(0,0,0)) - mobs.mob_fall_slow(self) - end - else - if round2(self.object:get_acceleration().y, 1) == 0 then - self.object:set_acceleration(vector_new(0,-self.gravity,0)) - end - end - end - end - - --calculate fall damage - if self.fall_damage then - mobs.calculate_fall_damage(self) - end - - if self.state == "stand" then - - --do animation - mobs.set_mob_animation(self, "stand") - - --set the velocity of the mob - mobs.set_velocity(self,0) - - --animation fixes for explosive mobs - if self.attack_type == "explode" then - mobs.reverse_explosion_animation(self,dtime) - end - - mobs.lock_yaw(self) - elseif self.state == "follow" then - - --always look at players - mobs.set_yaw_while_following(self) - - --check distance - local distance_from_follow_person = vector_distance(self.object:get_pos(), self.following_person:get_pos()) - local distance_2d = mobs.get_2d_distance(self.object:get_pos(), self.following_person:get_pos()) - - --don't push the player if too close - --don't spin around randomly - if self.follow_distance < distance_from_follow_person and self.minimum_follow_distance < distance_2d then - mobs.set_mob_animation(self, "run") - mobs.set_velocity(self,self.run_velocity) - - if mobs.jump_check(self) == 1 then - mobs.jump(self) - end - else - mobs.set_mob_animation(self, "stand") - mobs.set_velocity(self,0) - end - - elseif self.state == "walk" then - - self.walk_timer = self.walk_timer - dtime - - --reset the walk timer - if self.walk_timer <= 0 then - - --re-randomize the walk timer - self.walk_timer = math.random(1,6) + math.random() - - --set the mob into a random direction - self.yaw = (math_random() * (math.pi * 2)) - end - - --do animation - mobs.set_mob_animation(self, "walk") - - --enable rotation locking - mobs.movement_rotation_lock(self) - - --check for nodes to jump over - local node_in_front_of = mobs.jump_check(self) - - if node_in_front_of == 1 then - - mobs.jump(self) - - --turn if on the edge of cliff - --(this is written like this because unlike - --jump_check which simply tells the mob to jump - --this requires a mob to turn, removing the - --ease of a full implementation for it in a single - --function) - elseif node_in_front_of == 2 or (self.fear_height ~= 0 and cliff_check(self,dtime)) then - --turn 45 degrees if so - quick_rotate(self,dtime) - --stop the mob so it doesn't fall off - mobs.set_velocity(self,0) - end - - --only move forward if path is clear - if node_in_front_of == 0 or node_in_front_of == 1 then - --set the velocity of the mob - mobs.set_velocity(self,self.walk_velocity) - end - - --animation fixes for explosive mobs - if self.attack_type == "explode" then - mobs.reverse_explosion_animation(self,dtime) - end - - elseif self.state == "run" then - - --do animation - mobs.set_mob_animation(self, "run") - - --enable rotation locking - mobs.movement_rotation_lock(self) - - --check for nodes to jump over - local node_in_front_of = mobs.jump_check(self) - - if node_in_front_of == 1 then - - mobs.jump(self) - - --turn if on the edge of cliff - --(this is written like this because unlike - --jump_check which simply tells the mob to jump - --this requires a mob to turn, removing the - --ease of a full implementation for it in a single - --function) - elseif node_in_front_of == 2 or (self.fear_height ~= 0 and cliff_check(self,dtime)) then - --turn 45 degrees if so - quick_rotate(self,dtime) - --stop the mob so it doesn't fall off - mobs.set_velocity(self,0) - end - - --only move forward if path is clear - if node_in_front_of == 0 or node_in_front_of == 1 then - --set the velocity of the mob - mobs.set_velocity(self,self.run_velocity) - end - - elseif self.state == "attack" then - - --execute mob attack type - if self.attack_type == "explode" then - - mobs.explode_attack_walk(self, dtime) - - elseif self.attack_type == "punch" then - - mobs.punch_attack_walk(self,dtime) - - elseif self.attack_type == "projectile" then - - mobs.projectile_attack_walk(self,dtime) - - end - elseif self.state == "breed" then - - mobs.breeding_effect(self) - - local mate = mobs.look_for_mate(self) - - --found a mate - if mate then - mobs.set_yaw_while_breeding(self,mate) - mobs.set_velocity(self, self.walk_velocity) - - --smoosh together basically - if vector_distance(self.object:get_pos(), mate:get_pos()) <= self.breed_distance then - mobs.set_mob_animation(self, "stand") - if self.special_breed_timer == 0 then - self.special_breed_timer = 2 --breeding takes 2 seconds - end - - self.special_breed_timer = self.special_breed_timer - dtime - if self.special_breed_timer <= 0 then - - --pop a baby out, it's a miracle! - local baby_pos = vector.divide(vector.add(self.object:get_pos(), mate:get_pos()), 2) - local baby_mob = minetest.add_entity(pos, self.name, minetest.serialize({baby = true, grow_up_timer = self.grow_up_goal, bred = true})) - - mobs.play_sound_specific(self,"item_drop_pickup") - - self.special_breed_timer = 0 - self.breed_lookout_timer = 0 - self.breed_timer = self.breed_timer_cooloff - - mate:get_luaentity().special_breed_timer = 0 - mate:get_luaentity().breed_lookout_timer = 0 - mate:get_luaentity().breed_timer = self.breed_timer_cooloff -- can reuse because it's the same mob - end - else - mobs.set_mob_animation(self, "walk") - end - --couldn't find a mate, just stand there until the player pushes it towards one - --or the timer runs out - else - mobs.set_mob_animation(self, "stand") - mobs.set_velocity(self,0) - end - - end - - if float_now then - mobs.float(self) - else - local acceleration = self.object:get_acceleration() - if acceleration and acceleration.y == 0 then - self.object:set_acceleration(vector_new(0,-self.gravity,0)) - end - end -end - - - - ---[[ - _____ _ -/ ___| (_) -\ `--.__ ___ _ __ ___ - `--. \ \ /\ / / | '_ ` _ \ -/\__/ /\ V V /| | | | | | | -\____/ \_/\_/ |_|_| |_| |_| -]]-- - - - --- state switching logic (stand, walk, run, attacks) -local swim_state_list_wandering = {"stand", "swim"} - -local swim_state_switch = function(self, dtime) - self.state_timer = self.state_timer - dtime - if self.state_timer <= 0 then - self.state_timer = math.random(4,10) + math.random() - self.state = swim_state_list_wandering[math.random(1,#swim_state_list_wandering)] - end -end - - ---check if a mob needs to turn while swimming -local swim_turn_check = function(self,dtime) - - local pos = self.object:get_pos() - pos.y = pos.y + 0.1 - local dir = minetest_yaw_to_dir(self.yaw) - - local collisionbox = self.object:get_properties().collisionbox - local radius = collisionbox[4] + 0.5 - - vector_multiply(dir, radius) - - local test_dir = vector.add(pos,dir) - - local green_flag_1 = minetest_get_item_group(minetest_get_node(test_dir).name, "solid") ~= 0 - - return(green_flag_1) -end - ---this is to swap the built in engine acceleration modifier -local swim_physics_swapper = function(self,inside_swim_node) - - --should be swimming, gravity is applied, switch to floating - if inside_swim_node and self.object:get_acceleration().y ~= 0 then - self.object:set_acceleration(vector_new(0,0,0)) - --not be swim, gravity isn't applied, switch to falling - elseif not inside_swim_node and self.object:get_acceleration().y == 0 then - self.pitch = 0 - self.object:set_acceleration(vector_new(0,-self.gravity,0)) - end -end - - -local random_pitch_multiplier = {-1,1} --- states are executed here -local swim_state_execution = function(self,dtime) - - local pos = self.object:get_pos() - - pos.y = pos.y + self.object:get_properties().collisionbox[5] - local current_node = minetest_get_node(pos).name - local inside_swim_node = false - - --quick scan everything to see if inside swim node - for _,id in pairs(self.swim_in) do - if id == current_node then - inside_swim_node = true - break - end - end - - --turn gravity on or off - swim_physics_swapper(self,inside_swim_node) - - --swim properly if inside swim node - if inside_swim_node then - - if self.state == "stand" then - - --do animation - mobs.set_mob_animation(self, "stand") - - mobs.set_swim_velocity(self,0) - - if self.tilt_swim then - mobs.set_static_pitch(self) - end - - mobs.lock_yaw(self) - - elseif self.state == "swim" then - - self.walk_timer = self.walk_timer - dtime - - --reset the walk timer - if self.walk_timer <= 0 then - - --re-randomize the walk timer - self.walk_timer = math.random(1,6) + math.random() - - --set the mob into a random direction - self.yaw = (math_random() * (math.pi * 2)) - - --create a truly random pitch, since there is no easy access to pitch math that I can find - self.pitch = math_random() * math.random(1,3) * random_pitch_multiplier[math_random(1,2)] - end - - --do animation - mobs.set_mob_animation(self, "walk") - - --do a quick turn to make mob continuously move - --if in a fish tank or something - if swim_turn_check(self,dtime) then - quick_rotate(self,dtime) - end - - mobs.set_swim_velocity(self,self.walk_velocity) - - --only enable tilt swimming if enabled - if self.tilt_swim then - mobs.set_dynamic_pitch(self) - end - - --enable rotation locking - mobs.movement_rotation_lock(self) - end - --flop around if not inside swim node - else - --do animation - mobs.set_mob_animation(self, "stand") - - mobs.flop(self) - - if self.tilt_swim then - mobs.set_static_pitch(self) - end - end - -end - - ---[[ -______ _ -| ___| | -| |_ | |_ _ -| _| | | | | | -| | | | |_| | -\_| |_|\__, | - __/ | - |___/ -]]-- - --- state switching logic (stand, walk, run, attacks) -local fly_state_list_wandering = {"stand", "fly"} - -local fly_state_switch = function(self, dtime) - - if self.hostile and self.attacking then - self.state = "attack" - return - end - - self.state_timer = self.state_timer - dtime - if self.state_timer <= 0 then - self.state_timer = math.random(4,10) + math.random() - self.state = fly_state_list_wandering[math.random(1,#fly_state_list_wandering)] - end -end - - ---check if a mob needs to turn while flying -local fly_turn_check = function(self,dtime) - - local pos = self.object:get_pos() - pos.y = pos.y + 0.1 - local dir = minetest_yaw_to_dir(self.yaw) - - local collisionbox = self.object:get_properties().collisionbox - local radius = collisionbox[4] + 0.5 - - vector_multiply(dir, radius) - - local test_dir = vector.add(pos,dir) - - local green_flag_1 = minetest_get_item_group(minetest_get_node(test_dir).name, "solid") ~= 0 - - return(green_flag_1) -end - ---this is to swap the built in engine acceleration modifier -local fly_physics_swapper = function(self,inside_fly_node) - - --should be flyming, gravity is applied, switch to floating - if inside_fly_node and self.object:get_acceleration().y ~= 0 then - self.object:set_acceleration(vector_new(0,0,0)) - --not be fly, gravity isn't applied, switch to falling - elseif not inside_fly_node and self.object:get_acceleration().y == 0 then - self.pitch = 0 - self.object:set_acceleration(vector_new(0,-self.gravity,0)) - end -end - - -local random_pitch_multiplier = {-1,1} --- states are executed here -local fly_state_execution = function(self,dtime) - local pos = self.object:get_pos() - pos.y = pos.y + 0.1 - local current_node = minetest_get_node(pos).name - local inside_fly_node = minetest_get_item_group(current_node, "solid") == 0 - - local float_now = false - --recheck if in water or lava - if minetest_get_item_group(current_node, "water") ~= 0 or minetest_get_item_group(current_node, "lava") ~= 0 then - inside_fly_node = false - float_now = true - end - - --turn gravity on or off - fly_physics_swapper(self,inside_fly_node) - - --fly properly if inside fly node - if inside_fly_node then - if self.state == "stand" then - - --do animation - mobs.set_mob_animation(self, "stand") - - mobs.set_fly_velocity(self,0) - - if self.tilt_fly then - mobs.set_static_pitch(self) - end - - mobs.lock_yaw(self) - - elseif self.state == "fly" then - - self.walk_timer = self.walk_timer - dtime - - --reset the walk timer - if self.walk_timer <= 0 then - - --re-randomize the walk timer - self.walk_timer = math.random(1,6) + math.random() - - --set the mob into a random direction - self.yaw = (math_random() * (math.pi * 2)) - - --create a truly random pitch, since there is no easy access to pitch math that I can find - self.pitch = math_random() * math.random(1,3) * random_pitch_multiplier[math_random(1,2)] - end - - --do animation - mobs.set_mob_animation(self, "walk") - - --do a quick turn to make mob continuously move - --if in a bird cage or something - if fly_turn_check(self,dtime) then - quick_rotate(self,dtime) - end - - if self.tilt_fly then - mobs.set_dynamic_pitch(self) - end - - mobs.set_fly_velocity(self,self.walk_velocity) - - --enable rotation locking - mobs.movement_rotation_lock(self) - - elseif self.state == "attack" then - - --execute mob attack type - --if self.attack_type == "explode" then - - --mobs.explode_attack_fly(self, dtime) - - --elseif self.attack_type == "punch" then - - --mobs.punch_attack_fly(self,dtime) - - if self.attack_type == "projectile" then - - mobs.projectile_attack_fly(self,dtime) - - end - end - else - --make the mob float - if self.floats and float_now then - mobs.set_velocity(self, 0) - - mobs.float(self) - - if self.tilt_fly then - mobs.set_static_pitch(self) - end - end - end -end - - ---[[ - ___ - |_ | - | |_ _ _ __ ___ _ __ - | | | | | '_ ` _ \| '_ \ -/\__/ / |_| | | | | | | |_) | -\____/ \__,_|_| |_| |_| .__/ - | | - |_| -]]-- - - ---check if a mob needs to turn while jumping -local jump_turn_check = function(self,dtime) - - local pos = self.object:get_pos() - pos.y = pos.y + 0.1 - local dir = minetest_yaw_to_dir(self.yaw) - - local collisionbox = self.object:get_properties().collisionbox - local radius = collisionbox[4] + 0.5 - - vector_multiply(dir, radius) - - local test_dir = vector.add(pos,dir) - - local green_flag_1 = minetest_get_item_group(minetest_get_node(test_dir).name, "solid") ~= 0 - - return(green_flag_1) -end - --- state switching logic (stand, jump, run, attacks) -local jump_state_list_wandering = {"stand", "jump"} - -local jump_state_switch = function(self, dtime) - self.state_timer = self.state_timer - dtime - if self.state_timer <= 0 then - self.state_timer = math.random(4,10) + math.random() - self.state = jump_state_list_wandering[math.random(1,#jump_state_list_wandering)] - end -end - --- states are executed here -local jump_state_execution = function(self,dtime) - - local pos = self.object:get_pos() - local collisionbox = self.object:get_properties().collisionbox - --get the center of the mob - pos.y = pos.y + (collisionbox[2] + collisionbox[5] / 2) - local current_node = minetest_get_node(pos).name - - local float_now = false - - --recheck if in water or lava - if minetest_get_item_group(current_node, "water") ~= 0 or minetest_get_item_group(current_node, "lava") ~= 0 then - float_now = true - end - - if self.state == "stand" then - - --do animation - mobs.set_mob_animation(self, "stand") - - --set the velocity of the mob - mobs.set_velocity(self,0) - - mobs.lock_yaw(self) - - elseif self.state == "jump" then - - self.walk_timer = self.walk_timer - dtime - - --reset the jump timer - if self.walk_timer <= 0 then - - --re-randomize the jump timer - self.walk_timer = math.random(1,6) + math.random() - - --set the mob into a random direction - self.yaw = (math_random() * (math.pi * 2)) - end - - --do animation - mobs.set_mob_animation(self, "walk") - - --enable rotation locking - mobs.movement_rotation_lock(self) - - --jumping mobs are more loosey goosey - if node_in_front_of == 1 then - quick_rotate(self,dtime) - end - - --only move forward if path is clear - mobs.jump_move(self,self.walk_velocity) - - elseif self.state == "run" then - - print("run") - - elseif self.state == "attack" then - - print("attack") - - end - - if float_now then - mobs.float(self) - end -end - - - - ---[[ -___ ___ _ _ _ -| \/ | (_) | | (_) -| . . | __ _ _ _ __ | | ___ __ _ _ ___ -| |\/| |/ _` | | '_ \ | | / _ \ / _` | |/ __| -| | | | (_| | | | | | | |___| (_) | (_| | | (__ -\_| |_/\__,_|_|_| |_| \_____/\___/ \__, |_|\___| - __/ | - |___/ -]]-- - ---the main loop -mobs.mob_step = function(self, dtime) - - --do not continue if non-existent - if not self or not self.object or not self.object:get_luaentity() then - self.object:remove() - return false - end - - - --DEBUG TIME! - --REMEMBER TO MOVE THIS AFTER DEATH CHECK - - --if self.has_head then - -- mobs.do_head_logic(self,dtime) - --end - - - - --if true then--DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG - -- return - --end - - --despawn mechanism - --don't despawned tamed or bred mobs - if not self.tamed and not self.bred then - self.lifetimer = self.lifetimer - dtime - if self.lifetimer <= 0 then - self.lifetimer = self.lifetimer_reset - if not mobs.check_for_player_within_area(self, 64) then - --print("removing in MAIN LOGIC!") - self.object:remove() - return - end - end - end - - --color modifier which coincides with the pause_timer - if self.old_health and self.health < self.old_health then - self.object:set_texture_mod("^[colorize:red:120") - --fix double death sound - if self.health > 0 then - mobs.play_sound(self,"damage") - end - end - self.old_health = self.health - - --do death logic (animation, poof, explosion, etc) - if self.health <= 0 or self.dead then - --play death sound once - if not self.played_death_sound then - self.dead = true - mobs.play_sound(self,"death") - self.played_death_sound = true - end - - mobs.death_logic(self, dtime) - - --this is here because the mob must continue to move - --while stunned before coming to a complete halt even during - --the death tilt - if self.pause_timer > 0 then - self.pause_timer = self.pause_timer - dtime - --perfectly reset pause_timer - if self.pause_timer < 0 then - self.pause_timer = 0 - end - end - - return - end - - mobs.random_sound_handling(self,dtime) - - --mobs drowning mechanic - if not self.breathes_in_water then - - local pos = self.object:get_pos() - - pos.y = pos.y + self.eye_height - - local node = minetest_get_node(pos).name - - if minetest_get_item_group(node, "water") ~= 0 then - self.breath = self.breath - dtime - - --reset breath when drowning - if self.breath <= 0 then - self.health = self.health - 4 - self.breath = 1 - self.pause_timer = 0.5 - end - - elseif self.breath < self.breath_max then - self.breath = self.breath + dtime - - --clean timer reset - if self.breath > self.breath_max then - self.breath = self.breath_max - end - end - end - - --set mobs on fire when burned by sunlight - if self.ignited_by_sunlight then - local pos = self.object:get_pos() - pos.y = pos.y + 0.1 - - if self.burn_timer > 0 then - self.burn_timer = self.burn_timer - dtime - - if self.burn_timer <= 0 then - self.health = self.health - 4 - self.burn_timer = 0 - end - end - - if self.burn_timer == 0 and minetest_get_node_light(pos) > 12 and minetest_get_node_light(pos, 0.5) == 15 then - mcl_burning.set_on_fire(self.object, 1) - self.burn_timer = 1 --1.7 seconds - self.pause_timer = 0.4 - end - end - - - - - - --baby grows up - if self.baby then - --print(self.grow_up_timer) - --catch missing timer - if not self.grow_up_timer then - self.grow_up_timer = self.grow_up_goal - end - - self.grow_up_timer = self.grow_up_timer - dtime - - --baby grows up! - if self.grow_up_timer <= 0 then - self.grow_up_timer = 0 - mobs.baby_grow_up(self) - end - end - - - - --do custom mob instructions - if self.do_custom then - -- when false skip going any further - if self.do_custom(self, dtime) == false then - --this needs to be here or the mob becomes immortal - if self.pause_timer > 0 then - self.pause_timer = self.pause_timer - dtime - --perfectly reset pause_timer - if self.pause_timer <= 0 then - self.pause_timer = 0 - self.object:set_texture_mod("") - end - end - --this overrides internal lua collision detection - return - end - end - - local attacking = nil - - --scan for players within eyesight - if self.hostile then - --true for line_of_sight is debug - attacking = mobs.detect_closest_player_within_radius(self,true,self.view_range,self.eye_height) - - --go get the closest player - if attacking then - - self.memory = 6 --6 seconds of memory - - --set initial punch timer - if self.attacking == nil then - if self.attack_type == "punch" then - self.punch_timer = -1 - end - end - self.attacking = attacking - - --no player in area - elseif self.memory > 0 then - --try to remember - self.memory = self.memory - dtime - --get if memory player is within viewing range - if self.attacking and self.attacking:is_player() then - local distance = vector_distance(self.object:get_pos(), self.attacking:get_pos()) - if distance > self.view_range then - self.memory = 0 - end - --out of viewing range, forget em - else - self.memory = 0 - end - - if self.memory <= 0 then - - --reset states when coming out of hostile state - if self.attacking ~= nil then - self.state_timer = -1 - end - - self.attacking = nil - self.memory = 0 - end - end - end - - --count down hostile cooldown timer when no players in range - if self.neutral and self.hostile and not attacking and self.hostile_cooldown_timer then - - self.hostile_cooldown_timer = self.hostile_cooldown_timer - dtime - - if self.hostile_cooldown_timer <= 0 then - self.hostile = false - self.hostile_cooldown_timer = 0 - end - end - - --mob is stunned after being hit - if self.pause_timer > 0 then - self.pause_timer = self.pause_timer - dtime - --don't break eye contact - if self.hostile and self.attacking then - mobs.set_yaw_while_attacking(self) - end - - --perfectly reset pause_timer - if self.pause_timer <= 0 then - self.pause_timer = 0 - self.object:set_texture_mod("") - end - - --stop walking mobs from falling through the water - if not self.jump_only and not self.swim and not self.fly then - local pos = self.object:get_pos() - local collisionbox = self.object:get_properties().collisionbox - --get the center of the mob - pos.y = pos.y + (collisionbox[2] + collisionbox[5] / 2) - local current_node = minetest_get_node(pos).name - - --recheck if in water or lava - if minetest_get_item_group(current_node, "water") ~= 0 or minetest_get_item_group(current_node, "lava") ~= 0 then - mobs.float(self) - end - end - - --stop projectile mobs from being completely disabled while stunned - if self.projectile_timer and self.projectile_timer > 0.01 then - self.projectile_timer = self.projectile_timer - dtime - if self.projectile_timer < 0.01 then - self.projectile_timer = 0.01 - end - end - - return -- don't allow collision detection - --do normal ai - else - --jump only (like slimes) - if self.jump_only then - jump_state_switch(self, dtime) - jump_state_execution(self, dtime) - --swimming - elseif self.swim then - swim_state_switch(self, dtime) - swim_state_execution(self, dtime) - --flying - elseif self.fly then - fly_state_switch(self, dtime) - fly_state_execution(self,dtime) - --regular mobs that walk around - else - land_state_switch(self, dtime) - land_state_execution(self,dtime) - end - end - - --do not continue if non-existent - if not self or not self.object or not self.object:get_luaentity() then - self.object:remove() - return false - end - - --make it so mobs do not glitch out when walking around/jumping - mobs.swap_auto_step_height_adjust(self) - - - -- can mob be pushed, if so calculate direction -- do this last (overrides everything) - if self.pushable then - mobs.collision(self) - end - - --overrides absolutely everything - --mobs get stuck in cobwebs like players - if not self.ignores_cobwebs then - - local pos = self.object:get_pos() - local node = pos and minetest_get_node(pos).name - - if node == "mcl_core:cobweb" then - - --fight the rest of the api - if self.object:get_acceleration().y ~= 0 then - self.object:set_acceleration(vector_new(0,0,0)) - end - - mobs.stick_in_cobweb(self) - - self.was_stuck_in_cobweb = true - - else - --do not override other functions - if self.was_stuck_in_cobweb == true then - --return the mob back to normal - self.was_stuck_in_cobweb = nil - if self.object:get_acceleration().y == 0 and not self.swim and not self.fly then - self.object:set_acceleration(vector_new(0,-self.gravity,0)) - end - end - end - end - - self.old_velocity = self.object:get_velocity() - self.old_pos = self.object:get_pos() -end diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua deleted file mode 100644 index c26d33089..000000000 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua +++ /dev/null @@ -1,259 +0,0 @@ -local math_pi = math.pi -local math_floor = math.floor -local math_random = math.random -local HALF_PI = math_pi/2 - - -local vector_direction = vector.direction -local vector_distance = vector.distance -local vector_new = vector.new - -local minetest_dir_to_yaw = minetest.dir_to_yaw - --- set defined animation -mobs.set_mob_animation = function(self, anim, fixed_frame) - - if not self.animation or not anim then - return - end - - if self.state == "die" and anim ~= "die" and anim ~= "stand" then - return - end - - - if (not self.animation[anim .. "_start"] or not self.animation[anim .. "_end"]) then - return - end - - --animations break if they are constantly set - --so we put this return gate to check if it is - --already at the animation we are trying to implement - if self.current_animation == anim then - return - end - - local a_start = self.animation[anim .. "_start"] - local a_end - - if fixed_frame then - a_end = a_start - else - a_end = self.animation[anim .. "_end"] - end - - self.object:set_animation({ - x = a_start, - y = a_end}, - self.animation[anim .. "_speed"] or self.animation.speed_normal or 15, - 0, self.animation[anim .. "_loop"] ~= false) - - - self.current_animation = anim -end - - - - -mobs.death_effect = function(pos, yaw, collisionbox, rotate) - local min, max - if collisionbox then - min = {x=collisionbox[1], y=collisionbox[2], z=collisionbox[3]} - max = {x=collisionbox[4], y=collisionbox[5], z=collisionbox[6]} - else - min = { x = -0.5, y = 0, z = -0.5 } - max = { x = 0.5, y = 0.5, z = 0.5 } - end - if rotate then - min = vector.rotate(min, {x=0, y=yaw, z=math_pi/2}) - max = vector.rotate(max, {x=0, y=yaw, z=math_pi/2}) - min, max = vector.sort(min, max) - min = vector.multiply(min, 0.5) - max = vector.multiply(max, 0.5) - end - - minetest_add_particlespawner({ - amount = 50, - time = 0.001, - minpos = vector.add(pos, min), - maxpos = vector.add(pos, max), - minvel = vector_new(-5,-5,-5), - maxvel = vector_new(5,5,5), - minexptime = 1.1, - maxexptime = 1.5, - minsize = 1, - maxsize = 2, - collisiondetection = false, - vertical = false, - texture = "mcl_particles_mob_death.png^[colorize:#000000:255", - }) - - minetest_sound_play("mcl_mobs_mob_poof", { - pos = pos, - gain = 1.0, - max_hear_distance = 8, - }, true) -end - - ---this allows auto facedir rotation while making it so mobs ---don't look like wet noodles flopping around -mobs.movement_rotation_lock = function(self) - - local current_engine_yaw = self.object:get_yaw() - local current_lua_yaw = self.yaw - - if current_engine_yaw > math.pi * 2 then - current_engine_yaw = current_engine_yaw - (math.pi * 2) - end - - if math.abs(current_engine_yaw - current_lua_yaw) <= 0.05 and self.object:get_properties().automatic_face_movement_dir then - self.object:set_properties{automatic_face_movement_dir = false} - elseif math.abs(current_engine_yaw - current_lua_yaw) > 0.05 and self.object:get_properties().automatic_face_movement_dir == false then - self.object:set_properties{automatic_face_movement_dir = self.rotate} - end -end - - ---this is used when a mob is chasing a player -mobs.set_yaw_while_attacking = function(self) - - if self.object:get_properties().automatic_face_movement_dir then - self.object:set_properties{automatic_face_movement_dir = false} - end - - --turn positions into pseudo 2d vectors - local pos1 = self.object:get_pos() - pos1.y = 0 - - local pos2 = self.attacking:get_pos() - pos2.y = 0 - - local new_direction = vector_direction(pos1,pos2) - local new_yaw = minetest_dir_to_yaw(new_direction) - - self.object:set_yaw(new_yaw) - self.yaw = new_yaw -end - ---this is used to unlock a mob's yaw after attacking -mobs.unlock_yaw = function(self) - if self.object:get_properties().automatic_face_movement_dir == false then - self.object:set_properties{automatic_face_movement_dir = self.rotate} - end -end - ---this is used to lock a mob's yaw when they're standing -mobs.lock_yaw = function(self) - if self.object:get_properties().automatic_face_movement_dir then - self.object:set_properties{automatic_face_movement_dir = false} - end -end - - -local calculate_pitch = function(self) - local pos = self.object:get_pos() - local pos2 = self.old_pos - - if pos == nil or pos2 == nil then - return false - end - - return(minetest_dir_to_yaw(vector_new(vector_distance(vector_new(pos.x,0,pos.z),vector_new(pos2.x,0,pos2.z)),0,pos.y - pos2.y)) + HALF_PI) -end - ---this is a helper function used to make mobs pitch rotation dynamically flow when flying/swimming -mobs.set_dynamic_pitch = function(self) - local pitch = calculate_pitch(self) - - if not pitch then - return - end - - local current_rotation = self.object:get_rotation() - - current_rotation.x = pitch - - self.object:set_rotation(current_rotation) - - self.pitch_switch = "dynamic" -end - ---this is a helper function used to make mobs pitch rotation reset when flying/swimming -mobs.set_static_pitch = function(self) - - if self.pitch_switch == "static" then - return - end - - local current_rotation = self.object:get_rotation() - - current_rotation.x = 0 - - self.object:set_rotation(current_rotation) - self.pitch_switch = "static" -end - ---this is a helper function for mobs explosion animation -mobs.handle_explosion_animation = function(self) - - --secondary catch-all - if not self.explosion_animation then - self.explosion_animation = 0 - end - - --the timer works from 0 for sense of a 0 based counting - --but this just bumps it up so it's usable in here - local explosion_timer_adjust = self.explosion_animation + 1 - - - local visual_size_modified = table.copy(self.visual_size_origin) - - visual_size_modified.x = visual_size_modified.x * (explosion_timer_adjust ^ 3) - visual_size_modified.y = visual_size_modified.y * explosion_timer_adjust - - self.object:set_properties({visual_size = visual_size_modified}) -end - - ---this is used when a mob is following player -mobs.set_yaw_while_following = function(self) - - if self.object:get_properties().automatic_face_movement_dir then - self.object:set_properties{automatic_face_movement_dir = false} - end - - --turn positions into pseudo 2d vectors - local pos1 = self.object:get_pos() - pos1.y = 0 - - local pos2 = self.following_person:get_pos() - pos2.y = 0 - - local new_direction = vector_direction(pos1,pos2) - local new_yaw = minetest_dir_to_yaw(new_direction) - - self.object:set_yaw(new_yaw) - self.yaw = new_yaw -end - ---this is used for when mobs breed -mobs.set_yaw_while_breeding = function(self, mate) - - if self.object:get_properties().automatic_face_movement_dir then - self.object:set_properties{automatic_face_movement_dir = false} - end - - --turn positions into pseudo 2d vectors - local pos1 = self.object:get_pos() - pos1.y = 0 - - local pos2 = mate:get_pos() - pos2.y = 0 - - local new_direction = vector_direction(pos1,pos2) - local new_yaw = minetest_dir_to_yaw(new_direction) - - self.object:set_yaw(new_yaw) - self.yaw = new_yaw -end \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/attack_type_instructions.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/attack_type_instructions.lua deleted file mode 100644 index c973f3d1b..000000000 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/attack_type_instructions.lua +++ /dev/null @@ -1,351 +0,0 @@ -local vector_direction = vector.direction -local minetest_dir_to_yaw = minetest.dir_to_yaw -local vector_distance = vector.distance -local vector_multiply = vector.multiply -local math_random = math.random - ---[[ - _ _ _ _ -| | | | | | | | -| | | | __ _ _ __ __| | | | -| | | | / _` | '_ \ / _` | | | -|_| | |___| (_| | | | | (_| | |_| -(_) \_____/\__,_|_| |_|\__,_| (_) -]]-- - - - ---[[ - _____ _ _ -| ___| | | | | -| |____ ___ __ | | ___ __| | ___ -| __\ \/ / '_ \| |/ _ \ / _` |/ _ \ -| |___> <| |_) | | (_) | (_| | __/ -\____/_/\_\ .__/|_|\___/ \__,_|\___| - | | - |_| -]]-- - -mobs.explode_attack_walk = function(self,dtime) - - --this needs an exception - if self.attacking == nil or not self.attacking:is_player() then - self.attacking = nil - return - end - - mobs.set_yaw_while_attacking(self) - - local distance_from_attacking = vector_distance(self.object:get_pos(), self.attacking:get_pos()) - - --make mob walk up to player within 2 nodes distance then start exploding - if distance_from_attacking >= self.reach and - --don't allow explosion to cancel unless out of the reach boundary - not (self.explosion_animation ~= nil and self.explosion_animation > 0 and distance_from_attacking <= self.defuse_reach) then - - mobs.set_velocity(self, self.run_velocity) - mobs.set_mob_animation(self,"run") - - mobs.reverse_explosion_animation(self,dtime) - else - mobs.set_velocity(self,0) - - --this is the only way I can reference this without dumping extra data on all mobs - if not self.explosion_animation then - self.explosion_animation = 0 - end - - --play ignite sound - if self.explosion_animation == 0 then - mobs.play_sound(self,"attack") - end - - mobs.set_mob_animation(self,"stand") - - mobs.handle_explosion_animation(self) - - self.explosion_animation = self.explosion_animation + (dtime/2.5) - end - - --make explosive mobs jump - --check for nodes to jump over - --explosive mobs will just ride against walls for now - local node_in_front_of = mobs.jump_check(self) - if node_in_front_of == 1 then - mobs.jump(self) - end - - - --do biggening explosion thing - if self.explosion_animation and self.explosion_animation > self.explosion_timer then - mcl_explosions.explode(self.object:get_pos(), self.explosion_strength,{ drop_chance = 1.0 }) - self.object:remove() - end -end - - ---this is a small helper function to make working with explosion animations easier -mobs.reverse_explosion_animation = function(self,dtime) - - --if explosion animation was greater than 0 then reverse it - if self.explosion_animation ~= nil and self.explosion_animation > 0 then - self.explosion_animation = self.explosion_animation - dtime - if self.explosion_animation < 0 then - self.explosion_animation = 0 - end - end - - mobs.handle_explosion_animation(self) -end - - - - ---[[ -______ _ -| ___ \ | | -| |_/ / _ _ __ ___| |__ -| __/ | | | '_ \ / __| '_ \ -| | | |_| | | | | (__| | | | -\_| \__,_|_| |_|\___|_| |_| -]]-- - - - -mobs.punch_attack_walk = function(self,dtime) - - --this needs an exception - if self.attacking == nil or not self.attacking:is_player() then - self.attacking = nil - return - end - - local distance_from_attacking = mobs.get_2d_distance(self.object:get_pos(), self.attacking:get_pos()) - - if distance_from_attacking >= self.minimum_follow_distance then - mobs.set_velocity(self, self.run_velocity) - mobs.set_mob_animation(self, "run") - else - mobs.set_velocity(self, 0) - mobs.set_mob_animation(self, "stand") - end - - mobs.set_yaw_while_attacking(self) - - --make punchy mobs jump - --check for nodes to jump over - --explosive mobs will just ride against walls for now - local node_in_front_of = mobs.jump_check(self) - - if node_in_front_of == 1 then - mobs.jump(self) - end - - --mobs that can climb over stuff - if self.always_climb and node_in_front_of > 0 then - mobs.climb(self) - end - - - --auto reset punch_timer - if not self.punch_timer then - self.punch_timer = 0 - end - - if self.punch_timer > 0 then - self.punch_timer = self.punch_timer - dtime - end -end - -mobs.punch_attack = function(self) - - self.attacking:punch(self.object, 1.0, { - full_punch_interval = 1.0, - damage_groups = {fleshy = self.damage} - }, nil) - - self.punch_timer = self.punch_timer_cooloff - - - --knockback - local pos1 = self.object:get_pos() - pos1.y = 0 - local pos2 = self.attacking:get_pos() - pos2.y = 0 - local dir = vector_direction(pos1,pos2) - - dir = vector_multiply(dir,3) - - if self.attacking:get_velocity().y <= 1 then - dir.y = 5 - end - - self.attacking:add_velocity(dir) -end - - - - ---[[ -______ _ _ _ _ -| ___ \ (_) | | (_) | -| |_/ / __ ___ _ ___ ___| |_ _| | ___ -| __/ '__/ _ \| |/ _ \/ __| __| | |/ _ \ -| | | | | (_) | | __/ (__| |_| | | __/ -\_| |_| \___/| |\___|\___|\__|_|_|\___| - _/ | - |__/ -]]-- - - -mobs.projectile_attack_walk = function(self,dtime) - - --this needs an exception - if self.attacking == nil or not self.attacking:is_player() then - self.attacking = nil - return - end - - mobs.set_yaw_while_attacking(self) - - local distance_from_attacking = vector_distance(self.object:get_pos(), self.attacking:get_pos()) - - - if distance_from_attacking >= self.reach then - mobs.set_velocity(self, self.run_velocity) - mobs.set_mob_animation(self,"run") - else - mobs.set_velocity(self,0) - mobs.set_mob_animation(self,"stand") - end - - --do this to not load data into other mobs - if not self.projectile_timer then - self.projectile_timer = math_random(self.projectile_cooldown_min, self.projectile_cooldown_max) - end - - --run projectile timer - if self.projectile_timer > 0 then - self.projectile_timer = self.projectile_timer - dtime - - --shoot - if self.projectile_timer <= 0 then - --reset timer - self.projectile_timer = math_random(self.projectile_cooldown_min, self.projectile_cooldown_max) - mobs.shoot_projectile(self) - end - end - - --make shooty mobs jump - --check for nodes to jump over - --explosive mobs will just ride against walls for now - local node_in_front_of = mobs.jump_check(self) - if node_in_front_of == 1 then - mobs.jump(self) - end - -end - - - - - - - - - ---[[ - _ ______ _ _ -| | | ___| | | | -| | | |_ | |_ _ | | -| | | _| | | | | | | | -|_| | | | | |_| | |_| -(_) \_| |_|\__, | (_) - __/ | - |___/ -]]-- - - - - ---[[ -______ _ _ _ _ -| ___ \ (_) | | (_) | -| |_/ / __ ___ _ ___ ___| |_ _| | ___ -| __/ '__/ _ \| |/ _ \/ __| __| | |/ _ \ -| | | | | (_) | | __/ (__| |_| | | __/ -\_| |_| \___/| |\___|\___|\__|_|_|\___| - _/ | - |__/ -]]-- - -local random_pitch_multiplier = {-1,1} - -mobs.projectile_attack_fly = function(self, dtime) - - --this needs an exception - if self.attacking == nil or not self.attacking:is_player() then - self.attacking = nil - return - end - - --this is specifically for random ghast movement - if self.fly_random_while_attack then - - --enable rotation locking - mobs.movement_rotation_lock(self) - - self.walk_timer = self.walk_timer - dtime - - --reset the walk timer - if self.walk_timer <= 0 then - --re-randomize the walk timer - self.walk_timer = math.random(1,6) + math.random() - --set the mob into a random direction - self.yaw = (math_random() * (math.pi * 2)) - --create a truly random pitch, since there is no easy access to pitch math that I can find - self.pitch = math_random() * math.random(1,3) * random_pitch_multiplier[math_random(1,2)] - end - - mobs.set_fly_velocity(self, self.run_velocity) - - else - - mobs.set_yaw_while_attacking(self) - - local distance_from_attacking = vector_distance(self.object:get_pos(), self.attacking:get_pos()) - - if distance_from_attacking >= self.reach then - mobs.set_pitch_while_attacking(self) - mobs.set_fly_velocity(self, self.run_velocity) - mobs.set_mob_animation(self,"run") - else - mobs.set_pitch_while_attacking(self) - mobs.set_fly_velocity(self, 0) - mobs.set_mob_animation(self,"stand") - end - end - - - --do this to not load data into other mobs - if not self.projectile_timer then - self.projectile_timer = math_random(self.projectile_cooldown_min, self.projectile_cooldown_max) - end - - --run projectile timer - if self.projectile_timer > 0 then - self.projectile_timer = self.projectile_timer - dtime - - --shoot - if self.projectile_timer <= 0 then - - if self.fly_random_while_attack then - mobs.set_yaw_while_attacking(self) - self.walk_timer = 0 - end - --reset timer - self.projectile_timer = math_random(self.projectile_cooldown_min, self.projectile_cooldown_max) - mobs.shoot_projectile(self) - end - end -end \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/breeding.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/breeding.lua deleted file mode 100644 index 5dc0b8884..000000000 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/breeding.lua +++ /dev/null @@ -1,184 +0,0 @@ -local minetest_get_objects_inside_radius = minetest.get_objects_inside_radius - -local vector_distance = vector.distance - ---check to see if someone nearby has some tasty food -mobs.check_following = function(self) -- returns true or false - - --ignore - if not self.follow then - self.following_person = nil - return(false) - end - - --hey look, this thing works for passive mobs too! - local follower = mobs.detect_closest_player_within_radius(self,true,self.view_range,self.eye_height) - - --check if the follower is a player incase they log out - if follower and follower:is_player() then - local stack = follower:get_wielded_item() - --safety check - if not stack then - self.following_person = nil - return(false) - end - - local item_name = stack:get_name() - --all checks have passed, that guy has some good looking food - if item_name == self.follow then - self.following_person = follower - return(true) - end - end - - --everything failed - self.following_person = nil - return(false) -end - ---a function which attempts to make mobs enter ---the breeding state -mobs.enter_breed_state = function(self,clicker) - - --do not breed if baby - if self.baby then - return(false) - end - - --do not do anything if looking for mate or - --if cooling off from breeding - if self.breed_lookout_timer > 0 or self.breed_timer > 0 then - return(false) - end - - --if this is caught, that means something has gone - --seriously wrong - if not clicker or not clicker:is_player() then - return(false) - end - - local stack = clicker:get_wielded_item() - --safety check - if not stack then - return(false) - end - - local item_name = stack:get_name() - --all checks have passed, that guy has some good looking food - if item_name == self.follow then - if not minetest.is_creative_enabled(clicker:get_player_name()) then - stack:take_item() - clicker:set_wielded_item(stack) - end - self.breed_lookout_timer = self.breed_lookout_timer_goal - self.bred = true - mobs.play_sound_specific(self,"mobs_mc_animal_eat_generic") - return(true) - end - - --everything failed - return(false) -end - - ---find the closest mate in the area -mobs.look_for_mate = function(self) - - local pos1 = self.object:get_pos() - pos1.y = pos1.y + self.eye_height - - local mates_in_area = {} - local winner_mate = nil - local mates_detected = 0 - local radius = self.view_range - - --get mates in radius - for _,mate in pairs(minetest_get_objects_inside_radius(pos1, radius)) do - - --look for a breeding mate - if mate and mate:get_luaentity() - and mate:get_luaentity()._cmi_is_mob - and mate:get_luaentity().name == self.name - and mate:get_luaentity().breed_lookout_timer > 0 - and mate:get_luaentity() ~= self then - - local pos2 = mate:get_pos() - - local distance = vector_distance(pos1,pos2) - - if distance <= radius then - if line_of_sight then - --must add eye height or stuff breaks randomly because of - --seethrough nodes being a blocker (like grass) - if minetest_line_of_sight( - vector_new(pos1.x, pos1.y, pos1.z), - vector_new(pos2.x, pos2.y + mate:get_properties().eye_height, pos2.z) - ) then - mates_detected = mates_detected + 1 - mates_in_area[mate] = distance - end - else - mates_detected = mates_detected + 1 - mates_in_area[mate] = distance - end - end - end - end - - - --return if there's no one near by - if mates_detected <= 0 then --handle negative numbers for some crazy error that could possibly happen - return nil - end - - --do a default radius max - local shortest_distance = radius + 1 - - --sort through mates and find the closest mate - for mate,distance in pairs(mates_in_area) do - if distance < shortest_distance then - shortest_distance = distance - winner_mate = mate - end - end - - return(winner_mate) - -end - ---make the baby grow up -mobs.baby_grow_up = function(self) - self.baby = nil - self.visual_size = self.backup_visual_size - self.collisionbox = self.backup_collisionbox - self.selectionbox = self.backup_selectionbox - self.object:set_properties(self) -end - ---makes the baby grow up faster with diminishing returns -mobs.make_baby_grow_faster = function(self,clicker) - if clicker and clicker:is_player() then - local stack = clicker:get_wielded_item() - --safety check - if not stack then - return(false) - end - - local item_name = stack:get_name() - --all checks have passed, that guy has some good looking food - if item_name == self.follow then - self.grow_up_timer = self.grow_up_timer - (self.grow_up_timer * 0.10) --take 10 percent off - diminishing returns - - if not minetest.is_creative_enabled(clicker:get_player_name()) then - stack:take_item() - clicker:set_wielded_item(stack) - end - - mobs.play_sound_specific(self,"mobs_mc_animal_eat_generic") - - return(true) - end - end - - return(false) -end \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua deleted file mode 100644 index 44f43f20f..000000000 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua +++ /dev/null @@ -1,140 +0,0 @@ -local minetest_get_objects_inside_radius = minetest.get_objects_inside_radius - -local math_random = math.random -local vector_multiply = vector.multiply - -local vector_direction = vector.direction - -local integer_test = {-1,1} - -mobs.collision = function(self) - - local pos = self.object:get_pos() - - - if not self or not self.object or not self.object:get_luaentity() then - return - end - - --do collision detection from the base of the mob - local collisionbox = self.object:get_properties().collisionbox - - pos.y = pos.y + collisionbox[2] - - local collision_boundary = collisionbox[4] - - local radius = collision_boundary - - if collisionbox[5] > collision_boundary then - radius = collisionbox[5] - end - - local collision_count = 0 - - - local check_for_attack = false - - if self.attack_type == "punch" and self.hostile and self.attacking then - check_for_attack = true - end - - for _,object in ipairs(minetest_get_objects_inside_radius(pos, radius*1.25)) do - if object and object ~= self.object and (object:is_player() or (object:get_luaentity() and object:get_luaentity()._cmi_is_mob == true and object:get_luaentity().health > 0)) and - --don't collide with rider, rider don't collide with thing - (not object:get_attach() or (object:get_attach() and object:get_attach() ~= self.object)) and - (not self.object:get_attach() or (self.object:get_attach() and self.object:get_attach() ~= object)) then - --stop infinite loop - collision_count = collision_count + 1 - --mob cramming - if collision_count > 30 then - self.health = -20 - break - end - - local pos2 = object:get_pos() - - local object_collisionbox = object:get_properties().collisionbox - - pos2.y = pos2.y + object_collisionbox[2] - - local object_collision_boundary = object_collisionbox[4] - - - --this is checking the difference of the object collided with's possision - --if positive top of other object is inside (y axis) of current object - local y_base_diff = (pos2.y + object_collisionbox[5]) - pos.y - - local y_top_diff = (pos.y + collisionbox[5]) - pos2.y - - - local distance = vector.distance(vector.new(pos.x,0,pos.z),vector.new(pos2.x,0,pos2.z)) - - if distance <= collision_boundary + object_collision_boundary and y_base_diff >= 0 and y_top_diff >= 0 then - - local dir = vector.direction(pos,pos2) - - dir.y = 0 - - --eliminate mob being stuck in corners - if dir.x == 0 and dir.z == 0 then - --slightly adjust mob position to prevent equal length - --corner/wall sticking - dir.x = dir.x + ((math_random()/10)*integer_test[math.random(1,2)]) - dir.z = dir.z + ((math_random()/10)*integer_test[math.random(1,2)]) - end - - local velocity = dir - - --0.5 is the max force multiplier - local force = 0.5 - (0.5 * distance / (collision_boundary + object_collision_boundary)) - - local vel1 = vector.multiply(velocity, -1.5) - local vel2 = vector.multiply(velocity, 1.5) - - vel1 = vector.multiply(vel1, force * 10) - vel2 = vector.multiply(vel2, force) - - if object:is_player() then - vel2 = vector_multiply(vel2, 2.5) - - --integrate mob punching into collision detection - if check_for_attack and self.punch_timer <= 0 then - if object == self.attacking then - mobs.punch_attack(self) - end - end - end - - self.object:add_velocity(vel1) - object:add_velocity(vel2) - end - - end - end -end - - ---this is used for arrow collisions -mobs.arrow_hit = function(self, player) - - player:punch(self.object, 1.0, { - full_punch_interval = 1.0, - damage_groups = {fleshy = self._damage} - }, nil) - - - --knockback - local pos1 = self.object:get_pos() - pos1.y = 0 - local pos2 = player:get_pos() - pos2.y = 0 - local dir = vector_direction(pos1,pos2) - - dir = vector_multiply(dir,3) - - if player:get_velocity().y <= 1 then - dir.y = 5 - end - - player:add_velocity(dir) -end \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/death_logic.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/death_logic.lua deleted file mode 100644 index 57cb6e4e5..000000000 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/death_logic.lua +++ /dev/null @@ -1,160 +0,0 @@ -local minetest_add_item = minetest.add_item -local minetest_sound_play = minetest.sound_play - -local math_pi = math.pi -local math_random = math.random -local math_floor = math.floor -local HALF_PI = math_pi / 2 - -local vector_new = vector.new - - --- drop items -local item_drop = function(self, cooked, looting_level) - - looting_level = looting_level or 0 - - -- no drops for child mobs (except monster) - if (self.child and self.type ~= "monster") then - return - end - - local obj, item, num - local pos = self.object:get_pos() - - self.drops = self.drops or {} -- nil check - - for n = 1, #self.drops do - local dropdef = self.drops[n] - local chance = 1 / dropdef.chance - local looting_type = dropdef.looting - - if looting_level > 0 then - local chance_function = dropdef.looting_chance_function - if chance_function then - chance = chance_function(looting_level) - elseif looting_type == "rare" then - chance = chance + (dropdef.looting_factor or 0.01) * looting_level - end - end - - local num = 0 - local do_common_looting = (looting_level > 0 and looting_type == "common") - if math_random() < chance then - num = math_random(dropdef.min or 1, dropdef.max or 1) - elseif not dropdef.looting_ignore_chance then - do_common_looting = false - end - - if do_common_looting then - num = num + math_floor(math_random(0, looting_level) + 0.5) - end - - if num > 0 then - item = dropdef.name - - -- cook items when true - if cooked then - - local output = minetest_get_craft_result({ - method = "cooking", width = 1, items = {item}}) - - if output and output.item and not output.item:is_empty() then - item = output.item:get_name() - end - end - - -- add item if it exists - for x = 1, num do - obj = minetest_add_item(pos, ItemStack(item .. " " .. 1)) - end - - if obj and obj:get_luaentity() then - - obj:set_velocity({ - x = math_random(-10, 10) / 9, - y = 6, - z = math_random(-10, 10) / 9, - }) - elseif obj then - obj:remove() -- item does not exist - end - end - end - - self.drops = {} -end - - -mobs.death_logic = function(self, dtime) - - --stop crashing game when object is nil - if not self or not self.object or not self.object:get_luaentity() then - return - end - - self.death_animation_timer = self.death_animation_timer + dtime - - --get all attached entities and sort through them - local attached_entities = self.object:get_children() - if #attached_entities > 0 then - for _,entity in pairs(attached_entities) do - --kick the player off - if entity:is_player() then - mobs.detach(entity) - --kick mobs off - --if there is scaling issues, this needs an additional check - else - entity:set_detach() - end - end - end - - --stop mob from getting in the way of other mobs you're fighting - if self.object:get_properties().pointable then - self.object:set_properties({pointable = false}) - end - - --the final POOF of a mob despawning - if self.death_animation_timer >= 1.25 then - - item_drop(self,false,1) - - mobs.death_effect(self) - - mcl_experience.throw_experience(self.object:get_pos(), math_random(self.xp_min, self.xp_max)) - - self.object:remove() - - return - end - - --I'm sure there's a more efficient way to do this - --but this is the easiest, easier to work with 1 variable synced - --this is also not smooth - local death_animation_roll = self.death_animation_timer * 2 -- * 2 to make it faster - if death_animation_roll > 1 then - death_animation_roll = 1 - end - - local rot = self.object:get_rotation() --(no pun intended) - - rot.z = death_animation_roll * HALF_PI - - self.object:set_rotation(rot) - - mobs.set_mob_animation(self,"stand", true) - - - --flying and swimming mobs just fall down - if self.fly or self.swim then - if self.object:get_acceleration().y ~= -self.gravity then - self.object:set_acceleration(vector_new(0,-self.gravity,0)) - end - end - - --when landing allow mob to slow down and just fall if in air - if self.pause_timer <= 0 then - mobs.set_velocity(self,0) - end -end \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua deleted file mode 100644 index 7c709c09e..000000000 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua +++ /dev/null @@ -1,260 +0,0 @@ -local minetest_line_of_sight = minetest.line_of_sight -local minetest_dir_to_yaw = minetest.dir_to_yaw -local minetest_yaw_to_dir = minetest.yaw_to_dir -local minetest_get_node = minetest.get_node -local minetest_get_item_group = minetest.get_item_group -local minetest_get_objects_inside_radius = minetest.get_objects_inside_radius -local minetest_get_node_or_nil = minetest.get_node_or_nil -local minetest_registered_nodes = minetest.registered_nodes -local minetest_get_connected_players = minetest.get_connected_players - -local vector_new = vector.new -local vector_add = vector.add -local vector_multiply = vector.multiply -local vector_distance = vector.distance - -local table_copy = table.copy - -local math_abs = math.abs - --- default function when mobs are blown up with TNT -local do_tnt = function(obj, damage) - - obj.object:punch(obj.object, 1.0, { - full_punch_interval = 1.0, - damage_groups = {fleshy = damage}, - }, nil) - - return false, true, {} -end - ---a fast function to be able to detect only players without using objects_in_radius -mobs.detect_closest_player_within_radius = function(self, line_of_sight, radius, object_height_adder) - - local pos1 = self.object:get_pos() - local players_in_area = {} - local winner_player = nil - local players_detected = 0 - - --get players in radius - for _,player in pairs(minetest.get_connected_players()) do - if player and player:get_hp() > 0 then - - local pos2 = player:get_pos() - - local distance = vector_distance(pos1,pos2) - - if distance <= radius then - if line_of_sight then - --must add eye height or stuff breaks randomly because of - --seethrough nodes being a blocker (like grass) - if minetest_line_of_sight( - vector_new(pos1.x, pos1.y + object_height_adder, pos1.z), - vector_new(pos2.x, pos2.y + player:get_properties().eye_height, pos2.z) - ) then - players_detected = players_detected + 1 - players_in_area[player] = distance - end - else - players_detected = players_detected + 1 - players_in_area[player] = distance - end - end - end - end - - - --return if there's no one near by - if players_detected <= 0 then --handle negative numbers for some crazy error that could possibly happen - return nil - end - - --do a default radius max - local shortest_distance = radius + 1 - - --sort through players and find the closest player - for player,distance in pairs(players_in_area) do - if distance < shortest_distance then - shortest_distance = distance - winner_player = player - end - end - - return(winner_player) -end - - ---check if a mob needs to jump -mobs.jump_check = function(self,dtime) - - local pos = self.object:get_pos() - pos.y = pos.y + 0.1 - local dir = minetest_yaw_to_dir(self.yaw) - - local collisionbox = self.object:get_properties().collisionbox - local radius = collisionbox[4] + 0.5 - - vector_multiply(dir, radius) - - --only jump if there's a node and a non-solid node above it - local test_dir = vector_add(pos,dir) - - local green_flag_1 = minetest_get_item_group(minetest_get_node(test_dir).name, "solid") ~= 0 - - test_dir.y = test_dir.y + 1 - - local green_flag_2 = minetest_get_item_group(minetest_get_node(test_dir).name, "solid") == 0 - - if green_flag_1 and green_flag_2 then - --can jump over node - return(1) - elseif green_flag_1 and not green_flag_2 then - --wall in front of mob - return(2) - end - - --nothing to jump over - return(0) -end - --- a helper function to quickly turn neutral passive mobs hostile -local turn_hostile = function(self,detected_mob) - --drop in variables for attacking (stops crash) - detected_mob.punch_timer = 0 - --set to hostile - detected_mob.hostile = true - --hostile_cooldown timer is initialized here - detected_mob.hostile_cooldown_timer = detected_mob.hostile_cooldown - --set target to the same - detected_mob.attacking = self.attacking -end - ---allow hostile mobs to signal to other mobs ---to switch from neutal passive to neutral hostile -mobs.group_attack_initialization = function(self) - - --get basic data - local friends_list - - if self.group_attack == true then - friends_list = {self.name} - else - friends_list = table_copy(self.group_attack) - end - - local objects_in_area = minetest_get_objects_inside_radius(self.object:get_pos(), self.view_range) - - --get the player's name - local name = self.attacking:get_player_name() - - --re-use local variable - local detected_mob - - --run through mobs in viewing distance - for _,object in pairs(objects_in_area) do - if object and object:get_luaentity() then - detected_mob = object:get_luaentity() - -- only alert members of same mob or friends - if detected_mob._cmi_is_mob and detected_mob.state ~= "attack" and detected_mob.owner ~= name then - if detected_mob.name == self.name then - turn_hostile(self,detected_mob) - else - for _,id in pairs(friends_list) do - if detected_mob.name == id then - turn_hostile(self,detected_mob) - break - end - end - end - end - - --THIS NEEDS TO BE RE-IMPLEMENTED AS A GLOBAL HIT IN MOB_PUNCH!! - -- have owned mobs attack player threat - --if obj.owner == name and obj.owner_loyal then - -- do_attack(obj, self.object) - --end - end - end -end - --- check if within physical map limits (-30911 to 30927) --- within_limits, wmin, wmax = nil, -30913, 30928 -mobs.within_limits = function(pos, radius) - if mcl_vars then - if mcl_vars.mapgen_edge_min and mcl_vars.mapgen_edge_max then - wmin, wmax = mcl_vars.mapgen_edge_min, mcl_vars.mapgen_edge_max - within_limits = function(pos, radius) - return pos - and (pos.x - radius) > wmin and (pos.x + radius) < wmax - and (pos.y - radius) > wmin and (pos.y + radius) < wmax - and (pos.z - radius) > wmin and (pos.z + radius) < wmax - end - end - end - return pos - and (pos.x - radius) > wmin and (pos.x + radius) < wmax - and (pos.y - radius) > wmin and (pos.y + radius) < wmax - and (pos.z - radius) > wmin and (pos.z + radius) < wmax -end - --- get node but use fallback for nil or unknown -mobs.node_ok = function(pos, fallback) - - fallback = fallback or mobs.fallback_node - - local node = minetest_get_node_or_nil(pos) - - if node and minetest_registered_nodes[node.name] then - return node - end - - return minetest_registered_nodes[fallback] -end - - ---a teleport functoin -mobs.teleport = function(self, target) - if self.do_teleport then - if self.do_teleport(self, target) == false then - return - end - end -end - ---a function used for despawning mobs -mobs.check_for_player_within_area = function(self, radius) - local pos1 = self.object:get_pos() - --get players in radius - for _,player in pairs(minetest_get_connected_players()) do - if player and player:get_hp() > 0 then - local pos2 = player:get_pos() - local distance = vector_distance(pos1,pos2) - if distance < radius then - --found a player - return(true) - end - end - end - --did not find a player - return(false) -end - - ---a simple helper function for mobs following -mobs.get_2d_distance = function(pos1,pos2) - pos1.y = 0 - pos2.y = 0 - return(vector_distance(pos1, pos2)) -end - --- fall damage onto solid ground -mobs.calculate_fall_damage = function(self) - if self.old_velocity and self.old_velocity.y < -7 and self.object:get_velocity().y == 0 then - local vel = self.object:get_velocity() - if vel then - local damage = math_abs(self.old_velocity.y + 7) * 2 - self.pause_timer = 0.4 - self.health = self.health - damage - end - end -end \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua deleted file mode 100644 index 6b23d2fe7..000000000 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua +++ /dev/null @@ -1,291 +0,0 @@ -local minetest_after = minetest.after -local minetest_sound_play = minetest.sound_play -local minetest_dir_to_yaw = minetest.dir_to_yaw - -local math_floor = math.floor -local math_min = math.min -local math_random = math.random - -local vector_direction = vector.direction -local vector_multiply = vector.multiply - -local MAX_MOB_NAME_LENGTH = 30 - -mobs.feed_tame = function(self) - return nil -end - --- Code to execute before custom on_rightclick handling -local on_rightclick_prefix = function(self, clicker) - - local item = clicker:get_wielded_item() - - -- Name mob with nametag - if not self.ignores_nametag and item:get_name() == "mcl_mobs:nametag" then - - local tag = item:get_meta():get_string("name") - if tag ~= "" then - if string.len(tag) > MAX_MOB_NAME_LENGTH then - tag = string.sub(tag, 1, MAX_MOB_NAME_LENGTH) - end - self.nametag = tag - - mobs.update_tag(self) - - if not mobs.is_creative(clicker:get_player_name()) then - item:take_item() - clicker:set_wielded_item(item) - end - return true - end - - end - return false -end - --- I have no idea what this does -mobs.create_mob_on_rightclick = function(on_rightclick) - return function(self, clicker) - --don't allow rightclicking dead mobs - if self.health <= 0 then - return - end - local stop = on_rightclick_prefix(self, clicker) - if (not stop) and (on_rightclick) then - on_rightclick(self, clicker) - end - end -end - - --- deal damage and effects when mob punched -mobs.mob_punch = function(self, hitter, tflp, tool_capabilities, dir) - - --don't do anything if the mob is already dead - if self.health <= 0 then - return - end - - --neutral passive mobs switch to neutral hostile - if self.neutral then - --drop in variables for attacking (stops crash) - self.attacking = hitter - self.punch_timer = 0 - self.hostile = true - --hostile_cooldown timer is initialized here - self.hostile_cooldown_timer = self.hostile_cooldown - - --initialize the group attack (check for other mobs in area, make them neutral hostile) - if self.group_attack then - mobs.group_attack_initialization(self) - end - end - - --turn skittish mobs away and RUN - if self.skittish then - - self.state = "run" - - self.run_timer = 5 --arbitrary 5 seconds - - local pos1 = self.object:get_pos() - pos1.y = 0 - local pos2 = hitter:get_pos() - pos2.y = 0 - - - local dir = vector_direction(pos2,pos1) - - local yaw = minetest_dir_to_yaw(dir) - - self.yaw = yaw - end - - - -- custom punch function - if self.do_punch then - -- when false skip going any further - if self.do_punch(self, hitter, tflp, tool_capabilities, dir) == false then - return - end - end - - --don't do damage until pause timer resets - if self.pause_timer > 0 then - return - end - - - -- error checking when mod profiling is enabled - if not tool_capabilities then - minetest.log("warning", "[mobs_mc] Mod profiling enabled, damage not enabled") - return - end - - - local is_player = hitter:is_player() - - - -- punch interval - local weapon = hitter:get_wielded_item() - - local punch_interval = 1.4 - - -- exhaust attacker - if mod_hunger and is_player then - mcl_hunger.exhaust(hitter:get_player_name(), mcl_hunger.EXHAUST_ATTACK) - end - - -- calculate mob damage - local damage = 0 - local armor = self.object:get_armor_groups() or {} - local tmp - - --calculate damage groups - for group,_ in pairs( (tool_capabilities.damage_groups or {}) ) do - damage = damage + (tool_capabilities.damage_groups[group] or 0) * ((armor[group] or 0) / 100.0) - end - - if weapon then - local fire_aspect_level = mcl_enchanting.get_enchantment(weapon, "fire_aspect") - if fire_aspect_level > 0 then - mcl_burning.set_on_fire(self.object, fire_aspect_level * 4) - end - end - - -- check for tool immunity or special damage - for n = 1, #self.immune_to do - if self.immune_to[n][1] == weapon:get_name() then - damage = self.immune_to[n][2] or 0 - break - end - end - - -- healing - if damage <= -1 then - self.health = self.health - math_floor(damage) - return - end - - if tool_capabilities then - punch_interval = tool_capabilities.full_punch_interval or 1.4 - end - - -- add weapon wear manually - -- Required because we have custom health handling ("health" property) - --minetest_is_creative_enabled("") ~= true --removed for now - if tool_capabilities then - if tool_capabilities.punch_attack_uses then - -- Without this delay, the wear does not work. Quite hacky ... - minetest_after(0, function(name) - local player = minetest.get_player_by_name(name) - if not player then return end - local weapon = hitter:get_wielded_item(player) - local def = weapon:get_definition() - if def.tool_capabilities and def.tool_capabilities.punch_attack_uses then - local wear = math_floor(65535/tool_capabilities.punch_attack_uses) - weapon:add_wear(wear) - hitter:set_wielded_item(weapon) - end - end, hitter:get_player_name()) - end - end - - - --if player is falling multiply damage by 1.5 - --critical hit - if hitter:get_velocity().y < 0 then - damage = damage * 1.5 - mobs.critical_effect(self) - end - - - -- only play hit sound and show blood effects if damage is 1 or over; lower to 0.1 to ensure armor works appropriately. - if damage >= 0.1 then - - minetest_sound_play("default_punch", { - object = self.object, - max_hear_distance = 16 - }, true) - - -- do damage - self.health = self.health - damage - - - --0.4 seconds until you can hurt the mob again - self.pause_timer = 0.4 - - --don't do knockback from a rider - for _,obj in pairs(self.object:get_children()) do - if obj == hitter then - return - end - end - - -- knock back effect - local velocity = self.object:get_velocity() - - --2d direction - local pos1 = self.object:get_pos() - pos1.y = 0 - local pos2 = hitter:get_pos() - pos2.y = 0 - - local dir = vector.direction(pos2,pos1) - - local up = 3 - - -- if already in air then dont go up anymore when hit - if velocity.y ~= 0 then - up = 0 - end - - - --0.75 for perfect distance to not be too easy, and not be too hard - local multiplier = 0.75 - - -- check if tool already has specific knockback value - local knockback_enchant = mcl_enchanting.get_enchantment(hitter:get_wielded_item(), "knockback") - if knockback_enchant and knockback_enchant > 0 then - multiplier = knockback_enchant + 1 --(starts from 1, 1 would be no change) - end - - --do this to sure you can punch a mob back when - --it's coming for you - if self.hostile then - multiplier = multiplier + 2 - end - - dir = vector_multiply(dir,multiplier) - - dir.y = up - - --add the velocity - self.object:add_velocity(dir) - - end -end - ---do internal per mob projectile calculations -mobs.shoot_projectile = function(self) - - local pos1 = self.object:get_pos() - --add mob eye height - pos1.y = pos1.y + self.eye_height - - local pos2 = self.attacking:get_pos() - --add player eye height - pos2.y = pos2.y + self.attacking:get_properties().eye_height - - --get direction - local dir = vector_direction(pos1,pos2) - - --call internal shoot_arrow function - self.shoot_arrow(self,pos1,dir) -end - -mobs.update_tag = function(self) - self.object:set_properties({ - nametag = self.nametag, - }) -end \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/mob_effects.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/mob_effects.lua deleted file mode 100644 index 847315ff1..000000000 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/mob_effects.lua +++ /dev/null @@ -1,152 +0,0 @@ -local minetest_add_particlespawner = minetest.add_particlespawner - -mobs.death_effect = function(self) - - local pos = self.object:get_pos() - local yaw = self.object:get_yaw() - local collisionbox = self.object:get_properties().collisionbox - - local min, max - - if collisionbox then - min = {x=collisionbox[1], y=collisionbox[2], z=collisionbox[3]} - max = {x=collisionbox[4], y=collisionbox[5], z=collisionbox[6]} - end - - minetest_add_particlespawner({ - amount = 50, - time = 0.0001, - minpos = vector.add(pos, min), - maxpos = vector.add(pos, max), - minvel = vector.new(-0.5,0.5,-0.5), - maxvel = vector.new(0.5,1,0.5), - minexptime = 1.1, - maxexptime = 1.5, - minsize = 1, - maxsize = 2, - collisiondetection = false, - vertical = false, - texture = "mcl_particles_mob_death.png", -- this particle looks strange - }) -end - -mobs.critical_effect = function(self) - - local pos = self.object:get_pos() - local yaw = self.object:get_yaw() - local collisionbox = self.object:get_properties().collisionbox - - local min, max - - if collisionbox then - min = {x=collisionbox[1], y=collisionbox[2], z=collisionbox[3]} - max = {x=collisionbox[4], y=collisionbox[5], z=collisionbox[6]} - end - - minetest_add_particlespawner({ - amount = 10, - time = 0.0001, - minpos = vector.add(pos, min), - maxpos = vector.add(pos, max), - minvel = vector.new(-1,1,-1), - maxvel = vector.new(1,3,1), - minexptime = 0.7, - maxexptime = 1, - minsize = 1, - maxsize = 2, - collisiondetection = false, - vertical = false, - texture = "heart.png^[colorize:black:255", - }) -end - ---when feeding a mob -mobs.feed_effect = function(self) - - local pos = self.object:get_pos() - local yaw = self.object:get_yaw() - local collisionbox = self.object:get_properties().collisionbox - - local min, max - - if collisionbox then - min = {x=collisionbox[1], y=collisionbox[2], z=collisionbox[3]} - max = {x=collisionbox[4], y=collisionbox[5], z=collisionbox[6]} - end - - minetest_add_particlespawner({ - amount = 10, - time = 0.0001, - minpos = vector.add(pos, min), - maxpos = vector.add(pos, max), - minvel = vector.new(-1,1,-1), - maxvel = vector.new(1,3,1), - minexptime = 0.7, - maxexptime = 1, - minsize = 1, - maxsize = 2, - collisiondetection = false, - vertical = false, - texture = "heart.png^[colorize:gray:255", - }) -end - ---hearts when tamed -mobs.tamed_effect = function(self) - local pos = self.object:get_pos() - local yaw = self.object:get_yaw() - local collisionbox = self.object:get_properties().collisionbox - - local min, max - - if collisionbox then - min = {x=collisionbox[1], y=collisionbox[2], z=collisionbox[3]} - max = {x=collisionbox[4], y=collisionbox[5], z=collisionbox[6]} - end - - minetest_add_particlespawner({ - amount = 30, - time = 0.0001, - minpos = vector.add(pos, min), - maxpos = vector.add(pos, max), - minvel = vector.new(-1,1,-1), - maxvel = vector.new(1,3,1), - minexptime = 0.7, - maxexptime = 1, - minsize = 1, - maxsize = 2, - collisiondetection = false, - vertical = false, - texture = "heart.png", - }) -end - ---hearts when breeding -mobs.breeding_effect = function(self) - local pos = self.object:get_pos() - local yaw = self.object:get_yaw() - local collisionbox = self.object:get_properties().collisionbox - - local min, max - - if collisionbox then - min = {x=collisionbox[1], y=collisionbox[2], z=collisionbox[3]} - max = {x=collisionbox[4], y=collisionbox[5], z=collisionbox[6]} - end - - minetest_add_particlespawner({ - amount = 2, - time = 0.0001, - minpos = vector.add(pos, min), - maxpos = vector.add(pos, max), - minvel = vector.new(-1,1,-1), - maxvel = vector.new(1,3,1), - minexptime = 0.7, - maxexptime = 1, - minsize = 1, - maxsize = 2, - collisiondetection = false, - vertical = false, - texture = "heart.png", - }) -end \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua deleted file mode 100644 index 9a5fd9ea1..000000000 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua +++ /dev/null @@ -1,391 +0,0 @@ -local math_pi = math.pi -local math_sin = math.sin -local math_cos = math.cos -local math_random = math.random -local HALF_PI = math_pi / 2 -local DOUBLE_PI = math_pi * 2 - --- localize vector functions -local vector_new = vector.new -local vector_length = vector.length -local vector_multiply = vector.multiply -local vector_distance = vector.distance -local vector_normalize = vector.normalize - -local minetest_yaw_to_dir = minetest.yaw_to_dir -local minetest_dir_to_yaw = minetest.dir_to_yaw - -local DEFAULT_JUMP_HEIGHT = 5 -local DEFAULT_FLOAT_SPEED = 4 -local DEFAULT_CLIMB_SPEED = 3 - - -mobs.stick_in_cobweb = function(self) - local current_velocity = self.object:get_velocity() - - local goal_velocity = vector_multiply(vector_normalize(current_velocity), 0.4) - - goal_velocity.y = -0.5 - - local new_velocity_addition = vector.subtract(goal_velocity,current_velocity) - - --smooths out mobs a bit - if vector_length(new_velocity_addition) >= 0.0001 then - self.object:add_velocity(new_velocity_addition) - end -end - ---this is a generic float function -mobs.float = function(self) - - if self.object:get_acceleration().y ~= 0 then - self.object:set_acceleration(vector_new(0,0,0)) - end - - local current_velocity = self.object:get_velocity() - - local goal_velocity = { - x = 0, - y = DEFAULT_FLOAT_SPEED, - z = 0, - } - - local new_velocity_addition = vector.subtract(goal_velocity,current_velocity) - - new_velocity_addition.x = 0 - new_velocity_addition.z = 0 - - --smooths out mobs a bit - if vector_length(new_velocity_addition) >= 0.0001 then - self.object:add_velocity(new_velocity_addition) - end -end - ---this is a generic climb function -mobs.climb = function(self) - - local current_velocity = self.object:get_velocity() - - local goal_velocity = { - x = 0, - y = DEFAULT_CLIMB_SPEED, - z = 0, - } - - local new_velocity_addition = vector.subtract(goal_velocity,current_velocity) - - new_velocity_addition.x = 0 - new_velocity_addition.z = 0 - - --smooths out mobs a bit - if vector_length(new_velocity_addition) >= 0.0001 then - self.object:add_velocity(new_velocity_addition) - end -end - - - ---[[ - _ _ -| | | | -| | __ _ _ __ __| | -| | / _` | '_ \ / _` | -| |___| (_| | | | | (_| | -\_____/\__,_|_| |_|\__,_| -]] - - --- move mob in facing direction ---this has been modified to be internal ---internal = lua (self.yaw) ---engine = c++ (self.object:get_yaw()) -mobs.set_velocity = function(self, v) - - local yaw = (self.yaw or 0) - - local current_velocity = self.object:get_velocity() - - local goal_velocity = { - x = (math_sin(yaw) * -v), - y = 0, - z = (math_cos(yaw) * v), - } - - - local new_velocity_addition = vector.subtract(goal_velocity,current_velocity) - - if vector_length(new_velocity_addition) > vector_length(goal_velocity) then - vector.multiply(new_velocity_addition, (vector_length(goal_velocity) / vector_length(new_velocity_addition))) - end - - new_velocity_addition.y = 0 - - --smooths out mobs a bit - if vector_length(new_velocity_addition) >= 0.0001 then - self.object:add_velocity(new_velocity_addition) - end -end - - - --- calculate mob velocity -mobs.get_velocity = function(self) - - local v = self.object:get_velocity() - - v.y = 0 - - if v then - return vector_length(v) - end - - return 0 -end - ---make mobs jump -mobs.jump = function(self, velocity) - - if self.object:get_velocity().y ~= 0 or not self.old_velocity or (self.old_velocity and self.old_velocity.y > 0) then - return - end - - --fallback velocity to allow modularity - velocity = velocity or DEFAULT_JUMP_HEIGHT - - self.object:add_velocity(vector_new(0,velocity,0)) -end - ---make mobs fall slowly -mobs.mob_fall_slow = function(self) - - local current_velocity = self.object:get_velocity() - - local goal_velocity = { - x = 0, - y = -2, - z = 0, - } - - - local new_velocity_addition = vector.subtract(goal_velocity,current_velocity) - - new_velocity_addition.x = 0 - new_velocity_addition.z = 0 - - if vector_length(new_velocity_addition) > vector_length(goal_velocity) then - vector.multiply(new_velocity_addition, (vector_length(goal_velocity) / vector_length(new_velocity_addition))) - end - - new_velocity_addition.x = 0 - new_velocity_addition.z = 0 - - --smooths out mobs a bit - if vector_length(new_velocity_addition) >= 0.0001 then - self.object:add_velocity(new_velocity_addition) - end - -end - - ---[[ - _____ _ -/ ___| (_) -\ `--.__ ___ _ __ ___ - `--. \ \ /\ / / | '_ ` _ \ -/\__/ /\ V V /| | | | | | | -\____/ \_/\_/ |_|_| |_| |_| -]]-- - - - - ---make mobs flop -mobs.flop = function(self, velocity) - - if self.object:get_velocity().y ~= 0 or not self.old_velocity or (self.old_velocity and self.old_velocity.y > 0) then - return false - end - - mobs.set_velocity(self, 0) - - --fallback velocity to allow modularity - velocity = velocity or DEFAULT_JUMP_HEIGHT - - --create a random direction (2d yaw) - local dir = DOUBLE_PI * math_random() - - --create a random force value - local force = math_random(0,3) + math_random() - - --convert the yaw to a direction vector then multiply it times the force - local final_additional_force = vector_multiply(minetest_yaw_to_dir(dir), force) - - --place in the "flop" velocity to make the mob flop - final_additional_force.y = velocity - - self.object:add_velocity(final_additional_force) - - return true -end - - - --- move mob in facing direction ---this has been modified to be internal ---internal = lua (self.yaw) ---engine = c++ (self.object:get_yaw()) -mobs.set_swim_velocity = function(self, v) - - local yaw = (self.yaw or 0) - local pitch = (self.pitch or 0) - - if v == 0 then - pitch = 0 - end - - local current_velocity = self.object:get_velocity() - - local goal_velocity = { - x = (math_sin(yaw) * -v), - y = pitch, - z = (math_cos(yaw) * v), - } - - - local new_velocity_addition = vector.subtract(goal_velocity,current_velocity) - - if vector_length(new_velocity_addition) > vector_length(goal_velocity) then - vector.multiply(new_velocity_addition, (vector_length(goal_velocity) / vector_length(new_velocity_addition))) - end - - --smooths out mobs a bit - if vector_length(new_velocity_addition) >= 0.0001 then - self.object:add_velocity(new_velocity_addition) - end -end - ---[[ -______ _ -| ___| | -| |_ | |_ _ -| _| | | | | | -| | | | |_| | -\_| |_|\__, | - __/ | - |___/ -]]-- - --- move mob in facing direction ---this has been modified to be internal ---internal = lua (self.yaw) ---engine = c++ (self.object:get_yaw()) -mobs.set_fly_velocity = function(self, v) - - local yaw = (self.yaw or 0) - local pitch = (self.pitch or 0) - - if v == 0 then - pitch = 0 - end - - local current_velocity = self.object:get_velocity() - - local goal_velocity = { - x = (math_sin(yaw) * -v), - y = pitch, - z = (math_cos(yaw) * v), - } - - - local new_velocity_addition = vector.subtract(goal_velocity,current_velocity) - - if vector_length(new_velocity_addition) > vector_length(goal_velocity) then - vector.multiply(new_velocity_addition, (vector_length(goal_velocity) / vector_length(new_velocity_addition))) - end - - --smooths out mobs a bit - if vector_length(new_velocity_addition) >= 0.0001 then - self.object:add_velocity(new_velocity_addition) - end -end - ---a quick and simple pitch calculation between two vector positions -mobs.calculate_pitch = function(pos1, pos2) - - if pos1 == nil or pos2 == nil then - return false - end - - return(minetest_dir_to_yaw(vector_new(vector_distance(vector_new(pos1.x,0,pos1.z),vector_new(pos2.x,0,pos2.z)),0,pos1.y - pos2.y)) + HALF_PI) -end - ---make mobs fly up or down based on their y difference -mobs.set_pitch_while_attacking = function(self) - local pos1 = self.object:get_pos() - local pos2 = self.attacking:get_pos() - - local pitch = mobs.calculate_pitch(pos2,pos1) - - self.pitch = pitch -end - - - ---[[ - ___ - |_ | - | |_ _ _ __ ___ _ __ - | | | | | '_ ` _ \| '_ \ -/\__/ / |_| | | | | | | |_) | -\____/ \__,_|_| |_| |_| .__/ - | | - |_| -]]-- - ---special mob jump movement -mobs.jump_move = function(self, velocity) - - if self.object:get_velocity().y ~= 0 or not self.old_velocity or (self.old_velocity and self.old_velocity.y > 0) then - return - end - - --make the mob stick for a split second - mobs.set_velocity(self,0) - - --fallback velocity to allow modularity - jump_height = DEFAULT_JUMP_HEIGHT - - local yaw = (self.yaw or 0) - - local current_velocity = self.object:get_velocity() - - local goal_velocity = { - x = (math_sin(yaw) * -velocity), - y = jump_height, - z = (math_cos(yaw) * velocity), - } - - - local new_velocity_addition = vector.subtract(goal_velocity,current_velocity) - - if vector_length(new_velocity_addition) > vector_length(goal_velocity) then - vector.multiply(new_velocity_addition, (vector_length(goal_velocity) / vector_length(new_velocity_addition))) - end - - --smooths out mobs a bit - if vector_length(new_velocity_addition) >= 0.0001 then - self.object:add_velocity(new_velocity_addition) - end -end - ---make it so mobs do not glitch out and freak out ---when moving around over nodes -mobs.swap_auto_step_height_adjust = function(self) - local y_vel = self.object:get_velocity().y - - if y_vel == 0 and self.stepheight ~= self.stepheight_backup then - self.stepheight = self.stepheight_backup - elseif y_vel ~= 0 and self.stepheight ~= 0 then - self.stepheight = 0 - end -end \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/projectile_handling.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/projectile_handling.lua deleted file mode 100644 index e7ae6ffbe..000000000 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/projectile_handling.lua +++ /dev/null @@ -1,44 +0,0 @@ -local GRAVITY = minetest.settings:get("movement_gravity")-- + 9.81 - -mobs.shoot_projectile_handling = function(arrow_item, pos, dir, yaw, shooter, power, damage, is_critical, bow_stack, collectable, gravity) - local obj = minetest.add_entity({x=pos.x,y=pos.y,z=pos.z}, arrow_item.."_entity") - if power == nil then - power = 19 - end - if damage == nil then - damage = 3 - end - - gravity = gravity or -GRAVITY - - local knockback - if bow_stack then - local enchantments = mcl_enchanting.get_enchantments(bow_stack) - if enchantments.power then - damage = damage + (enchantments.power + 1) / 4 - end - if enchantments.punch then - knockback = enchantments.punch * 3 - end - if enchantments.flame then - mcl_burning.set_on_fire(obj, math.huge) - end - end - obj:set_velocity({x=dir.x*power, y=dir.y*power, z=dir.z*power}) - obj:set_acceleration({x=0, y=gravity, z=0}) - obj:set_yaw(yaw-math.pi/2) - local le = obj:get_luaentity() - le._shooter = shooter - le._damage = damage - le._is_critical = is_critical - le._startpos = pos - le._knockback = knockback - le._collectable = collectable - - --play custom shoot sound - if shooter ~= nil and shooter.shoot_sound then - minetest.sound_play(shooter.shoot_sound, {pos=pos, max_hear_distance=16}, true) - end - - return obj -end \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/set_up.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/set_up.lua deleted file mode 100644 index dfef98ee8..000000000 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/set_up.lua +++ /dev/null @@ -1,226 +0,0 @@ -local math_random = math.random - -local minetest_settings = minetest.settings - --- get entity staticdata -mobs.mob_staticdata = function(self) - - --despawn mechanism - --don't despawned tamed or bred mobs - if not self.tamed and not self.bred then - if not mobs.check_for_player_within_area(self, 64) then - --print("removing SERIALIZED!") - self.object:remove() - return - end - end - - self.remove_ok = true - self.attack = nil - self.following = nil - - if use_cmi then - self.serialized_cmi_components = cmi.serialize_components(self._cmi_components) - end - - local tmp = {} - - for _,stat in pairs(self) do - - local t = type(stat) - - if t ~= "function" - and t ~= "nil" - and t ~= "userdata" - and _ ~= "_cmi_components" then - tmp[_] = self[_] - end - end - - return minetest.serialize(tmp) -end - - --- activate mob and reload settings -mobs.mob_activate = function(self, staticdata, def, dtime) - - -- remove monsters in peaceful mode - if self.type == "monster" and minetest_settings:get_bool("only_peaceful_mobs", false) then - mcl_burning.extinguish(self.object) - self.object:remove() - return - end - - -- load entity variables - local tmp = minetest.deserialize(staticdata) - - if tmp then - for _,stat in pairs(tmp) do - self[_] = stat - end - end - - --set up wandering - if not self.wandering then - self.wandering = true - end - - --clear animation - self.current_animation = nil - - -- select random texture, set model and size - if not self.base_texture then - - -- compatiblity with old simple mobs textures - if type(def.textures[1]) == "string" then - def.textures = {def.textures} - end - - self.base_texture = def.textures[math_random(1, #def.textures)] - self.base_mesh = def.mesh - self.base_size = self.visual_size - self.base_colbox = self.collisionbox - self.base_selbox = self.selectionbox - end - - -- for current mobs that dont have this set - if not self.base_selbox then - self.base_selbox = self.selectionbox or self.base_colbox - end - - -- set texture, model and size - local textures = self.base_texture - local mesh = self.base_mesh - local vis_size = self.base_size - local colbox = self.base_colbox - local selbox = self.base_selbox - - -- specific texture if gotten - if self.gotten == true - and def.gotten_texture then - textures = def.gotten_texture - end - - -- specific mesh if gotten - if self.gotten == true - and def.gotten_mesh then - mesh = def.gotten_mesh - end - - -- set baby mobs to half size - if self.baby == true then - - vis_size = { - x = self.base_size.x * self.baby_size, - y = self.base_size.y * self.baby_size, - } - - if def.child_texture then - textures = def.child_texture[1] - end - - colbox = { - self.base_colbox[1] * self.baby_size, - self.base_colbox[2] * self.baby_size, - self.base_colbox[3] * self.baby_size, - self.base_colbox[4] * self.baby_size, - self.base_colbox[5] * self.baby_size, - self.base_colbox[6] * self.baby_size - } - selbox = { - self.base_selbox[1] * self.baby_size, - self.base_selbox[2] * self.baby_size, - self.base_selbox[3] * self.baby_size, - self.base_selbox[4] * self.baby_size, - self.base_selbox[5] * self.baby_size, - self.base_selbox[6] * self.baby_size - } - end - - --stop mobs from reviving - if not self.dead and not self.health then - self.health = math_random (self.hp_min, self.hp_max) - end - - - - if not self.random_sound_timer then - self.random_sound_timer = math_random(self.random_sound_timer_min,self.random_sound_timer_max) - end - - if self.breath == nil then - self.breath = self.breath_max - end - - -- pathfinding init - self.path = {} - self.path.way = {} -- path to follow, table of positions - self.path.lastpos = {x = 0, y = 0, z = 0} - self.path.stuck = false - self.path.following = false -- currently following path? - self.path.stuck_timer = 0 -- if stuck for too long search for path - - -- Armor groups - -- immortal=1 because we use custom health - -- handling (using "health" property) - local armor - if type(self.armor) == "table" then - armor = table.copy(self.armor) - armor.immortal = 1 - else - armor = {immortal=1, fleshy = self.armor} - end - self.object:set_armor_groups(armor) - self.old_y = self.object:get_pos().y - self.old_health = self.health - self.sounds.distance = self.sounds.distance or 10 - self.textures = textures - self.mesh = mesh - self.collisionbox = colbox - self.selectionbox = selbox - self.visual_size = vis_size - self.standing_in = "ignore" - self.standing_on = "ignore" - self.jump_sound_cooloff = 0 -- used to prevent jump sound from being played too often in short time - self.opinion_sound_cooloff = 0 -- used to prevent sound spam of particular sound types - - self.texture_mods = {} - - - self.v_start = false - self.timer = 0 - self.blinktimer = 0 - self.blinkstatus = false - - - --continue mob effect on server restart - if self.dead or self.health <= 0 then - self.object:set_texture_mod("^[colorize:red:120") - else - self.object:set_texture_mod("") - end - - - -- set anything changed above - self.object:set_properties(self) - - --update_tag(self) - --mobs.set_animation(self, "stand") - - -- run on_spawn function if found - if self.on_spawn and not self.on_spawn_run then - if self.on_spawn(self) then - self.on_spawn_run = true -- if true, set flag to run once only - end - end - - -- run after_activate - if def.after_activate then - def.after_activate(self, staticdata, def, dtime) - end - - if use_cmi then - self._cmi_components = cmi.activate_components(self.serialized_cmi_components) - cmi.notify_activate(self.object, dtime) - end -end \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/sound_handling.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/sound_handling.lua deleted file mode 100644 index 98d2644e8..000000000 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/sound_handling.lua +++ /dev/null @@ -1,59 +0,0 @@ -local math_random = math.random - - ---generic call for sound handler for mobs (data access) -mobs.play_sound = function(self,sound) - local soundinfo = self.sounds - - if not soundinfo then - return - end - - local play_sound = soundinfo[sound] - - if not play_sound then - return - end - - mobs.play_sound_handler(self, play_sound) -end - - ---generic sound handler for mobs -mobs.play_sound_handler = function(self, sound) - local pitch = (100 + math_random(-15,15) + math_random()) / 100 - local distance = self.sounds.distance or 16 - - minetest.sound_play(sound, { - object = self.object, - gain = 1.0, - max_hear_distance = distance, - pitch = pitch, - }, true) -end - - ---random sound timing handler -mobs.random_sound_handling = function(self,dtime) - - self.random_sound_timer = self.random_sound_timer - dtime - - --play sound and reset timer - if self.random_sound_timer <= 0 then - mobs.play_sound(self,"random") - self.random_sound_timer = math_random(self.random_sound_timer_min,self.random_sound_timer_max) - end -end - ---used for playing a non-mob internal sound at random pitches -mobs.play_sound_specific = function(self,soundname) - local pitch = (100 + math_random(-15,15) + math_random()) / 100 - local distance = self.sounds.distance or 16 - - minetest.sound_play(soundname, { - object = self.object, - gain = 1.0, - max_hear_distance = distance, - pitch = pitch, - }, true) -end \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mobs/api/mount.lua b/mods/ENTITIES/mcl_mobs/api/mount.lua index 8ee45f299..f1865b51b 100644 --- a/mods/ENTITIES/mcl_mobs/api/mount.lua +++ b/mods/ENTITIES/mcl_mobs/api/mount.lua @@ -1,18 +1,7 @@ --- lib_mount by Blert2112 (edited by TenPlus1) +--[[local node_ok = function(pos, fallback) -local enable_crash = false -local crash_threshold = 6.5 -- ignored if enable_crash=false - ------------------------------------------------------------------------------- - --- --- Helper functions --- - -local node_ok = function(pos, fallback) - - fallback = fallback or mobs.fallback_node + fallback = fallback or "mcl_core:dirt" local node = minetest.get_node_or_nil(pos) @@ -25,8 +14,7 @@ end local function node_is(pos) - - local node = node_ok(pos) + local node = minetest.get_node(pos) if node.name == "air" then return "air" @@ -40,182 +28,62 @@ local function node_is(pos) return "liquid" end - if minetest.registered_nodes[node.name].walkable == true then + local def = minetest.registered_nodes[node.name] + + if not def or def.walkable then return "walkable" end return "other" end +--]] +function mcl_mobs.mob:mount(obj) + if mcl_mount.mount(obj) then + if self.def.on_mount(obj) == false then + return + end -local function get_sign(i) - - i = i or 0 - - if i == 0 then - return 0 - else - return i / math.abs(i) + self.driver = obj + obj:set_attach(self.object, "", self.def.driver_offset) + if obj:is_player() then + obj:set_eye_offset(self.def.driver_eye_offset, vector.new(0, 0, 0)) + end end end - -local function get_velocity(v, yaw, y) - - local x = -math.sin(yaw) * v - local z = math.cos(yaw) * v - - return {x = x, y = y, z = z} -end - - -local function get_v(v) - return math.sqrt(v.x * v.x + v.z * v.z) -end - - -local function force_detach(player) - - local attached_to = player:get_attach() - - if not attached_to then - return - end - - local entity = attached_to:get_luaentity() - - if entity.driver - and entity.driver == player then - - entity.driver = nil - end - - player:set_detach() - mcl_player.player_attached[player:get_player_name()] = false - player:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) - mcl_player.player_set_animation(player, "stand" , 30) - player:set_properties({visual_size = {x = 1, y = 1} }) - -end - -------------------------------------------------------------------------------- - - -minetest.register_on_leaveplayer(function(player) - force_detach(player) -end) - -minetest.register_on_shutdown(function() - local players = minetest.get_connected_players() - for i = 1, #players do - force_detach(players[i]) - end -end) - -minetest.register_on_dieplayer(function(player) - force_detach(player) - return true -end) - -------------------------------------------------------------------------------- - -function mobs.attach(entity, player) - - local attach_at, eye_offset - - entity.player_rotation = entity.player_rotation or {x = 0, y = 0, z = 0} - entity.driver_attach_at = entity.driver_attach_at or {x = 0, y = 0, z = 0} - entity.driver_eye_offset = entity.driver_eye_offset or {x = 0, y = 0, z = 0} - entity.driver_scale = entity.driver_scale or {x = 1, y = 1} +--[[ +function mobs:drive(moving_anim, stand_anim, can_fly, dtime) local rot_view = 0 - if entity.player_rotation.y == 90 then - rot_view = math.pi/2 - end - - attach_at = entity.driver_attach_at - eye_offset = entity.driver_eye_offset - entity.driver = player - - force_detach(player) - - player:set_attach(entity.object, "", attach_at, entity.player_rotation) - mcl_player.player_attached[player:get_player_name()] = true - player:set_eye_offset(eye_offset, {x = 0, y = 0, z = 0}) - - player:set_properties({ - visual_size = { - x = entity.driver_scale.x, - y = entity.driver_scale.y - } - }) - - minetest.after(0.2, function(name) - local player = minetest.get_player_by_name(name) - if player then - mcl_player.player_set_animation(player, "sit_mount" , 30) - end - end, player:get_player_name()) - - player:set_look_horizontal(entity.object:get_yaw() - rot_view) -end - - -function mobs.detach(player, offset) - - force_detach(player) - - mcl_player.player_set_animation(player, "stand" , 30) - - --local pos = player:get_pos() - - --pos = {x = pos.x + offset.x, y = pos.y + 0.2 + offset.y, z = pos.z + offset.z} - - player:add_velocity(vector.new(math.random(-6,6),math.random(5,8),math.random(-6,6))) --throw the rider off - - --[[ - minetest.after(0.1, function(name, pos) - local player = minetest.get_player_by_name(name) - if player then - player:set_pos(pos) - end - end, player:get_player_name(), pos) - ]]-- -end - - -function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) - - local rot_view = 0 - - if entity.player_rotation.y == 90 then + if self.player_rotation.y == 90 then rot_view = math.pi/2 end local acce_y = 0 - local velo = entity.object:get_velocity() + local velo = self.object:get_velocity() - entity.v = get_v(velo) * get_sign(entity.v) + self.v = get_v(velo) * get_sign(self.v) -- process controls - if entity.driver then + if self.driver then - local ctrl = entity.driver:get_player_control() + local ctrl = self.driver:get_player_control() -- move forwards if ctrl.up then - mobs.set_velocity(entity, entity.run_velocity) + self:set_velocity(self.run_velocity) - mobs.set_mob_animation(entity, moving_anim) + self:set_mob_animation( moving_anim) -- move backwards elseif ctrl.down then - mobs.set_velocity(entity, -entity.run_velocity) + self:set_velocity(-self.run_velocity) - mobs.set_mob_animation(entity, moving_anim) + self:set_mob_animation(moving_anim) --halt else @@ -253,7 +121,7 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) end else - ]]-- + ] ]-- -- jump if ctrl.jump then @@ -381,7 +249,7 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) end entity.v2 = v - ]]-- + ] ]-- end @@ -449,3 +317,5 @@ function mobs.fly(entity, dtime, speed, shoots, arrow, moving_anim, stand_anim) mobs:set_mob_animation(entity, moving_anim) end end + +]]-- diff --git a/mods/ENTITIES/mcl_mobs/api/movement.lua b/mods/ENTITIES/mcl_mobs/api/movement.lua new file mode 100644 index 000000000..f5182f974 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/movement.lua @@ -0,0 +1,57 @@ +function mcl_mobs.mob:update_node_type() + self.last_node_type = self.node_type or "ignore" + self.node_type = mcl_mobs.util.get_node_type(self.object:get_pos()) + + if self.def.ignore_cobweb and self.node_type == "cobweb" then + self.node_type = "air" + end +end + +function mcl_mobs.mob:backup_movement() + self.last_pos = self.object:get_pos() + self.last_velocity = self.object:get_velocity() +end + +-- vertical_acceleration, vertical_speed, horizontal_speed_factor +function mcl_mobs.mob:get_movement() + if self.node_type == "solid" or self.node_type == "ignore" then + return 0, 0, 0 + elseif self.node_type == "air" then + return self.def.gravity, nil, nil + elseif self.node_type == "water" then + return 0, mcl_mobs.const.water_sink_speed, mcl_mobs.const.water_slowdown_factor + elseif self.node_type == "lava" then + return 0, mcl_mobs.const.lava_sink_speed, mcl_mobs.const.lava_slowdown_factor + elseif self.node_type == "cobweb" then + return 0, mcl_mobs.const.cobweb_sink_speed, mcl_mobs.const.cobweb_slowdown_factor + end +end + +function mcl_mobs.mob:update_movement() + local vertical_acceleration, vertical_speed, horizontal_speed_factor = self:get_movement() + + if vertical_acceleration then + self.object:set_acceleration(vector.new(0, vertical_acceleration, 0)) + end + + local velocity = self.object:get_velocity() + + if vertical_speed then + velocity.y = vertical_speed + end + + if horizontal_speed_factor then + velocity.x = velocity.x * horizontal_speed_factor + velocity.z = velocity.z * horizontal_speed_factor + end + + self.horizontal_speed_factor = horizontal_speed_factor + + self.object:set_velocity(velocity) +end + +function mcl_mobs.mob:movement_step() + if self.last_node_type ~= self.node_type then + self:update_movement() + end +end diff --git a/mods/ENTITIES/mcl_mobs/api/properties.lua b/mods/ENTITIES/mcl_mobs/api/properties.lua new file mode 100644 index 000000000..038941fc8 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/properties.lua @@ -0,0 +1,8 @@ +function mcl_mobs.mob:set_properties(props) + self.object:set_properties(props) + self:reload_properties() +end + +function mcl_mobs.mob:reload_properties() + self.properties = self.object:get_properties() +end diff --git a/mods/ENTITIES/mcl_mobs/api/register.lua b/mods/ENTITIES/mcl_mobs/api/register.lua new file mode 100644 index 000000000..c8ce12c38 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/register.lua @@ -0,0 +1,84 @@ +function mcl_mobs.register_mob(name, def) + mcl_mobs.registered_mobs[name] = def + + def = table.copy(def) + + def.health_min = mcl_mobs.util.scale_difficulty(def.health_min, 5, 1) + def.health_max = mcl_mobs.util.scale_difficulty(def.health_max, 10, 1) + def.breath_max = def.breath_max or mcl_mobs.const.breath_max + + def.damage = mcl_mobs.util.scale_difficulty(def.damage, 0, 0) + + def.fear_height = def.fear_height or 0 + def.view_range = def.view_range or mcl_mobs.const.VIEW_RANGE + + def.armor_groups = def.armor_groups or {fleshy = 100} + def.knockback_multiplier = def.knockback_multiplier or 1 + + def.sounds = def.sounds or {} + + def.gravity = def.gravity or mcl_mobs.const.gravity + + if def.group_attack then + if def.group_attack == true then + def.group_attack = {[name] = true} + else + def.group_attack = mcl_mobs.util.list_to_set(def.group_attack) + end + end + + def.get_with = mcl_mobs.util.list_to_set(def.feed_with) + + local feed_with = mcl_mobs.util.list_to_set(def.feed_with) + + def.boost_with = def.boostable and (def.boost_with and mcl_mobs.util.list_to_set(def.boost_with) or feed_with) + def.heal_with = def.healable and (def.heal_with and mcl_mobs.util.list_to_set(def.heal_with) or feed_with) + def.breed_with = def.breedable and (def.breed_with and mcl_mobs.util.list_to_set(def.breed_with) or feed_with) + def.tame_with = def.tameable and (def.tame_with and mcl_mobs.util.list_to_set(def.tame_with) or feed_with) + + if type(def.visual_size) == "number" then + def.visual_size = {x = def.visual_size, y = def.visual_size} + end + + def.driver_offset = def.driver_offset or vector.new(0, 0, 0) + def.driver_eye_offset = def.driver_eye_offset or vector.new(0, 0, 0) + + def.stepheight = def.stepheight or mcl_mobs.const.stepheight + + def.float_in_air = def.float_in_air == true and mcl_mobs.const.float_in_air or def.float_in_air + def.float_in_water = def.float_in_water == true and mcl_mobs.const.float_in_water or def.float_in_water + def.float_in_lava = def.float_in_lava == true and mcl_mobs.const.float_in_lava or def.float_in_lava + + mcl_mobs.mob_defititions[name] = def + + local entity_def = { + initial_properties = { + physical = true, + collide_with_objects = false, -- custom magnetic object collision handling + collisionbox = def.collisionbox, -- no default collisionbox, there are some basic traits the mob def **needs** to have, there is no such thing as a generic mob + pointable = true, + visual = "mesh", -- all mobs have models + mesh = def.model, + visual_size = def.visual_size or {x = 1, y = 1}, + textures = def.textures, -- maybe introduce a better concept to automatically handle textures (to avoid problems with armor and wielditems once they are added) + use_texture_alpha = def.use_texture_alpha, -- for e.g. slimes + is_visible = true, -- always visible + makes_footstep_sound = def.makes_footstep_sound, -- play the footstep sounds of the nodes the mob is walking over (maybe this should be enabled by default?) + automatic_rotate = 0, + stepheight = def.stepheight, -- is this needed? mobs have custom movement functions, don't they? Or is this useful for client side prediction? + automatic_face_movement_dir = def.rotate or 0, + automatic_face_movement_max_rotation_per_sec = 360, + glow = def.glow, -- Some mobs glow. Could also be used for spectral arrows in the future + static_save = true, -- persistent mobs + damage_texture_modifier = "^blank.png", -- damage is handled customly, don't show the damage overlay client-side + show_on_minimap = def.show_on_minimap, -- nice to have feature for bosses + }, + } + setmetatable(entity_def, {__index = mcl_mobs.mob}) + + minetest.register_entity(name, entity_def) + + if minetest.get_modpath("doc_identifier") ~= nil then + doc.sub.identifier.register_object(name, "basics", "mobs") + end +end diff --git a/mods/ENTITIES/mcl_mobs/api/sound.lua b/mods/ENTITIES/mcl_mobs/api/sound.lua new file mode 100644 index 000000000..55880eb65 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/sound.lua @@ -0,0 +1,32 @@ +function mcl_mobs.mob:play_sound(sound_name) + local sound = self.def.sounds[sound_name] + + if sound then + self:play_sound_specific(sound) + end +end + +function mcl_mobs.mob:play_sound_specific(self, sound) + if not self.silent then + minetest.sound_play(sound, { + object = self.object, + gain = 1.0, + max_hear_distance = 16, + pitch = (100 + math.random(-15, 15) + math.random()) / 100, + }, true) + end +end + +function mcl_mobs.mob:start_sound_timer() + self.random_sound_timer = math.random(self.def.random_sound_timer_min, self.def.random_sound_timer_max) +end + +function mcl_mobs.mob:sound_step() + if not self.random_sound_timer then + self:start_sound_timer() + end + if self:do_timer("random_sound") then + self:play_sound("random") + self:start_sound_timer() + end +end diff --git a/mods/ENTITIES/mcl_mobs/api/spawning.lua b/mods/ENTITIES/mcl_mobs/api/spawn.lua similarity index 85% rename from mods/ENTITIES/mcl_mobs/api/spawning.lua rename to mods/ENTITIES/mcl_mobs/api/spawn.lua index ca4dc1e4f..35791d178 100644 --- a/mods/ENTITIES/mcl_mobs/api/spawning.lua +++ b/mods/ENTITIES/mcl_mobs/api/spawn.lua @@ -1,23 +1,4 @@ ---lua locals -local get_node = minetest.get_node -local get_item_group = minetest.get_item_group -local get_node_light = minetest.get_node_light -local find_nodes_in_area_under_air = minetest.find_nodes_in_area_under_air -local get_biome_name = minetest.get_biome_name -local get_objects_inside_radius = minetest.get_objects_inside_radius - - -local math_random = math.random -local math_floor = math.floor -local max = math.max - -local vector_distance = vector.distance -local vector_new = vector.new -local vector_floor = vector.floor - -local table_copy = table.copy -local table_remove = table.remove - +--[[ -- range for mob count local aoc_range = 48 @@ -162,7 +143,7 @@ Overworld regular: "MesaBryce", "JungleEdge", "SavannaM", -]]-- +] ]-- @@ -170,7 +151,7 @@ Overworld regular: local count_mobs = function(pos) local num = 0 for _,object in pairs(get_objects_inside_radius(pos, aoc_range)) do - if object and object:get_luaentity() and object:get_luaentity()._cmi_is_mob then + if object and object:get_luaentity() and object:get_luaentity().is_mob then num = num + 1 end end @@ -209,7 +190,7 @@ biomes: tells the spawner to allow certain mobs to spawn in certain biomes what is aoc??? objects in area WARNING: BIOME INTEGRATION NEEDED -> How to get biome through lua?? -]]-- +] ]-- --this is where all of the spawning information is kept @@ -249,13 +230,13 @@ function mobs:spawn_specific(name, dimension, type_of_spawning, biomes, min_ligh -- is mob actually registered? if not mobs.spawning_mobs[name] or not minetest.registered_entities[name] then - minetest.log("warning", "Mob spawn of "..name.." failed, unknown entity or mob is not registered for spawning!") + minetest.log("warning", "mcl_mobs.mob spawn of "..name.." failed, unknown entity or mob is not registered for spawning!") return end -- additional custom checks for spawning mob if mobs:spawn_abm_check(pos, node, name) == true then - minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, ABM check rejected!") + minetest.log("info", "mcl_mobs.mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, ABM check rejected!") return end @@ -275,7 +256,7 @@ function mobs:spawn_specific(name, dimension, type_of_spawning, biomes, min_ligh or (not in_class_cap) -- spawn class mob cap or count_mobs(pos, name) >= aoc then -- per-mob mob cap -- too many entities - minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, too crowded!") + minetest.log("info", "mcl_mobs.mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, too crowded!") return end @@ -288,14 +269,14 @@ function mobs:spawn_specific(name, dimension, type_of_spawning, biomes, min_ligh -- daylight, but mob wants night if day_toggle == false then -- mob needs night - minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, mob needs light!") + minetest.log("info", "mcl_mobs.mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, mob needs light!") return end else -- night time but mob wants day if day_toggle == true then -- mob needs day - minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, mob needs daylight!") + minetest.log("info", "mcl_mobs.mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, mob needs daylight!") return end end @@ -311,7 +292,7 @@ function mobs:spawn_specific(name, dimension, type_of_spawning, biomes, min_ligh if objs[n]:is_player() then -- player too close - minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, player too close!") + minetest.log("info", "mcl_mobs.mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, player too close!") return end end @@ -319,14 +300,14 @@ function mobs:spawn_specific(name, dimension, type_of_spawning, biomes, min_ligh -- mobs cannot spawn in protected areas when enabled if not spawn_protected and minetest.is_protected(pos, "") then - minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, position is protected!") + minetest.log("info", "mcl_mobs.mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, position is protected!") return end -- are we spawning within height limits? if pos.y > max_height or pos.y < min_height then - minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, out of height limit!") + minetest.log("info", "mcl_mobs.mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, out of height limit!") return end @@ -335,7 +316,7 @@ function mobs:spawn_specific(name, dimension, type_of_spawning, biomes, min_ligh if not light or light > max_light or light < min_light then - minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, bad light!") + minetest.log("info", "mcl_mobs.mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, bad light!") return end @@ -369,7 +350,7 @@ function mobs:spawn_specific(name, dimension, type_of_spawning, biomes, min_ligh local pos2 = {x = pos.x+x, y = pos.y+y, z = pos.z+z} if minetest.registered_nodes[node_ok(pos2).name].walkable == true then -- inside block - minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, too little space!") + minetest.log("info", "mcl_mobs.mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, too little space!") if ent.spawn_small_alternative ~= nil and (not minetest.registered_nodes[node_ok(pos).name].walkable) then minetest.log("info", "Trying to spawn smaller alternative mob: "..ent.spawn_small_alternative) spawn_action(orig_pos, node, active_object_count, active_object_count_wider, ent.spawn_small_alternative) @@ -390,7 +371,7 @@ function mobs:spawn_specific(name, dimension, type_of_spawning, biomes, min_ligh pos.y = pos.y - 0.5 local mob = minetest.add_entity(pos, name) - minetest.log("action", "Mob spawned: "..name.." at "..minetest.pos_to_string(pos)) + minetest.log("action", "mcl_mobs.mob spawned: "..name.." at "..minetest.pos_to_string(pos)) if on_spawn then @@ -403,7 +384,7 @@ function mobs:spawn_specific(name, dimension, type_of_spawning, biomes, min_ligh local function spawn_abm_action(pos, node, active_object_count, active_object_count_wider) spawn_action(pos, node, active_object_count, active_object_count_wider, name) end - ]]-- + ] ]-- local entdef = minetest.registered_entities[name] local spawn_class @@ -441,7 +422,7 @@ function mobs:spawn_specific(name, dimension, type_of_spawning, biomes, min_ligh catch_up = false, action = spawn_abm_action, }) - ]]-- + ] ]-- end -- compatibility with older mob registration @@ -452,7 +433,7 @@ function mobs:register_spawn(name, nodes, max_light, min_light, chance, active_o mobs:spawn_specific(name, nodes, {"air"}, min_light, max_light, 30, chance, active_object_count, -31000, max_height, day_toggle) end -]]-- +] ]-- --Don't disable this yet-j4i @@ -476,7 +457,7 @@ function mobs:spawn(def) mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, interval, chance, active_object_count, min_height, max_height, day_toggle, on_spawn) - ]]-- + ] ]-- end @@ -488,18 +469,18 @@ local outer = 64 local int = {-1,1} local position_calculation = function(pos) - pos = vector_floor(pos) + pos = vector.floor(pos) --this is used to determine the axis buffer from the player - axis = math_random(0,1) + axis = math.random(0,1) --cast towards the direction if axis == 0 then --x - pos.x = pos.x + math_random(inner,outer)*int[math_random(1,2)] - pos.z = pos.z + math_random(-outer,outer) + pos.x = pos.x + math.random(inner,outer)*int[math.random(1,2)] + pos.z = pos.z + math.random(-outer,outer) else --z - pos.z = pos.z + math_random(inner,outer)*int[math_random(1,2)] - pos.x = pos.x + math_random(-outer,outer) + pos.z = pos.z + math.random(inner,outer)*int[math.random(1,2)] + pos.x = pos.x + math.random(-outer,outer) end return(pos) end @@ -510,12 +491,12 @@ local decypher_limits_dictionary = { ["nether"] = {mcl_vars.mg_nether_min, mcl_vars.mg_nether_max}, ["end"] = {mcl_vars.mg_end_min, mcl_vars.mg_end_max} } -]]-- +] ]-- local function decypher_limits(posy) --local min_max_table = decypher_limits_dictionary[dimension] --return min_max_table[1],min_max_table[2] - posy = math_floor(posy) + posy = math.floor(posy) return posy - 32, posy + 32 end @@ -556,27 +537,27 @@ if mobs_spawn then local min,max = decypher_limits(player_pos.y) - for i = 1,math_random(1,4) do + for i = 1,math.random(1,4) do -- after this line each "break" means "continue" local do_mob_algorithm = true repeat local goal_pos = position_calculation(player_pos) - local spawning_position_list = find_nodes_in_area_under_air(vector_new(goal_pos.x,min,goal_pos.z), vector_new(goal_pos.x,max,goal_pos.z), {"group:solid", "group:water", "group:lava"}) + local spawning_position_list = find_nodes_in_area_under_air(vector.new(goal_pos.x,min,goal_pos.z), vector.new(goal_pos.x,max,goal_pos.z), {"group:solid", "group:water", "group:lava"}) --couldn't find node if #spawning_position_list <= 0 then break end - local spawning_position = spawning_position_list[math_random(1,#spawning_position_list)] + local spawning_position = spawning_position_list[math.random(1,#spawning_position_list)] --Prevent strange behavior --- this is commented out: /too close to player --fixed with inner circle - if not spawning_position then -- or vector_distance(player_pos, spawning_position) < 15 + if not spawning_position then -- or vector.distance(player_pos, spawning_position) < 15 break end - + --hard code mob limit in area to 5 for now if count_mobs(spawning_position) >= 5 then break @@ -606,7 +587,7 @@ if mobs_spawn then local is_lava = get_item_group(gotten_node, "lava") ~= 0 local mob_def = nil - + --create a disconnected clone of the spawn dictionary --prevents memory leak local mob_library_worker_table = table_copy(spawn_dictionary) @@ -625,7 +606,7 @@ if mobs_spawn then local skip = false --use this for removing table elements of mobs that do not match - local temp_index = math_random(1,#mob_library_worker_table) + local temp_index = math.random(1,#mob_library_worker_table) local temp_def = mob_library_worker_table[temp_index] @@ -705,3 +686,25 @@ if mobs_spawn then end end) end + +local function is_forbidden_node(pos, node) + node = node or minetest.get_node(pos) + return minetest.get_item_group(node.name, "stair") > 0 or minetest.get_item_group(node.name, "slab") > 0 or minetest.get_item_group(node.name, "carpet") > 0 +end + +function mobs:spawn_abm_check(pos, node, name) + -- Don't spawn monsters on mycelium + if (node.name == "mcl_core:mycelium" or node.name == "mcl_core:mycelium_snow") and minetest.registered_entities[name].type == "monster" then + return true + --Don't Spawn mobs on stairs, slabs, or carpets + elseif is_forbidden_node(pos, node) or is_forbidden_node(vector.add(pos, vector.new(0, 1, 0))) then + return true + -- Spawn on opaque or liquid nodes + elseif minetest.get_item_group(node.name, "opaque") ~= 0 or minetest.registered_nodes[node.name].liquidtype ~= "none" or node.name == "mcl_core:grass_path" then + return false + end + + -- Reject everything else + return true +end +]]-- diff --git a/mods/ENTITIES/mobs_mc/3_shared.lua b/mods/ENTITIES/mcl_mobs/api/taming.lua similarity index 97% rename from mods/ENTITIES/mobs_mc/3_shared.lua rename to mods/ENTITIES/mcl_mobs/api/taming.lua index fce0850b4..705666d4d 100644 --- a/mods/ENTITIES/mobs_mc/3_shared.lua +++ b/mods/ENTITIES/mcl_mobs/api/taming.lua @@ -1,3 +1,6 @@ +-- ToDo + +--[[ local pr = PseudoRandom(os.time()*5) local offsets = {} @@ -12,7 +15,9 @@ the owner is too far away. To be used with do_custom. Note: Optimized for mobs s Larger mobs might have space problems after teleportation. * dist: Minimum required distance from owner to teleport. Default: 12 -* teleport_check_interval: Optional. Interval in seconds to check the mob teleportation. Default: 4 ]] +* teleport_check_interval: Optional. Interval in seconds to check the mob teleportation. Default: 4 ]]-- + +--[[ mobs_mc.make_owner_teleport_function = function(dist, teleport_check_interval) return function(self, dtime) -- No teleportation if no owner or if sitting @@ -61,3 +66,5 @@ mobs_mc.make_owner_teleport_function = function(dist, teleport_check_interval) end end end + +--]] diff --git a/mods/ENTITIES/mcl_mobs/api/util.lua b/mods/ENTITIES/mcl_mobs/api/util.lua new file mode 100644 index 000000000..25d2a21aa --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/util.lua @@ -0,0 +1,114 @@ +function mcl_mobs.util.scale_difficulty(value, default, min, special) + if (not value) or (value == default) or (value == special) then + return default + else + return math.max(min, value * difficulty) + end +end + +function mcl_mobs.util.scale_size(tbl, size) + for k, v in pairs(tbl) do + tbl[k] = v * size + end +end + +function mcl_mobs.util.rgb_to_hex(rgb) + local hexadecimal = "#" + + for key, value in pairs(rgb) do + local hex = "" + + while value > 0 do + local index = math.fmod(value, 16) + 1 + value = math.floor(value / 16) + hex = string.sub("0123456789ABCDEF", index, index) .. hex + end + + local len = string.len(hex) + + if len == 0 then + hex = "00" + elseif len == 1 then + hex = "0" .. hex + end + + hexadecimal = hexadecimal .. hex + end + + return hexadecimal +end + +function mcl_mobs.util.color_from_hue(hue) + local h = hue / 60 + local c = 255 + local x = (1 - math.abs(h % 2 - 1)) * 255 + + local i = math.floor(h) + if i == 0 then + return mcl_mobs.util.rgb_to_hex({c, x, 0}) + elseif i == 1 then + return mcl_mobs.util.rgb_to_hex({x, c, 0}) + elseif i == 2 then + return mcl_mobs.util.rgb_to_hex({0, c, x}) + elseif i == 3 then + return mcl_mobs.util.rgb_to_hex({0, x, c}) + elseif i == 4 then + return mcl_mobs.util.rgb_to_hex({x, 0, c}) + else + return mcl_mobs.util.rgb_to_hex({c, 0, x}) + end +end + +function mcl_mobs.util.take_item(player, itemstack) + if not minetest.is_creative_enabled(player:get_player_name()) then + itemstack:take_item() + return true + end +end + +function mcl_mobs.util.get_eye_height(obj) + if obj:is_player() then + return obj:get_properties().eye_height + else + return obj:get_luaentity().eye_height or 0 + end +end + +function mcl_mobs.util.list_to_set(list) + local set = {} + + if list then + for k, v in pairs(list) do + set[v] = true + end + end + + return set +end + +function mcl_mobs.util.within_map_limits(pos, radius) + return pos + and (pos.x - radius) > mcl_vars.mapgen_edge_min and (pos.x + radius) < mcl_vars.mapgen_edge_max + and (pos.y - radius) > mcl_vars.mapgen_edge_min and (pos.y + radius) < mcl_vars.mapgen_edge_max + and (pos.z - radius) > mcl_vars.mapgen_edge_min and (pos.z + radius) < mcl_vars.mapgen_edge_max +end + +function mcl_mobs.util.get_collision_data(obj) + local collisionbox = obj:get_properties().collisionbox + local pos = obj:get_pos() + pos.y = pos.y + collisionbox[2] + return collisionbox, pos, collisionbox[4] +end + +function mcl_mobs.util.get_node_type(pos) + local node = minetest.get_node(pos).name + + return nil + or node == "air" and "air" + or (minetest.registered_nodes[node] or {walkable = true}).walkable and "solid" + or node == "ignore" and "ignore" + or node == "mcl_core:cobweb" and "cobweb" + or minetest.get_item_group(node, "water") > 0 and "water" + or minetest.get_item_group(node, "lava") > 0 and "lava" + or "air" +end diff --git a/mods/ENTITIES/mcl_mobs/api_files.txt b/mods/ENTITIES/mcl_mobs/api_files.txt new file mode 100644 index 000000000..61717443a --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api_files.txt @@ -0,0 +1,51 @@ +api/properties.lua +api/taming.lua +api/main.lua +api/despawn.lua +api/damage.lua +api/arrow.lua +api/mount.lua +api/graphics/eye_height.lua +api/graphics/nametag.lua +api/graphics/rotation.lua +api/graphics/animation.lua +api/graphics/head.lua +api/graphics/visual_size.lua +api/graphics/textures.lua +api/graphics/collisionbox.lua +api/graphics/mesh.lua +api/ai/follow.lua +api/ai/land.lua +api/ai/fly.lua +api/ai/swim.lua +api/ai/jump.lua +api/ai/ai.lua +api/ai/attack/projectile_land.lua +api/ai/attack/projectile_fly.lua +api/ai/attack/projectile_common.lua +api/ai/attack/explode.lua +api/ai/attack/punch.lua +api/ai/climb.lua +api/ai/float.lua +api/ai/step_height.lua +api/common.lua +api/loot.lua +api/spawn.lua +api/register.lua +api/breeding.lua +api/env/breath.lua +api/env/env.lua +api/env/fall_damage.lua +api/env/collision.lua +api/env/sunlight.lua +api/movement.lua +api/death.lua +api/eggs.lua +api/interaction.lua +api/baby.lua +api/knockback.lua +api/anger.lua +api/util.lua +api/sound.lua +api/easteregg.lua +api/data.lua diff --git a/mods/ENTITIES/mcl_mobs/crafts.lua b/mods/ENTITIES/mcl_mobs/crafts.lua deleted file mode 100644 index e8a5b60fc..000000000 --- a/mods/ENTITIES/mcl_mobs/crafts.lua +++ /dev/null @@ -1,16 +0,0 @@ - -local S = minetest.get_translator("mcl_mobs") - --- name tag -minetest.register_craftitem("mcl_mobs:nametag", { - description = S("Name Tag"), - _tt_help = S("Give names to mobs").."\n"..S("Set name at anvil"), - _doc_items_longdesc = S("A name tag is an item to name a mob."), - _doc_items_usagehelp = S("Before you use the name tag, you need to set a name at an anvil. Then you can use the name tag to name a mob. This uses up the name tag."), - inventory_image = "mobs_nametag.png", - wield_image = "mobs_nametag.png", - stack_max = 64, - groups = { tool=1 }, -}) - -minetest.register_alias("mobs:nametag", "mcl_mobs:nametag") diff --git a/mods/ENTITIES/mcl_mobs/init.lua b/mods/ENTITIES/mcl_mobs/init.lua index b0daba2c4..f013115b9 100644 --- a/mods/ENTITIES/mcl_mobs/init.lua +++ b/mods/ENTITIES/mcl_mobs/init.lua @@ -1,16 +1,55 @@ +mcl_mobs = { + registered_mobs = {}, + mob_defititions = {}, + mob = {}, + util = {}, + eastereggs = { + rainbow = "kay27", + upside_down = "Fleckenstein", + spin = "Wuzzy", + }, + const = { + -- print debug messages + debug = minetest.settings:get_bool("mcl_mobs_debug"), -local path = minetest.get_modpath(minetest.get_current_modname()) + -- misc + breath_max = 6, -- default maximum breath + grow_up_boost = 0.1, -- how much grow up boost a baby mob will recieve when feed -local api_path = path.."/api" + -- limits + max_entity_cramming = 24, -- max amount of crammed entities before they take damage + despawn_radius = 64, -- radius outside of which mobs may despawn --- Mob API -dofile(api_path .. "/api.lua") + -- timers + life_timer = 30, -- how long it takes before the next despawn check is done + calm_down_timer = 6, -- how long it takes for mobs to calm down again after being angered when they don't see the attack target anymore + stun_timer = 0.4, -- how long it a mob will be stunned after taking damage + death_timer = 1.25, -- duration of the death animation + breed_giveup_timer = 15, -- how long a mob will search for a mate before giving up + run_timer = 5, -- how long a skittish mob runs after being damage: arbitrary 5 seconds --- Spawning Algorithm -dofile(api_path .. "/spawning.lua") + -- movement + gravity = 9.81, -- gravity: this is actually incorrect but MCL2 uses this value elsewhere too + water_sink_speed = -0.5, -- how fast mobs sink in water ToDo: research + water_slowdown_factor = 0.5, -- how much horizontal movement is slown down in water ToDo: research + lava_sink_speed = -0.2, -- how fast mobs sink in lava ToDo: research + lava_slowdown_factor = 0.2, -- how much horizontal movement is slown down in lava ToDo: research + cobweb_sink_speed = -0.1, -- how fast mobs sink in cobwebs ToDo: research + cobweb_slowdown_factor = 0.1, -- how much horizontal movement is slown down in cobwebs ToDo: research + float_in_air = -0.5, -- default float speed for mobs that float in air ToDo: research + float_in_water = 0.5, -- default float speed for mobs that float in water ToDo: research + float_in_lava = 0.5, -- default float speed for mobs that float in lava ToDo: research + knockback = 0.75, -- base knockback multiplier + knockback_up = 3, -- base vertical knockback + stepheight = 0.6, -- default step height + }, +} --- Rideable Mobs -dofile(api_path .. "/mount.lua") +local path = minetest.get_modpath("mcl_mobs") +local api_files = io.open(path .. "/api_files.txt", "r") -- update with: $ find api -name "*.lua" > api_files.txt --- Mob Items -dofile(path .. "/crafts.lua") \ No newline at end of file +for file in api_files:lines() do + dofile(path .. "/" .. file) +end + +api_files:close() diff --git a/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.de.tr b/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.de.tr index 3b1a310bf..8f3d352d0 100644 --- a/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.de.tr +++ b/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.de.tr @@ -1,11 +1,69 @@ # textdomain: mcl_mobs -Peaceful mode active! No monsters will spawn.=Friedlicher Modus aktiv! Es werden keine Monster auftauchen. This allows you to place a single mob.=Damit kann man einen Mob platzieren. Just place it where you want the mob to appear. Animals will spawn tamed, unless you hold down the sneak key while placing. If you place this on a mob spawner, you change the mob it spawns.=Platzieren Sie dies einfach dort, wo der Mob auftauchen soll. Tiere werden zahm erscheinen, außer, wenn Sie beim Platzieren die Schlichtaste drücken. Platzieren Sie dies auf einem Mobspawner, um den Mob im Mobspawner zu wechseln. You need the “maphack” privilege to change the mob spawner.=Sie brauchen das „maphack“-Privileg, um den Mobspawner ändern zu können. -Name Tag=Namensschild -A name tag is an item to name a mob.=Ein Namensschild ist ein Gegenstand, um einen Mob zu benennen. -Before you use the name tag, you need to set a name at an anvil. Then you can use the name tag to name a mob. This uses up the name tag.=Bevor Sie ein Namensschild benutzen können, müssen Sie ihn an einem Amboss benennen. Dann können können Sie das Namensschild benutztn, um einen Mob zu benennen. Das wird das Namensschild verbrauchen. Only peaceful mobs allowed!=Nur friedliche Mobs erlaubt! -Give names to mobs=Benennt Mobs -Set name at anvil=Namen am Amboss setzen +Agent=Akteur +Bat=Fledermaus +Blaze=Lohe +Chicken=Huhn +Cow=Kuh +Mooshroom=Pilzkuh +Creeper=Creeper +Ender Dragon=Enderdrache +Enderman=Enderman +Endermite=Endermilbe +Ghast=Ghast +Elder Guardian=Großer Wächter +Guardian=Wächter +Horse=Pferd +Skeleton Horse=Skelettpferd +Zombie Horse=Zombiepferd +Donkey=Esel +Mule=Maultier +Iron Golem=Eisengolem +Llama=Lama +Ocelot=Ozelot +Parrot=Papagei +Pig=Schwein +Polar Bear=Eisbär +Rabbit=Kaninchen +Killer Bunny=Killerkaninchen +The Killer Bunny=Das Killerkaninchen +Sheep=Schaf +Shulker=Shulker +Silverfish=Silberfischchen +Skeleton=Skelett +Stray=Eiswanderer +Wither Skeleton=Witherskelett +Magma Cube=Magmakubus +Slime=Schleim +Snow Golem=Schneegolem +Spider=Spinne +Cave Spider=Höhlenspinne +Squid=Tintenfisch +Vex=Plagegeist +Evoker=Magier +Illusioner=Illusionist +Villager=Dorfbewohner +Vindicator=Diener +Zombie Villager=Dorfbewohnerzombie +Witch=Hexe +Wither=Wither +Wolf=Wolf +Husk=Wüstenzombie +Zombie=Zombie +Zombie Pigman=Schweinezombie +Farmer=Bauer +Fisherman=Fischer +Fletcher=Pfeilmacher +Shepherd=Schäfer +Librarian=Bibliothekar +Cartographer=Kartograph +Armorer=Rüstungsschmied +Leatherworker=Lederarbeiter +Butcher=Metzger +Weapon Smith=Waffenschmied +Tool Smith=Werkzeugschmied +Cleric=Priester +Nitwit=Dorftrottel diff --git a/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.es.tr b/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.es.tr index ef067141f..d5f4b162d 100644 --- a/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.es.tr +++ b/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.es.tr @@ -1,9 +1,69 @@ # textdomain: mcl_mobs -Peaceful mode active! No monsters will spawn.=¡Modo pacífico activo! No aparecerán monstruos. This allows you to place a single mob.=Esto le permite colocar un solo animal. Just place it where you want the mob to appear. Animals will spawn tamed, unless you hold down the sneak key while placing. If you place this on a mob spawner, you change the mob it spawns.=Simplemente colóquelo donde desea que aparezcan los animales. Los animales aparecerán domesticados, a menos que mantenga presionada la tecla de sigilo mientras coloca. Si coloca esto en un engendrador de animales, cambia el animal que genera. You need the “maphack” privilege to change the mob spawner.=Necesita el privilegio "maphack" para cambiar el generador de animales. -Name Tag=Etiqueta -A name tag is an item to name a mob.=Una etiqueta es un elemento para nombrar una animal. -Before you use the name tag, you need to set a name at an anvil. Then you can use the name tag to name a mob. This uses up the name tag.=Antes de usar la etiqueta, debe establecer un nombre en un yunque. Luego puede usar la etiqueta para nombrar un animal. Esto usa la etiqueta. Only peaceful mobs allowed!=¡Solo se permiten animales pacíficos! +Agent=Agente +Bat=Murciélago +Blaze=Blaze +Chicken=Pollo +Cow=Vaca +Mooshroom=Champiñaca +Creeper=Creeper +Ender Dragon=Enderdragón +Enderman=Enderman +Endermite=Endermite +Ghast=Ghast +Elder Guardian=Gran guardián +Guardian=Guardián +Horse=Caballo +Skeleton Horse=Caballo esquelético +Zombie Horse=Caballo zombie +Donkey=Burro +Mule=Mula +Iron Golem=Golem de hierro +Llama=Llama +Ocelot=Ocelote +Parrot=Loro +Pig=Cerdo +Polar Bear=Oso polar +Rabbit=Conejo +Killer Bunny=Conejo asesino +The Killer Bunny=El Conejo asesino +Sheep=Oveja +Shulker=Shulker +Silverfish=Lepisma +Skeleton=Esqueleto +Stray=Esqueleto +Wither Skeleton=Esqueleto wither +Magma Cube=Cubo de Magma +Slime=Slime +Snow Golem=Golem de nieve +Spider=Araña +Cave Spider=Araña de las cuevas +Squid=Calamar +Vex=Ánima +Evoker=Invocador +Illusioner=Illusionista +Villager=Aldeano +Vindicator=Vindicador +Zombie Villager=Aldeano zombie +Witch=Bruja +Wither=Wither +Wolf=Lobo +Husk=Husk +Zombie=Zombie +Zombie Pigman=Cerdo Zombie +Farmer=Granjero +Fisherman=Pescador +Fletcher=Flechador +Shepherd=Sacerdote +Librarian=Bibliotecario +Cartographer=Cartógrafo +Armorer=Armero +Leatherworker=Peletero +Butcher=Carnicero +Weapon Smith=Herrero de Armas +Tool Smith=Herrero de Herramientas +Cleric=Sacerdote +Nitwit=Simple diff --git a/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.fr.tr b/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.fr.tr index 96ac6a817..1a253d204 100644 --- a/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.fr.tr +++ b/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.fr.tr @@ -1,11 +1,69 @@ # textdomain: mcl_mobs -Peaceful mode active! No monsters will spawn.=Mode paisible actif! Aucun monstre n'apparaîtra. This allows you to place a single mob.=Cela vous permet de placer un seul mob. Just place it where you want the mob to appear. Animals will spawn tamed, unless you hold down the sneak key while placing. If you place this on a mob spawner, you change the mob it spawns.=Placez-le là où vous voulez que le mob apparaisse. Les animaux apparaîtront apprivoisés, sauf si vous maintenez la touche furtive enfoncée pendant le placement. Si vous le placez sur un générateur de mob, vous changez le mob qu'il génère. You need the “maphack” privilege to change the mob spawner.=Vous avez besoin du privilège "maphack" pour changer le générateur de mob. -Name Tag=Étiquette de nom -A name tag is an item to name a mob.=Une étiquette de nom est un élément pour nommer un mob. -Before you use the name tag, you need to set a name at an anvil. Then you can use the name tag to name a mob. This uses up the name tag.=Avant d'utiliser l'étiquette de nom, vous devez définir un nom sur une enclume. Ensuite, vous pouvez utiliser l'étiquette de nom pour nommer un mob. Cela utilise l'étiquette de nom. Only peaceful mobs allowed!=Seuls les mobs pacifiques sont autorisées! -Give names to mobs=Donne des noms aux mobs -Set name at anvil=Définir le nom sur l'enclume +Agent=Agent +Bat=Chauve-souris +Blaze=Blaze +Chicken=Poulet +Cow=Vache +Mooshroom=Champimeuh +Creeper=Creeper +Ender Dragon=Ender Dragon +Enderman=Enderman +Endermite=Endermite +Ghast=Ghast +Elder Guardian=Gardien de l'Elder +Guardian=Gardien +Horse=Cheval +Skeleton Horse=Cheval-squelette +Zombie Horse=Cheval-zombie +Donkey=Âne +Mule=Mule +Iron Golem=Golem de fer +Llama=Lama +Ocelot=Ocelot +Parrot=Perroquet +Pig=Cochon +Polar Bear=Ours blanc +Rabbit=Lapin +Killer Bunny=Lapin tueur +The Killer Bunny=Le Lapin tueur +Sheep=Mouton +Shulker=Shulker +Silverfish=Poisson d'argent +Skeleton=Squelette +Stray=Vagabond +Wither Skeleton=Wither squelette +Magma Cube=Cube de magma +Slime=Slime +Snow Golem=Golem de neige +Spider=Araignée +Cave Spider=Araignée venimeuse +Squid=Poulpe +Vex=Vex +Evoker=Invocateur +Illusioner=Illusionniste +Villager=Villageois +Vindicator=Vindicateur +Zombie Villager=Zombie Villageois +Witch=Sorcière +Wither=Wither +Wolf=Loup +Husk=Zombie Momifié +Zombie=Zombie +Zombie Pigman=Zombie Cochon +Farmer=Fermier +Fisherman=Pêcheur +Fletcher=Archer +Shepherd=Berger +Librarian=Bibliothécaire +Cartographer=Cartographe +Armorer=Armurier +Leatherworker=Tanneur +Butcher=Boucher +Weapon Smith=Fabriquant d'arme +Tool Smith=Fabriquant d'outil +Cleric=Clerc +Nitwit=Crétin diff --git a/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.ru.tr b/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.ru.tr index 3fb2eb2f1..d2b4e0046 100644 --- a/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.ru.tr +++ b/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.ru.tr @@ -1,11 +1,69 @@ # textdomain: mcl_mobs -Peaceful mode active! No monsters will spawn.=Мирный режим включён! Монстры не будут появляться. This allows you to place a single mob.=Позволяет вам разместить одного моба. Just place it where you want the mob to appear. Animals will spawn tamed, unless you hold down the sneak key while placing. If you place this on a mob spawner, you change the mob it spawns.=Просто поместите это туда, где хотите, чтобы появился моб. Животные будут появляться уже прирученные, если это не нужно, удерживайте клавишу [Красться] при размещении. Если поместить это на спаунер, появляющийся из него моб будет изменён. You need the “maphack” privilege to change the mob spawner.=Вам нужно обладать привилегией “maphack”, чтобы изменить спаунер моба. -Name Tag=Именная бирка -A name tag is an item to name a mob.=Именная бирка это предмет, чтобы дать мобу имя. -Before you use the name tag, you need to set a name at an anvil. Then you can use the name tag to name a mob. This uses up the name tag.=Прежде чем использовать именную бирку, нужно задать имя на наковальне. Тогда вы сможете использовать бирку, чтобы дать имя мобу. Only peaceful mobs allowed!=Разрешены только мирные мобы! -Give names to mobs=Даёт имена мобам -Set name at anvil=Задайте имя при помощи наковальни +Agent=Агент +Bat=Летучая мышь +Blaze=Ифрит +Chicken=Курица +Cow=Корова +Mooshroom=Гриб +Creeper=Крипер +Ender Dragon=Дракон Предела +Enderman=Эндермен +Endermite=Эндермит +Ghast=Гаст +Elder Guardian=Древний страж +Guardian=Страж +Horse=Лошадь +Skeleton Horse=Скелет лошади +Zombie Horse=Зомби-лошадь +Donkey=Ослик +Mule=Мул +Iron Golem=Железный голем +Llama=Лама +Ocelot=Оцелот +Parrot=Попугай +Pig=Свинья +Polar Bear=Полярный медведь +Rabbit=Кролик +Killer Bunny=Кролик-убийца +The Killer Bunny=Кролик-убийца +Sheep=Овца +Shulker=Шалкер +Silverfish=Чешуйница +Skeleton=Скелет +Stray=Странник +Wither Skeleton=Скелет-иссушитель +Magma Cube=Лавовый куб +Slime=Слизняк +Snow Golem=Снежный голем +Spider=Паук +Cave Spider=Пещерный паук +Squid=Кальмар +Vex=Досаждатель +Evoker=Маг +Illusioner=Иллюзор +Villager=Житель +Vindicator=Поборник +Zombie Villager=Зомби-житель +Witch=Ведьма +Wither=Иссушитель +Wolf=Волк +Husk=Кадавр +Zombie=Зомби +Zombie Pigman=Зомби-свиночеловек +Farmer=Фермер +Fisherman=Рыбак +Fletcher=Лучник +Shepherd=Пастух +Librarian=Библиотекарь +Cartographer=Картограф +Armorer=Бронник +Leatherworker=Кожевник +Butcher=Мясник +Weapon Smith=Оружейник +Tool Smith=Инструментальщик +Cleric=Церковник +Nitwit=Нищий diff --git a/mods/ENTITIES/mcl_mobs/locale/template.txt b/mods/ENTITIES/mcl_mobs/locale/template.txt index e24974a41..81cf581d7 100644 --- a/mods/ENTITIES/mcl_mobs/locale/template.txt +++ b/mods/ENTITIES/mcl_mobs/locale/template.txt @@ -1,11 +1,68 @@ # textdomain: mcl_mobs -Peaceful mode active! No monsters will spawn.= This allows you to place a single mob.= Just place it where you want the mob to appear. Animals will spawn tamed, unless you hold down the sneak key while placing. If you place this on a mob spawner, you change the mob it spawns.= You need the “maphack” privilege to change the mob spawner.= -Name Tag= -A name tag is an item to name a mob.= -Before you use the name tag, you need to set a name at an anvil. Then you can use the name tag to name a mob. This uses up the name tag.= Only peaceful mobs allowed!= -Give names to mobs= -Set name at anvil= +Agent= +Bat= +Blaze= +Chicken= +Cow= +Mooshroom= +Creeper= +Ender Dragon= +Enderman= +Endermite= +Ghast= +Elder Guardian= +Guardian= +Horse= +Skeleton Horse= +Zombie Horse= +Donkey= +Mule= +Iron Golem= +Llama= +Ocelot= +Parrot= +Pig= +Polar Bear= +Rabbit= +Killer Bunny= +Sheep= +Shulker= +Silverfish= +Skeleton= +Stray= +Wither Skeleton= +Magma Cube= +Slime= +Snow Golem= +Spider= +Cave Spider= +Squid= +Vex= +Evoker= +Illusioner= +Villager= +Vindicator= +Zombie Villager= +Witch= +Wither= +Wolf= +Husk= +Zombie= +Zombie Pigman= +Farmer= +Fisherman= +Fletcher= +Shepherd= +Librarian= +Cartographer= +Armorer= +Leatherworker= +Butcher= +Weapon Smith= +Tool Smith= +Cleric= +Nitwit= diff --git a/mods/ENTITIES/mobs_mc_gameconfig/init.lua b/mods/ENTITIES/mcl_mobs/mobs/0_gameconfig.lua similarity index 57% rename from mods/ENTITIES/mobs_mc_gameconfig/init.lua rename to mods/ENTITIES/mcl_mobs/mobs/0_gameconfig.lua index 06d7eb87f..9bea74e15 100644 --- a/mods/ENTITIES/mobs_mc_gameconfig/init.lua +++ b/mods/ENTITIES/mcl_mobs/mobs/0_gameconfig.lua @@ -1,3 +1,194 @@ +mobs_mc.create_monster_egg_nodes = true + +-- Tables for attracting, feeding and breeding mobs +mobs_mc.follow = { + sheep = { mobs_mc.items.wheat }, + cow = { mobs_mc.items.wheat }, + chicken = { "farming:seed_wheat", "farming:seed_cotton" }, -- seeds in general + parrot = { "farming:seed_wheat", "farming:seed_cotton" }, -- seeds in general + horse = { mobs_mc.items.apple, mobs_mc.items.sugar, mobs_mc.items.wheat, mobs_mc.items.hay_bale, mobs_mc.items.golden_apple, mobs_mc.items.golden_carrot }, + llama = { mobs_mc.items.wheat, mobs_mc.items.hay_bale, }, + pig = { mobs_mc.items.potato, mobs_mc.items.carrot, mobs_mc.items.carrot_on_a_stick, + mobs_mc.items.apple, -- Minetest Game extra + }, + rabbit = { mobs_mc.items.dandelion, mobs_mc.items.carrot, mobs_mc.items.golden_carrot, "farming_plus:carrot_item", }, + ocelot = { mobs_mc.items.fish_raw, mobs_mc.items.salmon_raw, mobs_mc.items.clownfish_raw, mobs_mc.items.pufferfish_raw, + mobs_mc.items.chicken_raw, -- Minetest Game extra + }, + wolf = { mobs_mc.items.bone }, + dog = { mobs_mc.items.rabbit_raw, mobs_mc.items.rabbit_cooked, mobs_mc.items.mutton_raw, mobs_mc.items.mutton_cooked, mobs_mc.items.beef_raw, mobs_mc.items.beef_cooked, mobs_mc.items.chicken_raw, mobs_mc.items.chicken_cooked, mobs_mc.items.rotten_flesh, + -- Mobs Redo items + "mobs:meat", "mobs:meat_raw" }, +} + +-- Contents for replace_what +mobs_mc.replace = { + -- Rabbits reduce carrot growth stage by 1 + rabbit = { + -- Farming Redo carrots + {"farming:carrot_8", "farming:carrot_7", 0}, + {"farming:carrot_7", "farming:carrot_6", 0}, + {"farming:carrot_6", "farming:carrot_5", 0}, + {"farming:carrot_5", "farming:carrot_4", 0}, + {"farming:carrot_4", "farming:carrot_3", 0}, + {"farming:carrot_3", "farming:carrot_2", 0}, + {"farming:carrot_2", "farming:carrot_1", 0}, + {"farming:carrot_1", "air", 0}, + -- Farming Plus carrots + {"farming_plus:carrot", "farming_plus:carrot_7", 0}, + {"farming_plus:carrot_6", "farming_plus:carrot_5", 0}, + {"farming_plus:carrot_5", "farming_plus:carrot_4", 0}, + {"farming_plus:carrot_4", "farming_plus:carrot_3", 0}, + {"farming_plus:carrot_3", "farming_plus:carrot_2", 0}, + {"farming_plus:carrot_2", "farming_plus:carrot_1", 0}, + {"farming_plus:carrot_1", "air", 0}, + }, + -- Sheep eat grass + sheep = { + -- Grass Block + { "default:dirt_with_grass", "default:dirt", -1 }, + -- “Tall Grass” + { "default:grass_5", "air", 0 }, + { "default:grass_4", "air", 0 }, + { "default:grass_3", "air", 0 }, + { "default:grass_2", "air", 0 }, + { "default:grass_1", "air", 0 }, + }, + -- Silverfish populate stone, etc. with monster eggs + silverfish = { + {"default:stone", "mobs_mc:monster_egg_stone", -1}, + {"default:cobble", "mobs_mc:monster_egg_cobble", -1}, + {"default:mossycobble", "mobs_mc:monster_egg_mossycobble", -1}, + {"default:stonebrick", "mobs_mc:monster_egg_stonebrick", -1}, + {"default:stone_block", "mobs_mc:monster_egg_stone_block", -1}, + }, +} + +-- List of nodes which endermen can take +mobs_mc.enderman_takable = { + -- Generic handling, useful for entensions + "group:enderman_takable", + + -- Generic nodes + "group:sand", + "group:flower", + + -- Minetest Game + "default:dirt", + "default:dirt_with_grass", + "default:dirt_with_dry_grass", + "default:dirt_with_snow", + "default:dirt_with_rainforest_litter", + "default:dirt_with_grass_footsteps", +-- FIXME: For some reason, Minetest has a Lua error when an enderman tries to place a Minetest Game cactus. +-- Maybe this is because default:cactus has rotate_and_place? +-- "default:cactus", -- TODO: Re-enable cactus when it works again + "default:gravel", + "default:clay", + "flowers:mushroom_red", + "flowers:mushroom_brown", + "tnt:tnt", + + -- Nether mod + "nether:rack", +} + +--[[ Table of nodes to replace when an enderman takes it. +If the enderman takes an indexed node, it the enderman will get the item in the value. +Table indexes: Original node, taken by enderman. +Table values: The item which the enderman *actually* gets +Example: + mobs_mc.enderman_node_replace = { + ["default:dirt_with_dry_grass"] = "default_dirt_with_grass", + } +-- This means, if the enderman takes a dirt with dry grass, he will get a dirt with grass +-- on his hand instead. +]] +mobs_mc.enderman_replace_on_take = {} -- no replacements by default + +-- A table which can be used to override block textures of blocks carried by endermen. +-- Only works for cube-shaped nodes and nodeboxes. +-- Key: itemstrings of the blocks to replace +-- Value: A table with the texture overrides (6 textures) +mobs_mc.enderman_block_texture_overrides = { +} + +-- List of nodes on which mobs can spawn +mobs_mc.spawn = { + solid = { "group:cracky", "group:crumbly", "group:shovely", "group:pickaxey" }, -- spawn on "solid" nodes (this is mostly just guessing) + + grassland = { mobs_mc.items.grass_block, "ethereal:prairie_dirt" }, + savanna = { "default:dirt_with_dry_grass" }, + grassland_savanna = { mobs_mc.items.grass_block, "default:dirt_with_dry_grass" }, + desert = { "default:desert_sand", "group:sand" }, + jungle = { "default:dirt_with_rainforest_litter", "default:jungleleaves", "default:junglewood", "mcl_core:jungleleaves", "mcl_core:junglewood" }, + snow = { "default:snow", "default:snowblock", "default:dirt_with_snow" }, + end_city = { "default:sandstonebrick", "mcl_end:purpur_block", "mcl_end:end_stone" }, + wolf = { mobs_mc.items.grass_block, "default:dirt_with_rainforest_litter", "default:dirt", "default:dirt_with_snow", "default:snow", "default:snowblock" }, + village = { "mg_villages:road" }, + + -- These probably don't need overrides + mushroom_island = { mobs_mc.items.mycelium, "mcl_core:mycelium" }, + nether_fortress = { mobs_mc.items.nether_brick_block, "mcl_nether:nether_brick", }, + nether = { mobs_mc.items.netherrack, "mcl_nether:netherrack", }, + nether_portal = { mobs_mc.items.nether_portal, "mcl_portals:portal" }, + water = { mobs_mc.items.water_source, "mcl_core:water_source", "default:water_source" }, +} + +-- This table contains important spawn height references for the mob spawn height. +-- Please base your mob spawn height on these numbers to keep things clean. +mobs_mc.spawn_height = { + water = tonumber(minetest.settings:get("water_level")) or 0, -- Water level in the Overworld + + -- Overworld boundaries (inclusive) --I adjusted this to be more reasonable + overworld_min = -64,-- -2999, + overworld_max = 31000, + + -- Nether boundaries (inclusive) + nether_min = -29067,-- -3369, + nether_max = -28939,-- -3000, + + -- End boundaries (inclusive) + end_min = -6200, + end_max = -6000, +} + +mobs_mc.misc = { + shears_wear = 276, -- Wear to add per shears usage (238 uses) + totem_fail_nodes = {} -- List of nodes in which the totem of undying fails +} + +-- Item name overrides from mobs_mc_gameconfig (if present) +if minetest.get_modpath("mobs_mc_gameconfig") and mobs_mc.override then + local tables = {"items", "follow", "replace", "spawn", "spawn_height", "misc"} + for t=1, #tables do + local tbl = tables[t] + if mobs_mc.override[tbl] then + for k, v in pairs(mobs_mc.override[tbl]) do + mobs_mc[tbl][k] = v + end + end + end + + if mobs_mc.override.enderman_takable then + mobs_mc.enderman_takable = mobs_mc.override.enderman_takable + end + if mobs_mc.override.enderman_replace_on_take then + mobs_mc.enderman_replace_on_take = mobs_mc.override.enderman_replace_on_take + end + if mobs_mc.enderman_block_texture_overrides then + mobs_mc.enderman_block_texture_overrides = mobs_mc.override.enderman_block_texture_overrides + end +end + + + +--- +--- +--- actual gameconfig now +--- +--- + mobs_mc = {} mobs_mc.override = {} @@ -179,9 +370,6 @@ mobs_mc.override.enderman_takable = { } mobs_mc.override.enderman_replace_on_take = { } -mobs_mc.override.misc = { - totem_fail_nodes = { "mcl_core:void", "mcl_core:realm_barrier" }, -} -- Texuture overrides for enderman block. Required for cactus because it's original is a nodebox -- and the textures have tranparent pixels. @@ -200,7 +388,7 @@ end mobs_mc.override.enderman_block_texture_overrides = { ["mcl_core:cactus"] = ctable, -- FIXME: replace colorize colors with colors from palette - ["mcl_core:dirt_with_grass"] = + ["mcl_core:dirt_with_grass"] = { "mcl_core_grass_block_top.png^[colorize:green:90", "default_dirt.png", diff --git a/mods/ENTITIES/mobs_mc/2_throwing.lua b/mods/ENTITIES/mcl_mobs/mobs/2_throwing.lua similarity index 99% rename from mods/ENTITIES/mobs_mc/2_throwing.lua rename to mods/ENTITIES/mcl_mobs/mobs/2_throwing.lua index 23ae86d80..f72acaf36 100644 --- a/mods/ENTITIES/mobs_mc/2_throwing.lua +++ b/mods/ENTITIES/mcl_mobs/mobs/2_throwing.lua @@ -195,7 +195,7 @@ local how_to_throw = "Hold it in your and and leftclick to throw." -- egg throwing item -- egg entity if c("egg") then - local egg_GRAVITY = 9 + local egg_gravity = 9 local egg_VELOCITY = 19 mobs:register_arrow("mobs_mc:egg_entity", { @@ -289,7 +289,7 @@ if c("egg") then obj:set_acceleration({ x = dir.x * -3, - y = -egg_GRAVITY, + y = -egg_gravity, z = dir.z * -3 }) @@ -315,7 +315,7 @@ end -- Snowball -local snowball_GRAVITY = 9 +local snowball_gravity = 9 local snowball_VELOCITY = 19 mobs:register_arrow("mobs_mc:snowball_entity", { @@ -373,7 +373,7 @@ if c("snowball") then obj:set_acceleration({ x = dir.x * -3, - y = -snowball_GRAVITY, + y = -snowball_gravity, z = dir.z * -3 }) diff --git a/mods/ENTITIES/mobs_mc/bat.lua b/mods/ENTITIES/mcl_mobs/mobs/bat.lua similarity index 84% rename from mods/ENTITIES/mobs_mc/bat.lua rename to mods/ENTITIES/mcl_mobs/mobs/bat.lua index 70e084ee2..3f645a5e5 100644 --- a/mods/ENTITIES/mobs_mc/bat.lua +++ b/mods/ENTITIES/mcl_mobs/mobs/bat.lua @@ -1,8 +1,7 @@ --License for code WTFPL and otherwise stated in readmes +local S = minetest.get_translator("mcl_mobs") -local S = minetest.get_translator("mobs_mc") - -mobs:register_mob("mobs_mc:bat", { +mcl_mobs.register_mob("mcl_mobs:bat", { description = S("Bat"), type = "animal", spawn_class = "ambient", @@ -14,16 +13,14 @@ mobs:register_mob("mobs_mc:bat", { hp_min = 6, hp_max = 6, collisionbox = {-0.25, -0.01, -0.25, 0.25, 0.89, 0.25}, - visual = "mesh", - mesh = "mobs_mc_bat.b3d", + model = "mcl_mobs_bat.b3d", textures = { - {"mobs_mc_bat.png"}, + {"mcl_mobs_bat.png"}, }, - visual_size = {x=1, y=1}, sounds = { - random = "mobs_mc_bat_idle", - damage = "mobs_mc_bat_hurt", - death = "mobs_mc_bat_death", + random = "mcl_mobs_bat_idle", + damage = "mcl_mobs_bat_hurt", + death = "mcl_mobs_bat_death", distance = 16, }, walk_velocity = 4.5, @@ -47,7 +44,6 @@ mobs:register_mob("mobs_mc:bat", { walk_chance = 100, fall_damage = 0, view_range = 16, - fear_height = 0, jump = false, makes_footstep_sound = false, }) @@ -66,8 +62,8 @@ else end -- Spawn on solid blocks at or below Sea level and the selected light level -mobs:spawn_specific( -"mobs_mc:bat", +mcl_mobs.spawn_specific( +"mcl_mobs:bat", "overworld", "ground", { @@ -139,9 +135,8 @@ maxlight, 20, 5000, 2, -mobs_mc.spawn_height.overworld_min, -mobs_mc.spawn_height.water-1) - +mcl_mobs.spawn_height.overworld_min, +mcl_mobs.spawn_height.water-1) -- spawn eggs -mobs:register_egg("mobs_mc:bat", S("Bat"), "mobs_mc_spawn_icon_bat.png", 0) +mcl_mobs.register_egg("mcl_mobs:bat", "mcl_mobs_spawn_icon_bat.png", 0) diff --git a/mods/ENTITIES/mobs_mc/blaze.lua b/mods/ENTITIES/mcl_mobs/mobs/blaze.lua similarity index 78% rename from mods/ENTITIES/mobs_mc/blaze.lua rename to mods/ENTITIES/mcl_mobs/mobs/blaze.lua index 146e8da70..c62fcdfdf 100644 --- a/mods/ENTITIES/mobs_mc/blaze.lua +++ b/mods/ENTITIES/mcl_mobs/mobs/blaze.lua @@ -1,16 +1,21 @@ -- daufinsyd -- My work is under the LGPL terms --- Model and mobs_blaze.png see https://github.com/22i/minecraft-voxel-blender-models -hi 22i ~jordan4ibanez --- blaze.lua partial copy of mobs_mc/ghast.lua +-- Model and mcl_mobs_blaze.png see https://github.com/22i/minecraft-voxel-blender-models -hi 22i ~jordan4ibanez +-- blaze.lua partial copy of ghast.lua +local S = minetest.get_translator("mcl_mobs") -local S = minetest.get_translator("mobs_mc") +local smokedef = mcl_particles.get_smoke_def({ + amount = 0.009, + maxexptime = 4.0, + minvel = {x = -0.1, y = 0.3, z = -0.1}, + maxvel = {x = 0.1, y = 1.6, z = 0.1}, + minsize = 4.0, + maxsize = 4.5, + minrelpos = {x = -0.7, y = -0.45, z = -0.7}, + maxrelpos = {x = 0.7, y = 0.45, z = 0.7}, +}) ---################### ---################### BLAZE ---################### - - -mobs:register_mob("mobs_mc:blaze", { +mcl_mobs.register_mob("mcl_mobs:blaze", { description = S("Blaze"), type = "monster", spawn_class = "hostile", @@ -23,17 +28,16 @@ mobs:register_mob("mobs_mc:blaze", { rotate = 270, collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.79, 0.3}, rotate = -180, - visual = "mesh", - mesh = "mobs_mc_blaze.b3d", + model = "mcl_mobs_blaze.b3d", textures = { - {"mobs_mc_blaze.png"}, + {"mcl_mobs_blaze.png"}, }, - armor = { fleshy = 100, snowball_vulnerable = 100, water_vulnerable = 100 }, - visual_size = {x=3, y=3}, + armor = {fleshy = 100, snowball_vulnerable = 100, water_vulnerable = 100}, + visual_size = {x = 3, y = 3}, sounds = { - random = "mobs_mc_blaze_breath", - death = "mobs_mc_blaze_died", - damage = "mobs_mc_blaze_hurt", + random = "mcl_mobs_blaze_breath", + death = "mcl_mobs_blaze_died", + damage = "mcl_mobs_blaze_hurt", distance = 16, }, walk_velocity = .8, @@ -42,17 +46,19 @@ mobs:register_mob("mobs_mc:blaze", { reach = 4, -- don't want blaze getting too close pathfinding = 1, drops = { - {name = mobs_mc.items.blaze_rod, - chance = 1, - min = 0, - max = 1, - looting = "common",}, + { + name = "mcl_mobitems:blaze_rod", + chance = 1, + min = 0, + max = 1, + looting = "common", + }, }, animation = { stand_speed = 25, stand_start = 0, - stand_end = 100, - walk_speed = 25, + stand_end = 100, + walk_speed = 25, walk_start = 0, walk_end = 100, run_speed = 50, @@ -62,11 +68,9 @@ mobs:register_mob("mobs_mc:blaze", { -- MC Wiki: takes 1 damage every half second while in water water_damage = 2, lava_damage = 0, - fire_damage = 0, fall_damage = 0, fall_speed = -2.25, - light_damage = 0, - view_range = 16, + view_range = 48, attack_type = "projectile", arrow = "mobs_mc:blaze_fireball", shoot_interval = 3.5, @@ -76,17 +80,12 @@ mobs:register_mob("mobs_mc:blaze", { jump_height = 4, fly = true, makes_footstep_sound = false, - fear_height = 0, glow = 14, fire_resistant = true, eye_height = 0.75, projectile_cooldown_min = 2, projectile_cooldown_max = 3, - shoot_arrow = function(self, pos, dir) - -- 2-4 damage per arrow - local dmg = math.random(2,4) - mobs.shoot_projectile_handling("mobs_mc:blaze_fireball", pos, dir, self.object:get_yaw(), self.object, 7, dmg,nil,nil,nil,-0.4) - end, + arrow = "mcl_mobs:blaze_fireball", do_custom = function(self) if self.attacking and self.state == "attack" and vector.distance(self.object:get_pos(), self.attacking:get_pos()) < 1.2 then @@ -155,6 +154,13 @@ mobs_mc.spawn_height.nether_min, mobs_mc.spawn_height.nether_max) -- Blaze fireball +mcl_mobs.register_arrow("mobs_mc:blaze_fireball", { + type = "fireball", + deflectable = false, + explosion = false, + damage = 5, + +}) mobs:register_arrow("mobs_mc:blaze_fireball", { visual = "sprite", visual_size = {x = 0.3, y = 0.3}, @@ -165,11 +171,9 @@ mobs:register_arrow("mobs_mc:blaze_fireball", { tail_texture = "mobs_mc_spit.png^[colorize:black:255", --repurpose spit texture tail_size = 2, tail_distance_divider = 3, - _is_fireball = true, + is_fireball = true, - -- Direct hit, no fire... just plenty of pain hit_player = function(self, player) - mcl_burning.set_on_fire(player, 5) player:punch(self.object, 1.0, { full_punch_interval = 1.0, damage_groups = {fleshy = self._damage}, @@ -177,7 +181,6 @@ mobs:register_arrow("mobs_mc:blaze_fireball", { end, hit_mob = function(self, mob) - mcl_burning.set_on_fire(mob, 5) mob:punch(self.object, 1.0, { full_punch_interval = 1.0, damage_groups = {fleshy = self._damage}, @@ -214,4 +217,4 @@ mobs:register_arrow("mobs_mc:blaze_fireball", { }) -- spawn eggs -mobs:register_egg("mobs_mc:blaze", S("Blaze"), "mobs_mc_spawn_icon_blaze.png", 0) +mcl_mobs.register_egg("mcl_mobs:blaze", "mobs_mc_spawn_icon_blaze.png", 0) diff --git a/mods/ENTITIES/mobs_mc/chicken.lua b/mods/ENTITIES/mcl_mobs/mobs/chicken.lua similarity index 100% rename from mods/ENTITIES/mobs_mc/chicken.lua rename to mods/ENTITIES/mcl_mobs/mobs/chicken.lua diff --git a/mods/ENTITIES/mobs_mc/cow+mooshroom.lua b/mods/ENTITIES/mcl_mobs/mobs/cow.lua similarity index 100% rename from mods/ENTITIES/mobs_mc/cow+mooshroom.lua rename to mods/ENTITIES/mcl_mobs/mobs/cow.lua diff --git a/mods/ENTITIES/mobs_mc/creeper.lua b/mods/ENTITIES/mcl_mobs/mobs/creeper.lua similarity index 60% rename from mods/ENTITIES/mobs_mc/creeper.lua rename to mods/ENTITIES/mcl_mobs/mobs/creeper.lua index 4d0539996..dc64ce7a6 100644 --- a/mods/ENTITIES/mobs_mc/creeper.lua +++ b/mods/ENTITIES/mcl_mobs/mobs/creeper.lua @@ -6,10 +6,7 @@ local S = minetest.get_translator("mobs_mc") --################### CREEPER --################### - - - -mobs:register_mob("mobs_mc:creeper", { +local creeper = { type = "monster", spawn_class = "hostile", hostile = true, @@ -24,7 +21,7 @@ mobs:register_mob("mobs_mc:creeper", { mesh = "mobs_mc_creeper.b3d", textures = { {"mobs_mc_creeper.png", - "mobs_mc_empty.png"}, + "empty.png"}, }, visual_size = {x=3, y=3}, sounds = { @@ -99,15 +96,12 @@ mobs:register_mob("mobs_mc:creeper", { end end end, - on_die = function(self, pos, cmi_cause) + on_die = function(self, pos, reason) -- Drop a random music disc when killed by skeleton or stray - if cmi_cause and cmi_cause.type == "punch" then - local luaentity = cmi_cause.puncher and cmi_cause.puncher:get_luaentity() - if luaentity and luaentity.name:find("arrow") then - local shooter_luaentity = luaentity._shooter and luaentity._shooter:get_luaentity() - if shooter_luaentity and (shooter_luaentity.name == "mobs_mc:skeleton" or shooter_luaentity.name == "mobs_mc:stray") then - minetest.add_item({x=pos.x, y=pos.y+1, z=pos.z}, mobs_mc.items.music_discs[math.random(1, #mobs_mc.items.music_discs)]) - end + if reason.type == "arrow" then + local shooter_luaentity = reason.source:get_luaentity() + if shooter_luaentity and (shooter_luaentity.name == "mobs_mc:skeleton" or shooter_luaentity.name == "mobs_mc:stray") then + minetest.add_item({x=pos.x, y=pos.y+1, z=pos.z}, mobs_mc.items.music_discs[math.random(1, #mobs_mc.items.music_discs)]) end end end, @@ -145,134 +139,15 @@ mobs:register_mob("mobs_mc:creeper", { floats = 1, fear_height = 4, view_range = 16, -}) +} +mobs:register_mob("mobs_mc:creeper", creeper) -mobs:register_mob("mobs_mc:creeper_charged", { - description = S("Charged Creeper"), - type = "monster", - spawn_class = "hostile", - hp_min = 20, - hp_max = 20, - xp_min = 5, - xp_max = 5, - collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.69, 0.3}, - pathfinding = 1, - visual = "mesh", - mesh = "mobs_mc_creeper.b3d", - - --BOOM - - textures = { - {"mobs_mc_creeper.png", - "mobs_mc_creeper_charge.png"}, - }, - visual_size = {x=3, y=3}, - rotate = 270, - sounds = { - attack = "tnt_ignite", - death = "mobs_mc_creeper_death", - damage = "mobs_mc_creeper_hurt", - fuse = "tnt_ignite", - explode = "tnt_explode", - distance = 16, - }, - makes_footstep_sound = false, - walk_velocity = 1.05, - run_velocity = 2.1, - runaway_from = { "mobs_mc:ocelot", "mobs_mc:cat" }, - attack_type = "explode", - - explosion_strength = 6, - --explosion_radius = 3, - --explosion_damage_radius = 6, - --explosiontimer_reset_radius = 3, - reach = 1.5, - defuse_reach = 4, - explosion_timer = 0.3, - allow_fuse_reset = true, - stop_to_explode = true, - - -- Force-ignite creeper with flint and steel and explode after 1.5 seconds. - -- TODO: Make creeper flash after doing this as well. - -- TODO: Test and debug this code. - on_rightclick = function(self, clicker) - if self._forced_explosion_countdown_timer ~= nil then - return - end - local item = clicker:get_wielded_item() - if item:get_name() == mobs_mc.items.flint_and_steel then - if not minetest.is_creative_enabled(clicker:get_player_name()) then - -- Wear tool - local wdef = item:get_definition() - item:add_wear(1000) - -- Tool break sound - if item:get_count() == 0 and wdef.sound and wdef.sound.breaks then - minetest.sound_play(wdef.sound.breaks, {pos = clicker:get_pos(), gain = 0.5}, true) - end - clicker:set_wielded_item(item) - end - self._forced_explosion_countdown_timer = self.explosion_timer - minetest.sound_play(self.sounds.attack, {pos = self.object:get_pos(), gain = 1, max_hear_distance = 16}, true) - end - end, - do_custom = function(self, dtime) - if self._forced_explosion_countdown_timer ~= nil then - self._forced_explosion_countdown_timer = self._forced_explosion_countdown_timer - dtime - if self._forced_explosion_countdown_timer <= 0 then - mobs:boom(self, mcl_util.get_object_center(self.object), self.explosion_strength) - end - end - end, - on_die = function(self, pos, cmi_cause) - -- Drop a random music disc when killed by skeleton or stray - if cmi_cause and cmi_cause.type == "punch" then - local luaentity = cmi_cause.puncher and cmi_cause.puncher:get_luaentity() - if luaentity and luaentity.name:find("arrow") then - local shooter_luaentity = luaentity._shooter and luaentity._shooter:get_luaentity() - if shooter_luaentity and (shooter_luaentity.name == "mobs_mc:skeleton" or shooter_luaentity.name == "mobs_mc:stray") then - minetest.add_item({x=pos.x, y=pos.y+1, z=pos.z}, mobs_mc.items.music_discs[math.random(1, #mobs_mc.items.music_discs)]) - end - end - end - end, - maxdrops = 2, - drops = { - {name = mobs_mc.items.gunpowder, - chance = 1, - min = 0, - max = 2, - looting = "common",}, - - -- Head - -- TODO: Only drop if killed by charged creeper - {name = mobs_mc.items.head_creeper, - chance = 200, -- 0.5% - min = 1, - max = 1,}, - }, - animation = { - speed_normal = 24, - speed_run = 48, - stand_start = 0, - stand_end = 23, - walk_start = 24, - walk_end = 49, - run_start = 24, - run_end = 49, - hurt_start = 110, - hurt_end = 139, - death_start = 140, - death_end = 189, - look_start = 50, - look_end = 108, - }, - floats = 1, - fear_height = 4, - view_range = 16, - --Having trouble when fire is placed with lightning - fire_resistant = true, - glow = 3, -}) +local creeper_charged = table.copy(creeper) +creeper_charged.description = S("Charged Creeper") +creeper_charged.textures = {{"mobs_mc_creeper.png", "mobs_mc_creeper_charge.png"}} +creeper_charged.explosion_strength = 6 +creeper_charged.glow = 3 +mobs:register_mob("mobs_mc:creeper_charged", creeper_charged) mobs:spawn_specific( "mobs_mc:creeper", diff --git a/mods/ENTITIES/mobs_mc/guardian_elder.lua b/mods/ENTITIES/mcl_mobs/mobs/elder_guardian.lua similarity index 100% rename from mods/ENTITIES/mobs_mc/guardian_elder.lua rename to mods/ENTITIES/mcl_mobs/mobs/elder_guardian.lua diff --git a/mods/ENTITIES/mobs_mc/ender_dragon.lua b/mods/ENTITIES/mcl_mobs/mobs/ender_dragon.lua similarity index 100% rename from mods/ENTITIES/mobs_mc/ender_dragon.lua rename to mods/ENTITIES/mcl_mobs/mobs/ender_dragon.lua diff --git a/mods/ENTITIES/mobs_mc/enderman.lua b/mods/ENTITIES/mcl_mobs/mobs/enderman.lua similarity index 99% rename from mods/ENTITIES/mobs_mc/enderman.lua rename to mods/ENTITIES/mcl_mobs/mobs/enderman.lua index 9ebc3d6fa..ebd017f30 100644 --- a/mods/ENTITIES/mobs_mc/enderman.lua +++ b/mods/ENTITIES/mcl_mobs/mobs/enderman.lua @@ -208,7 +208,7 @@ mobs:register_mob("mobs_mc:enderman", { eye_height = 2.5, sounds = { -- TODO: Custom war cry sound - war_cry = "mobs_sandmonster", + war_cry = "mcl_mobs_enderman", death = {name="mobs_mc_enderman_death", gain=0.7}, damage = {name="mobs_mc_enderman_hurt", gain=0.5}, random = {name="mobs_mc_enderman_random", gain=0.5}, diff --git a/mods/ENTITIES/mobs_mc/endermite.lua b/mods/ENTITIES/mcl_mobs/mobs/endermite.lua similarity index 100% rename from mods/ENTITIES/mobs_mc/endermite.lua rename to mods/ENTITIES/mcl_mobs/mobs/endermite.lua diff --git a/mods/ENTITIES/mobs_mc/villager_evoker.lua b/mods/ENTITIES/mcl_mobs/mobs/evoker.lua similarity index 100% rename from mods/ENTITIES/mobs_mc/villager_evoker.lua rename to mods/ENTITIES/mcl_mobs/mobs/evoker.lua diff --git a/mods/ENTITIES/mobs_mc/gameconfig.md b/mods/ENTITIES/mcl_mobs/mobs/gameconfig.md similarity index 100% rename from mods/ENTITIES/mobs_mc/gameconfig.md rename to mods/ENTITIES/mcl_mobs/mobs/gameconfig.md diff --git a/mods/ENTITIES/mobs_mc/ghast.lua b/mods/ENTITIES/mcl_mobs/mobs/ghast.lua similarity index 97% rename from mods/ENTITIES/mobs_mc/ghast.lua rename to mods/ENTITIES/mcl_mobs/mobs/ghast.lua index 609110bdb..74bbe1270 100644 --- a/mods/ENTITIES/mobs_mc/ghast.lua +++ b/mods/ENTITIES/mcl_mobs/mobs/ghast.lua @@ -34,8 +34,8 @@ mobs:register_mob("mobs_mc:ghast", { sounds = { shoot_attack = "mobs_fireball", death = "mobs_mc_zombie_death", - attack = "mobs_fireball", - random = "mobs_eerie", + attack = "mcl_mobs_fireball", + random = "mcl_mobs_ghast", distance = 16, -- TODO: damage -- TODO: better death @@ -109,7 +109,7 @@ mobs:register_arrow("mobs_mc:ghast_fireball", { tail = 1, tail_texture = "mobs_mc_spit.png^[colorize:black:255", --repurpose spit texture tail_size = 5, - _is_fireball = true, + is_fireball = true, hit_player = function(self, player) --[[ diff --git a/mods/ENTITIES/mobs_mc/guardian.lua b/mods/ENTITIES/mcl_mobs/mobs/guardian.lua similarity index 100% rename from mods/ENTITIES/mobs_mc/guardian.lua rename to mods/ENTITIES/mcl_mobs/mobs/guardian.lua diff --git a/mods/ENTITIES/mobs_mc/horse.lua b/mods/ENTITIES/mcl_mobs/mobs/horse.lua similarity index 99% rename from mods/ENTITIES/mobs_mc/horse.lua rename to mods/ENTITIES/mcl_mobs/mobs/horse.lua index 461c60efd..ad50ae4d4 100644 --- a/mods/ENTITIES/mobs_mc/horse.lua +++ b/mods/ENTITIES/mcl_mobs/mobs/horse.lua @@ -151,7 +151,6 @@ local horse = { self.terrain_type = 3 self.driver_attach_at = {x = 0, y = 4.17, z = -1.75} self.driver_eye_offset = {x = 0, y = 3, z = 0} - self.driver_scale = {x = 1/self.visual_size.x, y = 1/self.visual_size.y} end -- Slowly regenerate health diff --git a/mods/ENTITIES/mobs_mc/villager_illusioner.lua b/mods/ENTITIES/mcl_mobs/mobs/illusioner.lua similarity index 100% rename from mods/ENTITIES/mobs_mc/villager_illusioner.lua rename to mods/ENTITIES/mcl_mobs/mobs/illusioner.lua diff --git a/mods/ENTITIES/mobs_mc/init.lua b/mods/ENTITIES/mcl_mobs/mobs/init.lua similarity index 76% rename from mods/ENTITIES/mobs_mc/init.lua rename to mods/ENTITIES/mcl_mobs/mobs/init.lua index 58006fe90..3fb1b6e4c 100644 --- a/mods/ENTITIES/mobs_mc/init.lua +++ b/mods/ENTITIES/mcl_mobs/mobs/init.lua @@ -1,45 +1,3 @@ ---MCmobs v0.4 ---maikerumine ---made for MC like Survival game ---License for code WTFPL and otherwise stated in readmes - -local path = minetest.get_modpath("mobs_mc") - -if not minetest.get_modpath("mobs_mc_gameconfig") then - mobs_mc = {} -end - --- For utility functions -mobs_mc.tools = {} - --- This function checks if the item ID has been overwritten and returns true if it is unchanged -if minetest.get_modpath("mobs_mc_gameconfig") and mobs_mc.override and mobs_mc.override.items then - mobs_mc.is_item_variable_overridden = function(id) - return mobs_mc.override.items[id] == nil - end -else - -- No items are overwritten, so always return true - mobs_mc.is_item_variable_overridden = function(id) - return true - end -end - ---MOB ITEMS SELECTOR SWITCH -dofile(path .. "/0_gameconfig.lua") ---Items -dofile(path .. "/1_items_default.lua") - --- Bow, arrow and throwables -dofile(path .. "/2_throwing.lua") - --- Shared functions -dofile(path .. "/3_shared.lua") - ---Mob heads -dofile(path .. "/4_heads.lua") - -dofile(path .. "/5_spawn_abm_check.lua") - -- Animals dofile(path .. "/bat.lua") -- Mesh and animation by toby109tt / https://github.com/22i dofile(path .. "/rabbit.lua") -- Mesh and animation byExeterDad @@ -58,7 +16,6 @@ dofile(path .. "/squid.lua") -- Animation, sound and egg texture by daufinsyd -- NPCs dofile(path .. "/villager.lua") -- KrupnoPavel Mesh and animation by toby109tt / https://github.com/22i -- Agent texture missing ---dofile(path .. "/agent.lua") -- Mesh and animation by toby109tt / https://github.com/22i -- Illagers and witch dofile(path .. "/villager_evoker.lua") -- Mesh and animation by toby109tt / https://github.com/22i diff --git a/mods/ENTITIES/mobs_mc/iron_golem.lua b/mods/ENTITIES/mcl_mobs/mobs/iron_golem.lua similarity index 100% rename from mods/ENTITIES/mobs_mc/iron_golem.lua rename to mods/ENTITIES/mcl_mobs/mobs/iron_golem.lua diff --git a/mods/ENTITIES/mobs_mc/llama.lua b/mods/ENTITIES/mcl_mobs/mobs/llama.lua similarity index 98% rename from mods/ENTITIES/mobs_mc/llama.lua rename to mods/ENTITIES/mcl_mobs/mobs/llama.lua index 58f565ec1..55d9c2781 100644 --- a/mods/ENTITIES/mobs_mc/llama.lua +++ b/mods/ENTITIES/mcl_mobs/mobs/llama.lua @@ -35,7 +35,7 @@ mobs:register_mob("mobs_mc:llama", { shoot_arrow = function(self, pos, dir) -- 2-4 damage per arrow local dmg = 1 - mobs.shoot_projectile_handling("mobs_mc:spit", pos, dir, self.object:get_yaw(), self.object, nil, dmg) + mobs.shoot_projectile_handling("mobs_mc:spit", pos, dir, self.object:get_yaw(), self.object, nil, dmg) end, hp_min = 15, hp_max = 30, @@ -109,7 +109,6 @@ mobs:register_mob("mobs_mc:llama", { self.terrain_type = 3 self.driver_attach_at = {x = 0, y = 4.17, z = -1.5} self.driver_eye_offset = {x = 0, y = 3, z = 0} - self.driver_scale = {x = 1/self.visual_size.x, y = 1/self.visual_size.y} end -- if driver present allow control of llama @@ -146,7 +145,7 @@ mobs:register_mob("mobs_mc:llama", { self.tamed = true self.owner = clicker:get_player_name() return - end + end --ignore other logic --make baby grow faster @@ -316,7 +315,7 @@ mobs:register_arrow("mobs_mc:spit", { }, nil) end, - hit_mob = function(self, mob) + hit_mob = function(self, mob) mob:punch(self.object, 1.0, { full_punch_interval = 1.0, damage_groups = {fleshy = _damage}, @@ -326,4 +325,4 @@ mobs:register_arrow("mobs_mc:spit", { hit_node = function(self, pos, node) --does nothing end -}) \ No newline at end of file +}) diff --git a/mods/ENTITIES/mobs_mc/ocelot.lua b/mods/ENTITIES/mcl_mobs/mobs/ocelot.lua similarity index 100% rename from mods/ENTITIES/mobs_mc/ocelot.lua rename to mods/ENTITIES/mcl_mobs/mobs/ocelot.lua diff --git a/mods/ENTITIES/mobs_mc/parrot.lua b/mods/ENTITIES/mcl_mobs/mobs/parrot.lua similarity index 99% rename from mods/ENTITIES/mobs_mc/parrot.lua rename to mods/ENTITIES/mcl_mobs/mobs/parrot.lua index de52c6252..ecfb0bfb4 100644 --- a/mods/ENTITIES/mobs_mc/parrot.lua +++ b/mods/ENTITIES/mcl_mobs/mobs/parrot.lua @@ -67,7 +67,6 @@ mobs:register_mob("mobs_mc:parrot", { physical = true, fly = true, makes_footstep_sound = false, - fear_height = 0, view_range = 16, follow = mobs_mc.follow.parrot, on_rightclick = function(self, clicker) diff --git a/mods/ENTITIES/mobs_mc/pig.lua b/mods/ENTITIES/mcl_mobs/mobs/pig.lua similarity index 98% rename from mods/ENTITIES/mobs_mc/pig.lua rename to mods/ENTITIES/mcl_mobs/mobs/pig.lua index d7433a092..a91f29eb0 100644 --- a/mods/ENTITIES/mobs_mc/pig.lua +++ b/mods/ENTITIES/mcl_mobs/mobs/pig.lua @@ -83,7 +83,6 @@ mobs:register_mob("mobs_mc:pig", { self.terrain_type = 3 self.driver_attach_at = {x = 0.0, y = 2.75, z = -1.5} self.driver_eye_offset = {x = 0, y = 3, z = 0} - self.driver_scale = {x = 1/self.visual_size.x, y = 1/self.visual_size.y} end -- if driver present allow control of horse @@ -130,7 +129,7 @@ mobs:register_mob("mobs_mc:pig", { -- Put saddle on pig local item = clicker:get_wielded_item() local wielditem = item - + if item:get_name() == mobs_mc.items.saddle and self.saddle ~= "yes" then self.base_texture = { "blank.png", -- baby diff --git a/mods/ENTITIES/mobs_mc/polar_bear.lua b/mods/ENTITIES/mcl_mobs/mobs/polar_bear.lua similarity index 100% rename from mods/ENTITIES/mobs_mc/polar_bear.lua rename to mods/ENTITIES/mcl_mobs/mobs/polar_bear.lua diff --git a/mods/ENTITIES/mobs_mc/rabbit.lua b/mods/ENTITIES/mcl_mobs/mobs/rabbit.lua similarity index 99% rename from mods/ENTITIES/mobs_mc/rabbit.lua rename to mods/ENTITIES/mcl_mobs/mobs/rabbit.lua index 3214925ac..d31c70662 100644 --- a/mods/ENTITIES/mobs_mc/rabbit.lua +++ b/mods/ENTITIES/mcl_mobs/mobs/rabbit.lua @@ -90,7 +90,7 @@ killer_bunny.specific_attack = { "player", "mobs_mc:wolf", "mobs_mc:dog" } killer_bunny.damage = 8 killer_bunny.passive = false -- 8 armor points -killer_bunny.armor = 50 +killer_bunny.armor = {fleshy = 50} killer_bunny.textures = { "mobs_mc_rabbit_caerbannog.png" } killer_bunny.view_range = 16 killer_bunny.replace_rate = nil diff --git a/mods/ENTITIES/mobs_mc/sheep.lua b/mods/ENTITIES/mcl_mobs/mobs/sheep.lua similarity index 88% rename from mods/ENTITIES/mobs_mc/sheep.lua rename to mods/ENTITIES/mcl_mobs/mobs/sheep.lua index 1527fd6da..046a7f021 100644 --- a/mods/ENTITIES/mobs_mc/sheep.lua +++ b/mods/ENTITIES/mcl_mobs/mobs/sheep.lua @@ -23,33 +23,21 @@ local colors = { unicolor_cyan = { mobs_mc.items.wool_cyan, "#00CCCCD0" }, unicolor_red_violet = { mobs_mc.items.wool_magenta, "#CC0050D0" }, unicolor_black = { mobs_mc.items.wool_black, "#000000D0" }, + unicolor_light_blue = { mobs_mc.items.wool_light_blue, "#5050FFD0" }, } -local rainbow_colors = { - "unicolor_light_red", - "unicolor_red", - "unicolor_orange", - "unicolor_yellow", - "unicolor_green", - "unicolor_dark_green", - "unicolor_light_blue", - "unicolor_blue", - "unicolor_violet", - "unicolor_red_violet" -} - -if minetest.get_modpath("mcl_wool") ~= nil then - colors["unicolor_light_blue"] = { mobs_mc.items.wool_light_blue, "#5050FFD0" } +local sheep_texture_raw(color) + return { + "mobs_mc_sheep_fur.png^[colorize:" .. color, + "mobs_mc_sheep.png", + } end local sheep_texture = function(color_group) if not color_group then color_group = "unicolor_white" end - return { - "mobs_mc_sheep_fur.png^[colorize:"..colors[color_group][2], - "mobs_mc_sheep.png", - } + return sheep_texture_raw(colors[color_group][2]) end local gotten_texture = { "blank.png", "mobs_mc_sheep.png" } @@ -79,11 +67,11 @@ mobs:register_mob("mobs_mc:sheep", { makes_footstep_sound = true, walk_velocity = 1, run_velocity = 3, - + --head code has_head = true, head_bone = "head", - + swap_y_with_x = false, reverse_head_yaw = false, @@ -146,6 +134,10 @@ mobs:register_mob("mobs_mc:sheep", { } end, + get_rainbow_textures = function(color) + sheep_texture_raw(color .. "D0") + end, + -- Set random color on spawn do_custom = function(self, dtime) if not self.initial_color_set then @@ -184,33 +176,6 @@ mobs:register_mob("mobs_mc:sheep", { } self.initial_color_set = true end - - local is_kay27 = self.nametag == "kay27" - - if self.color_change_timer then - local old_color = self.color - if is_kay27 then - self.color_change_timer = self.color_change_timer - dtime - if self.color_change_timer < 0 then - self.color_change_timer = 0.5 - self.color_index = (self.color_index + 1) % #rainbow_colors - self.color = rainbow_colors[self.color_index + 1] - end - else - self.color_change_timer = nil - self.color_index = nil - self.color = self.initial_color - end - - if old_color ~= self.color then - self.base_texture = sheep_texture(self.color) - self.object:set_properties({textures = self.base_texture}) - end - elseif is_kay27 then - self.initial_color = self.color - self.color_change_timer = 0 - self.color_index = -1 - end end, on_rightclick = function(self, clicker) diff --git a/mods/ENTITIES/mobs_mc/shulker.lua b/mods/ENTITIES/mcl_mobs/mobs/shulker.lua similarity index 98% rename from mods/ENTITIES/mobs_mc/shulker.lua rename to mods/ENTITIES/mcl_mobs/mobs/shulker.lua index 9932c5add..718d72491 100644 --- a/mods/ENTITIES/mobs_mc/shulker.lua +++ b/mods/ENTITIES/mcl_mobs/mobs/shulker.lua @@ -24,7 +24,7 @@ mobs:register_mob("mobs_mc:shulker", { hp_max = 30, xp_min = 5, xp_max = 5, - armor = 150, + armor = {fleshy = 150}, collisionbox = {-0.5, -0.01, -0.5, 0.5, 0.99, 0.5}, visual = "mesh", mesh = "mobs_mc_shulker.b3d", diff --git a/mods/ENTITIES/mobs_mc/silverfish.lua b/mods/ENTITIES/mcl_mobs/mobs/silverfish.lua similarity index 100% rename from mods/ENTITIES/mobs_mc/silverfish.lua rename to mods/ENTITIES/mcl_mobs/mobs/silverfish.lua diff --git a/mods/ENTITIES/mobs_mc/skeleton+stray.lua b/mods/ENTITIES/mcl_mobs/mobs/skeleton.lua similarity index 99% rename from mods/ENTITIES/mobs_mc/skeleton+stray.lua rename to mods/ENTITIES/mcl_mobs/mobs/skeleton.lua index 37b1fc6dd..69362061b 100644 --- a/mods/ENTITIES/mobs_mc/skeleton+stray.lua +++ b/mods/ENTITIES/mcl_mobs/mobs/skeleton.lua @@ -55,7 +55,7 @@ local skeleton = { makes_footstep_sound = true, textures = { { - "mobs_mc_empty.png", -- armor + "empty.png", -- armor "mobs_mc_skeleton.png", -- texture "mcl_bows_bow_0.png", -- wielded_item } diff --git a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua b/mods/ENTITIES/mcl_mobs/mobs/slime.lua similarity index 99% rename from mods/ENTITIES/mobs_mc/slime+magma_cube.lua rename to mods/ENTITIES/mcl_mobs/mobs/slime.lua index 0cae6757d..3494e1b3f 100644 --- a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua +++ b/mods/ENTITIES/mcl_mobs/mobs/slime.lua @@ -104,7 +104,6 @@ local slime_big = { run_velocity = 2.5, walk_chance = 0, jump_height = 5.2, - fear_height = 0, spawn_small_alternative = "mobs_mc:slime_small", on_die = spawn_children_on_die("mobs_mc:slime_small", 4, 1.0, 1.5), use_texture_alpha = true, @@ -314,7 +313,7 @@ local magma_cube_big = { rotate = 270, damage = 6, reach = 3, - armor = 53, + armor = {fleshy = 53}, drops = { {name = mobs_mc.items.magma_cream, chance = 4, @@ -345,7 +344,6 @@ local magma_cube_big = { jump = true, jump_height = 8, walk_chance = 0, - fear_height = 0, spawn_small_alternative = "mobs_mc:magma_cube_small", on_die = spawn_children_on_die("mobs_mc:magma_cube_small", 3, 0.8, 1.5), fire_resistant = true, @@ -368,7 +366,7 @@ magma_cube_small.run_velocity = 2.6 magma_cube_small.jump_height = 6 magma_cube_small.damage = 4 magma_cube_small.reach = 2.75 -magma_cube_small.armor = 66 +magma_cube_small.armor = {fleshy = 66} magma_cube_small.spawn_small_alternative = "mobs_mc:magma_cube_tiny" magma_cube_small.on_die = spawn_children_on_die("mobs_mc:magma_cube_tiny", 4, 0.6, 1.0) mobs:register_mob("mobs_mc:magma_cube_small", magma_cube_small) @@ -388,7 +386,7 @@ magma_cube_tiny.run_velocity = 1.02 magma_cube_tiny.jump_height = 4 magma_cube_tiny.damage = 3 magma_cube_tiny.reach = 2.5 -magma_cube_tiny.armor = 50 +magma_cube_tiny.armor = {fleshy = 50} magma_cube_tiny.drops = {} magma_cube_tiny.spawn_small_alternative = nil magma_cube_tiny.on_die = nil diff --git a/mods/ENTITIES/mobs_mc/snowman.lua b/mods/ENTITIES/mcl_mobs/mobs/snowman.lua similarity index 100% rename from mods/ENTITIES/mobs_mc/snowman.lua rename to mods/ENTITIES/mcl_mobs/mobs/snowman.lua diff --git a/mods/ENTITIES/mobs_mc/spider.lua b/mods/ENTITIES/mcl_mobs/mobs/spider.lua similarity index 100% rename from mods/ENTITIES/mobs_mc/spider.lua rename to mods/ENTITIES/mcl_mobs/mobs/spider.lua diff --git a/mods/ENTITIES/mobs_mc/squid.lua b/mods/ENTITIES/mcl_mobs/mobs/squid.lua similarity index 99% rename from mods/ENTITIES/mobs_mc/squid.lua rename to mods/ENTITIES/mcl_mobs/mobs/squid.lua index 55d4b05c3..4fbd4f93b 100644 --- a/mods/ENTITIES/mobs_mc/squid.lua +++ b/mods/ENTITIES/mcl_mobs/mobs/squid.lua @@ -16,7 +16,6 @@ mobs:register_mob("mobs_mc:squid", { hp_max = 10, xp_min = 1, xp_max = 3, - armor = 100, rotate = 270, tilt_swim = true, -- FIXME: If the squid is near the floor, it turns black diff --git a/mods/ENTITIES/mobs_mc/vex.lua b/mods/ENTITIES/mcl_mobs/mobs/vex.lua similarity index 100% rename from mods/ENTITIES/mobs_mc/vex.lua rename to mods/ENTITIES/mcl_mobs/mobs/vex.lua diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mcl_mobs/mobs/villager.lua similarity index 100% rename from mods/ENTITIES/mobs_mc/villager.lua rename to mods/ENTITIES/mcl_mobs/mobs/villager.lua diff --git a/mods/ENTITIES/mobs_mc/villager_vindicator.lua b/mods/ENTITIES/mcl_mobs/mobs/vindicator.lua similarity index 100% rename from mods/ENTITIES/mobs_mc/villager_vindicator.lua rename to mods/ENTITIES/mcl_mobs/mobs/vindicator.lua diff --git a/mods/ENTITIES/mobs_mc/witch.lua b/mods/ENTITIES/mcl_mobs/mobs/witch.lua similarity index 100% rename from mods/ENTITIES/mobs_mc/witch.lua rename to mods/ENTITIES/mcl_mobs/mobs/witch.lua diff --git a/mods/ENTITIES/mobs_mc/wither.lua b/mods/ENTITIES/mcl_mobs/mobs/wither.lua similarity index 97% rename from mods/ENTITIES/mobs_mc/wither.lua rename to mods/ENTITIES/mcl_mobs/mobs/wither.lua index 7c9072f43..491639149 100644 --- a/mods/ENTITIES/mobs_mc/wither.lua +++ b/mods/ENTITIES/mcl_mobs/mobs/wither.lua @@ -17,7 +17,7 @@ mobs:register_mob("mobs_mc:wither", { hp_min = 300, xp_min = 50, xp_max = 50, - armor = {undead = 80, fleshy = 100}, + armor = {undead = 100, fleshy = 100}, -- This deviates from MC Wiki's size, which makes no sense collisionbox = {-0.9, 0.4, -0.9, 0.9, 2.45, 0.9}, visual = "mesh", @@ -72,7 +72,6 @@ mobs:register_mob("mobs_mc:wither", { self.base_texture = "mobs_mc_wither_half_health.png" self.fly = false self.object:set_properties({textures={self.base_texture}}) - self.armor = {undead = 80, fleshy = 80} end mcl_bossbars.update_boss(self.object, "Wither", "dark_purple") end, diff --git a/mods/ENTITIES/mobs_mc/skeleton_wither.lua b/mods/ENTITIES/mcl_mobs/mobs/wither_skeleton.lua similarity index 98% rename from mods/ENTITIES/mobs_mc/skeleton_wither.lua rename to mods/ENTITIES/mcl_mobs/mobs/wither_skeleton.lua index 279a1d8cb..13e6b678f 100644 --- a/mods/ENTITIES/mobs_mc/skeleton_wither.lua +++ b/mods/ENTITIES/mcl_mobs/mobs/wither_skeleton.lua @@ -26,7 +26,7 @@ mobs:register_mob("mobs_mc:witherskeleton", { mesh = "mobs_mc_witherskeleton.b3d", textures = { { - "mobs_mc_empty.png", -- armor + "empty.png", -- armor "mobs_mc_wither_skeleton.png", -- wither skeleton "default_tool_stonesword.png", -- sword } diff --git a/mods/ENTITIES/mobs_mc/wolf.lua b/mods/ENTITIES/mcl_mobs/mobs/wolf.lua similarity index 100% rename from mods/ENTITIES/mobs_mc/wolf.lua rename to mods/ENTITIES/mcl_mobs/mobs/wolf.lua diff --git a/mods/ENTITIES/mobs_mc/zombie.lua b/mods/ENTITIES/mcl_mobs/mobs/zombie.lua similarity index 97% rename from mods/ENTITIES/mobs_mc/zombie.lua rename to mods/ENTITIES/mcl_mobs/mobs/zombie.lua index 7d0fb1491..0ca9df172 100644 --- a/mods/ENTITIES/mobs_mc/zombie.lua +++ b/mods/ENTITIES/mcl_mobs/mobs/zombie.lua @@ -56,15 +56,15 @@ local zombie = { xp_min = 5, xp_max = 5, breath_max = -1, - armor = {undead = 90, fleshy = 90}, + armor = {undead = 100, fleshy = 100}, collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.94, 0.3}, visual = "mesh", mesh = "mobs_mc_zombie.b3d", textures = { { - "mobs_mc_empty.png", -- armor + "empty.png", -- armor "mobs_mc_zombie.png", -- texture - "mobs_mc_empty.png", -- wielded_item + "empty.png", -- wielded_item } }, visual_size = {x=3, y=3}, @@ -140,9 +140,9 @@ local husk = table.copy(zombie) husk.description = S("Husk") husk.textures = { { - "mobs_mc_empty.png", -- armor + "empty.png", -- armor "mobs_mc_husk.png", -- texture - "mobs_mc_empty.png", -- wielded_item + "empty.png", -- wielded_item } } husk.ignited_by_sunlight = false diff --git a/mods/ENTITIES/mobs_mc/zombiepig.lua b/mods/ENTITIES/mcl_mobs/mobs/zombie_pigman.lua similarity index 98% rename from mods/ENTITIES/mobs_mc/zombiepig.lua rename to mods/ENTITIES/mcl_mobs/mobs/zombie_pigman.lua index 72a19f413..094a647ee 100644 --- a/mods/ENTITIES/mobs_mc/zombiepig.lua +++ b/mods/ENTITIES/mcl_mobs/mobs/zombie_pigman.lua @@ -23,7 +23,7 @@ local pigman = { hp_max = 20, xp_min = 6, xp_max = 6, - armor = {undead = 90, fleshy = 90}, + armor = {undead = 100, fleshy = 100}, attack_type = "punch", group_attack = { "mobs_mc:pigman", "mobs_mc:baby_pigman" }, damage = 9, diff --git a/mods/ENTITIES/mobs_mc/villager_zombie.lua b/mods/ENTITIES/mcl_mobs/mobs/zombie_villager.lua similarity index 92% rename from mods/ENTITIES/mobs_mc/villager_zombie.lua rename to mods/ENTITIES/mcl_mobs/mobs/zombie_villager.lua index 450710c49..e7200bcdc 100644 --- a/mods/ENTITIES/mobs_mc/villager_zombie.lua +++ b/mods/ENTITIES/mcl_mobs/mobs/zombie_villager.lua @@ -37,17 +37,17 @@ mobs:register_mob("mobs_mc:villager_zombie", { xp_min = 5, xp_max = 5, breath_max = -1, - armor = {undead = 90, fleshy = 90}, + armor = {undead = 100, fleshy = 100}, collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.94, 0.3}, visual = "mesh", mesh = "mobs_mc_villager_zombie.b3d", textures = { - {"mobs_mc_empty.png", "mobs_mc_zombie_butcher.png", "mobs_mc_empty.png"}, - {"mobs_mc_empty.png", "mobs_mc_zombie_farmer.png", "mobs_mc_empty.png"}, - {"mobs_mc_empty.png", "mobs_mc_zombie_librarian.png", "mobs_mc_empty.png"}, - {"mobs_mc_empty.png", "mobs_mc_zombie_priest.png", "mobs_mc_empty.png"}, - {"mobs_mc_empty.png", "mobs_mc_zombie_smith.png", "mobs_mc_empty.png"}, - {"mobs_mc_empty.png", "mobs_mc_zombie_villager.png", "mobs_mc_empty.png"}, + {"empty.png", "mobs_mc_zombie_butcher.png", "empty.png"}, + {"empty.png", "mobs_mc_zombie_farmer.png", "empty.png"}, + {"empty.png", "mobs_mc_zombie_librarian.png", "empty.png"}, + {"empty.png", "mobs_mc_zombie_priest.png", "empty.png"}, + {"empty.png", "mobs_mc_zombie_smith.png", "empty.png"}, + {"empty.png", "mobs_mc_zombie_villager.png", "empty.png"}, }, visual_size = {x=2.75, y=2.75}, makes_footstep_sound = true, diff --git a/mods/ENTITIES/mcl_mobs/mod.conf b/mods/ENTITIES/mcl_mobs/mod.conf index 0d622f6a9..7d6c1333f 100644 --- a/mods/ENTITIES/mcl_mobs/mod.conf +++ b/mods/ENTITIES/mcl_mobs/mod.conf @@ -1,5 +1,5 @@ name = mcl_mobs -author = PilzAdam -description = Adds a mob API for mods to add animals or monsters, etc. -depends = mcl_particles -optional_depends = mcl_weather, mcl_explosions, mcl_hunger, mcl_worlds, invisibility, lucky_block, cmi, doc_identifier, mcl_armor, mcl_portals, mcl_experience +author = PilzAdam, maikerumine +description = Adds a mob API for mods to add animals or monsters, etc. and adds Minecraft-like monsters and animals. +depends = mcl_particles, mcl_damage, mcl_burning, mcl_weather, mcl_explosions, mcl_hunger, mcl_worlds, mcl_armor, mcl_portals, mcl_experience, mcl_tnt, mcl_bows, mcl_throwing, mcl_init, mcl_wip, mcl_totems, mcl_mobitems +optional_depends = doc_identifier, doc_items diff --git a/mods/ENTITIES/mobs_mc/models/attributes.txt b/mods/ENTITIES/mcl_mobs/models/attributes.txt similarity index 100% rename from mods/ENTITIES/mobs_mc/models/attributes.txt rename to mods/ENTITIES/mcl_mobs/models/attributes.txt diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_bat.b3d b/mods/ENTITIES/mcl_mobs/models/mcl_mobs_bat.b3d similarity index 100% rename from mods/ENTITIES/mobs_mc/models/mobs_mc_bat.b3d rename to mods/ENTITIES/mcl_mobs/models/mcl_mobs_bat.b3d diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_blaze.b3d b/mods/ENTITIES/mcl_mobs/models/mcl_mobs_blaze.b3d similarity index 100% rename from mods/ENTITIES/mobs_mc/models/mobs_mc_blaze.b3d rename to mods/ENTITIES/mcl_mobs/models/mcl_mobs_blaze.b3d diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_cat.b3d b/mods/ENTITIES/mcl_mobs/models/mcl_mobs_cat.b3d similarity index 100% rename from mods/ENTITIES/mobs_mc/models/mobs_mc_cat.b3d rename to mods/ENTITIES/mcl_mobs/models/mcl_mobs_cat.b3d diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_chicken.b3d b/mods/ENTITIES/mcl_mobs/models/mcl_mobs_chicken.b3d similarity index 100% rename from mods/ENTITIES/mobs_mc/models/mobs_mc_chicken.b3d rename to mods/ENTITIES/mcl_mobs/models/mcl_mobs_chicken.b3d diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_cow.b3d b/mods/ENTITIES/mcl_mobs/models/mcl_mobs_cow.b3d similarity index 100% rename from mods/ENTITIES/mobs_mc/models/mobs_mc_cow.b3d rename to mods/ENTITIES/mcl_mobs/models/mcl_mobs_cow.b3d diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_creeper.b3d b/mods/ENTITIES/mcl_mobs/models/mcl_mobs_creeper.b3d similarity index 100% rename from mods/ENTITIES/mobs_mc/models/mobs_mc_creeper.b3d rename to mods/ENTITIES/mcl_mobs/models/mcl_mobs_creeper.b3d diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_dragon.b3d b/mods/ENTITIES/mcl_mobs/models/mcl_mobs_dragon.b3d similarity index 100% rename from mods/ENTITIES/mobs_mc/models/mobs_mc_dragon.b3d rename to mods/ENTITIES/mcl_mobs/models/mcl_mobs_dragon.b3d diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_enderman.b3d b/mods/ENTITIES/mcl_mobs/models/mcl_mobs_enderman.b3d similarity index 100% rename from mods/ENTITIES/mobs_mc/models/mobs_mc_enderman.b3d rename to mods/ENTITIES/mcl_mobs/models/mcl_mobs_enderman.b3d diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_endermite.b3d b/mods/ENTITIES/mcl_mobs/models/mcl_mobs_endermite.b3d similarity index 100% rename from mods/ENTITIES/mobs_mc/models/mobs_mc_endermite.b3d rename to mods/ENTITIES/mcl_mobs/models/mcl_mobs_endermite.b3d diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_evoker.b3d b/mods/ENTITIES/mcl_mobs/models/mcl_mobs_evoker.b3d similarity index 100% rename from mods/ENTITIES/mobs_mc/models/mobs_mc_evoker.b3d rename to mods/ENTITIES/mcl_mobs/models/mcl_mobs_evoker.b3d diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_ghast.b3d b/mods/ENTITIES/mcl_mobs/models/mcl_mobs_ghast.b3d similarity index 100% rename from mods/ENTITIES/mobs_mc/models/mobs_mc_ghast.b3d rename to mods/ENTITIES/mcl_mobs/models/mcl_mobs_ghast.b3d diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_guardian.b3d b/mods/ENTITIES/mcl_mobs/models/mcl_mobs_guardian.b3d similarity index 100% rename from mods/ENTITIES/mobs_mc/models/mobs_mc_guardian.b3d rename to mods/ENTITIES/mcl_mobs/models/mcl_mobs_guardian.b3d diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_horse.b3d b/mods/ENTITIES/mcl_mobs/models/mcl_mobs_horse.b3d similarity index 100% rename from mods/ENTITIES/mobs_mc/models/mobs_mc_horse.b3d rename to mods/ENTITIES/mcl_mobs/models/mcl_mobs_horse.b3d diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_illusioner.b3d b/mods/ENTITIES/mcl_mobs/models/mcl_mobs_illusioner.b3d similarity index 100% rename from mods/ENTITIES/mobs_mc/models/mobs_mc_illusioner.b3d rename to mods/ENTITIES/mcl_mobs/models/mcl_mobs_illusioner.b3d diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_iron_golem.b3d b/mods/ENTITIES/mcl_mobs/models/mcl_mobs_iron_golem.b3d similarity index 100% rename from mods/ENTITIES/mobs_mc/models/mobs_mc_iron_golem.b3d rename to mods/ENTITIES/mcl_mobs/models/mcl_mobs_iron_golem.b3d diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_llama.b3d b/mods/ENTITIES/mcl_mobs/models/mcl_mobs_llama.b3d similarity index 100% rename from mods/ENTITIES/mobs_mc/models/mobs_mc_llama.b3d rename to mods/ENTITIES/mcl_mobs/models/mcl_mobs_llama.b3d diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_magmacube.b3d b/mods/ENTITIES/mcl_mobs/models/mcl_mobs_magmacube.b3d similarity index 100% rename from mods/ENTITIES/mobs_mc/models/mobs_mc_magmacube.b3d rename to mods/ENTITIES/mcl_mobs/models/mcl_mobs_magmacube.b3d diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_mooshroom.b3d b/mods/ENTITIES/mcl_mobs/models/mcl_mobs_mooshroom.b3d similarity index 100% rename from mods/ENTITIES/mobs_mc/models/mobs_mc_mooshroom.b3d rename to mods/ENTITIES/mcl_mobs/models/mcl_mobs_mooshroom.b3d diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_parrot.b3d b/mods/ENTITIES/mcl_mobs/models/mcl_mobs_parrot.b3d similarity index 100% rename from mods/ENTITIES/mobs_mc/models/mobs_mc_parrot.b3d rename to mods/ENTITIES/mcl_mobs/models/mcl_mobs_parrot.b3d diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_pig.b3d b/mods/ENTITIES/mcl_mobs/models/mcl_mobs_pig.b3d similarity index 100% rename from mods/ENTITIES/mobs_mc/models/mobs_mc_pig.b3d rename to mods/ENTITIES/mcl_mobs/models/mcl_mobs_pig.b3d diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_polarbear.b3d b/mods/ENTITIES/mcl_mobs/models/mcl_mobs_polarbear.b3d similarity index 100% rename from mods/ENTITIES/mobs_mc/models/mobs_mc_polarbear.b3d rename to mods/ENTITIES/mcl_mobs/models/mcl_mobs_polarbear.b3d diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_rabbit.b3d b/mods/ENTITIES/mcl_mobs/models/mcl_mobs_rabbit.b3d similarity index 100% rename from mods/ENTITIES/mobs_mc/models/mobs_mc_rabbit.b3d rename to mods/ENTITIES/mcl_mobs/models/mcl_mobs_rabbit.b3d diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_sheepfur.b3d b/mods/ENTITIES/mcl_mobs/models/mcl_mobs_sheepfur.b3d similarity index 100% rename from mods/ENTITIES/mobs_mc/models/mobs_mc_sheepfur.b3d rename to mods/ENTITIES/mcl_mobs/models/mcl_mobs_sheepfur.b3d diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_shulker.b3d b/mods/ENTITIES/mcl_mobs/models/mcl_mobs_shulker.b3d similarity index 100% rename from mods/ENTITIES/mobs_mc/models/mobs_mc_shulker.b3d rename to mods/ENTITIES/mcl_mobs/models/mcl_mobs_shulker.b3d diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_silverfish.b3d b/mods/ENTITIES/mcl_mobs/models/mcl_mobs_silverfish.b3d similarity index 100% rename from mods/ENTITIES/mobs_mc/models/mobs_mc_silverfish.b3d rename to mods/ENTITIES/mcl_mobs/models/mcl_mobs_silverfish.b3d diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_skeleton.b3d b/mods/ENTITIES/mcl_mobs/models/mcl_mobs_skeleton.b3d similarity index 100% rename from mods/ENTITIES/mobs_mc/models/mobs_mc_skeleton.b3d rename to mods/ENTITIES/mcl_mobs/models/mcl_mobs_skeleton.b3d diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_slime.b3d b/mods/ENTITIES/mcl_mobs/models/mcl_mobs_slime.b3d similarity index 100% rename from mods/ENTITIES/mobs_mc/models/mobs_mc_slime.b3d rename to mods/ENTITIES/mcl_mobs/models/mcl_mobs_slime.b3d diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_snowman.b3d b/mods/ENTITIES/mcl_mobs/models/mcl_mobs_snowman.b3d similarity index 100% rename from mods/ENTITIES/mobs_mc/models/mobs_mc_snowman.b3d rename to mods/ENTITIES/mcl_mobs/models/mcl_mobs_snowman.b3d diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_spider.b3d b/mods/ENTITIES/mcl_mobs/models/mcl_mobs_spider.b3d similarity index 100% rename from mods/ENTITIES/mobs_mc/models/mobs_mc_spider.b3d rename to mods/ENTITIES/mcl_mobs/models/mcl_mobs_spider.b3d diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_squid.b3d b/mods/ENTITIES/mcl_mobs/models/mcl_mobs_squid.b3d similarity index 100% rename from mods/ENTITIES/mobs_mc/models/mobs_mc_squid.b3d rename to mods/ENTITIES/mcl_mobs/models/mcl_mobs_squid.b3d diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_stray.b3d b/mods/ENTITIES/mcl_mobs/models/mcl_mobs_stray.b3d similarity index 100% rename from mods/ENTITIES/mobs_mc/models/mobs_mc_stray.b3d rename to mods/ENTITIES/mcl_mobs/models/mcl_mobs_stray.b3d diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_vex.b3d b/mods/ENTITIES/mcl_mobs/models/mcl_mobs_vex.b3d similarity index 100% rename from mods/ENTITIES/mobs_mc/models/mobs_mc_vex.b3d rename to mods/ENTITIES/mcl_mobs/models/mcl_mobs_vex.b3d diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_villager.b3d b/mods/ENTITIES/mcl_mobs/models/mcl_mobs_villager.b3d similarity index 100% rename from mods/ENTITIES/mobs_mc/models/mobs_mc_villager.b3d rename to mods/ENTITIES/mcl_mobs/models/mcl_mobs_villager.b3d diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_villager_zombie.b3d b/mods/ENTITIES/mcl_mobs/models/mcl_mobs_villager_zombie.b3d similarity index 100% rename from mods/ENTITIES/mobs_mc/models/mobs_mc_villager_zombie.b3d rename to mods/ENTITIES/mcl_mobs/models/mcl_mobs_villager_zombie.b3d diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_vindicator.b3d b/mods/ENTITIES/mcl_mobs/models/mcl_mobs_vindicator.b3d similarity index 100% rename from mods/ENTITIES/mobs_mc/models/mobs_mc_vindicator.b3d rename to mods/ENTITIES/mcl_mobs/models/mcl_mobs_vindicator.b3d diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_witch.b3d b/mods/ENTITIES/mcl_mobs/models/mcl_mobs_witch.b3d similarity index 100% rename from mods/ENTITIES/mobs_mc/models/mobs_mc_witch.b3d rename to mods/ENTITIES/mcl_mobs/models/mcl_mobs_witch.b3d diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_wither.b3d b/mods/ENTITIES/mcl_mobs/models/mcl_mobs_wither.b3d similarity index 100% rename from mods/ENTITIES/mobs_mc/models/mobs_mc_wither.b3d rename to mods/ENTITIES/mcl_mobs/models/mcl_mobs_wither.b3d diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_witherskeleton.b3d b/mods/ENTITIES/mcl_mobs/models/mcl_mobs_witherskeleton.b3d similarity index 100% rename from mods/ENTITIES/mobs_mc/models/mobs_mc_witherskeleton.b3d rename to mods/ENTITIES/mcl_mobs/models/mcl_mobs_witherskeleton.b3d diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_wolf.b3d b/mods/ENTITIES/mcl_mobs/models/mcl_mobs_wolf.b3d similarity index 100% rename from mods/ENTITIES/mobs_mc/models/mobs_mc_wolf.b3d rename to mods/ENTITIES/mcl_mobs/models/mcl_mobs_wolf.b3d diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_zombie.b3d b/mods/ENTITIES/mcl_mobs/models/mcl_mobs_zombie.b3d similarity index 100% rename from mods/ENTITIES/mobs_mc/models/mobs_mc_zombie.b3d rename to mods/ENTITIES/mcl_mobs/models/mcl_mobs_zombie.b3d diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_zombie_pigman.b3d b/mods/ENTITIES/mcl_mobs/models/mcl_mobs_zombie_pigman.b3d similarity index 100% rename from mods/ENTITIES/mobs_mc/models/mobs_mc_zombie_pigman.b3d rename to mods/ENTITIES/mcl_mobs/models/mcl_mobs_zombie_pigman.b3d diff --git a/mods/ENTITIES/mcl_mobs/readme.MD b/mods/ENTITIES/mcl_mobs/readme.MD deleted file mode 100644 index aa79d909c..000000000 --- a/mods/ENTITIES/mcl_mobs/readme.MD +++ /dev/null @@ -1,74 +0,0 @@ - -Mobs Redo: MineClone 2 Edition - -Based on Mobs Redo from TenPlus1 -Built from PilzAdam's original Simple Mobs with additional mobs by KrupnoPavel, Zeg9, ExeterDad and AspireMint. - - -This mod contains the API only for adding your own mobs into the world, so please use the additional modpacks to add animals, monsters etc. - - -https://forum.minetest.net/viewtopic.php?f=11&t=9917 - ------------- -Credits: - -mcl_mobs_mob_poof.ogg: -- by Planman (license: Creative Commons Zero) -- Source: - ------------- - -Changelog from original Mobs Redo mod: -- 1.41- Mob pathfinding has been updated thanks to Elkien3 -- 1.40- Updated to use newer functions, requires Minetest 0.4.16+ to work. -- 1.39- Added 'on_breed', 'on_grown' and 'do_punch' custom functions per mob -- 1.38- Better entity checking, nametag setting and on_spawn function added to mob registry, tweaked light damage -- 1.37- Added support for Raymoo's CMI (common mob interface) mod: https://forum.minetest.net/viewtopic.php?f=9&t=15448 -- 1.36- Death check added, if mob dies in fire/lava/with lava pick then drops are cooked -- 1.35- Added owner_loyal flag for owned mobs to attack player enemies, also fixed group_attack -- 1.34- Added function to fly mob using directional movement (thanks D00Med for flying code) -- 1.33- Added functions to mount ride mobs (mobs.attach, mobs.detach, mobs.drive) many thanks to Blert2112 -- 1.32- Added new spawn check to count specific mobs AND new minetest.conf setting to chance spawn chance and numbers, added ability to protect tamed mobs -- 1.31- Added 'attack_animals' and 'specific_attack' flags for custom monster attacks, also 'mob_difficulty' .conf setting to make mobs harder. -- 1.30- Added support for invisibility mod (mobs cant attack what they cant see), tweaked and tidied code -- 1.29- Split original Mobs Redo into a modpack to make it easier to disable mob sets (animal, monster, npc) or simply use the Api itself for your own mod -- 1.28- New damage system added with ability for mob to be immune to weapons or healed by them :) -- 1.27- Added new sheep, lava flan and spawn egg textures. New Lava Pick tool smelts what you dig. New atan checking function. -- 1.26- Pathfinding feature added thanks to rnd, when monsters attack they become scary smart in finding you :) also, beehive produces honey now :) -- 1.25- Mobs no longer spawn within 12 blocks of player or despawn within same range, spawners now have player detection, Code tidy and tweak. -- 1.24- Added feature where certain animals run away when punched (runaway = true in mob definition) -- 1.23- Added mob spawner block for admin to setup spawners in-game (place and right click to enter settings) -- 1.22- Added ability to name tamed animals and npc using nametags, also npc will attack anyone who punches them apart from owner -- 1.21- Added some more error checking to reduce serialize.h error and added height checks for falling off cliffs (thanks cmdskp) -- 1.20- Error checking added to remove bad mobs, out of map limit mobs and stop serialize.h error -- 1.19- Chickens now drop egg items instead of placing the egg, also throwing eggs result in 1/8 chance of spawning chick -- 1.18- Added docile_by_day flag so that monsters will not attack automatically during daylight hours unless hit first -- 1.17- Added 'dogshoot' attack type, shoots when out of reach, melee attack when in reach, also api tweaks and self.reach added -- 1.16- Mobs follow multiple items now, Npc's can breed -- 1.15- Added Feeding/Taming/Breeding function, right-click to pick up any sheep with X mark on them and replace with new one to fix compatibility. -- 1.14- All .self variables saved in staticdata, Fixed self.health bug -- 1.13- Added capture function (thanks blert2112) chance of picking up mob with hand; net; magic lasso, replaced some .x models with newer .b3d one's -- 1.12- Added animal ownership so that players cannot steal your tamed animals -- 1.11- Added flying mobs (and swimming), fly=true and fly_in="air" or "deafult:water_source" for fishy -- 1,10- Footstep removed (use replace), explosion routine added for exploding mobs. -- 1.09- reworked breeding routine, added mob rotation value, added footstep feature, added jumping mobs with sounds feature, added magic lasso for picking up animals -- 1.08- Mob throwing attack has been rehauled so that they can damage one another, also drops and on_die function added -- 1.07- Npc's can now be set to follow player or stand by using self.order and self.owner variables -- beta- Npc mob added, kills monsters, attacks player when punched, right click with food to heal or gold lump for drop -- 1.06- Changed recovery times after breeding, and time taken to grow up (can be sped up by feeding baby animal) -- 1.05- Added ExeterDad's bunny's which can be picked up and tamed with 4 carrots from farming redo or farming_plus, also shears added to get wool from sheep and lastly Jordach/BSD's kitten -- 1.04- Added mating for sheep, cows and hogs... feed animals to make horny and hope for a baby which is half size, will grow up quick though :) -- 1.03- Added mob drop/replace feature so that chickens can drop eggs, cow/sheep can eat grass/wheat etc. -- 1.02- Sheared sheep are remembered and spawn shaven, Warthogs will attack when threatened, Api additions -- 1.01- Mobs that suffer fall damage or die in water/lava/sunlight will now drop items -- 1.0 - more work on Api so that certain mobs can float in water while some sink like a brick :) -- 0.9 - Spawn eggs added for all mobs (admin only, cannot be placed in protected areas)... Api tweaked -- 0.8 - Added sounds to monster mobs (thanks Cyberpangolin for the sfx) and also chicken sound -- 0.7 - mobs.protected switch added to api.lua, when set to 1 mobs no longer spawn in protected areas, also bug fixes -- 0.6 - Api now supports multi-textured mobs, e.g oerkki, dungeon master, rats and chickens have random skins when spawning (sheep fix TODO), also new Honey block -- 0.5 - Mobs now float in water, die from falling, and some code improvements -- 0.4 - Dungeon Masters and Mese Monsters have much better aim due to shoot_offset, also they can both shoot through nodes that aren't walkable (flowers, grass etc) plus new sheep sound :) -- 0.3 - Added LOTT's Spider mob, made Cobwebs, added KPavel's Bee with Honey and Beehives (made texture), Warthogs now have sound and can be tamed, taming of shaved sheep or milked cow with 8 wheat so it will not despawn, many bug fixes :) -- 0.2 - Cooking bucket of milk into cheese now returns empty bucket -- 0.1 - Initial Release diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_animal_eat_generic.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_animal_eat_generic.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_animal_eat_generic.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_animal_eat_generic.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bat_death.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_bat_death.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_bat_death.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_bat_death.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bat_hurt.1.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_bat_hurt.1.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_bat_hurt.1.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_bat_hurt.1.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bat_hurt.2.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_bat_hurt.2.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_bat_hurt.2.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_bat_hurt.2.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bat_hurt.3.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_bat_hurt.3.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_bat_hurt.3.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_bat_hurt.3.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bat_idle.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_bat_idle.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_bat_idle.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_bat_idle.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_attack.1.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_bear_attack.1.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_attack.1.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_bear_attack.1.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_attack.2.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_bear_attack.2.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_attack.2.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_bear_attack.2.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_death.1.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_bear_death.1.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_death.1.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_bear_death.1.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_growl.1.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_bear_growl.1.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_growl.1.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_bear_growl.1.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_growl.2.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_bear_growl.2.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_growl.2.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_bear_growl.2.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_growl.3.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_bear_growl.3.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_growl.3.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_bear_growl.3.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_hurt.1.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_bear_hurt.1.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_hurt.1.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_bear_hurt.1.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_random.1.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_bear_random.1.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_random.1.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_bear_random.1.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_random.2.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_bear_random.2.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_random.2.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_bear_random.2.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_random.3.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_bear_random.3.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_random.3.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_bear_random.3.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_blaze_breath.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_blaze_breath.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_blaze_breath.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_blaze_breath.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_blaze_died.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_blaze_died.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_blaze_died.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_blaze_died.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_blaze_hurt.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_blaze_hurt.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_blaze_hurt.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_blaze_hurt.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cat_hiss.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_cat_hiss.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_cat_hiss.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_cat_hiss.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cat_idle.1.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_cat_idle.1.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_cat_idle.1.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_cat_idle.1.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cat_idle.2.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_cat_idle.2.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_cat_idle.2.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_cat_idle.2.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_chicken_buck.1.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_chicken_buck.1.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_chicken_buck.1.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_chicken_buck.1.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_chicken_buck.2.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_chicken_buck.2.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_chicken_buck.2.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_chicken_buck.2.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_chicken_buck.3.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_chicken_buck.3.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_chicken_buck.3.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_chicken_buck.3.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_chicken_child.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_chicken_child.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_chicken_child.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_chicken_child.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_chicken_hurt.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_chicken_hurt.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_chicken_hurt.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_chicken_hurt.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_chicken_lay_egg.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_chicken_lay_egg.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_chicken_lay_egg.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_chicken_lay_egg.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cow.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_cow.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_cow.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_cow.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cow_hurt.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_cow_hurt.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_cow_hurt.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_cow_hurt.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cow_milk.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_cow_milk.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_cow_milk.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_cow_milk.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cow_mushroom_stew.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_cow_mushroom_stew.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_cow_mushroom_stew.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_cow_mushroom_stew.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_creeper_death.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_creeper_death.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_creeper_death.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_creeper_death.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_creeper_hurt.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_creeper_hurt.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_creeper_hurt.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_creeper_hurt.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_donkey_death.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_donkey_death.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_donkey_death.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_donkey_death.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_donkey_hurt.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_donkey_hurt.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_donkey_hurt.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_donkey_hurt.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_donkey_random.1.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_donkey_random.1.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_donkey_random.1.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_donkey_random.1.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_donkey_random.2.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_donkey_random.2.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_donkey_random.2.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_donkey_random.2.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_ender_dragon_attack.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_ender_dragon_attack.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_ender_dragon_attack.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_ender_dragon_attack.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_ender_dragon_shoot.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_ender_dragon_shoot.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_ender_dragon_shoot.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_ender_dragon_shoot.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_sandmonster.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_enderman.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_sandmonster.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_enderman.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_enderman_death.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_enderman_death.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_enderman_death.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_enderman_death.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_enderman_hurt.1.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_enderman_hurt.1.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_enderman_hurt.1.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_enderman_hurt.1.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_enderman_hurt.2.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_enderman_hurt.2.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_enderman_hurt.2.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_enderman_hurt.2.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_enderman_hurt.3.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_enderman_hurt.3.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_enderman_hurt.3.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_enderman_hurt.3.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_enderman_random.1.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_enderman_random.1.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_enderman_random.1.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_enderman_random.1.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_enderman_teleport_dst.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_enderman_teleport_dst.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_enderman_teleport_dst.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_enderman_teleport_dst.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_enderman_teleport_src.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_enderman_teleport_src.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_enderman_teleport_src.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_enderman_teleport_src.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_endermite_death.1.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_endermite_death.1.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_endermite_death.1.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_endermite_death.1.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_endermite_death.2.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_endermite_death.2.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_endermite_death.2.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_endermite_death.2.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_endermite_hurt.1.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_endermite_hurt.1.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_endermite_hurt.1.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_endermite_hurt.1.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_endermite_hurt.2.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_endermite_hurt.2.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_endermite_hurt.2.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_endermite_hurt.2.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_endermite_hurt.3.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_endermite_hurt.3.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_endermite_hurt.3.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_endermite_hurt.3.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_endermite_random.1.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_endermite_random.1.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_endermite_random.1.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_endermite_random.1.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_fireball.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_fireball.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_fireball.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_fireball.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_eerie.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_ghast.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_eerie.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_ghast.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_guardian_death.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_guardian_death.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_guardian_death.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_guardian_death.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_guardian_hurt.1.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_guardian_hurt.1.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_guardian_hurt.1.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_guardian_hurt.1.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_guardian_hurt.2.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_guardian_hurt.2.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_guardian_hurt.2.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_guardian_hurt.2.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_guardian_random.1.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_guardian_random.1.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_guardian_random.1.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_guardian_random.1.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_guardian_random.2.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_guardian_random.2.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_guardian_random.2.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_guardian_random.2.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_guardian_random.3.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_guardian_random.3.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_guardian_random.3.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_guardian_random.3.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_horse_death.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_horse_death.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_horse_death.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_horse_death.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_horse_hurt.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_horse_hurt.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_horse_hurt.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_horse_hurt.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_horse_random.1.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_horse_random.1.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_horse_random.1.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_horse_random.1.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_horse_random.2.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_horse_random.2.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_horse_random.2.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_horse_random.2.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_llama.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_llama.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_llama.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_llama.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_magma_cube_attack.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_magma_cube_attack.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_magma_cube_attack.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_magma_cube_attack.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_magma_cube_big.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_magma_cube_big.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_magma_cube_big.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_magma_cube_big.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_magma_cube_small.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_magma_cube_small.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_magma_cube_small.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_magma_cube_small.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_ocelot_hurt.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_ocelot_hurt.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_ocelot_hurt.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_ocelot_hurt.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_parrot_death.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_parrot_death.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_parrot_death.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_parrot_death.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_parrot_hurt.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_parrot_hurt.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_parrot_hurt.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_parrot_hurt.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_parrot_random.1.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_parrot_random.1.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_parrot_random.1.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_parrot_random.1.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_parrot_random.2.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_parrot_random.2.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_parrot_random.2.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_parrot_random.2.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_pig.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_pig.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_pig.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_pig.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_pig_angry.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_pig_angry.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_pig_angry.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_pig_angry.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_attack.1.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_rabbit_attack.1.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_attack.1.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_rabbit_attack.1.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_attack.2.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_rabbit_attack.2.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_attack.2.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_rabbit_attack.2.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_death.1.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_rabbit_death.1.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_death.1.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_rabbit_death.1.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_death.2.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_rabbit_death.2.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_death.2.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_rabbit_death.2.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_death.3.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_rabbit_death.3.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_death.3.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_rabbit_death.3.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_hurt.1.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_rabbit_hurt.1.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_hurt.1.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_rabbit_hurt.1.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_hurt.2.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_rabbit_hurt.2.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_hurt.2.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_rabbit_hurt.2.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_hurt.3.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_rabbit_hurt.3.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_hurt.3.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_rabbit_hurt.3.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_random.1.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_rabbit_random.1.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_random.1.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_rabbit_random.1.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_random.2.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_rabbit_random.2.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_random.2.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_rabbit_random.2.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_random.3.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_rabbit_random.3.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_random.3.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_rabbit_random.3.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_random.4.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_rabbit_random.4.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_random.4.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_rabbit_random.4.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_sheep.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_sheep.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_sheep.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_sheep.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_silverfish_death.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_silverfish_death.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_silverfish_death.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_silverfish_death.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_silverfish_hurt.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_silverfish_hurt.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_silverfish_hurt.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_silverfish_hurt.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_silverfish_idle.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_silverfish_idle.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_silverfish_idle.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_silverfish_idle.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_skeleton_death.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_skeleton_death.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_skeleton_death.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_skeleton_death.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_skeleton_hurt.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_skeleton_hurt.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_skeleton_hurt.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_skeleton_hurt.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_skeleton_random.1.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_skeleton_random.1.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_skeleton_random.1.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_skeleton_random.1.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_skeleton_random.2.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_skeleton_random.2.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_skeleton_random.2.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_skeleton_random.2.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/green_slime_attack.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_slime_attack.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/green_slime_attack.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_slime_attack.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/green_slime_damage.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_slime_damage.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/green_slime_damage.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_slime_damage.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/green_slime_death.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_slime_death.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/green_slime_death.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_slime_death.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/green_slime_jump.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_slime_jump.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/green_slime_jump.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_slime_jump.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/green_slime_land.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_slime_land.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/green_slime_land.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_slime_land.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_snowman_death.1.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_snowman_death.1.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_snowman_death.1.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_snowman_death.1.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_snowman_death.2.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_snowman_death.2.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_snowman_death.2.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_snowman_death.2.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_snowman_death.3.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_snowman_death.3.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_snowman_death.3.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_snowman_death.3.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_snowman_hurt.1.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_snowman_hurt.1.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_snowman_hurt.1.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_snowman_hurt.1.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_snowman_hurt.2.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_snowman_hurt.2.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_snowman_hurt.2.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_snowman_hurt.2.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_snowman_hurt.3.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_snowman_hurt.3.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_snowman_hurt.3.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_snowman_hurt.3.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_spider.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_spider.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_spider.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_spider.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_spider_attack.1.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_spider_attack.1.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_spider_attack.1.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_spider_attack.1.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_spider_attack.2.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_spider_attack.2.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_spider_attack.2.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_spider_attack.2.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_spider_death.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_spider_death.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_spider_death.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_spider_death.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_spider_hurt.1.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_spider_hurt.1.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_spider_hurt.1.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_spider_hurt.1.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_spider_hurt.2.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_spider_hurt.2.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_spider_hurt.2.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_spider_hurt.2.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_spider_hurt.3.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_spider_hurt.3.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_spider_hurt.3.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_spider_hurt.3.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_spider_random.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_spider_random.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_spider_random.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_spider_random.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_squid_death.1.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_squid_death.1.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_squid_death.1.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_squid_death.1.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_squid_flop.1.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_squid_flop.1.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_squid_flop.1.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_squid_flop.1.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_squid_flop.2.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_squid_flop.2.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_squid_flop.2.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_squid_flop.2.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_squid_flop.3.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_squid_flop.3.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_squid_flop.3.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_squid_flop.3.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_squid_flop.4.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_squid_flop.4.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_squid_flop.4.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_squid_flop.4.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_squid_hurt.1.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_squid_hurt.1.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_squid_hurt.1.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_squid_hurt.1.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_squid_hurt.2.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_squid_hurt.2.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_squid_hurt.2.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_squid_hurt.2.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_vex_death.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_vex_death.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_vex_death.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_vex_death.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_vex_hurt.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_vex_hurt.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_vex_hurt.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_vex_hurt.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.1.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_villager.1.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.1.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_villager.1.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.2.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_villager.2.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.2.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_villager.2.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.3.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_villager.3.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.3.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_villager.3.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.4.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_villager.4.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.4.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_villager.4.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.5.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_villager.5.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.5.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_villager.5.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.6.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_villager.6.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.6.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_villager.6.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_hurt.1.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_villager_hurt.1.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_hurt.1.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_villager_hurt.1.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_wither_spawn.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_wither_spawn.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_wither_spawn.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_wither_spawn.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_bark.1.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_wolf_bark.1.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_bark.1.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_wolf_bark.1.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_bark.2.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_wolf_bark.2.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_bark.2.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_wolf_bark.2.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_bark.3.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_wolf_bark.3.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_bark.3.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_wolf_bark.3.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_death.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_wolf_death.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_death.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_wolf_death.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_growl.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_wolf_growl.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_growl.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_wolf_growl.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_hurt.1.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_wolf_hurt.1.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_hurt.1.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_wolf_hurt.1.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_hurt.2.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_wolf_hurt.2.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_hurt.2.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_wolf_hurt.2.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_hurt.3.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_wolf_hurt.3.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_hurt.3.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_wolf_hurt.3.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_take_bone.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_wolf_take_bone.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_take_bone.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_wolf_take_bone.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombie_death.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_zombie_death.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombie_death.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_zombie_death.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombie_growl.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_zombie_growl.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombie_growl.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_zombie_growl.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombie_hurt.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_zombie_hurt.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombie_hurt.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_zombie_hurt.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombiepig_death.1.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_zombiepig_death.1.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombiepig_death.1.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_zombiepig_death.1.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombiepig_death.2.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_zombiepig_death.2.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombiepig_death.2.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_zombiepig_death.2.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombiepig_hurt.1.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_zombiepig_hurt.1.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombiepig_hurt.1.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_zombiepig_hurt.1.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombiepig_hurt.2.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_zombiepig_hurt.2.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombiepig_hurt.2.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_zombiepig_hurt.2.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombiepig_hurt.3.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_zombiepig_hurt.3.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombiepig_hurt.3.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_zombiepig_hurt.3.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombiepig_random.1.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_zombiepig_random.1.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombiepig_random.1.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_zombiepig_random.1.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombiepig_war_cry.1.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_zombiepig_war_cry.1.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombiepig_war_cry.1.ogg rename to mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_zombiepig_war_cry.1.ogg diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_TEMP_wither_projectile.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_TEMP_wither_projectile.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_TEMP_wither_projectile.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_TEMP_wither_projectile.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_bat.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_bat.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_bat.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_bat.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_blaze.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_blaze.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_blaze.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_blaze.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_cat_black.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_cat_black.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_cat_black.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_cat_black.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_cat_ocelot.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_cat_ocelot.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_cat_ocelot.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_cat_ocelot.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_cat_red.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_cat_red.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_cat_red.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_cat_red.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_cat_siamese.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_cat_siamese.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_cat_siamese.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_cat_siamese.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_cave_spider.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_cave_spider.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_cave_spider.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_cave_spider.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_chicken.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_chicken.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_chicken.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_chicken.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_chicken_egg.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_chicken_egg.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_chicken_egg.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_chicken_egg.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_cow.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_cow.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_cow.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_cow.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_creeper.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_creeper.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_creeper.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_creeper.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_creeper_charge.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_creeper_charge.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_creeper_charge.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_creeper_charge.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_donkey.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_donkey.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_donkey.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_donkey.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_dragon.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_dragon.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_dragon.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_dragon.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_dragon_fireball.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_dragon_fireball.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_dragon_fireball.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_dragon_fireball.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_endergolem.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_endergolem.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_endergolem.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_endergolem.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_enderman.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_enderman.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_enderman.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_enderman.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_enderman_block.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_enderman_block.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_enderman_block.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_enderman_block.png diff --git a/mods/ENTITIES/mobs_mc_gameconfig/textures/mobs_mc_gameconfig_enderman_cactus_background.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_enderman_cactus_background.png similarity index 100% rename from mods/ENTITIES/mobs_mc_gameconfig/textures/mobs_mc_gameconfig_enderman_cactus_background.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_enderman_cactus_background.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_enderman_eyes.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_enderman_eyes.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_enderman_eyes.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_enderman_eyes.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_endermite.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_endermite.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_endermite.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_endermite.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_evoker.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_evoker.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_evoker.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_evoker.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_ghast.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_ghast.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_ghast.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_ghast.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_ghast_firing.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_ghast_firing.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_ghast_firing.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_ghast_firing.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_guardian.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_guardian.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_guardian.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_guardian.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_guardian_elder.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_guardian_elder.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_guardian_elder.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_guardian_elder.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_armor_diamond.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_horse_armor_diamond.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_armor_diamond.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_horse_armor_diamond.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_armor_gold.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_horse_armor_gold.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_armor_gold.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_horse_armor_gold.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_armor_iron.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_horse_armor_iron.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_armor_iron.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_horse_armor_iron.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_black.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_horse_black.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_black.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_horse_black.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_brown.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_horse_brown.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_brown.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_horse_brown.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_chestnut.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_horse_chestnut.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_chestnut.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_horse_chestnut.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_creamy.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_horse_creamy.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_creamy.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_horse_creamy.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_darkbrown.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_horse_darkbrown.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_darkbrown.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_horse_darkbrown.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_gray.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_horse_gray.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_gray.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_horse_gray.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_markings_blackdots.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_horse_markings_blackdots.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_markings_blackdots.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_horse_markings_blackdots.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_markings_white.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_horse_markings_white.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_markings_white.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_horse_markings_white.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_markings_whitedots.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_horse_markings_whitedots.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_markings_whitedots.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_horse_markings_whitedots.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_markings_whitefield.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_horse_markings_whitefield.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_markings_whitefield.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_horse_markings_whitefield.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_skeleton.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_horse_skeleton.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_skeleton.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_horse_skeleton.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_white.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_horse_white.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_white.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_horse_white.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_husk.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_husk.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_husk.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_husk.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_illusionist.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_illusionist.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_illusionist.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_illusionist.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_iron_golem.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_iron_golem.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_iron_golem.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_iron_golem.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_llama.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_brown.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama_brown.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_brown.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama_brown.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_chest.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama_chest.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_chest.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama_chest.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_creamy.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama_creamy.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_creamy.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama_creamy.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_black.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama_decor_black.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_black.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama_decor_black.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_blue.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama_decor_blue.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_blue.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama_decor_blue.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_brown.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama_decor_brown.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_brown.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama_decor_brown.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_cyan.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama_decor_cyan.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_cyan.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama_decor_cyan.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_gray.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama_decor_gray.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_gray.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama_decor_gray.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_green.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama_decor_green.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_green.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama_decor_green.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_light_blue.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama_decor_light_blue.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_light_blue.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama_decor_light_blue.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_light_gray.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama_decor_light_gray.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_light_gray.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama_decor_light_gray.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_lime.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama_decor_lime.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_lime.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama_decor_lime.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_magenta.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama_decor_magenta.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_magenta.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama_decor_magenta.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_orange.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama_decor_orange.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_orange.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama_decor_orange.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_pink.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama_decor_pink.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_pink.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama_decor_pink.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_purple.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama_decor_purple.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_purple.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama_decor_purple.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_red.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama_decor_red.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_red.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama_decor_red.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_white.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama_decor_white.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_white.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama_decor_white.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_yellow.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama_decor_yellow.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_yellow.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama_decor_yellow.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_gray.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama_gray.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_gray.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama_gray.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_white.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama_white.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_white.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_llama_white.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_magmacube.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_magmacube.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_magmacube.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_magmacube.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_mooshroom.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_mooshroom.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_mooshroom.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_mooshroom.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_mooshroom_brown.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_mooshroom_brown.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_mooshroom_brown.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_mooshroom_brown.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_mule.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_mule.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_mule.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_mule.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_mushroom_brown.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_mushroom_brown.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_mushroom_brown.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_mushroom_brown.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_mushroom_red.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_mushroom_red.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_mushroom_red.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_mushroom_red.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_blue.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_parrot_blue.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_blue.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_parrot_blue.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_green.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_parrot_green.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_green.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_parrot_green.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_grey.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_parrot_grey.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_grey.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_parrot_grey.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_red_blue.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_parrot_red_blue.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_red_blue.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_parrot_red_blue.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_yellow_blue.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_parrot_yellow_blue.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_yellow_blue.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_parrot_yellow_blue.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_pig.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_pig.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_pig.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_pig.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_pig_saddle.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_pig_saddle.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_pig_saddle.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_pig_saddle.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_polarbear.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_polarbear.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_polarbear.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_polarbear.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_rabbit_black.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_rabbit_black.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_rabbit_black.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_rabbit_black.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_rabbit_brown.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_rabbit_brown.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_rabbit_brown.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_rabbit_brown.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_rabbit_caerbannog.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_rabbit_caerbannog.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_rabbit_caerbannog.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_rabbit_caerbannog.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_rabbit_gold.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_rabbit_gold.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_rabbit_gold.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_rabbit_gold.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_rabbit_salt.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_rabbit_salt.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_rabbit_salt.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_rabbit_salt.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_rabbit_toast.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_rabbit_toast.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_rabbit_toast.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_rabbit_toast.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_rabbit_white.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_rabbit_white.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_rabbit_white.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_rabbit_white.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_rabbit_white_splotched.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_rabbit_white_splotched.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_rabbit_white_splotched.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_rabbit_white_splotched.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_sheep.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_sheep.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_sheep.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_sheep.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_sheep_fur.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_sheep_fur.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_sheep_fur.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_sheep_fur.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_black.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_shulker_black.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_black.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_shulker_black.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_blue.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_shulker_blue.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_blue.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_shulker_blue.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_brown.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_shulker_brown.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_brown.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_shulker_brown.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_cyan.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_shulker_cyan.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_cyan.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_shulker_cyan.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_gray.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_shulker_gray.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_gray.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_shulker_gray.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_green.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_shulker_green.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_green.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_shulker_green.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_light_blue.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_shulker_light_blue.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_light_blue.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_shulker_light_blue.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_lime.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_shulker_lime.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_lime.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_shulker_lime.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_magenta.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_shulker_magenta.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_magenta.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_shulker_magenta.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_orange.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_shulker_orange.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_orange.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_shulker_orange.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_pink.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_shulker_pink.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_pink.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_shulker_pink.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_purple.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_shulker_purple.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_purple.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_shulker_purple.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_red.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_shulker_red.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_red.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_shulker_red.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_silver.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_shulker_silver.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_silver.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_shulker_silver.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_white.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_shulker_white.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_white.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_shulker_white.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_yellow.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_shulker_yellow.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_yellow.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_shulker_yellow.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulkerbullet.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_shulkerbullet.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_shulkerbullet.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_shulkerbullet.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_silverfish.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_silverfish.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_silverfish.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_silverfish.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_skeleton.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_skeleton.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_skeleton.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_skeleton.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_slime.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_slime.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_slime.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_slime.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_snowman.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_snowman.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_snowman.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_snowman.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_bat.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_bat.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_bat.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_bat.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_blaze.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_blaze.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_blaze.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_blaze.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_cat.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_cat.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_cat.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_cat.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_cave_spider.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_cave_spider.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_cave_spider.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_cave_spider.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_chicken.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_chicken.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_chicken.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_chicken.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_cow.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_cow.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_cow.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_cow.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_creeper.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_creeper.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_creeper.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_creeper.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_donkey.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_donkey.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_donkey.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_donkey.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_dragon.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_dragon.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_dragon.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_dragon.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_enderman.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_enderman.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_enderman.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_enderman.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_endermite.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_endermite.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_endermite.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_endermite.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_evoker.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_evoker.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_evoker.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_evoker.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_ghast.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_ghast.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_ghast.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_ghast.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_guardian.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_guardian.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_guardian.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_guardian.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_guardian_elder.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_guardian_elder.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_guardian_elder.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_guardian_elder.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_horse.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_horse.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_horse.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_horse.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_horse_skeleton.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_horse_skeleton.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_horse_skeleton.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_horse_skeleton.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_horse_zombie.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_horse_zombie.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_horse_zombie.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_horse_zombie.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_husk.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_husk.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_husk.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_husk.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_illusioner.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_illusioner.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_illusioner.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_illusioner.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_iron_golem.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_iron_golem.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_iron_golem.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_iron_golem.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_llama.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_llama.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_llama.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_llama.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_magmacube.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_magmacube.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_magmacube.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_magmacube.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_mooshroom.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_mooshroom.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_mooshroom.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_mooshroom.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_mule.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_mule.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_mule.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_mule.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_parrot.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_parrot.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_parrot.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_parrot.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_pig.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_pig.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_pig.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_pig.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_polarbear.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_polarbear.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_polarbear.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_polarbear.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_rabbit.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_rabbit.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_rabbit.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_rabbit.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_sheep.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_sheep.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_sheep.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_sheep.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_shulker.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_shulker.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_shulker.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_shulker.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_silverfish.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_silverfish.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_silverfish.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_silverfish.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_skeleton.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_skeleton.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_skeleton.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_skeleton.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_slime.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_slime.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_slime.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_slime.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_snowman.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_snowman.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_snowman.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_snowman.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_spider.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_spider.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_spider.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_spider.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_squid.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_squid.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_squid.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_squid.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_stray.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_stray.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_stray.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_stray.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_vex.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_vex.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_vex.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_vex.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_villager.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_villager.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_villager.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_villager.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_vindicator.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_vindicator.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_vindicator.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_vindicator.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_witch.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_witch.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_witch.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_witch.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_wither.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_wither.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_wither.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_wither.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_witherskeleton.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_witherskeleton.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_witherskeleton.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_witherskeleton.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_wolf.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_wolf.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_wolf.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_wolf.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_zombie.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_zombie.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_zombie.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_zombie.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_zombie_pigman.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_zombie_pigman.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_zombie_pigman.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_zombie_pigman.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_zombie_villager.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_zombie_villager.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_zombie_villager.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spawn_icon_zombie_villager.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spider.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spider.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spider.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spider.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spider_eyes.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spider_eyes.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spider_eyes.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spider_eyes.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spit.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spit.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_spit.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_spit.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_squid.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_squid.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_squid.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_squid.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_stray.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_stray.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_stray.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_stray.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_stray_overlay.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_stray_overlay.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_stray_overlay.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_stray_overlay.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_trading_formspec_bg.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_trading_formspec_bg.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_trading_formspec_bg.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_trading_formspec_bg.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_trading_formspec_disabled.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_trading_formspec_disabled.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_trading_formspec_disabled.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_trading_formspec_disabled.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_vex.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_vex.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_vex.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_vex.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_vex_charging.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_vex_charging.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_vex_charging.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_vex_charging.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_villager.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_villager.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_villager.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_butcher.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_villager_butcher.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_butcher.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_villager_butcher.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_farmer.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_villager_farmer.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_farmer.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_villager_farmer.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_librarian.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_villager_librarian.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_librarian.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_villager_librarian.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_priest.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_villager_priest.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_priest.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_villager_priest.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_smith.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_villager_smith.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_smith.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_villager_smith.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_vindicator.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_vindicator.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_vindicator.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_vindicator.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_witch.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_witch.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_witch.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_witch.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_wither.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_wither.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_wither.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_wither.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_wither_half_health.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_wither_half_health.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_wither_half_health.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_wither_half_health.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_wither_skeleton.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_wither_skeleton.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_wither_skeleton.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_wither_skeleton.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_wolf.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_wolf.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_wolf.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_wolf.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_wolf_angry.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_wolf_angry.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_wolf_angry.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_wolf_angry.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_wolf_collar.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_wolf_collar.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_wolf_collar.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_wolf_collar.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_wolf_icon_roam.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_wolf_icon_roam.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_wolf_icon_roam.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_wolf_icon_roam.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_wolf_icon_sit.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_wolf_icon_sit.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_wolf_icon_sit.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_wolf_icon_sit.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_wolf_tame.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_wolf_tame.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_wolf_tame.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_wolf_tame.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_zombie.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_zombie.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie_butcher.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_zombie_butcher.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie_butcher.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_zombie_butcher.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie_farmer.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_zombie_farmer.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie_farmer.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_zombie_farmer.png diff --git a/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_zombie_hearteyes.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_zombie_hearteyes.png new file mode 100644 index 0000000000000000000000000000000000000000..9f7afbf08d1b1b5707da5b48551639655ec9f274 GIT binary patch literal 10354 zcmaiZWl&sAxAh^o6G*UxKyV8Zd~lcG4#9%EyGw!uhX6qb2o3|mgAF9OI|LovhJoOL zL2l)F?wh)G>$~-xQ~jq;ckjK|S-pByb&R^IJU$L34gdi7iV8BC0DuDgX;>Hl02sNK zSpxuhwZFE$r{+5!8drB0Ydc3P8c#o0D;g_bJ8J;&U4&%WrPH&dynpccC=_1X?WPZd zKN~sOC2_rqUaqJ&Rg=^C7UdMmL0kAS^P=-%aVO+=hPxYMkCCRz{<>*dL2F;e>2k=$ zZIhZ{C+y)6enr?nx?8z9eYSrbvuxtSm(XAHY}MlD{id6iiH(t;=$>d@8?^}?9C<6I zn9vrm9629x&}ypr>KdtygiCIEt!ECwAJl{Ox2~6NU1=L+=*bTjO3@^CCVyb7GakoAf*MDQh}@BE5_0oP9nPr=4s-NR~<;@)kCm0;*v z=X&~gukUT+Mu!y5c_)#t;zV9$fQGx-n{QA0Z>I+zw)zi6EoqUT5+R>6w2XN0{Zu)n`w0}GgP74+_Q-0F8OT1UE7x)h{ICy$(?wh@z7&{yEMmRkgs{;4RdW#${Uu( zhJy-BR0|cpc})kW(ab)HcpJWIm*@M{$QS;H<+~>S2qz*jx;Vk9fiH2OMbBw9GxL&6 zn@q1JtIVTU7MrTOi|c|m*k zVDTR~s)d1({YGDXMTSw)8dAse%%xpVa{@25nM6F4Uk?db8~WjqMOqmzUv9Q>j^Cxh zl-WbJ1+I=oY_?h-2*)Xmt}0={n~f}a&-yI{aIL2MQ-g9$iz)Q76d<|dxi~QIE0%eo z0PsrWir$4ZA*Y2^XDLbI;fq_7#_C$kZw&%RFm8`w0p{&MNjNAQ}+^UW% z7^y+t$4k3S+}($M0-bXv&SU0++HaYKIZfr=`Qn*c9y|3Vw0UE^fgJLknb6g|*jRo< z!jV{eL8P?N`l5MZ<%s_=p|sp7Tl|)d17F`_w@EN+eYwbzxM2qzVSo(&fDa9#3_7WA zZP_sqPHa)gZHi`&>^l3L@6hrA6k%$zzhHqicPGaeT2Nj;7|}#Qvsn4IfvqJ6lG1o3exO zRS|_+i^1V0y)#2A`a_rqpWZk80gOSzY^*LassRIEu*tMYUUt>A`XKuSZ!@kp2&NYI7>6=E-y4ojwly2=H;!b#qH9Wbs0kpj968~m z+b|ByJn1z40Lx9H)o$Lf^iPL+>5$)apzxa?^h@LJ?$%Fyvg%qcRVhop77bsdl!(Tt z>FOODO$w4xSN@ovb|O+`qWi4giq>o)Aa#Ul5M(9o4B%_HB7jX!$kMG@v_i_5h>0nA z&|y~Lt*rOateeJlk<>Vuf*_^>FvX}+ ztBX5hX)ir|$ipGc>?BDxb zxRT6!lo~BubQI|$P{{*pKMV{Opo+cA)t7G^hu#~4x>lRikC7p;*YY^)?GRec&&XP3 zP|G37bmZi(fYBB=EA-8nbt+HlRzlEMQMDhUB-(b*9W9SkeV=6rpvf^58L&Q{k)y3K z0MSrRU#3pjq0-|p5VFhpN9bFLdtRSHS1%$fCWw8Wzk)mu&|Bg(d8lnC2!!) zF{pBgqs$8pEw>=MRZ%KXnXX>D?#5!mt42@jg`5?YNjKwhR-g%MSoa7KzbhdR;5Imb^z1&7YntJ~(V)wCubZUU+xz2I z<9k^x9iDM$LJ%BVnm9R5FJe$kQa4Mbj>lTXNlRJ-<4~FYi03Gb!+> zd1xed9jwl=8!qtoPzhTQ(X*a45otv{o|&|iCjg5kmoXVKL9*I-X)ePFG2HYu>@y{6 z{*aH*C8?CO+}eq(f1yZ4vdH(}whRq&giMAp-}KzOU|KV{@eR25W;Z(+2Ma=x+sU>Y zA3kx#N-#1svL{-`^}g7VO196hb{p7~+mMUtD~x)zPFuxI8lKAf5)xj!l7#b^Lpyqo zt@~RaE!GNNm1`)$N;+;=RMKagA8${p0PU_i*N|a(okyS91p<)-9YkeQ_{7ByQT^6G z8GB8J3(+L)^OGoT^+bSo>f63$(v)UA^_91n`K*vwbRbha6v*^*HC-SrkW5_s}rUi3aI_SK8=#vt1)+(Ti`)GLkT%Cyua3J>lnd)j0Hj(Xi) z;yv_HrFY08hQRN8{F6Y2j1nepED~M?2E(Td_x$Bqn2tpiV+YZcuuw0X2!gJge@AC#}EUW{9weg5YR#$Bop`edORiSgJOR_>u)Z< z%D0mAitH(UIT60J!2%x~U&Q*OP)Ff$2t}}ws_&JuJ+02~`4EEXIB=sHUMGbYY^J$E z;c6hB%nE-qxus>OpoSE)$RP6bd+*@Zm=z}!#xAW~4y89B4s)g2J4S8He&fv)Ot9GV zsXMU(#2a-^@7uWga)Ab$L%3IVze@Ri)d(`P#ZM~NOFKmN8jBs*U~>&Lz?Ek}S5bgR z4{T2_Q(t_{;UhPw6IZ%qi+_vXzgd|uOo$1Z5nAqsQJ*&`_Y(`5dVp#qB#!-shZ~})@ ze=c4lVO(xdkEZZPm)DN!=sCNr0GGS=q2y%*oVA7qsm{mMx@*fvx+bf1|D<>~;l_yR zd;Ztj;`gp`1H7)zlf0oVkGwS2dsFHcskQl-$wrvNv(~cnE3mI*<6XSDIsMCHu+Wie zTp~q3j!3MF9A9>&n6q}WCgWHsyQ2nvdtAC|ezbG?$lWbeN4`hVN~7V8(8o~Km8nE0 z`cR~%28)PTyZa|>Z|6SD=VCQ&`8AqitB=T&bI~pzmlPP%K4F$+7c}ia3zvQTmP}@8 zwQJxLaab!s-pgrRhHDL1a%}bYe-%1m?f)gWj|_}W=&Bn@}uYXo7SLPm@TFHg`;dXG^uSDj+aP}?W?OR2&;cf)XFyY zQn=ZYNm1sz?|GA3&!I7*zDV3sG|uDjAWJaRK2!f-BaKM%^h>Ruy{gk`#9@r~Vx%qZ zMAQW3)Ih|7`ngeWULvz3XLrhs$_qhYfVO3U^uxg`dI#a@*I8uGe-l-!^D#fK(S$Pv z>y$YsMu+|=!P!Ntk^}Msi#SWhDJ^<23B}( zfo2|dxM|;N%kfD%eYnb?^!f69i_Yd7>TWp{fHm}8aczO^TosKb2 z8Bx>&T94B13IC^2xYtRG-k$rgj`$UUK~4=F|H1S|ygC?J38`q;W^gs~FZV zmIUh5@lM)RNq7!|d{V6A>D5A&=WixH(2TH}v6>fngi*0Z@>o&dV2xbd_vF1~RT!mR z^!6<)Q^1RBHx%hX%v{35E2gDeUe_DFdg+(X_#`|q3*9QTPL)G?Z-qY+l(!xD0j^iC zUCi7*saC2SmpAUCBX(ECq$|CA@U<@29)nj#u6UhHsjFgGW=%-5D+5U-_;|6y0Mm9z zZ;0X@x!1&V`#7_~STQI=7{T^Y*IAV8b%0h5=pBjqZ$ZOWO3}jRu?Mt!&a;+*+<;8dbjn zb&+<7+qL^PoF8%&e%m_&0s350k8zc$7A!b%t-Zi0w3UXI6z5Kc`7%O9baApupR_&> zoh_gYy{c53fI~2D_OCRQ7@bgkkzO-gkZ?_D<0v?5ZdcJQg7K$Vjhm&hFj+(2&neIfmb+#@#$*oBmU#5hhT4pep+~ZD zXQE%4ordcpYfyQW?n%9*k1NjPA+wF5i6wWK)NB{zrFs><4unyYEADE$tfrmAXuJE% zDQe6OJP778Oxb(8$pzyytw}#3L^#J(SCgwSR#JIweOj(IrUxdiL-=jzZGU^wFYljK zR+ZJ=v9x{rb%viynn+{ zIlaOg&q@X~GQ=uwf&@Ojnq6rqU!!`maRZg`(EAVK{M9@%?cMIZP2Vi zWajl%-7e8^Y>bae$xm?A6=Kl05=`09Me>&FkdF6I$1xVTM>F7AU+Qsl__|mu#PQ(W zeDqW@=0)EEn^tdI(NkG-uFKapump(*-mAN2bvXj3k;R#dPxQeW!a8A>8mmDxPFQMm zFA0b8jzTGynF$_4yb-D#x#@>>1jBNXxKKDB+SsUvDU*C|1*(T7`k4DcVRB{7m<;@t zaN}T~V36O1%d^Bo?N91IXnJQ+QbywTG0o0GgG#bS2cvvR->*h21CYTv8h9%S;U*?gb zH6Zlj5sd{I+pRlumCROp7D~v|Q<|@?DuDr6oj=u};}z9_30$k!!bFe#t>p4-gAdo@ zQ<@?W%Jm(da<#`$KvKhjrQEs3*`?Nbj$f0PZGMke3PXje=}wd1cl&(d0`)PmFEzXA zDN_iXnc#ZmC>y=Xqr6t8v3K2ATt>K^2`79#2SG$0CWKfPolO=o-h+qbQr9A7v;;(0 zHu5$v9P<`KXmnB%Uua}YRr|!=s;P#47`2h-i@R?Nx`lIWH@)=wDR7wV>x^NK1#lns(=P}PZzoFQxCod??r92PV zQwGFKBj_kc?*cG)zrjofD|vPWb!lc5H9vn5TSTdhniy(dAu?e6O&0#*O2me2BWFE- z%#G15BHf=dS*Jg_Km3dECrZ|BIjzi=F=Tppx;a$$`k>GD)j@HOfwoOmT3*d?2=r!{ ze#eJ@@_zM8M+4WPtV?_6L3|})Fx?(l?|hVp?guBXLwy6*hrV0q>|FLY>X2aP3gX4G z@hZkA-3Rz&Pf*+(n?h8RE{uvM8!Bg0Tjxe7Ok3I{5rOywnOUaczGd8v&icf!B^o7* zz7X{pQ=*07mE#qXxrI=*mK-$6hE0hz$HJux z&HisYKBWORs(jIbtWS6+qS9*pCmb0PV0sg1B531k*YWK zU@MotY!0Do)$3IwplMEPP!T+1T)s|zA~Us;=Wr28|HJ1vVPH3LN3A+6q2B{FWp)RP zAx-N$R;~RRZ_eC)u(M`SY$}=BOC8Y{bjv}8Sh5A$XHMAA29(0pX?0oLI$6~#MXj3uU)8rK}T*k zN}<5`?h)v`oGeT&L1UfnVYiY-_M47U^b@LaI|oLW^k~Yl{GQI-RsutpH z1D#BYbnpDq7@a+Sd;QEw9}-mD<>?r#V`jG)22cvh0}%8FZZk! z#t{kOYoP&Xcr5#6@eu#9MS;P^mdsV7bs{$cbDx#m%zCzm#UT`5tqIcQ!i1^Hob}($ zK_RXi-y;VDLY!+$11d96WmYvv*cLgoy7@c$baI6ZM-ymE%fuu7y~?4QmQerPH=Klu zy|%+AjtawDUa#|4WukXSvmrnB=0>DlP@&wwAQRr9*ApQB zYx%WVXu(g`>Th6JvcB@ zhqB}IrA6kvQK2C=#P)0(-_zvFvsv?At%KPFHvTV{nPui>t$BV530#($H+giN}r>0gpUi@5$(NvstCjCc%->^3Q)$jl=QZiI>oUM{z-p zWByUtk8f}vT zNR>S`^x|qc$IarUf5njy?(qG4VsAx6Y<)FBbvVs$l#QL8qCHxMdrp>y=##Z?)W=7n zN2@4OUq*N<9iC5|S7a*n^eTJn90tn*kI&zczsxk~%b{mj7lIzGZ^Dh^Z2Z7TkM}b< zy#QE2WEihrsa;Z}!+=llm?X+TLpNqTreC?0=7etkX$DM?>^Z5g^-tx}otW+(^MZ&p z0&7_UU@fLt)7-fCc%l>E$f%jmityVq3I-T&;S<%Mn%2N>*cH!B2|Jf7?s;`f zN8_d24Nz2GxrOiQiWNu79I&#vBAVNA7f><_Ba}0BPa_on;Q;^uhWQ(L8Q|g1o8M8I z3IG7MtAc?C0N|4RX(&Ke4mkh-n4XF%vY6ZG&k5-G=^mna0RX>IQASeRcM-AT6m6tO z)qf(qu#mgEkU7ejtunnb!H!KCH>aRkWEtIfY~xKp0$Xzi0{1AYyi=n;Jw%uAi-Net+uWEfSBXqNhEDbCOqawxUVUj8zdIb)J>JcP-AmZb+Yc)RT#uzp z!{G*{!NI6uFN*ILI0M@t#}6RFP?yJlF5&`>nfj!GZ`ugMZrl-YO5_H{%XeIOwMNB-GrSgq7r7X_C;;HmKMAN=0P`F+ z4Sen8eceCz7UuPb-n1Y_N@vasP(uB9|a>0G+UhR;`ol zzxQsTKYkW1H+NREEZ1nL(ssKxDXqJdI{q-s9Tp)^IO_?2Q*D94`LOjS2L+%303rY& zNA(47c_HI``MbQ8zc-14hO6a$n4PX2L#s}pHKz?s-Wu3CE(HyVH-_*QI5TABIb;tMvrUU@k z7Iaxez0k`8uW}WQS*}i3&aw9f%Gxn$9Xt<+J&RRpGh$~$Xxf?B=~c$6@->%Z@Lmu` z1$1~rg9lxZ84veOl%g2wS8qR<6ATsiZRB-J>Lheaj*n^2Pr&yr*9NQ}XFR;?q{B zo$`+!?X&DTfp}~*(fo+_3ArcUrO4w(nEqt21^=#Jsfj5cnw)Ba1JXL=JYbv$E&6y2 z@Wq{oX~J_ZLoP{_%@1?1&xS-J!&j$1b}pS;;Q@QZ3)e^(fBQLLdN_M?bC0*yQOUDN zIi|h2y{ok7Ei-b)S%b@o`N)g!VF=`W`Rr}S`AL1{T&TM;P0;OO#{*cbVg8wrP&I^l z>F(wZ`hd)2&k%Ll(Y=G|mRmU8D4n*37>{yRBZnzhFIu57RqOM&6kRKzqoa`hO`DFD z{a_bU)_wdLdz0H4c;)5F?XX@N)TjA^CTNmk$5e35YL~2I(EWOq%%{%ivhFO_grDe_ zx%{O-F(-or=3MAo3<2f{5Ng3{$(5|l`>vh`Rk%}U7e^3wC3dxZ=_CR_*0*4IB} zBu%gS^C3t8g9ePA#AhTzG0l;&OubkM+4K|$|8|bfi~?dtJJRbH9U%Kz%qanQMsJ)2 zd;*Q_;2utq{hB2Yy^W|^aJI6B@H0CoX@v+;hu+e@ISZMc4=qqT(r-MDu)Tn1z>!W5 zA5uX5`TL++pVot}CtVMeox>-f(2!JJSaQ12g>@oKCbKl*GB(yL?Sz2gY2!nVSv z%gDB8H;^8Jq1#@-n<3@%i}&));zbZY^Ab9*QS7eSAdzc z;;&pBy&l8zJTcY##>Pqb;^P>_V?{X5nfw7P?EE zpDxB>nB#YEAumZzBB9V0DUG(bMw;3hQycZW@uR+U`4=>iW zmD<`t0;R?r4#9SQZkap)fcD=))kSI6O4!9K_g9}oxkLL}NUwF|sm39D&c!R8Z=B?B zkhx8!gWEHAG216U{E9`n^2O9v4{T5uM?G_4O* zkEgAzf+=b&{Jw5S`RHc>0z7C*>3`eZ=FNhTDlUZVtMJtsnL3Yqf+L*pVYah5@8X7B zZ&&yuyC?t&>_7V5Mc$<}S>~VH=-2|KM-Ibpn#M5(;P+nrZ=Ic07#*N2ll&`{rbK)l zMz9M5RK0034*l7IIys+Q!ta-NoDJXPjz{A?{&N!SWpM*q_$vry3-Z&}YJ`{BbO+pS z*amZ}{?XI!6JMVrL8?wWvV&4U5cpo~py>A0=FO7Iy)(W-46~}39LSWm{}qDtA9;!vEdv?#@5Ys&Qd+5V)tkCzvNP-ME%@eH0B`YH|P{0 zP`xBN4zq3Q7jM7QQVLj7P;R^L-B0muIpmygHa=>7kh}6>xT0=#m$F+DOQa?q{!&}f z6rynMlZSGqJGcM)FG3COcxyXHmG~=WYRVy00WC#yp>M9+mv9vrb8pCCx3N=Dw@Jjs z@O}5v40mK_E;4s2_;zsIE~D+JbN0?jR=i?vL}0ZI0u9NYV{^I|=`i9zj$6(m#l+6P zYdEPmzwI8rfZdngun(OfYHPY(wmw!ORzEQYgS z7rsV`ruOHzzy;q0y3;6!gLO;0_~Y7&+GjyjCeGv9XCBo5ZT{FE;#pT{Oloo?ytZ7b>IKTjSP}& z{q6ccV*Ks?AE^@oz}(kX?0K=%LlXocdJzW6B7PsqJH)9zZHaMSbRXVQqHRWq+3;uY z>vdFEU6y46OofP=d}nX-|5MQ4U|0YE>FQp=7{R0w;~K&IdsyVZMRyVwxm)LU(h%Xw z2lH^HMLT3%m7WiGPnLOKPjqL;Ssf1bt&^$!VgdfMIsR{?|JJm}i?Y)mF^d@~gz}gC bo|O;4nby{)dp?$_KSWZLRh6lhG7JAN8a3PM literal 0 HcmV?d00001 diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie_librarian.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_zombie_librarian.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie_librarian.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_zombie_librarian.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie_pigman.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_zombie_pigman.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie_pigman.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_zombie_pigman.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie_priest.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_zombie_priest.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie_priest.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_zombie_priest.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie_smith.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_zombie_smith.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie_smith.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_zombie_smith.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie_villager.png b/mods/ENTITIES/mcl_mobs/textures/mcl_mobs_zombie_villager.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie_villager.png rename to mods/ENTITIES/mcl_mobs/textures/mcl_mobs_zombie_villager.png diff --git a/mods/ENTITIES/mcl_mobs/todo.txt b/mods/ENTITIES/mcl_mobs/todo.txt deleted file mode 100644 index 7598b14ed..000000000 --- a/mods/ENTITIES/mcl_mobs/todo.txt +++ /dev/null @@ -1 +0,0 @@ ---use vector.distance to count down mob despawn timer \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mount/init.lua b/mods/ENTITIES/mcl_mount/init.lua new file mode 100644 index 000000000..35ee34af4 --- /dev/null +++ b/mods/ENTITIES/mcl_mount/init.lua @@ -0,0 +1,81 @@ +mcl_mount = { + mounted = {} +} + +local S = minetest.get_translator("mcl_mount") + +function mcl_mount.update_children_visual_size(parent) + for _, obj in pairs(parent:get_children()) do + mcl_mount.update_visual_size(obj) + end +end + +function mcl_mount.update_visual_size(obj) + if obj:is_player() then + local visual_size = vector.new(1, 1, 1) + local attach = obj:get_attach() + + obj:set_properties({visual_size = attach and vector.divide(visual_size, attach:get_properties().visual_size) or visual_size}) + mcl_mount.update_children_visual_size(obj) + else + local luaentity = obj:get_luaentity() + if luaentity and luaentity.update_visual_size then + luaentity:update_visual_size() + end + end +end + +function mcl_mount.mount(obj, parent, animation) + if obj:get_attach() then + return false + end + + if obj:is_player() then + obj:set_look_horizontal(parent:get_yaw()) + mcl_mount.mounted[obj] = true + mcl_player.player_set_animation(obj, animation or "sit", 30) + mcl_tmp_message.message(obj, S("Sneak to dismount")) + end + + mcl_mount.update_visual_size(obj) + + return true +end + +function mcl_mount.dismount(obj) + local parent = obj:get_attach() + if not parent then + return false + end + + obj:set_detach() + + if obj:is_player() then + mcl_mount.mounted[obj] = nil + mcl_player.player_set_animation(obj, "stand", 30) + obj:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) + end + + mcl_mount.update_visual_size(obj) + return true +end + +function mcl_mount.throw_off(obj) + if mcl_mount.dismount(obj) then + -- player:add_velocity(vector.new(math.random(-6, 6), math.random(5, 8), math.random(-6, 6))) + obj:set_pos(vector.add(obj:get_pos(), vector.new(0, 0.2, 0))) + end +end + +minetest.register_on_respawnplayer(mcl_mount.dismount) +minetest.register_on_leaveplayer(mcl_mount.dismount) + +minetest.register_globalstep(function() + for player in pairs(mcl_mount.mounted) do + local ctrl = player:get_player_control() + if ctrl.sneak then + mcl_mount.throw_off(player) + end + end +end) + diff --git a/mods/ENTITIES/mcl_mount/mod.conf b/mods/ENTITIES/mcl_mount/mod.conf new file mode 100644 index 000000000..2ab39643b --- /dev/null +++ b/mods/ENTITIES/mcl_mount/mod.conf @@ -0,0 +1,3 @@ +name = mcl_mount +author = Fleckenstein +description = MineClone2 library for entity mounts (uwu) diff --git a/mods/ENTITIES/mobs_mc/0_gameconfig.lua b/mods/ENTITIES/mobs_mc/0_gameconfig.lua deleted file mode 100644 index 3476bee4c..000000000 --- a/mods/ENTITIES/mobs_mc/0_gameconfig.lua +++ /dev/null @@ -1,335 +0,0 @@ ---[[ This table contains the concrete itemstrings to be used by this mod. -All mobs in this mod must use variables in this table, instead -of hardcoding the itemstring. -This way, external mods are enabled to replace the itemstrings to provide -their own items and game integration is made much simpler. - -An item IDs is supposed to be overwritten by adding -mobs_mc.override.items["example:item"] in a game mod -with name "mobs_mc_gameconfig". ]] - - --- Standard items - --- If true, mobs_mc adds the monster egg nodes (needs default mod). --- Set to false in your gameconfig mod if you create your own monster egg nodes. -mobs_mc.create_monster_egg_nodes = true - -mobs_mc.items = {} - -mobs_mc.items = { - -- Items defined in mobs_mc - blaze_rod = "mobs_mc:blaze_rod", - blaze_powder = "mobs_mc:blaze_powder", - chicken_raw = "mobs_mc:chicken_raw", - chicken_cooked = "mobs_mc:chicken_cooked", - feather = "mobs_mc:feather", - beef_raw = "mobs_mc:beef_raw", - beef_cooked = "mobs_mc:beef_cooked", - bowl = "mobs_mc:bowl", - mushroom_stew = "mobs_mc:mushroom_stew", - milk = "mobs_mc:milk_bucket", - dragon_egg = "mobs_mc:dragon_egg", - egg = "mobs_mc:egg", - ender_eye = "mobs_mc:ender_eye", - ghast_tear = "mobs_mc:ghast_tear", - saddle = "mobs:saddle", - iron_horse_armor = "mobs_mc:iron_horse_armor", - gold_horse_armor = "mobs_mc:gold_horse_armor", - diamond_horse_armor = "mobs_mc:diamond_horse_armor", - porkchop_raw = "mobs_mc:porkchop_raw", - porkchop_cooked = "mobs_mc:porkchop_cooked", - carrot_on_a_stick = "mobs_mc:carrot_on_a_stick", - rabbit_raw = "mobs_mc:rabbit_raw", - rabbit_cooked = "mobs_mc:rabbit_cooked", - rabbit_hide = "mobs_mc:rabbit_hide", - mutton_raw = "mobs_mc:mutton_raw", - mutton_cooked = "mobs_mc:mutton_cooked", - shulker_shell = "mobs_mc:shulker_shell", - magma_cream = "mobs_mc:magma_cream", - spider_eye = "mobs_mc:spider_eye", - snowball = "mobs_mc:snowball", - totem = "mobs_mc:totem", - rotten_flesh = "mobs_mc:rotten_flesh", - nether_star = "mobs_mc:nether_star", - bone = "mobs_mc:bone", - slimeball = "mobs_mc:slimeball", - arrow = "mobs_mc:arrow", - bow = "mobs_mc:bow_wood", - head_creeper = "mobs_mc:head_creeper", - head_zombie = "mobs_mc:head_zombie", - head_skeleton = "mobs_mc:head_skeleton", - head_wither_skeleton = "mobs_mc:head_wither_skeleton", - - -- External items - -- Mobs Redo - leather = "mobs:leather", - shears = "mobs:shears", - - -- Minetest Game - top_snow = "default:snow", - snow_block = "default:snowblock", - mushroom_red = "flowers:mushroom_red", - bucket = "bucket:bucket_empty", - grass_block = "default:dirt_with_grass", - string = "farming:string", - stick = "default:stick", - flint = "default:flint", - iron_ingot = "default:steel_ingot", - iron_block = "default:steelblock", - fire = "fire:basic_flame", - gunpowder = "tnt:gunpowder", - flint_and_steel = "fire:flint_and_steel", - water_source = "default:water_source", - water_flowing = "default:water_flowing", - river_water_source = "default:river_water_source", - water_flowing = "default:river_water_flowing", - black_dye = "dye:black", - poppy = "flowers:rose", - dandelion = "flowers:dandelion_yellow", - coal = "default:coal_lump", - emerald = "default:diamond", - iron_axe = "default:axe_steel", - gold_sword = "default:sword_mese", - gold_ingot = "default:gold_ingot", - gold_nugget = "default:gold_lump", - glowstone_dust = "default:mese_crystal_fragment", - redstone = "default:mese_crystal_fragment", - glass_bottle = "vessels:glass_bottle", - sugar = "default:papyrus", - wheat = "farming:wheat", - hay_bale = "farming:straw", - prismarine_shard = "default:mese_crystal_fragment", - prismarine_crystals = "default:mese_crystal", - apple = "default:apple", - golden_apple = "default:apple", - rabbit_foot = "mobs_mc:rabbit_foot", - - -- Boss items - wet_sponge = "default:gold_block", -- only dropped by elder guardian; there is no equivalent block in Minetest Game - - -- Other - nether_brick_block = "nether:brick", - mycelium = "ethereal:mushroom_dirt", - carrot = "farming:carrot", - potato = "farming:potato", - golden_carrot = "farming:carrot_gold", - fishing_rod = "fishing:pole_wood", - fish_raw = "fishing:fish_raw", - salmon_raw = "fishing:carp_raw", - clownfish_raw = "fishing:clownfish_raw", - pufferfish_raw = "fishing:pike_raw", - - cookie = "farming:cookie", - - - -- TODO: Add actual ender pearl - ender_pearl = "farorb:farorb", - - nether_portal = "nether:portal", - netherrack = "nether:rack", - nether_brick_block = "nether:brick", - - -- Wool (Minecraft color scheme) - wool_white = "wool:white", - wool_light_grey = "wool:grey", - wool_grey = "wool:dark_grey", - wool_blue = "wool:blue", - wool_lime = "wool:green", - wool_green = "wool:dark_green", - wool_purple = "wool:violet", - wool_pink = "wool:pink", - wool_yellow = "wool:yellow", - wool_orange = "wool:orange", - wool_brown = "wool:brown", - wool_red = "wool:red", - wool_cyan = "wool:cyan", - wool_magenta = "wool:magenta", - wool_black = "wool:black", - -- Light blue intentionally missing - - -- Special items - music_discs = {}, -- No music discs by default; used by creeper. Override this if your game has music discs. -} - --- Tables for attracting, feeding and breeding mobs -mobs_mc.follow = { - sheep = { mobs_mc.items.wheat }, - cow = { mobs_mc.items.wheat }, - chicken = { "farming:seed_wheat", "farming:seed_cotton" }, -- seeds in general - parrot = { "farming:seed_wheat", "farming:seed_cotton" }, -- seeds in general - horse = { mobs_mc.items.apple, mobs_mc.items.sugar, mobs_mc.items.wheat, mobs_mc.items.hay_bale, mobs_mc.items.golden_apple, mobs_mc.items.golden_carrot }, - llama = { mobs_mc.items.wheat, mobs_mc.items.hay_bale, }, - pig = { mobs_mc.items.potato, mobs_mc.items.carrot, mobs_mc.items.carrot_on_a_stick, - mobs_mc.items.apple, -- Minetest Game extra - }, - rabbit = { mobs_mc.items.dandelion, mobs_mc.items.carrot, mobs_mc.items.golden_carrot, "farming_plus:carrot_item", }, - ocelot = { mobs_mc.items.fish_raw, mobs_mc.items.salmon_raw, mobs_mc.items.clownfish_raw, mobs_mc.items.pufferfish_raw, - mobs_mc.items.chicken_raw, -- Minetest Game extra - }, - wolf = { mobs_mc.items.bone }, - dog = { mobs_mc.items.rabbit_raw, mobs_mc.items.rabbit_cooked, mobs_mc.items.mutton_raw, mobs_mc.items.mutton_cooked, mobs_mc.items.beef_raw, mobs_mc.items.beef_cooked, mobs_mc.items.chicken_raw, mobs_mc.items.chicken_cooked, mobs_mc.items.rotten_flesh, - -- Mobs Redo items - "mobs:meat", "mobs:meat_raw" }, -} - --- Contents for replace_what -mobs_mc.replace = { - -- Rabbits reduce carrot growth stage by 1 - rabbit = { - -- Farming Redo carrots - {"farming:carrot_8", "farming:carrot_7", 0}, - {"farming:carrot_7", "farming:carrot_6", 0}, - {"farming:carrot_6", "farming:carrot_5", 0}, - {"farming:carrot_5", "farming:carrot_4", 0}, - {"farming:carrot_4", "farming:carrot_3", 0}, - {"farming:carrot_3", "farming:carrot_2", 0}, - {"farming:carrot_2", "farming:carrot_1", 0}, - {"farming:carrot_1", "air", 0}, - -- Farming Plus carrots - {"farming_plus:carrot", "farming_plus:carrot_7", 0}, - {"farming_plus:carrot_6", "farming_plus:carrot_5", 0}, - {"farming_plus:carrot_5", "farming_plus:carrot_4", 0}, - {"farming_plus:carrot_4", "farming_plus:carrot_3", 0}, - {"farming_plus:carrot_3", "farming_plus:carrot_2", 0}, - {"farming_plus:carrot_2", "farming_plus:carrot_1", 0}, - {"farming_plus:carrot_1", "air", 0}, - }, - -- Sheep eat grass - sheep = { - -- Grass Block - { "default:dirt_with_grass", "default:dirt", -1 }, - -- “Tall Grass” - { "default:grass_5", "air", 0 }, - { "default:grass_4", "air", 0 }, - { "default:grass_3", "air", 0 }, - { "default:grass_2", "air", 0 }, - { "default:grass_1", "air", 0 }, - }, - -- Silverfish populate stone, etc. with monster eggs - silverfish = { - {"default:stone", "mobs_mc:monster_egg_stone", -1}, - {"default:cobble", "mobs_mc:monster_egg_cobble", -1}, - {"default:mossycobble", "mobs_mc:monster_egg_mossycobble", -1}, - {"default:stonebrick", "mobs_mc:monster_egg_stonebrick", -1}, - {"default:stone_block", "mobs_mc:monster_egg_stone_block", -1}, - }, -} - --- List of nodes which endermen can take -mobs_mc.enderman_takable = { - -- Generic handling, useful for entensions - "group:enderman_takable", - - -- Generic nodes - "group:sand", - "group:flower", - - -- Minetest Game - "default:dirt", - "default:dirt_with_grass", - "default:dirt_with_dry_grass", - "default:dirt_with_snow", - "default:dirt_with_rainforest_litter", - "default:dirt_with_grass_footsteps", --- FIXME: For some reason, Minetest has a Lua error when an enderman tries to place a Minetest Game cactus. --- Maybe this is because default:cactus has rotate_and_place? --- "default:cactus", -- TODO: Re-enable cactus when it works again - "default:gravel", - "default:clay", - "flowers:mushroom_red", - "flowers:mushroom_brown", - "tnt:tnt", - - -- Nether mod - "nether:rack", -} - ---[[ Table of nodes to replace when an enderman takes it. -If the enderman takes an indexed node, it the enderman will get the item in the value. -Table indexes: Original node, taken by enderman. -Table values: The item which the enderman *actually* gets -Example: - mobs_mc.enderman_node_replace = { - ["default:dirt_with_dry_grass"] = "default_dirt_with_grass", - } --- This means, if the enderman takes a dirt with dry grass, he will get a dirt with grass --- on his hand instead. -]] -mobs_mc.enderman_replace_on_take = {} -- no replacements by default - --- A table which can be used to override block textures of blocks carried by endermen. --- Only works for cube-shaped nodes and nodeboxes. --- Key: itemstrings of the blocks to replace --- Value: A table with the texture overrides (6 textures) -mobs_mc.enderman_block_texture_overrides = { -} - --- List of nodes on which mobs can spawn -mobs_mc.spawn = { - solid = { "group:cracky", "group:crumbly", "group:shovely", "group:pickaxey" }, -- spawn on "solid" nodes (this is mostly just guessing) - - grassland = { mobs_mc.items.grass_block, "ethereal:prairie_dirt" }, - savanna = { "default:dirt_with_dry_grass" }, - grassland_savanna = { mobs_mc.items.grass_block, "default:dirt_with_dry_grass" }, - desert = { "default:desert_sand", "group:sand" }, - jungle = { "default:dirt_with_rainforest_litter", "default:jungleleaves", "default:junglewood", "mcl_core:jungleleaves", "mcl_core:junglewood" }, - snow = { "default:snow", "default:snowblock", "default:dirt_with_snow" }, - end_city = { "default:sandstonebrick", "mcl_end:purpur_block", "mcl_end:end_stone" }, - wolf = { mobs_mc.items.grass_block, "default:dirt_with_rainforest_litter", "default:dirt", "default:dirt_with_snow", "default:snow", "default:snowblock" }, - village = { "mg_villages:road" }, - - -- These probably don't need overrides - mushroom_island = { mobs_mc.items.mycelium, "mcl_core:mycelium" }, - nether_fortress = { mobs_mc.items.nether_brick_block, "mcl_nether:nether_brick", }, - nether = { mobs_mc.items.netherrack, "mcl_nether:netherrack", }, - nether_portal = { mobs_mc.items.nether_portal, "mcl_portals:portal" }, - water = { mobs_mc.items.water_source, "mcl_core:water_source", "default:water_source" }, -} - --- This table contains important spawn height references for the mob spawn height. --- Please base your mob spawn height on these numbers to keep things clean. -mobs_mc.spawn_height = { - water = tonumber(minetest.settings:get("water_level")) or 0, -- Water level in the Overworld - - -- Overworld boundaries (inclusive) --I adjusted this to be more reasonable - overworld_min = -64,-- -2999, - overworld_max = 31000, - - -- Nether boundaries (inclusive) - nether_min = -29067,-- -3369, - nether_max = -28939,-- -3000, - - -- End boundaries (inclusive) - end_min = -6200, - end_max = -6000, -} - -mobs_mc.misc = { - shears_wear = 276, -- Wear to add per shears usage (238 uses) - totem_fail_nodes = {} -- List of nodes in which the totem of undying fails -} - --- Item name overrides from mobs_mc_gameconfig (if present) -if minetest.get_modpath("mobs_mc_gameconfig") and mobs_mc.override then - local tables = {"items", "follow", "replace", "spawn", "spawn_height", "misc"} - for t=1, #tables do - local tbl = tables[t] - if mobs_mc.override[tbl] then - for k, v in pairs(mobs_mc.override[tbl]) do - mobs_mc[tbl][k] = v - end - end - end - - if mobs_mc.override.enderman_takable then - mobs_mc.enderman_takable = mobs_mc.override.enderman_takable - end - if mobs_mc.override.enderman_replace_on_take then - mobs_mc.enderman_replace_on_take = mobs_mc.override.enderman_replace_on_take - end - if mobs_mc.enderman_block_texture_overrides then - mobs_mc.enderman_block_texture_overrides = mobs_mc.override.enderman_block_texture_overrides - end -end - diff --git a/mods/ENTITIES/mobs_mc/1_items_default.lua b/mods/ENTITIES/mobs_mc/1_items_default.lua deleted file mode 100644 index bdadbfdc5..000000000 --- a/mods/ENTITIES/mobs_mc/1_items_default.lua +++ /dev/null @@ -1,587 +0,0 @@ ---MCmobs v0.5 ---maikerumine ---made for MC like Survival game ---License for code WTFPL and otherwise stated in readmes - ---THIS IS THE MASTER ITEM LIST TO USE WITH DEFAULT - --- NOTE: Most strings intentionally not marked for translation, other mods already have these items. --- TODO: Remove this file eventually, most items are already outsourced in other mods. - -local S = minetest.get_translator("mobs_mc") - -local c = mobs_mc.is_item_variable_overridden - --- Blaze -if c("blaze_rod") then - minetest.register_craftitem("mobs_mc:blaze_rod", { - description = "Blaze Rod", - _doc_items_longdesc = "This is a crafting component dropped from dead blazes.", - wield_image = "mcl_mobitems_blaze_rod.png", - inventory_image = "mcl_mobitems_blaze_rod.png", - }) - - -- Make blaze rod furnace-burnable. 1.5 times the burn time of a coal lump - local coalcraft, burntime - if minetest.get_modpath("default") then - coalcraft = minetest.get_craft_result({method="fuel", width=1, items={"default:coal_lump"}}) - end - if coalcraft then - burntime = math.floor(coalcraft.time * 1.5) - end - if burntime == nil or burntime == 0 then - burntime = 60 - end - - minetest.register_craft({ - type = "fuel", - burntime = burntime, - recipe = "mobs_mc:blaze_rod", - }) -end - -if c("blaze_powder") then - minetest.register_craftitem("mobs_mc:blaze_powder", { - description = "Blaze Powder", - _doc_items_longdesc = "This item is mainly used for brewing potions and crafting.", - wield_image = "mcl_mobitems_blaze_powder.png", - inventory_image = "mcl_mobitems_blaze_powder.png", - }) -end - -if c("blaze_rod") and c("blaze_powder") then - minetest.register_craft({ - output = "mobs_mc:blaze_powder 2", - recipe = {{ "mobs_mc:blaze_rod" }}, - }) -end - --- Chicken -if c("chicken_raw") then - minetest.register_craftitem("mobs_mc:chicken_raw", { - description = "Raw Chicken", - _doc_items_longdesc = "Raw chicken is a food item and can be eaten safely. Cooking it will increase its nutritional value.", - inventory_image = "mcl_mobitems_chicken_raw.png", - groups = { food = 2, eatable = 2 }, - on_use = minetest.item_eat(2), - }) -end - -if c("chicken_cooked") then - minetest.register_craftitem("mobs_mc:chicken_cooked", { - description = "Cooked Chicken", - _doc_items_longdesc = "A cooked chicken is a healthy food item which can be eaten.", - inventory_image = "mcl_mobitems_chicken_cooked.png", - groups = { food = 2, eatable = 6 }, - on_use = minetest.item_eat(6), - }) -end - -if c("chicken_raw") and c("chicken_cooked") then - minetest.register_craft({ - type = "cooking", - output = "mobs_mc:chicken_cooked", - recipe = "mobs_mc:chicken_raw", - cooktime = 5, - }) -end - -if c("feather") then - minetest.register_craftitem("mobs_mc:feather", { - description = "Feather", - _doc_items_longdesc = "Feathers are used in crafting and are dropped from chickens.", - inventory_image = "mcl_mobitems_feather.png", - }) -end - --- Cow and mooshroom -if c("beef_raw") then - minetest.register_craftitem("mobs_mc:beef_raw", { - description = "Raw Beef", - _doc_items_longdesc = "Raw beef is the flesh from cows and can be eaten safely. Cooking it will greatly increase its nutritional value.", - inventory_image = "mcl_mobitems_beef_raw.png", - groups = { food = 2, eatable = 3 }, - on_use = minetest.item_eat(3), - }) -end - -if c("beef_cooked") then - minetest.register_craftitem("mobs_mc:beef_cooked", { - description = "Steak", - _doc_items_longdesc = "Steak is cooked beef from cows and can be eaten.", - inventory_image = "mcl_mobitems_beef_cooked.png", - groups = { food = 2, eatable = 8 }, - on_use = minetest.item_eat(8), - }) -end - -if c("beef_raw") and c("beef_cooked") then - minetest.register_craft({ - type = "cooking", - output = "mobs_mc:beef_cooked", - recipe = "mobs_mc:beef_raw", - cooktime = 5, - }) -end - - -if c("milk") then - -- milk - minetest.register_craftitem("mobs_mc:milk_bucket", { - description = "Milk", - _doc_items_longdesc = "Milk is a food item obtained by using a bucket on a cow.", - inventory_image = "mobs_bucket_milk.png", - groups = { food = 3, eatable = 1 }, - on_use = minetest.item_eat(1, "bucket:bucket_empty"), - stack_max = 1, - }) -end - -if c("bowl") then - minetest.register_craftitem("mobs_mc:bowl", { - description = "Bowl", - _doc_items_longdesc = "Bowls are mainly used to hold tasty soups.", - inventory_image = "mcl_core_bowl.png", - }) - - minetest.register_craft({ - output = "mobs_mc:bowl", - recipe = { - { "group:wood", "", "group:wood" }, - { "", "group:wood", "", }, - } - }) - - minetest.register_craft({ - type = "fuel", - recipe = "mobs_mc:bowl", - burntime = 5, - }) -end - -if c("mushroom_stew") then - minetest.register_craftitem("mobs_mc:mushroom_stew", { - description = "Mushroom Stew", - _doc_items_longdesc = "Mushroom stew is a healthy soup.", - inventory_image = "farming_mushroom_stew.png", - groups = { food = 3, eatable = 6 }, - on_use = minetest.item_eat(6, "mobs_mc:bowl"), - stack_max = 1, - }) -end - --- Ender dragon -if c("dragon_egg") then - - local dragon_egg_sounds - if minetest.get_modpath("default") then - dragon_egg_sounds = default.node_sound_stone_defaults() - end - - --ender dragon - minetest.register_node("mobs_mc:dragon_egg", { - description = "Dragon Egg", - tiles = { - "mcl_end_dragon_egg.png", - "mcl_end_dragon_egg.png", - "mcl_end_dragon_egg.png", - "mcl_end_dragon_egg.png", - "mcl_end_dragon_egg.png", - "mcl_end_dragon_egg.png", - }, - drawtype = "nodebox", - is_ground_content = false, - paramtype = "light", - light_source = 1, - node_box = { - type = "fixed", - fixed = { - {-0.375, -0.5, -0.375, 0.375, -0.4375, 0.375}, - {-0.5, -0.4375, -0.5, 0.5, -0.1875, 0.5}, - {-0.4375, -0.1875, -0.4375, 0.4375, 0, 0.4375}, - {-0.375, 0, -0.375, 0.375, 0.125, 0.375}, - {-0.3125, 0.125, -0.3125, 0.3125, 0.25, 0.3125}, - {-0.25, 0.25, -0.25, 0.25, 0.3125, 0.25}, - {-0.1875, 0.3125, -0.1875, 0.1875, 0.375, 0.1875}, - {-0.125, 0.375, -0.125, 0.125, 0.4375, 0.125}, - {-0.0625, 0.4375, -0.0625, 0.0625, 0.5, 0.0625}, - } - }, - selection_box = { - type = "regular", - }, - groups = {snappy = 1, falling_node = 1, deco_block = 1, not_in_creative_inventory = 1, dig_by_piston = 1 }, - sounds = dragon_egg_sounds, - -- TODO: Make dragon egg teleport on punching - }) -end - -local longdesc_craftitem -if minetest.get_modpath("doc_items") then - longdesc_craftitem = doc.sub.items.temp.craftitem -end - --- Enderman -if c("ender_eye") then - minetest.register_craftitem("mobs_mc:ender_eye", { - description = "Eye of Ender", - _doc_items_longdesc = longdesc_craftitem, - inventory_image = "mcl_end_ender_eye.png", - groups = { craftitem = 1 }, - }) -end - -if c("ender_eye") and c("blaze_powder") and c("blaze_rod") then - minetest.register_craft({ - type = "shapeless", - output = 'mobs_mc:ender_eye', - recipe = { 'mobs_mc:blaze_powder', 'mobs_mc:blaze_rod'}, - }) -end - --- Ghast -if c("ghast_tear") then - minetest.register_craftitem("mobs_mc:ghast_tear", { - description = "Ghast Tear", - _doc_items_longdesc = "A ghast tear is an item used in potion brewing. It is dropped from dead ghasts.", - wield_image = "mcl_mobitems_ghast_tear.png", - inventory_image = "mcl_mobitems_ghast_tear.png", - groups = { brewitem = 1 }, - }) -end - --- Saddle -if c("saddle") then - -- Overwrite the saddle from Mobs Redo - minetest.register_craftitem(":mobs:saddle", { - description = "Saddle", - _doc_items_longdesc = "Saddles can be put on horses, donkeys, mules and pigs in order to mount them.", - _doc_items_usagehelp = "Rightclick an animal while holding a saddle to put on the saddle. You can now mount the animal by rightclicking it again.", - inventory_image = "mcl_mobitems_saddle.png", - stack_max = 1, - }) -end - --- Horse Armor -local horse_armor_use = S("Place it on a horse to put on the horse armor. Donkeys and mules can't wear horse armor.") --- TODO: Balance the horse armor strength, compare with MC armor strength -if c("iron_horse_armor") then - minetest.register_craftitem("mobs_mc:iron_horse_armor", { - description = S("Iron Horse Armor"), - _doc_items_longdesc = S("Iron horse armor can be worn by horses to increase their protection from harm a bit."), - _doc_items_usagehelp = horse_armor_use, - inventory_image = "mobs_mc_iron_horse_armor.png", - _horse_overlay_image = "mobs_mc_horse_armor_iron.png", - sounds = { - _mcl_armor_equip = "mcl_armor_equip_iron", - }, - stack_max = 1, - groups = { horse_armor = 85 }, - }) -end -if c("gold_horse_armor") then - minetest.register_craftitem("mobs_mc:gold_horse_armor", { - description = S("Golden Horse Armor"), - _doc_items_longdesc = S("Golden horse armor can be worn by horses to increase their protection from harm."), - _doc_items_usagehelp = horse_armor_use, - inventory_image = "mobs_mc_gold_horse_armor.png", - _horse_overlay_image = "mobs_mc_horse_armor_gold.png", - sounds = { - _mcl_armor_equip = "mcl_armor_equip_iron", - }, - stack_max = 1, - groups = { horse_armor = 60 }, - }) -end -if c("diamond_horse_armor") then - minetest.register_craftitem("mobs_mc:diamond_horse_armor", { - description = S("Diamond Horse Armor"), - _doc_items_longdesc = S("Diamond horse armor can be worn by horses to greatly increase their protection from harm."), - _doc_items_usagehelp = horse_armor_use, - inventory_image = "mobs_mc_diamond_horse_armor.png", - _horse_overlay_image = "mobs_mc_horse_armor_diamond.png", - sounds = { - _mcl_armor_equip = "mcl_armor_equip_diamond", - }, - stack_max = 1, - groups = { horse_armor = 45 }, - }) -end - --- Pig -if c("porkchop_raw") then - minetest.register_craftitem("mobs_mc:porkchop_raw", { - description = "Raw Porkchop", - _doc_items_longdesc = "A raw porkchop is the flesh from a pig and can be eaten safely. Cooking it will greatly increase its nutritional value.", - inventory_image = "mcl_mobitems_porkchop_raw.png", - groups = { food = 2, eatable = 3 }, - on_use = minetest.item_eat(3), - }) -end - -if c("porkchop_cooked") then - minetest.register_craftitem("mobs_mc:porkchop_cooked", { - description = "Cooked Porkchop", - _doc_items_longdesc = "Cooked porkchop is the cooked flesh of a pig and is used as food.", - inventory_image = "mcl_mobitems_porkchop_cooked.png", - groups = { food = 2, eatable = 8 }, - on_use = minetest.item_eat(8), - }) -end - -if c("porkchop_raw") and c("porkchop_cooked") then - minetest.register_craft({ - type = "cooking", - output = "mobs_mc:porkchop_cooked", - recipe = "mobs_mc:porkchop_raw", - cooktime = 5, - }) -end - -if c("carrot_on_a_stick") then - minetest.register_tool("mobs_mc:carrot_on_a_stick", { - description = "Carrot on a Stick", - _doc_items_longdesc = "A carrot on a stick can be used on saddled pigs to ride them. Pigs will also follow anyone who holds a carrot on a stick near them.", - _doc_items_usagehelp = "Rightclick a saddled pig with the carrot on a stick to mount it. You can now ride it like a horse.", - wield_image = "mcl_mobitems_carrot_on_a_stick.png", - inventory_image = "mcl_mobitems_carrot_on_a_stick.png", - sounds = { breaks = "default_tool_breaks" }, - }) -end - --- Poor-man's recipes for carrot on a stick -if c("carrot_on_a_stick") and c("stick") and c("string") and minetest.get_modpath("farming") then - minetest.register_craft({ - output = "mobs_mc:carrot_on_a_stick", - recipe = { - {"", "", "farming:string" }, - {"", "group:stick", "farming:string" }, - {"group:stick", "", "farming:bread" }, - } - }) - --- FIXME: Identify correct farming mod (check if it includes the carrot item) - minetest.register_craft({ - output = "mobs_mc:carrot_on_a_stick", - recipe = { - {"", "", "farming:string" }, - {"", "group:stick", "farming:string" }, - {"group:stick", "", "farming:carrot" }, - } - }) -end - -if c("carrot_on_a_stick") and c("stick") and c("string") and minetest.get_modpath("fishing") and minetest.get_modpath("farming") then - minetest.register_craft({ - type = "shapeless", - output = "mobs_mc:carrot_on_a_stick", - recipe = {"fishing:pole_wood", "farming:carrot"}, - }) -end - --- Rabbit -if c("rabbit_raw") then - minetest.register_craftitem("mobs_mc:rabbit_raw", { - description = "Raw Rabbit", - _doc_items_longdesc = "Raw rabbit is a food item from a dead rabbit. It can be eaten safely. Cooking it will increase its nutritional value.", - inventory_image = "mcl_mobitems_rabbit_raw.png", - groups = { food = 2, eatable = 3 }, - on_use = minetest.item_eat(3), - }) -end - -if c("rabbit_cooked") then - minetest.register_craftitem("mobs_mc:rabbit_cooked", { - description = "Cooked Rabbit", - _doc_items_longdesc = "This is a food item which can be eaten.", - inventory_image = "mcl_mobitems_rabbit_cooked.png", - groups = { food = 2, eatable = 5 }, - on_use = minetest.item_eat(5), - }) -end - -if c("rabbit_raw") and c("rabbit_cooked") then - minetest.register_craft({ - type = "cooking", - output = "mobs_mc:rabbit_cooked", - recipe = "mobs_mc:rabbit_raw", - cooktime = 5, - }) -end - -if c("rabbit_hide") then - minetest.register_craftitem("mobs_mc:rabbit_hide", { - description = "Rabbit Hide", - _doc_items_longdesc = "Rabbit hide is used to create leather.", - inventory_image = "mcl_mobitems_rabbit_hide.png" - }) -end - -if c("leather") and c("rabbit_hide") then - minetest.register_craft({ - output = "mobs:leather", - recipe = { - { "mobs_mc:rabbit_hide", "mobs_mc:rabbit_hide" }, - { "mobs_mc:rabbit_hide", "mobs_mc:rabbit_hide" }, - } - }) -end - -if c("rabbit_foot") then - minetest.register_craftitem("mobs_mc:rabbit_foot", { - description = "Rabbit's Foot", - _doc_items_longdesc = "This item is used in brewing.", - inventory_image = "mcl_mobitems_rabbit_foot.png" - }) -end - --- Sheep -if c("mutton_raw") then - minetest.register_craftitem("mobs_mc:mutton_raw", { - description = "Raw Mutton", - _doc_items_longdesc = "Raw mutton is the flesh from a sheep and can be eaten safely. Cooking it will greatly increase its nutritional value.", - inventory_image = "mcl_mobitems_mutton_raw.png", - groups = { food = 2, eatable = 4 }, - on_use = minetest.item_eat(4), - }) -end - -if c("mutton_cooked") then - minetest.register_craftitem("mobs_mc:mutton_cooked", { - description = "Cooked Mutton", - _doc_items_longdesc = "Cooked mutton is the cooked flesh from a sheep and is used as food.", - inventory_image = "mcl_mobitems_mutton_cooked.png", - groups = { food = 2, eatable = 8 }, - on_use = minetest.item_eat(8), - }) -end - -if c("mutton_raw") and c("mutton_cooked") then - minetest.register_craft({ - type = "cooking", - output = "mobs_mc:mutton_cooked", - recipe = "mobs_mc:mutton_raw", - cooktime = 5, - }) -end - --- Shulker -if c("shulker_shell") then - minetest.register_craftitem("mobs_mc:shulker_shell", { - description = "Shulker Shell", - _doc_items_longdesc = "Shulker shells are used in crafting. They are dropped from dead shulkers.", - inventory_image = "mcl_mobitems_shulker_shell.png", - groups = { craftitem = 1 }, - }) -end - --- Magma cube -if c("magma_cream") then - minetest.register_craftitem("mobs_mc:magma_cream", { - description = "Magma Cream", - _doc_items_longdesc = "Magma cream is a crafting component.", - wield_image = "mcl_mobitems_magma_cream.png", - inventory_image = "mcl_mobitems_magma_cream.png", - groups = { brewitem = 1 }, - }) -end - --- Slime -if c("slimeball") then - minetest.register_craftitem("mobs_mc:slimeball", { - description = "Slimeball", - _doc_items_longdesc = "Slimeballs are used in crafting. They are dropped from slimes.", - inventory_image = "mcl_mobitems_slimeball.png" - }) - if minetest.get_modpath("mesecons_materials") then - minetest.register_craft({ - output = "mesecons_materials:glue", - recipe = {{ "mobs_mc:slimeball" }}, - }) - end -end - --- Spider -if c("spider_eye") then - minetest.register_craftitem("mobs_mc:spider_eye", { - description = "Spider Eye", - _doc_items_longdesc = "Spider eyes are used mainly in crafting and brewing. Spider eyes can be eaten, but they poison you and reduce your health by 2 hit points.", - inventory_image = "mcl_mobitems_spider_eye.png", - wield_image = "mcl_mobitems_spider_eye.png", - -- Simplified poisonous food - groups = { food = 2, eatable = -2 }, - on_use = minetest.item_eat(-2), - }) -end - --- Evoker -if c("totem") then - -- Totem of Undying - minetest.register_craftitem("mobs_mc:totem", { - description = S("Totem of Undying"), - _tt_help = minetest.colorize(mcl_colors.GREEN, S("Protects you from death while wielding it")), - _doc_items_longdesc = S("A totem of undying is a rare artifact which may safe you from certain death."), - _doc_items_usagehelp = S("The totem only works while you hold it in your hand. If you receive fatal damage, you are saved from death and you get a second chance with 1 HP. The totem is destroyed in the process, however."), - inventory_image = "mcl_totems_totem.png", - wield_image = "mcl_totems_totem.png", - stack_max = 1, - groups = {combat_item=1}, - }) -end - --- Rotten flesh -if c("rotten_flesh") then - minetest.register_craftitem("mobs_mc:rotten_flesh", { - description = "Rotten Flesh", - _doc_items_longdesc = "Yuck! This piece of flesh clearly has seen better days. Eating it will only poison you and reduces your health by 4 hit points. But tamed wolves can eat it just fine.", - inventory_image = "mcl_mobitems_rotten_flesh.png", - -- Simplified poisonous food - groups = { food = 2, eatable = -4 }, - on_use = minetest.item_eat(-4), - }) -end - --- Misc. -if c("nether_star") then - minetest.register_craftitem("mobs_mc:nether_star", { - description = "Nether Star", - _doc_items_longdesc = "A nether star is a crafting component. It is dropped from the Wither.", - inventory_image = "mcl_mobitems_nether_star.png" - }) -end - -if c("snowball") and minetest.get_modpath("default") then - minetest.register_craft({ - output = "mobs_mc:snowball 2", - recipe = { - {"default:snow"}, - }, - }) - minetest.register_craft({ - output = "default:snow 2", - recipe = { - {"mobs_mc:snowball", "mobs_mc:snowball"}, - {"mobs_mc:snowball", "mobs_mc:snowball"}, - }, - }) - -- Change the appearance of default snow to avoid confusion with snowball - minetest.override_item("default:snow", { - inventory_image = "", - wield_image = "", - }) -end - -if c("bone") then - minetest.register_craftitem("mobs_mc:bone", { - description = "Bone", - _doc_items_longdesc = "Bones can be used to tame wolves so they will protect you. They are also useful as a crafting ingredient.", - _doc_items_usagehelp = "Hold the bone in your hand near wolves to attract them. Rightclick the wolf to give it a bone and tame it.", - inventory_image = "mcl_mobitems_bone.png" - }) - if minetest.get_modpath("bones") then - minetest.register_craft({ - output = "mobs_mc:bone 3", - recipe = {{ "bones:bones" }}, - }) - end -end diff --git a/mods/ENTITIES/mobs_mc/4_heads.lua b/mods/ENTITIES/mobs_mc/4_heads.lua deleted file mode 100644 index 01b8ee577..000000000 --- a/mods/ENTITIES/mobs_mc/4_heads.lua +++ /dev/null @@ -1,62 +0,0 @@ ---MC Heads for minetest ---maikerumine - --- NOTE: Strings intentionally not marked for translation, other mods already have these items. --- TODO: Remove this file eventually, all items here are already outsourced in other mods. - -local S = minetest.get_translator("mobs_mc") - --- Heads system - -local sounds -if minetest.get_modpath("default") then - sounds = default.node_sound_defaults({ - footstep = {name="default_hard_footstep", gain=0.3} - }) -end - -local function addhead(mobname, desc, longdesc) - if not mobs_mc.is_item_variable_overridden("head_"..mobname) then - return - end - minetest.register_node("mobs_mc:head_"..mobname, { - description = desc, - _doc_items_longdesc = longdesc, - drawtype = "nodebox", - is_ground_content = false, - node_box = { - type = "fixed", - fixed = { - { -0.25, -0.5, -0.25, 0.25, 0.0, 0.25, }, - }, - }, - groups = { oddly_breakable_by_hand=3, head=1, }, - -- The head textures are based off the textures of an actual mob. - -- FIXME: This code assumes 16×16 textures for the mob textures! - tiles = { - -- Note: bottom texture is overlaid over top texture to get rid of possible transparency. - -- This is required for skeleton skull and wither skeleton skull. - "[combine:16x16:-4,4=mobs_mc_"..mobname..".png", -- top - "([combine:16x16:-4,4=mobs_mc_"..mobname..".png)^([combine:16x16:-12,4=mobs_mc_"..mobname..".png)", -- bottom - "[combine:16x16:-12,0=mobs_mc_"..mobname..".png", -- left - "[combine:16x16:4,0=mobs_mc_"..mobname..".png", -- right - "[combine:16x16:-20,0=mobs_mc_"..mobname..".png", -- back - "[combine:16x16:-4,0=mobs_mc_"..mobname..".png", -- front - }, - paramtype = "light", - paramtype2 = "facedir", - sunlight_propagates = true, - walkable = true, - sounds = sounds, - selection_box = { - type = "fixed", - fixed = { -0.25, -0.5, -0.25, 0.25, 0.0, 0.25, }, - }, - }) -end - --- Add heads -addhead("zombie", "Zombie Head", "A zombie head is a small decorative block which resembles the head of a zombie.") -addhead("creeper", "Creeper Head", "A creeper head is a small decorative block which resembles the head of a creeper.") -addhead("skeleton", "Skeleton Skull", "A skeleton skull is a small decorative block which resembles the skull of a skeleton.") -addhead("wither_skeleton", "Wither Skeleton Skull", "A wither skeleton skull is a small decorative block which resembles the skull of a wither skeleton.") diff --git a/mods/ENTITIES/mobs_mc/5_spawn_abm_check.lua b/mods/ENTITIES/mobs_mc/5_spawn_abm_check.lua deleted file mode 100644 index 8fcaaf31f..000000000 --- a/mods/ENTITIES/mobs_mc/5_spawn_abm_check.lua +++ /dev/null @@ -1,20 +0,0 @@ -local function is_forbidden_node(pos, node) - node = node or minetest.get_node(pos) - return minetest.get_item_group(node.name, "stair") > 0 or minetest.get_item_group(node.name, "slab") > 0 or minetest.get_item_group(node.name, "carpet") > 0 -end - -function mobs:spawn_abm_check(pos, node, name) - -- Don't spawn monsters on mycelium - if (node.name == "mcl_core:mycelium" or node.name == "mcl_core:mycelium_snow") and minetest.registered_entities[name].type == "monster" then - return true - --Don't Spawn mobs on stairs, slabs, or carpets - elseif is_forbidden_node(pos, node) or is_forbidden_node(vector.add(pos, vector.new(0, 1, 0))) then - return true - -- Spawn on opaque or liquid nodes - elseif minetest.get_item_group(node.name, "opaque") ~= 0 or minetest.registered_nodes[node.name].liquidtype ~= "none" or node.name == "mcl_core:grass_path" then - return false - end - - -- Reject everything else - return true -end diff --git a/mods/ENTITIES/mobs_mc/LICENSE b/mods/ENTITIES/mobs_mc/LICENSE deleted file mode 100644 index 9cecc1d46..000000000 --- a/mods/ENTITIES/mobs_mc/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - {one line to give the program's name and a brief idea of what it does.} - Copyright (C) {year} {name of author} - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - {project} Copyright (C) {year} {fullname} - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/mods/ENTITIES/mobs_mc/README.md b/mods/ENTITIES/mobs_mc/README.md deleted file mode 100644 index d3ac29a16..000000000 --- a/mods/ENTITIES/mobs_mc/README.md +++ /dev/null @@ -1,89 +0,0 @@ -# MC-like mobs [`mobs_mc`] - -This mod adds mobs which closely resemble the mobs from the game Minecraft, version 1.12. - -## Credits - -* [maikerumine](https://github.com/maikerumine): Coding behaviour, spawning, drops, and misc. -* [Wuzzy2](https://github.com/Wuzzy2): Zombies, husks, item textures, and code -* [toby109tt](https://github.com/tobyplowy): Mapping fixes - better 2D planes -* [22i](https://github.com/22i): Models (done in Blender) and mob icons for spawn eggs -* [XSSheep](https://www.planetminecraft.com/member/xssheep/): Mob and item textures (from [Pixel Perfection](https://www.planetminecraft.com/texture_pack/131pixel-perfection/)) -* MysticTempest: More mob textures -* See `LICENSE_media.md` for detailed credits about each file - -## Licensing - -* Code: GNU General Public License, version 3 (see `LICENSE`) -* Media: MIT, CC0, CC BY 3.0 CC BY-SA 4.0, LGPLv2.1, GPLv3. See `LICENSE_media.md` for details - -## Useful information for developers - -### Game integration -Want to include this mod in your game? Read `gameconfig.md`. - -### Links - -* [`mobs_mc`](https://github.com/maikerumine/mobs_mc) -* [Blender models](https://github.com/22i/minecraft-voxel-blender-models) -* [How to recreate mobs from textures with Blender and Gimp](http://imgur.com/a/Iqg88) - -## List of mobs - -**Note**: Many of these are incomplete. - -### Monsters - -* Zombie -* Husk -* Skeleton -* Stray -* Creeper -* Slime -* Spider -* Cave Spider -* Enderman -* Zombie Villager -* Zombie Pigman -* Wither Skeleton -* Magma Cube -* Blaze -* Ghast -* Evoker -* Vex -* Vindicator -* Witch -* Guardian -* Silverfish -* Endermite -* Shulker -* Ender Dragon -* Wither -* Elder Guardian - -### Peaceful mobs - -* Chicken -* Cow -* Pig -* Rabbit -* Sheep -* Squid -* Polar Bear -* Bat -* Mooshroom -* Horse -* Donkey -* Llama -* Mule -* Skeleton Horse -* Zombie Horse - -### Helpful mobs - -* Wolf -* Villager -* Iron golem -* Snow golem -* Ocelot/Cat -* Parrot diff --git a/mods/ENTITIES/mobs_mc/agent.lua b/mods/ENTITIES/mobs_mc/agent.lua deleted file mode 100644 index cc9910ee6..000000000 --- a/mods/ENTITIES/mobs_mc/agent.lua +++ /dev/null @@ -1,39 +0,0 @@ ---################### ---################### AGENT - seemingly unused ---################### - -local S = minetest.get_translator("mobs_mc") - -mobs:register_mob("mobs_mc:agent", { - type = "npc", - spawn_class = "passive", - passive = true, - hp_min = 20, - hp_max = 20, - armor = 100, - collisionbox = {-0.35, -0.01, -0.35, 0.35, 1, 0.35}, - visual = "mesh", - mesh = "mobs_mc_agent.b3d", - textures = { - {"mobs_mc_agent.png"}, - }, - -- TODO: sounds - visual_size = {x=3, y=3}, - walk_chance = 0, - walk_velocity = 0.6, - run_velocity = 2, - jump = true, - animation = { - stand_speed = 25, - walk_speed = 25, - run_speed = 50, - stand_start = 20, - stand_end = 60, - walk_start = 0, - walk_end = 20, - run_start = 0, - run_end = 20, - }, -}) - -mobs:register_egg("mobs_mc:agent", S("Agent"), "mobs_mc_spawn_icon_agent.png", 0) diff --git a/mods/ENTITIES/mobs_mc/depends.txt b/mods/ENTITIES/mobs_mc/depends.txt deleted file mode 100644 index 674eb8094..000000000 --- a/mods/ENTITIES/mobs_mc/depends.txt +++ /dev/null @@ -1 +0,0 @@ -mcl_mobs \ No newline at end of file diff --git a/mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr b/mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr deleted file mode 100644 index 6598cd481..000000000 --- a/mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr +++ /dev/null @@ -1,76 +0,0 @@ -# textdomain: mobs_mc -Totem of Undying=Totem der Unsterblichkeit -A totem of undying is a rare artifact which may safe you from certain death.=Ein Totem der Unsterblichkeit ist ein seltenes Artefakt, dass Sie vor dem sicheren Tod bewahren kann. -The totem only works while you hold it in your hand. If you receive fatal damage, you are saved from death and you get a second chance with 1 HP. The totem is destroyed in the process, however.=Der Totem funktioniert nur, während Sie ihn halten. Wenn Sie normalerweise tödlich hohen Schaden erhalten, werden Sie vor dem Tod bewahrt und Sie erhalten eine zweite Chance mit 1 TP. Der Totem wird dabei zerstört. -Agent=Akteur -Bat=Fledermaus -Blaze=Lohe -Chicken=Huhn -Cow=Kuh -Mooshroom=Pilzkuh -Creeper=Creeper -Ender Dragon=Enderdrache -Enderman=Enderman -Endermite=Endermilbe -Ghast=Ghast -Elder Guardian=Großer Wächter -Guardian=Wächter -Horse=Pferd -Skeleton Horse=Skelettpferd -Zombie Horse=Zombiepferd -Donkey=Esel -Mule=Maultier -Iron Golem=Eisengolem -Llama=Lama -Ocelot=Ozelot -Parrot=Papagei -Pig=Schwein -Polar Bear=Eisbär -Rabbit=Kaninchen -Killer Bunny=Killerkaninchen -The Killer Bunny=Das Killerkaninchen -Sheep=Schaf -Shulker=Shulker -Silverfish=Silberfischchen -Skeleton=Skelett -Stray=Eiswanderer -Wither Skeleton=Witherskelett -Magma Cube=Magmakubus -Slime=Schleim -Snow Golem=Schneegolem -Spider=Spinne -Cave Spider=Höhlenspinne -Squid=Tintenfisch -Vex=Plagegeist -Evoker=Magier -Illusioner=Illusionist -Villager=Dorfbewohner -Vindicator=Diener -Zombie Villager=Dorfbewohnerzombie -Witch=Hexe -Wither=Wither -Wolf=Wolf -Husk=Wüstenzombie -Zombie=Zombie -Zombie Pigman=Schweinezombie -Iron Horse Armor=Eisenpferderüstung -Iron horse armor can be worn by horses to increase their protection from harm a bit.=Eine Eisenpferderüstung kann von Pferden getragen werden, um ihren Schutz vor Schaden etwas zu erhöhen. -Golden Horse Armor=Goldpferderüstung -Golden horse armor can be worn by horses to increase their protection from harm.=Eine Goldpferderüstung kann von Pferden getragen werden, um ihren Schutz vor Schaden zu erhöhen. -Diamond Horse Armor=Diamantpferderüstung -Diamond horse armor can be worn by horses to greatly increase their protection from harm.=Eine Diamantpferderüstung kann von Pferden getragen werden, um ihren Schutz vor Schaden beträchtlich zu erhöhen. -Place it on a horse to put on the horse armor. Donkeys and mules can't wear horse armor.=Platzieren Sie es auf einem Pferd, um die Pferderüstung aufzusetzen. Esel und Maultiere können keine Pferderüstung tragen. -Farmer=Bauer -Fisherman=Fischer -Fletcher=Pfeilmacher -Shepherd=Schäfer -Librarian=Bibliothekar -Cartographer=Kartograph -Armorer=Rüstungsschmied -Leatherworker=Lederarbeiter -Butcher=Metzger -Weapon Smith=Waffenschmied -Tool Smith=Werkzeugschmied -Cleric=Priester -Nitwit=Dorftrottel -Protects you from death while wielding it=Schützt vor dem Tod, wenn es gehalten wird diff --git a/mods/ENTITIES/mobs_mc/locale/mobs_mc.es.tr b/mods/ENTITIES/mobs_mc/locale/mobs_mc.es.tr deleted file mode 100644 index c61c09943..000000000 --- a/mods/ENTITIES/mobs_mc/locale/mobs_mc.es.tr +++ /dev/null @@ -1,75 +0,0 @@ -# textdomain: mobs_mc -Totem of Undying=Tótem de la inmortalidad -A totem of undying is a rare artifact which may safe you from certain death.=Un tótem de la inmortalidad es un artefacto raro que puede salvarte de una muerte segura. -The totem only works while you hold it in your hand. If you receive fatal damage, you are saved from death and you get a second chance with 1 HP. The totem is destroyed in the process, however.=El tótem solo funciona mientras lo sostienes en tu mano. Si recibes un daño crítico, no mueres y obtienes una segunda oportunidad con 1 HP. Sin embargo, el tótem se destruye en el proceso. -Agent=Agente -Bat=Murciélago -Blaze=Blaze -Chicken=Pollo -Cow=Vaca -Mooshroom=Champiñaca -Creeper=Creeper -Ender Dragon=Enderdragón -Enderman=Enderman -Endermite=Endermite -Ghast=Ghast -Elder Guardian=Gran guardián -Guardian=Guardián -Horse=Caballo -Skeleton Horse=Caballo esquelético -Zombie Horse=Caballo zombie -Donkey=Burro -Mule=Mula -Iron Golem=Golem de hierro -Llama=Llama -Ocelot=Ocelote -Parrot=Loro -Pig=Cerdo -Polar Bear=Oso polar -Rabbit=Conejo -Killer Bunny=Conejo asesino -The Killer Bunny=El Conejo asesino -Sheep=Oveja -Shulker=Shulker -Silverfish=Lepisma -Skeleton=Esqueleto -Stray=Esqueleto -Wither Skeleton=Esqueleto wither -Magma Cube=Cubo de Magma -Slime=Slime -Snow Golem=Golem de nieve -Spider=Araña -Cave Spider=Araña de las cuevas -Squid=Calamar -Vex=Ánima -Evoker=Invocador -Illusioner=Illusionista -Villager=Aldeano -Vindicator=Vindicador -Zombie Villager=Aldeano zombie -Witch=Bruja -Wither=Wither -Wolf=Lobo -Husk=Husk -Zombie=Zombie -Zombie Pigman=Cerdo Zombie -Iron Horse Armor=Armadura de hierro para caballo -Iron horse armor can be worn by horses to increase their protection from harm a bit.=Los caballos pueden usar armadura de caballo de hierro para aumentar un poco su protección contra el daño. -Golden Horse Armor=Armadura de oro para caballo -Golden horse armor can be worn by horses to increase their protection from harm.=Los caballos pueden usar armadura de caballo de oro para aumentar su protección contra el daño. -Diamond Horse Armor=Armadura de diamante para caballo -Diamond horse armor can be worn by horses to greatly increase their protection from harm.=Los caballos pueden usar armadura de caballo de diamante para aumentar en gran medida su protección contra el daño. -Place it on a horse to put on the horse armor. Donkeys and mules can't wear horse armor.=Colóquelo en un caballo para ponerle la armadura de caballo. Los burros y las mulas no pueden usar armadura de caballo. -Farmer=Granjero -Fisherman=Pescador -Fletcher=Flechador -Shepherd=Sacerdote -Librarian=Bibliotecario -Cartographer=Cartógrafo -Armorer=Armero -Leatherworker=Peletero -Butcher=Carnicero -Weapon Smith=Herrero de Armas -Tool Smith=Herrero de Herramientas -Cleric=Sacerdote -Nitwit=Simple diff --git a/mods/ENTITIES/mobs_mc/locale/mobs_mc.fr.tr b/mods/ENTITIES/mobs_mc/locale/mobs_mc.fr.tr deleted file mode 100644 index 4c8bd562d..000000000 --- a/mods/ENTITIES/mobs_mc/locale/mobs_mc.fr.tr +++ /dev/null @@ -1,76 +0,0 @@ -# textdomain: mobs_mc -Totem of Undying=Totem d'immortalité -A totem of undying is a rare artifact which may safe you from certain death.=Un totem d'immortalité est un artefact rare qui peut vous protéger d'une mort certaine. -The totem only works while you hold it in your hand. If you receive fatal damage, you are saved from death and you get a second chance with 1 HP. The totem is destroyed in the process, however.=Le totem ne fonctionne que lorsque vous le tenez dans votre main. Si vous recevez des dégâts mortels, vous êtes sauvé de la mort et vous obtenez une seconde chance avec 1 HP. Cependant, le totem est détruit. -Agent=Agent -Bat=Chauve-souris -Blaze=Blaze -Chicken=Poulet -Cow=Vache -Mooshroom=Champimeuh -Creeper=Creeper -Ender Dragon=Ender Dragon -Enderman=Enderman -Endermite=Endermite -Ghast=Ghast -Elder Guardian=Gardien de l'Elder -Guardian=Gardien -Horse=Cheval -Skeleton Horse=Cheval-squelette -Zombie Horse=Cheval-zombie -Donkey=Âne -Mule=Mule -Iron Golem=Golem de fer -Llama=Lama -Ocelot=Ocelot -Parrot=Perroquet -Pig=Cochon -Polar Bear=Ours blanc -Rabbit=Lapin -Killer Bunny=Lapin tueur -The Killer Bunny=Le Lapin tueur -Sheep=Mouton -Shulker=Shulker -Silverfish=Poisson d'argent -Skeleton=Squelette -Stray=Vagabond -Wither Skeleton=Wither squelette -Magma Cube=Cube de magma -Slime=Slime -Snow Golem=Golem de neige -Spider=Araignée -Cave Spider=Araignée venimeuse -Squid=Poulpe -Vex=Vex -Evoker=Invocateur -Illusioner=Illusionniste -Villager=Villageois -Vindicator=Vindicateur -Zombie Villager=Zombie Villageois -Witch=Sorcière -Wither=Wither -Wolf=Loup -Husk=Zombie Momifié -Zombie=Zombie -Zombie Pigman=Zombie Cochon -Iron Horse Armor=Armure de cheval en fer -Iron horse armor can be worn by horses to increase their protection from harm a bit.=L'armure de cheval en fer peut être portée par les chevaux pour augmenter un peu leur protection contre les dommages. -Golden Horse Armor=Armure de cheval en or -Golden horse armor can be worn by horses to increase their protection from harm.=Une armure de cheval en or peut être portée par les chevaux pour augmenter leur protection contre les dommages. -Diamond Horse Armor=Armure de cheval en diamant -Diamond horse armor can be worn by horses to greatly increase their protection from harm.=Une armure de cheval en diament peut être portée par les chevaux pour augmenter fortement leur protection contre les dommages. -Place it on a horse to put on the horse armor. Donkeys and mules can't wear horse armor.=Placez-la sur un cheval pour mettre l'armure de cheval. Les ânes et les mules ne peuvent pas porter d'armure de cheval. -Farmer=Fermier -Fisherman=Pêcheur -Fletcher=Archer -Shepherd=Berger -Librarian=Bibliothécaire -Cartographer=Cartographe -Armorer=Armurier -Leatherworker=Tanneur -Butcher=Boucher -Weapon Smith=Fabriquant d'arme -Tool Smith=Fabriquant d'outil -Cleric=Clerc -Nitwit=Crétin -Protects you from death while wielding it=Vous protège de la mort en la maniant diff --git a/mods/ENTITIES/mobs_mc/locale/mobs_mc.ru.tr b/mods/ENTITIES/mobs_mc/locale/mobs_mc.ru.tr deleted file mode 100644 index 8857dda97..000000000 --- a/mods/ENTITIES/mobs_mc/locale/mobs_mc.ru.tr +++ /dev/null @@ -1,76 +0,0 @@ -# textdomain: mobs_mc -Totem of Undying=Тотем бессмертия -A totem of undying is a rare artifact which may safe you from certain death.=Тотем бессмертия это редкий артефакт, способный спасти вас от смерти. -The totem only works while you hold it in your hand. If you receive fatal damage, you are saved from death and you get a second chance with 1 HP. The totem is destroyed in the process, however.=Тотем работает только когда вы держите его в руке. Если вы получаете смертельный урон, вы спасаетесь от смерти и получаете второй шанс с 1 HP. Однако тотем при этом уничтожается. -Agent=Агент -Bat=Летучая мышь -Blaze=Ифрит -Chicken=Курица -Cow=Корова -Mooshroom=Гриб -Creeper=Крипер -Ender Dragon=Дракон Предела -Enderman=Эндермен -Endermite=Эндермит -Ghast=Гаст -Elder Guardian=Древний страж -Guardian=Страж -Horse=Лошадь -Skeleton Horse=Скелет лошади -Zombie Horse=Зомби-лошадь -Donkey=Ослик -Mule=Мул -Iron Golem=Железный голем -Llama=Лама -Ocelot=Оцелот -Parrot=Попугай -Pig=Свинья -Polar Bear=Полярный медведь -Rabbit=Кролик -Killer Bunny=Кролик-убийца -The Killer Bunny=Кролик-убийца -Sheep=Овца -Shulker=Шалкер -Silverfish=Чешуйница -Skeleton=Скелет -Stray=Странник -Wither Skeleton=Скелет-иссушитель -Magma Cube=Лавовый куб -Slime=Слизняк -Snow Golem=Снежный голем -Spider=Паук -Cave Spider=Пещерный паук -Squid=Кальмар -Vex=Досаждатель -Evoker=Маг -Illusioner=Иллюзор -Villager=Житель -Vindicator=Поборник -Zombie Villager=Зомби-житель -Witch=Ведьма -Wither=Иссушитель -Wolf=Волк -Husk=Кадавр -Zombie=Зомби -Zombie Pigman=Зомби-свиночеловек -Iron Horse Armor=Железные доспехи лошади -Iron horse armor can be worn by horses to increase their protection from harm a bit.=Железные доспехи лошади, надетые на лошадь, немного защищают её от вреда. -Golden Horse Armor=Золотые доспехи лошади -Golden horse armor can be worn by horses to increase their protection from harm.=Золотые доспехи лошади, надетые на лошадь, защищают её от вреда. -Diamond Horse Armor=Алмазные доспехи лошади -Diamond horse armor can be worn by horses to greatly increase their protection from harm.=Алмазные доспехи лошади, надетые на лошадь, отлично защищают её от вреда. -Place it on a horse to put on the horse armor. Donkeys and mules can't wear horse armor.=Поместите это на лошадь, чтобы одеть лошадь в доспехи. Ослики и мулы не могут носить лошадиные доспехи. -Farmer=Фермер -Fisherman=Рыбак -Fletcher=Лучник -Shepherd=Пастух -Librarian=Библиотекарь -Cartographer=Картограф -Armorer=Бронник -Leatherworker=Кожевник -Butcher=Мясник -Weapon Smith=Оружейник -Tool Smith=Инструментальщик -Cleric=Церковник -Nitwit=Нищий -Protects you from death while wielding it=Защищает вас от смерти, пока вы владеете им diff --git a/mods/ENTITIES/mobs_mc/locale/template.txt b/mods/ENTITIES/mobs_mc/locale/template.txt deleted file mode 100644 index 04ba9e465..000000000 --- a/mods/ENTITIES/mobs_mc/locale/template.txt +++ /dev/null @@ -1,75 +0,0 @@ -# textdomain: mobs_mc -Totem of Undying= -A totem of undying is a rare artifact which may safe you from certain death.= -The totem only works while you hold it in your hand. If you receive fatal damage, you are saved from death and you get a second chance with 1 HP. The totem is destroyed in the process, however.= -Agent= -Bat= -Blaze= -Chicken= -Cow= -Mooshroom= -Creeper= -Ender Dragon= -Enderman= -Endermite= -Ghast= -Elder Guardian= -Guardian= -Horse= -Skeleton Horse= -Zombie Horse= -Donkey= -Mule= -Iron Golem= -Llama= -Ocelot= -Parrot= -Pig= -Polar Bear= -Rabbit= -Killer Bunny= -Sheep= -Shulker= -Silverfish= -Skeleton= -Stray= -Wither Skeleton= -Magma Cube= -Slime= -Snow Golem= -Spider= -Cave Spider= -Squid= -Vex= -Evoker= -Illusioner= -Villager= -Vindicator= -Zombie Villager= -Witch= -Wither= -Wolf= -Husk= -Zombie= -Zombie Pigman= -Iron Horse Armor= -Iron horse armor can be worn by horses to increase their protection from harm a bit.= -Golden Horse Armor= -Golden horse armor can be worn by horses to increase their protection from harm.= -Diamond Horse Armor= -Diamond horse armor can be worn by horses to greatly increase their protection from harm.= -Place it on a horse to put on the horse armor. Donkeys and mules can't wear horse armor.= -Farmer= -Fisherman= -Fletcher= -Shepherd= -Librarian= -Cartographer= -Armorer= -Leatherworker= -Butcher= -Weapon Smith= -Tool Smith= -Cleric= -Nitwit= -Protects you from death while wielding it= diff --git a/mods/ENTITIES/mobs_mc/mod.conf b/mods/ENTITIES/mobs_mc/mod.conf deleted file mode 100644 index 98f48b388..000000000 --- a/mods/ENTITIES/mobs_mc/mod.conf +++ /dev/null @@ -1,6 +0,0 @@ -name = mobs_mc -author = maikerumine -description = Adds Minecraft-like monsters and animals. -depends = mcl_init, mcl_particles, mcl_mobs, mcl_wip -optional_depends = default, mcl_tnt, mcl_bows, mcl_throwing, mcl_fishing, bones, mesecons_materials, mobs_mc_gameconfig, doc_items - diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_agent.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_agent.b3d deleted file mode 100644 index 3e79c009b9000e574bfd819693ea836b427c27c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41853 zcmeI53zQVqwT5>@W1^@;lMxgn8uW@pV5U)Iy1F+Y578OqAsXX5ItmIR2#7?f1Bz%O zF(M#fjH2f0BRHtMnkjrlVjL3;LX0NHXw+!p$|Y*dg{yPdUwa?Ar|6pAE8e?SZk)Xq ztE$%i>Qr@|Gy9zL*Qw2*L7BnR?jiaV5e*tWc1$nQ{VCI~7}u*$pK2m<-1?sou$GpV zmJz269+J6-==>=YdrfG#Xlm>z+O8*is~9F>>=DPffHBU$1T6}x{OV1t<5#5z1n!)hjHKPlAe{`ehUU7aFE;+Vsd)WY;_JhY^1Z)! zefVdX{B4#0s9yiY=DNJUzC51|@%7=y^}WCNeBrPBd@I#YrSd=C{himw_2v1Ze#+M$ z{3F|VzWDv(FaLbSpI-lHpCc=_&q}|4^>dwB+ef1PyPUQU*87Y7#r6;Xc_=^jzqm{L zhlyY7KmPkDwm;a6`26yI{QZa@*Wa~#`TIKlf#G@hpWCJV4~W|z{3zf1i`R#LhRNSn z`2+O&Pw&$HDZW1ZxW4xn+dup>OnzM7pI?0bQa!u z^cSBm`~x_v{(~Oen27)6ydULzf3f|+KQcbQyuTZJKd$f3$MvQEfPVn)FVg!f6aU4p zzc2O|uP^Zl=U4K#Rer5r|DXpqCgMNh(}38ozc2O|+rPvwoL|YWzrSqxmFlNb{i6Q# z`pNjjMBUnWKDhsG74AQN{%P&2Lj6hkZM3iW`jvivrTY10a~VZxw%aH?-u)e zEqHCGzjga3ex|uD_HS)&PPTto>__?DUu=J{Zf*Dn#LqvyeE13X7wP>a+CQGJ`1SWC z+P~B<&adQetNfqq^|v-RC)y|aZ;Ji;`xEUS{%$5euAf#u>aVT(sZ_sszUAu&@nu6k z{rTYjH{|jA(|=$5{8QQ&%5SUwr2O>yNBfWOug%|IseWE+uFFrJ@+vCe9p+GqTH%RisE{Z{yWu8r%X{I=>(%1>`!Xn$1k z_gAW)?=0=Yi}SDYf3-;aEvcXQ?+gCdSD!S%`%9ib;#YpL`a2Lst>?cO--sXOdw;S0 z!M`Cszq}vMNBp?HKfl=i;qQj~i}e1=#DDSY?<*7kH^k>x^0!s~ZF>C+g&G#petE29sZZf7$XY)la4RMg5h3{)kURc)sPI5AL6+?cWza|CIJ6@h`ppr2O>u zh4vTUUz_c-QvEzKVJW}Tw6w5t7yV}>6ZK*EFKKy=y}#K0;op>hSp9GAGXKT+MEoe< z`-|-#{yvQJ%ln~ei67VZ=NH>Q{G0N-T~QbNU*2W@d-+a3%J=@__2KWsIKPq~*Z1ca zuP^2AuGcT@GXFgpwBSLi=Bl$NA;`Xy4-3`cKR+V$C=A=!B)Qe`VSBFMgEo{jJ;oiagG*-O(*mFlNb{iZ*Ew7*KvudUyQ=R=f!eUwj> zUVq|GZ(nGCQhrI(qn+>vl&;@;(6X1z;WY81`u*+JlII?WxDu-;0PoOGKX` zqP_JP`}-2nK19@!i1yQC?C(!RpCh79M09{2W50@szCc8uC!z!O82bkiQ5PcWOhgCk zG4{VmM28SjS0Xx8kFkF^5gmqEH4%MDkFkFw5gkE9-HGTw^ced`6HyN$I*N#T>M{25 zdgd4+`Z5vq)?@6~5D{M0^dX{*9%KJFB083c`Vvt;J;r`55%njcJ;wg`iRgPo zbT1M8K##HiV2iULnNyEYcE`z2AwiuNF2G;d|<;%PZ$CmOk-ah;9v-LFa$an z0vZf~4u+ryL%@Ui8%Dr`A^5=%_+SWdFa$mrf*=e55QabpLjZ&!7{U+;VF-9I1VR{s zA`Af$hQJ3yK!hPU!Vnl?2!JpIMi_!53;_~`KnO#CgdteM5GY{?h%f|77=k7Y0TYJ6 z2t&YxA$YnFt!M^*dhR9i(rf`0x`A-xY!~PV~e1SEdnyO2)x)LAY+T*j4c8) zwg|v51ZEh5Gz7y>;E0Ud@w4@1z0A>hLh*kK6xFa&=X0zV7^9)`dVLni=32LMB$hoJ+2 zp)-J?BY+{`!_X1H&?&&sA;1v$VdxNG=p10^7+~lCVCWcN=pz1cnX+ zhK>Y=P6dVz1%{3Th7JXW&IN{!1$Od~Gsd{RB%W&@;M(XvobNxhpD?l7mzY@XZ%ix( z-Dtv=`_+ES#A@GWVzvJ>vD!zPSnWqmtoF4gR{LWUt9`bK)qdT?YTs{Sb$noAbqrx* zb(~>hbu40Hb-ZF?bxdPob=+fOb!=o}b^K&vb&O?VbsT15b*yG$bv$Qcb3xSb#7*2b^c~z zb&h9ZbslJ9b*^Y)bv|igA>vubXAm;x97Z&*;rw{YN4!#L&R__B8FoTF&vAC;aEfr$0A}l77@d-h!~DV#BeMkhGP*i z9E*tISVRoRB4Rie5yP>F7>-56a4aH*V-YbNi-_S^L=49wVmKBN!?B1Mj@v~Hv415I zL;DYOA<6#3YhF7=3=8W;3=8W;3=8W;3=8W;3=8W;3=8W;3=8W;3=8W;3=8W;3=8W; z3=8W;3=8W;3=8W;3=8W;3=8W;3=8W;3=8W;3=8W;3=8W;3=8W;3=8W;3=8W;3=8W; z3=8W;3=8W;3=8W;3=8W;3=8W;3=8W;3=8W;3=8W;3=8W;3=8W;3=8W;3=8W;3=8W; z3=8W;3=8W;3=8W;3=8W;3=8W;3=8W;3=8W;3=8W;3=8W;3=8W;3=8W;3=8W;3=8W; z3=8W;3=8W;3=8W;3=8W;3=8W;3=8W;3=8W;3=8W;3=8W;3=8W;3=0bpV|^#0%O+jX zKz}>&vK23M*_Y4j-6c5y)j=syul3nXyNDsyE@Fs%vPBHXvJ%6wti*6ED={3)N({%c z62q~q#BeMtF&xWE49Bt(!?CQya4ah^9Lq`!$FdT`v8=>!EGsb_%SsH#SVD(MqpZYm zEGsb_%SsH#vJ%6wti*6ED={3mufz~*Ux^|1aaUqg=s)5G9KF_OS7IfGm4%35Wg%i% zS%?@`79xg~g@|EgA!1lrh!|EDB8HWPh+$|B%0k4jvJf$>EJO?|3lYQ0Ld3AL5HYMQL<}nn5yQ$t#IUjuF{~^^ z3@Zx}!^%R$u(A*_tSm$fD+>|B%0k4jvJf$>EJO?|3lYQ0Ld3AL5HYMQL<}nn5yQ$t z#IUjuF{~^^jK@1kF1;z^FCI6QE}7~0;q6tt*M+Y%wtk%klkZB}m5lapO7x?n|D|tA z+LvRre^Vm%&wW$kSiUK7EZ>wkmTyWN%Qq#C<(m@6@=b|j`KH9Nd{g3Blnlr6O^IXq zro^#)Q{q^@DRC^{lsJ}eN*v2KC648r636mQiDUVu#Ibx+;#j^ZaV+1IIF@fp9RIt0 zQ&OS-Xr*MNu{)lADH#8!kbi&7@;chBOZw=S#hvc5J0B_oY} zYH5A`vZrVA2^*_wu6(;+21-U6`_Z#E<@Y{pI`2JqM9rsN-wc$DH1?psFU>a}IhDIS zcYfoO9Wxmy8EI^x;g+#hu@qVe{RV0|FW_1qG8z#l#C=>?EB+> ze`mcx$w;z^a-&0gjIO?9ST%{z% zEi_Oxly+<{|j=Iz!uRx*;TzXz?iNb4Bok;Y0iE!G>9j5K!k>`}qp+e5zKh%NnF{ur%+ zl99&FTK;74!Cyjdx_e7){Z}`vg_2Rq`Z~ii-mvB~xs@-5{G+2LW@~O7yADc58aw8N zBXgrRhJ5{|XR^0nyJ{Vjj3n#pZPffAcjF@=-`=Mx=$GBI041Z81?TUhW$8(|PCp3w z+g~3VJn(2u0ZK+G3(l82VBYB5obQDE+e0S@A02!~0ZK+G>p7gWclBwx4U0k^_wo%v z@2jR4pk$O|an2(Rr{|7a5b_0YEC^m1d|d%bMw0dSyX>2%=Z?E2dwP$(bI(5)@)`RL z2#)AnU4W92WPRC_KL1j1(Q6@hm{Jv-c~Zv$l#Ei=mkGYl3EvG4*cS3p`@fL=!NBHq zP%=tcFrHsNXIQZR_K+{FpO^jn_Sx&8WF%S7@4eUBb&q}&M$xg`*Dibgy;>+4iBg zl%IY3v$;9H3Zp$bR|nbs1{9!VBw2qSC->~0yEY1=N$-pbdOqAxfRa(lg7fUuCH-^r z9|)t57ETEI*Uu?H$tY!UpPmi&8lKDE8AhE~hrtQ6<`5~4azY)2fiCHU1J!|0hYdj>5hR~4XSl(PQWf_>}mZwJ@B z8%7u3vno6B-DlQ8$tY#P_f8bk`e!}07HKqM(sjI zdvXk2E9BP!`87WON69hTg^YF~L+qauGXB3O$8apkF&s;B49Aij!?7gCa4g9&97}Qx z$C4bwu_VWEEZ>zlmgE?YB{_y;Nsi$d*_F^)NOBCvk{rXaB*$Muq-k=Y$wbGSXNTG9nc+;w2ertO^;C3K{W|j5Jn-j7Wuy zcu7VYt3pPkLPoqKBaKZ?h#_R8u_|OlDrCesej5M}x^ZfkvJErkH9j7(Uxv*~rOEQwIzuz9uo|?~( zpUEd}Uex&Kd-`RtBqPcCd)R%@+qsuV&0_jsbz@<6Z3as+lB_THi-&$8_pRqc-u}+> zjf3yVX0Rk9$@+4W^#&m$jlJ>UQ-a60htWUYj`|6FNIOVH^ydv(PLsPWF%RCzwiIKd+z3+h0!(Ft;(MA+%vI| zQObG_~dTryqt_8Hk{DQv$LD)=fy%slJ(ER3l5)p z^S#=>{kE@#kdb7IWyk&N&i)NTMmZK`e_92S$Bx~;cFF7S)k4Tfvi|qot-{NM`gz$8 zw$F}*j8fKfxR2f^d^gyCTgXT5|3dbA1Dj(Zqm(V)tK-R^e<^5qE#%#&R0Wex>KF?d zN!FJ=Lj|b%{RRYGI#OS8EH?+-asKPTwA zXhJMxl(N1|Y!{C_IXCH!ko(P=9~{0qjD?JHEXq#`d=N5{EI9m23WpFfO4-u;y?^8A zT&Kk$FZ|Pj;H{z8#X?4s_56R1ADr9c-jKJwenYV1`suNdQOcJ7whucVll#uZ*d@j@dI7 zGD_Lfa<3Y*AmDdHp7HK8*(>f@6$=@qEXwu#tX@Y4D|UoDX4u5+S@({Og^Y46_!sMz zuIttkM%y0Rvi7s%Hq=7MNV5K(`}}#y+P}4g(Gxwktm*Ss)E`1d8k_9jAY`0cqgg&D zOo~^WJG%Fswg2_uA6EJc$Tt2%jSFaBk@2s#BEzwKT;^Cl9CIumg*lcFz8uTPT#n^K zEywZ^mSg$A%CUSrl0*HSf3!n!ukXm7S<=ou&_QshK2PBGAyi5 zkYQncf(#4m6J%IepCH4+`UDvk)+flYus%VCh4l$CEUZtEVPSoO3=8WMWLQ|AAj87? z1Q{0AC&;j{K0$_s^$9X8tWS_(VSR!O3+oePSXiGR!@~Lm85Y(j$gr?77ix1}yK`J3 z^CcVW6J%KK!6(SDus%VCh4l$CEUZtEVPSoO3=69-y-lplCvB|EIc==}wq!!X#rkc@ z+{d2I|Mb|c`Gp;NWLhg3MHK^cj(@K#8IGlwbu2xoW9c0oOV8(6dNs$=V>y=I$g%V^ zj-?lIEIou{iT;iyvOAWj?N}nRV~MtoC6YRpDCt-tpks+{jwNzAmZ;=dB93E;CXO{y z_%t~_1&&W|<5So8v@|~Dj87-yQ^oi+Fh0dg`;rWuS${H8eYXF9CGA-<#6E78j0*jS zg9?r-LCHvCZ~slmch_{xeR_E|(|h@|eV}9{S;+nPckg4@aQC5m=KpbEZD!oKr>dc3 zBw62&Z9e}>p1k(j{NPKE%^Yy-z#1qSY3!)AllXUct;`SjMeodjb=THF$w*_*y>3b`YFd`Cat)+21-Vf_4nKIv&(q@MXU2C9@0BgclNv*C>crC-|uzLPvxe?i}F2g z%49}fd}a-lj3n#Jz2uy)bHnQc^Q%ukKJ#MrzBN!X(%Aa0A+KNX<6KQuHZ!x=%xWkZ zN!H(kY>V{? zl#C?npD(_PnsfN(^_|z(X0ltCJp?5qjm7s?EkA#$@Q3@dnTLBXUjZc}jZM}Ylng5i zCBw=>$*{5*V_8{@!>laEYE~BGIV+1XpOwY9(8^-$Xk{_Jw6Yk3T3L)!tt`f}Ru zlDUsP-Lz!tuk-)ivc1(h73~<~=OJlHCv4yEy?liV8D-f`chBNkhi_hw1R2L~UG|U)8D&`{$ardL zeG?L74BA-Ls6s|rHaT%sA)_ptoDi#!QI*>Rc1OM5k{kWrRJf{fMY9MXgY8GqmO#zQJ(v|{~4d)&Dp7lz-w{^DWTjO#J_ zAr&%Ov3{bRoDi#!(TYu!o6~ZuRmflavYgEW+#rk{DddsVjQKLdeSytOaUWJSr6*5|}{(e=+ z$g7Z1qe4b2*588)895a)s#VA+%c_tOsF2Y|g^aRnvffn4FtI9Rm{=7uOsonSCRT+E z6RSdoiB%!P#Hx^CVpYg6u_|PkSQRo%tO^+>R)q``t3rl}RUyN~s*qt~Rmd>0DrA^g z6*5e$3K=F=g$xs`LWYS|A;ZL~kYQp~$S|=gWSCeLGEA%r875YR3=^wDhKW@n!^EnP mVPaLtFtI9Rm{=7uOsonSCRT+E6RSdoiB%!P#Hx^CV*dwDN+db} diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_arrow_particle.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_arrow_particle.png deleted file mode 100644 index 1d0cd9b1c918a7587048b647b74a9e693de262b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 186 zcmV;r07d_aP)=*@gPe|8w~IIp2xxFL!KTw%GMq og`OK{CQUq)r#N2*GZ$tL06Mn{BnPry4FCWD07*qoM6N<$f{@fhTL1t6 diff --git a/mods/ENTITIES/mobs_mc_gameconfig/mod.conf b/mods/ENTITIES/mobs_mc_gameconfig/mod.conf deleted file mode 100644 index a9d0d3d7b..000000000 --- a/mods/ENTITIES/mobs_mc_gameconfig/mod.conf +++ /dev/null @@ -1,4 +0,0 @@ -name = mobs_mc_gameconfig -author = Wuzzy -description = mobs_mc game configuration for MCL2 -depends = mcl_init, mcl_core diff --git a/mods/ENVIRONMENT/lightning/init.lua b/mods/ENVIRONMENT/lightning/init.lua index 4a58866f9..5d37a8168 100644 --- a/mods/ENVIRONMENT/lightning/init.lua +++ b/mods/ENVIRONMENT/lightning/init.lua @@ -139,34 +139,34 @@ lightning.strike = function(pos) local obj = objs[o] local lua = obj:get_luaentity() -- pig → zombie pigman (no damage) - if lua and lua.name == "mobs_mc:pig" then + if lua and lua.name == "mcl_mobs:pig" then local rot = obj:get_yaw() obj:remove() - obj = add_entity(pos2, "mobs_mc:pigman") + obj = add_entity(pos2, "mcl_mobs:pigman") obj:set_yaw(rot) -- mooshroom: toggle color red/brown (no damage) - elseif lua and lua.name == "mobs_mc:mooshroom" then - if lua.base_texture[1] == "mobs_mc_mooshroom.png" then - lua.base_texture = { "mobs_mc_mooshroom_brown.png", "mobs_mc_mushroom_brown.png" } + elseif lua and lua.name == "mcl_mobs:mooshroom" then + if lua.base_texture[1] == "mcl_mobs_mooshroom.png" then + lua.base_texture = { "mcl_mobs_mooshroom_brown.png", "mcl_mobs_mushroom_brown.png" } else - lua.base_texture = { "mobs_mc_mooshroom.png", "mobs_mc_mushroom_red.png" } + lua.base_texture = { "mcl_mobs_mooshroom.png", "mcl_mobs_mushroom_red.png" } end obj:set_properties({textures = lua.base_texture}) -- villager → witch (no damage) - elseif lua and lua.name == "mobs_mc:villager" then + elseif lua and lua.name == "mcl_mobs:villager" then -- Witches are incomplete, this code is unused -- TODO: Enable this code when witches are working. --[[ local rot = obj:get_yaw() obj:remove() - obj = minetest.add_entity(pos2, "mobs_mc:witch") + obj = minetest.add_entity(pos2, "mcl_mobs:witch") obj:set_yaw(rot) ]] -- charged creeper - elseif lua and lua.name == "mobs_mc:creeper" then + elseif lua and lua.name == "mcl_mobs:creeper" then local rot = obj:get_yaw() obj:remove() - obj = add_entity(pos2, "mobs_mc:creeper_charged") + obj = add_entity(pos2, "mcl_mobs:creeper_charged") obj:set_yaw(rot) -- Other objects: Just damage else @@ -203,14 +203,14 @@ lightning.strike = function(pos) if get_node(pos2).name == "air" then -- Low chance for a lightning to spawn skeleton horse + skeletons if skeleton_lightning then - add_entity(pos2, "mobs_mc:skeleton_horse") + add_entity(pos2, "mcl_mobs:skeleton_horse") local angle, posadd angle = math.random(0, math.pi*2) for i=1,3 do posadd = {x=math.cos(angle),y=0,z=math.sin(angle)} posadd = vector.normalize(posadd) - local mob = add_entity(vector.add(pos2, posadd), "mobs_mc:skeleton") + local mob = add_entity(vector.add(pos2, posadd), "mcl_mobs:skeleton") mob:set_yaw(angle-math.pi/2) angle = angle + (math.pi*2) / 3 end diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_empty.png b/mods/HUD/mcl_base_textures/textures/empty.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_empty.png rename to mods/HUD/mcl_base_textures/textures/empty.png diff --git a/mods/HUD/mcl_bossbars/init.lua b/mods/HUD/mcl_bossbars/init.lua index f1d99e013..96b6b4896 100644 --- a/mods/HUD/mcl_bossbars/init.lua +++ b/mods/HUD/mcl_bossbars/init.lua @@ -78,7 +78,7 @@ end function mcl_bossbars.update_boss(object, name, color) local props = object:get_luaentity() - if not props or not props._cmi_is_mob then + if not props or not props.is_mob then props = object:get_properties() props.health = object:get_hp() end diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index 61ba39b10..798fc784e 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -405,7 +405,7 @@ mcl_inventory.set_creative_formspec = function(player, start_i, pagenum, inv_siz food = "mcl_core:apple", tools = "mcl_core:axe_iron", combat = "mcl_core:sword_gold", - mobs = "mobs_mc:cow", + mobs = "mcl_mobs:cow", brew = "mcl_potions:dragon_breath", matr = "mcl_core:stick", inv = "mcl_chests:chest", diff --git a/mods/ITEMS/REDSTONE/mesecons_pressureplates/init.lua b/mods/ITEMS/REDSTONE/mesecons_pressureplates/init.lua index 2e161ae4d..7fdcc326e 100644 --- a/mods/ITEMS/REDSTONE/mesecons_pressureplates/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_pressureplates/init.lua @@ -28,7 +28,7 @@ local function pp_on_timer(pos, elapsed) local obj_does_activate = function(obj, activated_by) if activated_by.any then return true - elseif activated_by.mob and obj:get_luaentity() and obj:get_luaentity()._cmi_is_mob == true then + elseif activated_by.mob and obj:get_luaentity() and obj:get_luaentity().is_mob == true then return true elseif activated_by.player and obj:is_player() then return true diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index ecd749603..6d2a95454 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -50,16 +50,16 @@ end -- These monsters do not prevent sleep local monster_exceptions = { - ["mobs_mc:ghast"] = true, - ["mobs_mc:enderdragon"] = true, - ["mobs_mc:killer_bunny"] = true, - ["mobs_mc:slime_big"] = true, - ["mobs_mc:slime_small"] = true, - ["mobs_mc:slime_tiny"] = true, - ["mobs_mc:magma_cube_big"] = true, - ["mobs_mc:magma_cube_small"] = true, - ["mobs_mc:magma_cube_tiny"] = true, - ["mobs_mc:shulker"] = true, + ["mcl_mobs:ghast"] = true, + ["mcl_mobs:enderdragon"] = true, + ["mcl_mobs:killer_bunny"] = true, + ["mcl_mobs:slime_big"] = true, + ["mcl_mobs:slime_small"] = true, + ["mcl_mobs:slime_tiny"] = true, + ["mcl_mobs:magma_cube_big"] = true, + ["mcl_mobs:magma_cube_small"] = true, + ["mcl_mobs:magma_cube_tiny"] = true, + ["mcl_mobs:shulker"] = true, } local function lay_down(player, pos, bed_pos, state, skip) @@ -110,7 +110,7 @@ local function lay_down(player, pos, bed_pos, state, skip) local mobname = ent.name local def = minetest.registered_entities[mobname] -- Approximation of monster detection range - if def._cmi_is_mob and ((mobname ~= "mobs_mc:pigman" and def.type == "monster" and not monster_exceptions[mobname]) or (mobname == "mobs_mc:pigman" and ent.state == "attack")) then + if def.is_mob and ((mobname ~= "mcl_mobs:pigman" and def.type == "monster" and not monster_exceptions[mobname]) or (mobname == "mcl_mobs:pigman" and ent.state == "attack")) then if math.abs(bed_pos.y - obj:get_pos().y) <= 5 then return false, S("You can't sleep now, monsters are nearby!") end diff --git a/mods/ITEMS/mcl_bows/arrow.lua b/mods/ITEMS/mcl_bows/arrow.lua index a6f0c13db..ab99de431 100644 --- a/mods/ITEMS/mcl_bows/arrow.lua +++ b/mods/ITEMS/mcl_bows/arrow.lua @@ -58,6 +58,8 @@ local ARROW_ENTITY={ textures = {"mcl_bows_arrow.png"}, collisionbox = {-0.19, -0.125, -0.19, 0.19, 0.125, 0.19}, collide_with_objects = false, + + is_arrow = true, _fire_damage_resistant = true, _lastpos={}, @@ -69,7 +71,6 @@ local ARROW_ENTITY={ _stuckrechecktimer=nil,-- An additional timer for periodically re-checking the stuck status of an arrow _stuckin=nil, --Position of node in which arow is stuck. _shooter=nil, -- ObjectRef of player or mob who shot it - _is_arrow = true, _viscosity=0, -- Viscosity of node the arrow is currently in _deflection_cooloff=0, -- Cooloff timer after an arrow deflection, to prevent many deflections in quick succession @@ -187,7 +188,7 @@ ARROW_ENTITY.on_step = function(self, dtime) maxsize = 2, collisiondetection = false, vertical = false, - texture = "mobs_mc_arrow_particle.png", + texture = "mcl_mobs_arrow_particle.png", glow = 1, }) end @@ -210,7 +211,7 @@ ARROW_ENTITY.on_step = function(self, dtime) if obj:is_player() then ok = true elseif obj:get_luaentity() ~= nil then - if (obj:get_luaentity()._cmi_is_mob or obj:get_luaentity()._hittable_by_projectile) then + if (obj:get_luaentity().is_mob or obj:get_luaentity()._hittable_by_projectile) then ok = true end end @@ -233,7 +234,7 @@ ARROW_ENTITY.on_step = function(self, dtime) local obj = closest_object local is_player = obj:is_player() local lua = obj:get_luaentity() - if obj == self._shooter and self._time_in_air > 1.02 or obj ~= self._shooter and (is_player or (lua and (lua._cmi_is_mob or lua._hittable_by_projectile))) then + if obj == self._shooter and self._time_in_air > 1.02 or obj ~= self._shooter and (is_player or (lua and (lua.is_mob or lua._hittable_by_projectile))) then if obj:get_hp() > 0 then -- Check if there is no solid node between arrow and object local ray = minetest.raycast(self.object:get_pos(), obj:get_pos(), true) @@ -254,13 +255,10 @@ ARROW_ENTITY.on_step = function(self, dtime) end -- Punch target object but avoid hurting enderman. - if not lua or lua.name ~= "mobs_mc:enderman" then + if not lua or lua.name ~= "mcl_mobs:enderman" then if self._in_player == false then damage_particles(self.object:get_pos(), self._is_critical) end - if mcl_burning.is_burning(self.object) then - mcl_burning.set_on_fire(obj, 5) - end if self._in_player == false then obj:punch(self.object, 1.0, { full_punch_interval=1.0, @@ -320,7 +318,7 @@ ARROW_ENTITY.on_step = function(self, dtime) -- NOTE: Range has been reduced because mobs unload much earlier than that ... >_> -- TODO: This achievement should be given for the kill, not just a hit if self._shooter and self._shooter:is_player() and vector.distance(pos, self._startpos) >= 20 then - if mod_awards and (entity_name == "mobs_mc:skeleton" or entity_name == "mobs_mc:stray" or entity_name == "mobs_mc:witherskeleton") then + if mod_awards and (entity_name == "mcl_mobs:skeleton" or entity_name == "mcl_mobs:stray" or entity_name == "mcl_mobs:witherskeleton") then awards.unlock(self._shooter:get_player_name(), "mcl:snipeSkeleton") end end diff --git a/mods/ITEMS/mcl_bows/bow.lua b/mods/ITEMS/mcl_bows/bow.lua index 2257fcc5e..8a6b441bb 100644 --- a/mods/ITEMS/mcl_bows/bow.lua +++ b/mods/ITEMS/mcl_bows/bow.lua @@ -33,7 +33,7 @@ local bow_load = {} -- Another player table, this one stores the wield index of the bow being charged local bow_index = {} -mcl_bows.shoot_arrow = function(arrow_item, pos, dir, yaw, shooter, power, damage, is_critical, bow_stack, collectable) +mcl_bows.shoot_arrow = function(arrow_item, pos, dir, yaw, shooter, power, damage, is_critical, bow_stack, collectable, gravity, make_sound) local obj = minetest.add_entity({x=pos.x,y=pos.y,z=pos.z}, arrow_item.."_entity") if power == nil then power = BOW_MAX_SPEED --19 @@ -41,6 +41,9 @@ mcl_bows.shoot_arrow = function(arrow_item, pos, dir, yaw, shooter, power, damag if damage == nil then damage = 3 end + + gravity = gravity or -GRAVITY + local knockback if bow_stack then local enchantments = mcl_enchanting.get_enchantments(bow_stack) @@ -55,7 +58,7 @@ mcl_bows.shoot_arrow = function(arrow_item, pos, dir, yaw, shooter, power, damag end end obj:set_velocity({x=dir.x*power, y=dir.y*power, z=dir.z*power}) - obj:set_acceleration({x=0, y=-GRAVITY, z=0}) + obj:set_acceleration({x=0, y=gravity, z=0}) obj:set_yaw(yaw-math.pi/2) local le = obj:get_luaentity() le._shooter = shooter @@ -65,7 +68,9 @@ mcl_bows.shoot_arrow = function(arrow_item, pos, dir, yaw, shooter, power, damag le._startpos = pos le._knockback = knockback le._collectable = collectable - minetest.sound_play("mcl_bows_bow_shoot", {pos=pos, max_hear_distance=16}, true) + if not no_sound then + minetest.sound_play("mcl_bows_bow_shoot", {pos=pos, max_hear_distance=16}, true) + end if shooter ~= nil and shooter:is_player() then if obj:get_luaentity().player == "" then obj:get_luaentity().player = shooter diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index 824530eb3..3247628ba 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -380,7 +380,7 @@ minetest.register_node(small_name, { type = "fixed", fixed = {-0.4375, -0.5, -0.4375, 0.4375, 0.375, 0.4375}, }, - tiles = {"mcl_chests_blank.png"}, + tiles = {"empty.png"}, use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, _chest_entity_textures = small_textures, _chest_entity_sound = "default_chest", @@ -506,7 +506,7 @@ minetest.register_node(left_name, { type = "fixed", fixed = {-0.4375, -0.5, -0.4375, 0.5, 0.375, 0.4375}, }, - tiles = {"mcl_chests_blank.png"}, + tiles = {"empty.png"}, use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, _chest_entity_textures = left_textures, _chest_entity_sound = "default_chest", @@ -661,7 +661,7 @@ minetest.register_node("mcl_chests:"..basename.."_right", { type = "fixed", fixed = {-0.5, -0.5, -0.4375, 0.4375, 0.375, 0.4375}, }, - tiles = {"mcl_chests_blank.png"}, + tiles = {"empty.png"}, use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, groups = {handy=1,axey=1, container=6,not_in_creative_inventory=1, material_wood=1,flammable=-1,double_chest=2}, drop = drop, @@ -1012,7 +1012,7 @@ minetest.register_node("mcl_chests:ender_chest_small", { _chest_entity_sound = "mcl_chests_enderchest", _chest_entity_mesh = "mcl_chests_chest", _chest_entity_animation_type = "chest", - tiles = {"mcl_chests_blank.png"}, + tiles = {"empty.png"}, use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, --[[{"mcl_chests_ender_chest_top.png", "mcl_chests_ender_chest_bottom.png", "mcl_chests_ender_chest_right.png", "mcl_chests_ender_chest_left.png", @@ -1083,22 +1083,22 @@ local boxtypes = { } local shulker_mob_textures = { - white = "mobs_mc_shulker_white.png", - grey = "mobs_mc_shulker_silver.png", - orange = "mobs_mc_shulker_orange.png", - cyan = "mobs_mc_shulker_cyan.png", - magenta = "mobs_mc_shulker_magenta.png", - violet = "mobs_mc_shulker_purple.png", - lightblue = "mobs_mc_shulker_light_blue.png", - blue = "mobs_mc_shulker_blue.png", - yellow = "mobs_mc_shulker_yellow.png", - brown = "mobs_mc_shulker_brown.png", - green = "mobs_mc_shulker_lime.png", - dark_green = "mobs_mc_shulker_green.png", - pink = "mobs_mc_shulker_pink.png", - red = "mobs_mc_shulker_red.png", - dark_grey = "mobs_mc_shulker_gray.png", - black = "mobs_mc_shulker_black.png", + white = "mcl_mobs_shulker_white.png", + grey = "mcl_mobs_shulker_silver.png", + orange = "mcl_mobs_shulker_orange.png", + cyan = "mcl_mobs_shulker_cyan.png", + magenta = "mcl_mobs_shulker_magenta.png", + violet = "mcl_mobs_shulker_purple.png", + lightblue = "mcl_mobs_shulker_light_blue.png", + blue = "mcl_mobs_shulker_blue.png", + yellow = "mcl_mobs_shulker_yellow.png", + brown = "mcl_mobs_shulker_brown.png", + green = "mcl_mobs_shulker_lime.png", + dark_green = "mcl_mobs_shulker_green.png", + pink = "mcl_mobs_shulker_pink.png", + red = "mcl_mobs_shulker_red.png", + dark_grey = "mcl_mobs_shulker_gray.png", + black = "mcl_mobs_shulker_black.png", } local canonical_shulker_color = "violet" @@ -1214,7 +1214,7 @@ for color, desc in pairs(boxtypes) do _doc_items_longdesc = longdesc, _doc_items_usagehelp = usagehelp, drawtype = "nodebox", - tiles = {"mcl_chests_blank.png"}, + tiles = {"empty.png"}, use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, _chest_entity_textures = {mob_texture}, _chest_entity_sound = "mcl_chests_shulker", diff --git a/mods/ITEMS/mcl_chests/textures/mcl_chests_blank.png b/mods/ITEMS/mcl_chests/textures/mcl_chests_blank.png deleted file mode 100644 index baee128d431db678799b44e683939c65a391d717..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 570 zcmV-A0>%A_P)EX>4Tx04R}tkv&MmP!xqvQ;Q-MhjtKg$WWauNELC^DionYs1;guFnQ@8G-*gu zTpR`0f`dPcRRQHpmtPfoUlBkM5rmMCnPtpLQX0PXbx++?cX6KO-}h$?s0E7w0g-r?8KzCVK|H-_ z8=UuvqpU2e#OK80CS8#Dk?V@bZ=6dm3p_JwW;64|QDU*w#Yz{mvZ)bI5yw=bb>jVfs16O*-Uuyz0pQJZB zTI>iI+y*YLJDRcwT zjFl*R-RIqX-E;f5r#-(PFD!D5_eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{000t6L_t(I%VS^|1*2dTi~T%77XSbN diff --git a/mods/ITEMS/mcl_core/crafting.lua b/mods/ITEMS/mcl_core/crafting.lua index a0ad38a77..6d3a9e7e5 100644 --- a/mods/ITEMS/mcl_core/crafting.lua +++ b/mods/ITEMS/mcl_core/crafting.lua @@ -245,14 +245,14 @@ minetest.register_craft({ minetest.register_craft({ type = "cooking", output = 'mcl_core:iron_nugget', - recipe = 'mobs_mc:iron_horse_armor', + recipe = 'mcl_mobs:iron_horse_armor', cooktime = 10, }) minetest.register_craft({ type = "cooking", output = 'mcl_core:gold_nugget', - recipe = 'mobs_mc:gold_horse_armor', + recipe = 'mcl_mobs:gold_horse_armor', cooktime = 10, }) diff --git a/mods/ITEMS/mcl_core/nodes_misc.lua b/mods/ITEMS/mcl_core/nodes_misc.lua index 8b36f0696..800c87847 100644 --- a/mods/ITEMS/mcl_core/nodes_misc.lua +++ b/mods/ITEMS/mcl_core/nodes_misc.lua @@ -31,7 +31,7 @@ minetest.register_node("mcl_core:slimeblock", { node_box = { type = "fixed", fixed = { - {-0.25, -0.25, -0.25, 0.25, 0.25, 0.25}, + {-0.25, -0.25, -0.25, 0.25, 0.25, 0.25}, {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, } }, @@ -108,7 +108,7 @@ minetest.register_node("mcl_core:cobweb", { liquid_renewable = false, liquid_range = 0, walkable = false, - groups = {swordy_cobweb=1, shearsy_cobweb=1, fake_liquid=1, disable_jump=1, deco_block=1, dig_by_piston=1, dig_by_water=1,destroy_by_lava_flow=1,}, + groups = {swordy_cobweb=1, shearsy_cobweb=1, fake_liquid=1, disable_jump=1, deco_block=1, dig_by_piston=1, dig_by_water=1,destroy_by_lava_flow=1, stuck = tr}, drop = "mcl_mobitems:string", _mcl_shears_drop = true, sounds = mcl_sounds.node_sound_leaves_defaults(), @@ -213,7 +213,7 @@ minetest.register_node("mcl_core:barrier", { -- Same as barrier, but non-pointable. This node is only to be used internally to separate realms. -- It must NOT be used for anything else. -- This node only exists because Minetest does not have support for “dimensions” yet and needs to --- be removed when support for this is implemented. +-- be removed when support for this is implemented. minetest.register_node("mcl_core:realm_barrier", { description = S("Realm Barrier"), _doc_items_create_entry = false, diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index 84327e3f6..4e3e680e7 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -10,7 +10,7 @@ local function increase_damage(damage_group, factor) end end --- implemented via on_enchant and additions in mobs_mc; Slowness IV part unimplemented +-- implemented via on_enchant and additions in mcl_mobs; Slowness IV part unimplemented mcl_enchanting.enchantments.bane_of_arthropods = { name = S("Bane of Arthropods"), max_level = 5, @@ -126,14 +126,13 @@ mcl_enchanting.enchantments.fire_aspect = { inv_tool_tab = false, } -minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, tool_capabilities, dir, damage) - if hitter and hitter:is_player() then - local wielditem = hitter:get_wielded_item() - if wielditem then - local fire_aspect_level = mcl_enchanting.get_enchantment(wielditem, "fire_aspect") - if fire_aspect_level > 0 then - mcl_burning.set_on_fire(player, fire_aspect_level * 4) - end +mcl_damage.register_on_damage(function(obj, damage, reason) + if reason.direct then + local wield = mcl_util.get_wielded_item(reason.direct) + + local fire_aspect_level = mcl_enchanting.get_enchantment(wielditem, "fire_aspect") + if fire_aspect_level > 0 then + mcl_burning.set_on_fire(player, fire_aspect_level * 4) end end end) @@ -284,7 +283,7 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool return knockback end --- implemented in mcl_mobs and mobs_mc +-- implemented in mcl_mobs mcl_enchanting.enchantments.looting = { name = S("Looting"), max_level = 3, @@ -550,7 +549,7 @@ mcl_enchanting.enchantments.silk_touch = { inv_tool_tab = true, } --- implemented via on_enchant and additions in mobs_mc +-- implemented via on_enchant and additions in mcl_mobitems mcl_enchanting.enchantments.smite = { name = S("Smite"), max_level = 5, diff --git a/mods/ITEMS/mcl_end/end_crystal.lua b/mods/ITEMS/mcl_end/end_crystal.lua index 78fcc0e21..470513dc6 100644 --- a/mods/ITEMS/mcl_end/end_crystal.lua +++ b/mods/ITEMS/mcl_end/end_crystal.lua @@ -68,7 +68,7 @@ local function spawn_crystal(pos) end local portal_pos = vector.add(portal_center, vector.new(-3, -1, -3)) mcl_structures.call_struct(portal_pos, "end_exit_portal") - minetest.add_entity(vector.add(portal_pos, vector.new(3, 11, 3)), "mobs_mc:enderdragon"):get_luaentity()._portal_pos = portal_pos + minetest.add_entity(vector.add(portal_pos, vector.new(3, 11, 3)), "mcl_mobs:enderdragon"):get_luaentity()._portal_pos = portal_pos end minetest.register_entity("mcl_end:crystal", { diff --git a/mods/ITEMS/mcl_farming/mod.conf b/mods/ITEMS/mcl_farming/mod.conf index fe4bc1564..4004ec290 100644 --- a/mods/ITEMS/mcl_farming/mod.conf +++ b/mods/ITEMS/mcl_farming/mod.conf @@ -1,3 +1,3 @@ name = mcl_farming -depends = mcl_core, mcl_sounds, mcl_wool, mcl_torches, mcl_weather, mobs_mc, mcl_colors, mcl_init +depends = mcl_core, mcl_sounds, mcl_wool, mcl_torches, mcl_weather, mcl_mobs, mcl_colors, mcl_init optional_depends = mcl_armor, doc diff --git a/mods/ITEMS/mcl_farming/pumpkin.lua b/mods/ITEMS/mcl_farming/pumpkin.lua index 86ddf707b..d117dcdfb 100644 --- a/mods/ITEMS/mcl_farming/pumpkin.lua +++ b/mods/ITEMS/mcl_farming/pumpkin.lua @@ -116,7 +116,7 @@ pumpkin_face_base_def.groups.non_combat_armor=1 pumpkin_face_base_def.groups.armor_head=1 pumpkin_face_base_def.groups.non_combat_armor_head=1 pumpkin_face_base_def._mcl_armor_mob_range_factor = 0 -pumpkin_face_base_def._mcl_armor_mob_range_mob = "mobs_mc:enderman" +pumpkin_face_base_def._mcl_armor_mob_range_mob = "mcl_mobs:enderman" pumpkin_face_base_def._mcl_armor_element = "head" pumpkin_face_base_def._mcl_armor_texture = "mcl_farming_pumpkin_face.png" pumpkin_face_base_def._mcl_armor_preview = "mcl_farming_pumpkin_face_preview.png" @@ -131,8 +131,8 @@ mcl_farming:add_plant("plant_pumpkin_stem", "mcl_farming:pumpkintige_unconnect", mcl_farming:add_gourd("mcl_farming:pumpkintige_unconnect", "mcl_farming:pumpkintige_linked", "mcl_farming:pumpkintige_unconnect", stem_def, stem_drop, "mcl_farming:pumpkin_face", pumpkin_face_base_def, 30, 15, "mcl_farming_pumpkin_stem_connected.png^[colorize:#FFA800:127", function(pos) -- Attempt to spawn iron golem or snow golem - mobs_mc.tools.check_iron_golem_summon(pos) - mobs_mc.tools.check_snow_golem_summon(pos) + mcl_mobs.check_iron_golem_summon(pos) + mcl_mobs.check_snow_golem_summon(pos) end) -- Jack o'Lantern @@ -149,8 +149,8 @@ minetest.register_node("mcl_farming:pumpkin_face_light", { sounds = mcl_sounds.node_sound_wood_defaults(), on_construct = function(pos) -- Attempt to spawn iron golem or snow golem - mobs_mc.tools.check_iron_golem_summon(pos) - mobs_mc.tools.check_snow_golem_summon(pos) + mcl_mobs.check_iron_golem_summon(pos) + mcl_mobs.check_snow_golem_summon(pos) end, on_rotate = on_rotate, _mcl_blast_resistance = 1, diff --git a/mods/ITEMS/mcl_fire/fire_charge.lua b/mods/ITEMS/mcl_fire/fire_charge.lua index 69e536790..59bb1bd26 100644 --- a/mods/ITEMS/mcl_fire/fire_charge.lua +++ b/mods/ITEMS/mcl_fire/fire_charge.lua @@ -48,7 +48,7 @@ minetest.register_craftitem("mcl_fire:fire_charge", { _on_dispense = function(stack, pos, droppos, dropnode, dropdir) -- Throw fire charge local shootpos = vector.add(pos, vector.multiply(dropdir, 0.51)) - local fireball = add_entity(shootpos, "mobs_mc:blaze_fireball") + local fireball = add_entity(shootpos, "mcl_mobs:blaze_fireball") local ent = fireball:get_luaentity() ent._shot_from_dispenser = true local v = ent.velocity or 1 diff --git a/mods/ITEMS/mcl_fire/init.lua b/mods/ITEMS/mcl_fire/init.lua index 176fb250c..338dbbccb 100644 --- a/mods/ITEMS/mcl_fire/init.lua +++ b/mods/ITEMS/mcl_fire/init.lua @@ -47,7 +47,7 @@ local alldirs= { x = 0, y = 0, z = 1} } -local smoke_pdef = { +local smokedef = mcl_particles.get_smoke_def({ amount = 0.009, maxexptime = 4.0, minvel = { x = -0.1, y = 0.3, z = -0.1 }, @@ -56,7 +56,7 @@ local smoke_pdef = { maxsize = 4.5, minrelpos = { x = -0.45, y = -0.45, z = -0.45 }, maxrelpos = { x = 0.45, y = 0.45, z = 0.45 }, -} +}) -- -- Items @@ -225,7 +225,7 @@ minetest.register_node("mcl_fire:fire", { end fire_timer(pos) - mcl_particles.spawn_smoke(pos, "fire", smoke_pdef) + mcl_particles.add_node_smoke_particlespawner(pos, smokedef) end, on_destruct = function(pos) mcl_particles.delete_node_particlespawners(pos) @@ -289,7 +289,7 @@ minetest.register_node("mcl_fire:eternal_fire", { if has_mcl_portals then --Calling directly minetest.get_modpath consumes 4x more compute time mcl_portals.light_nether_portal(pos) end - mcl_particles.spawn_smoke(pos, "fire", smoke_pdef) + mcl_particles.add_node_smoke_particlespawner(pos, smokedef) end, on_destruct = function(pos) mcl_particles.delete_node_particlespawners(pos) @@ -549,7 +549,7 @@ minetest.register_lbm({ nodenames = {"group:fire"}, run_at_every_load = true, action = function(pos, node) - mcl_particles.spawn_smoke(pos, "fire", smoke_pdef) + mcl_particles.add_node_smoke_particlespawner(pos, smokedef) end, }) diff --git a/mods/ITEMS/mcl_heads/init.lua b/mods/ITEMS/mcl_heads/init.lua index 0f41adb89..90f985806 100644 --- a/mods/ITEMS/mcl_heads/init.lua +++ b/mods/ITEMS/mcl_heads/init.lua @@ -159,9 +159,9 @@ local function addhead(name, texture, desc, longdesc, rangemob, rangefactor) end -- Add heads -addhead("zombie", "mcl_heads_zombie_node.png", S("Zombie Head"), S("A zombie head is a small decorative block which resembles the head of a zombie. It can also be worn as a helmet, which reduces the detection range of zombies by 50%."), "mobs_mc:zombie", 0.5) -addhead("creeper", "mcl_heads_creeper_node.png", S("Creeper Head"), S("A creeper head is a small decorative block which resembles the head of a creeper. It can also be worn as a helmet, which reduces the detection range of creepers by 50%."), "mobs_mc:creeper", 0.5) +addhead("zombie", "mcl_heads_zombie_node.png", S("Zombie Head"), S("A zombie head is a small decorative block which resembles the head of a zombie. It can also be worn as a helmet, which reduces the detection range of zombies by 50%."), "mcl_mobs:zombie", 0.5) +addhead("creeper", "mcl_heads_creeper_node.png", S("Creeper Head"), S("A creeper head is a small decorative block which resembles the head of a creeper. It can also be worn as a helmet, which reduces the detection range of creepers by 50%."), "mcl_mobs:creeper", 0.5) -- Original Minecraft name: “Head” addhead("steve", "mcl_heads_steve_node.png", S("Human Head"), S("A human head is a small decorative block which resembles the head of a human (i.e. a player character). It can also be worn as a helmet for fun, but does not offer any protection.")) -addhead("skeleton", "mcl_heads_skeleton_node.png", S("Skeleton Skull"), S("A skeleton skull is a small decorative block which resembles the skull of a skeleton. It can also be worn as a helmet, which reduces the detection range of skeletons by 50%."), "mobs_mc:skeleton", 0.5) +addhead("skeleton", "mcl_heads_skeleton_node.png", S("Skeleton Skull"), S("A skeleton skull is a small decorative block which resembles the skull of a skeleton. It can also be worn as a helmet, which reduces the detection range of skeletons by 50%."), "mcl_mobs:skeleton", 0.5) addhead("wither_skeleton", "mcl_heads_wither_skeleton_node.png", S("Wither Skeleton Skull"), S("A wither skeleton skull is a small decorative block which resembles the skull of a wither skeleton. It can also be worn as a helmet for fun, but does not offer any protection.")) diff --git a/mods/ITEMS/mcl_mobitems/init.lua b/mods/ITEMS/mcl_mobitems/init.lua index 1b7929722..4556a0518 100644 --- a/mods/ITEMS/mcl_mobitems/init.lua +++ b/mods/ITEMS/mcl_mobitems/init.lua @@ -327,6 +327,67 @@ minetest.register_tool("mcl_mobitems:carrot_on_a_stick", { _mcl_toollike_wield = true, }) +minetest.register_craftitem("mcl_mobitems:nametag", { + description = S("Name Tag"), + _tt_help = S("Give names to mobs").."\n"..S("Set name at anvil"), + _doc_items_longdesc = S("A name tag is an item to name a mob."), + _doc_items_usagehelp = S("Before you use the name tag, you need to set a name at an anvil. Then you can use the name tag to name a mob. This uses up the name tag."), + inventory_image = "mcl_mobitems_nametag.png", + wield_image = "mcl_mobitems_nametag.png", + stack_max = 64, + groups = { tool=1 }, +}) + +minetest.register_alias("mobs:nametag", "mcl_mobitems:nametag") +minetest.register_alias("mcl_mobs:nametag", "mcl_mobitems:nametag") + +-- TODO: Balance the horse armor strength, compare with MC horse armor strength + +local horse_armor_use = S("Place it on a horse to put on the horse armor. Donkeys and mules can't wear horse armor.") + +minetest.register_craftitem("mcl_mobitems:iron_horse_armor", { + description = S("Iron Horse Armor"), + _doc_items_longdesc = S("Iron horse armor can be worn by horses to increase their protection from harm a bit."), + _doc_items_usagehelp = horse_armor_use, + inventory_image = "mcl_mobitems_iron_horse_armor.png", + _horse_overlay_image = "mcl_mobitems_horse_armor_iron.png", + sounds = { + _mcl_armor_equip = "mcl_armor_equip_iron", + }, + stack_max = 1, + groups = { horse_armor = 85 }, +}) + +minetest.register_craftitem("mcl_mobitems:gold_horse_armor", { + description = S("Golden Horse Armor"), + _doc_items_longdesc = S("Golden horse armor can be worn by horses to increase their protection from harm."), + _doc_items_usagehelp = horse_armor_use, + inventory_image = "mcl_mobitems_gold_horse_armor.png", + _horse_overlay_image = "mcl_mobitems_horse_armor_gold.png", + sounds = { + _mcl_armor_equip = "mcl_armor_equip_iron", + }, + stack_max = 1, + groups = { horse_armor = 60 }, +}) + +minetest.register_craftitem("mcl_mobitems:diamond_horse_armor", { + description = S("Diamond Horse Armor"), + _doc_items_longdesc = S("Diamond horse armor can be worn by horses to greatly increase their protection from harm."), + _doc_items_usagehelp = horse_armor_use, + inventory_image = "mcl_mobitems_diamond_horse_armor.png", + _horse_overlay_image = "mcl_mobitems_horse_armor_diamond.png", + sounds = { + _mcl_armor_equip = "mcl_armor_equip_diamond", + }, + stack_max = 1, + groups = { horse_armor = 45 }, +}) + +minetest.register_alias("mobs_mc:iron_horse_armor", "mcl_mobitems:iron_horse_armor") +minetest.register_alias("mobs_mc:gold_horse_armor", "mcl_mobitems:gold_horse_armor") +minetest.register_alias("mobs_mc:diamond_horse_armor", "mcl_mobitems:diamond_horse_armor") + ----------- -- Crafting ----------- diff --git a/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.de.tr b/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.de.tr index 2fd938f2f..3a1b10d08 100644 --- a/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.de.tr +++ b/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.de.tr @@ -93,3 +93,16 @@ A carrot on a stick can be used on saddled pigs to ride them.=Eine Karottenrute Place it on a saddled pig to mount it. You can now ride the pig like a horse. Pigs will also walk towards you when you just wield the carrot on a stick.=Platzieren Sie sie auf einem Schwein mit Sattel, um sich aufzusatteln. Sie können nun das Schwein wie ein Pferd reiten. Schweine werden auch auf Sie zugehen, wenn Sie einfach nur die Karottenrute halten. +Name Tag=Namensschild +A name tag is an item to name a mob.=Ein Namensschild ist ein Gegenstand, um einen Mob zu benennen. +Before you use the name tag, you need to set a name at an anvil. Then you can use the name tag to name a mob. This uses up the name tag.=Bevor Sie ein Namensschild benutzen können, müssen Sie ihn an einem Amboss benennen. Dann können können Sie das Namensschild benutztn, um einen Mob zu benennen. Das wird das Namensschild verbrauchen. +Give names to mobs=Benennt Mobs +Set name at anvil=Namen am Amboss setzen + +Iron Horse Armor=Eisenpferderüstung +Iron horse armor can be worn by horses to increase their protection from harm a bit.=Eine Eisenpferderüstung kann von Pferden getragen werden, um ihren Schutz vor Schaden etwas zu erhöhen. +Golden Horse Armor=Goldpferderüstung +Golden horse armor can be worn by horses to increase their protection from harm.=Eine Goldpferderüstung kann von Pferden getragen werden, um ihren Schutz vor Schaden zu erhöhen. +Diamond Horse Armor=Diamantpferderüstung +Diamond horse armor can be worn by horses to greatly increase their protection from harm.=Eine Diamantpferderüstung kann von Pferden getragen werden, um ihren Schutz vor Schaden beträchtlich zu erhöhen. +Place it on a horse to put on the horse armor. Donkeys and mules can't wear horse armor.=Platzieren Sie es auf einem Pferd, um die Pferderüstung aufzusetzen. Esel und Maultiere können keine Pferderüstung tragen. diff --git a/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.es.tr b/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.es.tr index 746a438b0..6b3d3c56f 100644 --- a/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.es.tr +++ b/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.es.tr @@ -93,7 +93,17 @@ A carrot on a stick can be used on saddled pigs to ride them.=La caña con zanah Place it on a saddled pig to mount it. You can now ride the pig like a horse. Pigs will also walk towards you when you just wield the carrot on a stick.=Colóquelo sobre un cerdo ensillado para montarlo. Ahora puedes montar el cerdo como un caballo. Los cerdos también caminarán hacia ti cuando solo manejes la zanahoria en un palo. +Name Tag=Etiqueta +A name tag is an item to name a mob.=Una etiqueta es un elemento para nombrar una animal. +Before you use the name tag, you need to set a name at an anvil. Then you can use the name tag to name a mob. This uses up the name tag.=Antes de usar la etiqueta, debe establecer un nombre en un yunque. Luego puede usar la etiqueta para nombrar un animal. Esto usa la etiqueta. +Iron Horse Armor=Armadura de hierro para caballo +Iron horse armor can be worn by horses to increase their protection from harm a bit.=Los caballos pueden usar armadura de caballo de hierro para aumentar un poco su protección contra el daño. +Golden Horse Armor=Armadura de oro para caballo +Golden horse armor can be worn by horses to increase their protection from harm.=Los caballos pueden usar armadura de caballo de oro para aumentar su protección contra el daño. +Diamond Horse Armor=Armadura de diamante para caballo +Diamond horse armor can be worn by horses to greatly increase their protection from harm.=Los caballos pueden usar armadura de caballo de diamante para aumentar en gran medida su protección contra el daño. +Place it on a horse to put on the horse armor. Donkeys and mules can't wear horse armor.=Colóquelo en un caballo para ponerle la armadura de caballo. Los burros y las mulas no pueden usar armadura de caballo. ##### not used anymore ##### diff --git a/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.fr.tr b/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.fr.tr index eee31278b..9ed8a94a2 100644 --- a/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.fr.tr +++ b/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.fr.tr @@ -40,7 +40,7 @@ Removes all status effects=Supprime tous les effets de statut! Milk is very refreshing and can be obtained by using a bucket on a cow. Drinking it will remove all status effects, but restores no hunger points.=Le lait est très rafraîchissant et peut être obtenu en utilisant un seau sur une vache. Le boire supprimera tous les effets de statut, mais ne restaure aucun point de faim. -Use the placement key to drink the milk.=Utilisez la touche de placement pour boire le lait. +Use the placement key to drink the milk.=Utilisez la touche de placement pour boire le lait. Spider Eye=Oeil d'Araignée Poisonous=Toxique @@ -62,7 +62,7 @@ Magma Cream=Crème de Magma Magma cream is a crafting component.=La crème de magma est un composant artisanal. Ghast Tear=Larme de Ghast Place this item in an item frame as decoration.=Placez cet article dans un cadre d'article comme décoration. -Nether Star=Étoile du Nether +Nether Star=Étoile du Nether A nether star is dropped when the Wither dies. Place it in an item frame to show the world how hardcore you are! Or just as decoration.=Une étoile du Nether est lâchée lorsque le Wither meurt. Placez-le dans un cadre d'objet pour montrer au monde à quel point vous êtes génial! Ou tout simplement comme décoration. @@ -91,4 +91,18 @@ Carrot on a Stick=Carotte sur un Batôn Lets you ride a saddled pig=Vous permet de monter un cochon sellé A carrot on a stick can be used on saddled pigs to ride them.=Une carotte sur un bâton peut être utilisée sur les porcs sellés pour les monter. -Place it on a saddled pig to mount it. You can now ride the pig like a horse. Pigs will also walk towards you when you just wield the carrot on a stick.=Placez-le sur un cochon sellé pour le monter. Vous pouvez maintenant monter le cochon comme un cheval. Les porcs marcheront également vers vous lorsque vous brandirez la carotte sur un bâton. \ No newline at end of file +Place it on a saddled pig to mount it. You can now ride the pig like a horse. Pigs will also walk towards you when you just wield the carrot on a stick.=Placez-le sur un cochon sellé pour le monter. Vous pouvez maintenant monter le cochon comme un cheval. Les porcs marcheront également vers vous lorsque vous brandirez la carotte sur un bâton. + +Name Tag=Étiquette de nom +A name tag is an item to name a mob.=Une étiquette de nom est un élément pour nommer un mob. +Before you use the name tag, you need to set a name at an anvil. Then you can use the name tag to name a mob. This uses up the name tag.=Avant d'utiliser l'étiquette de nom, vous devez définir un nom sur une enclume. Ensuite, vous pouvez utiliser l'étiquette de nom pour nommer un mob. Cela utilise l'étiquette de nom. +Give names to mobs=Donne des noms aux mobs +Set name at anvil=Définir le nom sur l'enclume + +Iron Horse Armor=Armure de cheval en fer +Iron horse armor can be worn by horses to increase their protection from harm a bit.=L'armure de cheval en fer peut être portée par les chevaux pour augmenter un peu leur protection contre les dommages. +Golden Horse Armor=Armure de cheval en or +Golden horse armor can be worn by horses to increase their protection from harm.=Une armure de cheval en or peut être portée par les chevaux pour augmenter leur protection contre les dommages. +Diamond Horse Armor=Armure de cheval en diamant +Diamond horse armor can be worn by horses to greatly increase their protection from harm.=Une armure de cheval en diament peut être portée par les chevaux pour augmenter fortement leur protection contre les dommages. +Place it on a horse to put on the horse armor. Donkeys and mules can't wear horse armor.=Placez-la sur un cheval pour mettre l'armure de cheval. Les ânes et les mules ne peuvent pas porter d'armure de cheval. diff --git a/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.ru.tr b/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.ru.tr index f51e4f562..5439e6be8 100644 --- a/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.ru.tr +++ b/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.ru.tr @@ -93,3 +93,16 @@ A carrot on a stick can be used on saddled pigs to ride them.=Удочку с м Place it on a saddled pig to mount it. You can now ride the pig like a horse. Pigs will also walk towards you when you just wield the carrot on a stick.=Поместите это на осёдланную свинью, чтобы закрепиться на ней. Теперь вы можете ехать на ней, как на лошади. Свиньи также идут вперёд, когда вы просто держите удочку с морковью. +Name Tag=Именная бирка +A name tag is an item to name a mob.=Именная бирка это предмет, чтобы дать мобу имя. +Before you use the name tag, you need to set a name at an anvil. Then you can use the name tag to name a mob. This uses up the name tag.=Прежде чем использовать именную бирку, нужно задать имя на наковальне. Тогда вы сможете использовать бирку, чтобы дать имя мобу. +Give names to mobs=Даёт имена мобам +Set name at anvil=Задайте имя при помощи наковальни + +Iron Horse Armor=Железные доспехи лошади +Iron horse armor can be worn by horses to increase their protection from harm a bit.=Железные доспехи лошади, надетые на лошадь, немного защищают её от вреда. +Golden Horse Armor=Золотые доспехи лошади +Golden horse armor can be worn by horses to increase their protection from harm.=Золотые доспехи лошади, надетые на лошадь, защищают её от вреда. +Diamond Horse Armor=Алмазные доспехи лошади +Diamond horse armor can be worn by horses to greatly increase their protection from harm.=Алмазные доспехи лошади, надетые на лошадь, отлично защищают её от вреда. +Place it on a horse to put on the horse armor. Donkeys and mules can't wear horse armor.=Поместите это на лошадь, чтобы одеть лошадь в доспехи. Ослики и мулы не могут носить лошадиные доспехи. diff --git a/mods/ITEMS/mcl_mobitems/locale/template.txt b/mods/ITEMS/mcl_mobitems/locale/template.txt index ce5bbcabe..63e9aed56 100644 --- a/mods/ITEMS/mcl_mobitems/locale/template.txt +++ b/mods/ITEMS/mcl_mobitems/locale/template.txt @@ -93,3 +93,16 @@ A carrot on a stick can be used on saddled pigs to ride them.= Place it on a saddled pig to mount it. You can now ride the pig like a horse. Pigs will also walk towards you when you just wield the carrot on a stick.= +Name Tag= +A name tag is an item to name a mob.= +Before you use the name tag, you need to set a name at an anvil. Then you can use the name tag to name a mob. This uses up the name tag.= +Give names to mobs= +Set name at anvil= + +Iron Horse Armor= +Iron horse armor can be worn by horses to increase their protection from harm a bit.= +Golden Horse Armor= +Golden horse armor can be worn by horses to increase their protection from harm.= +Diamond Horse Armor= +Diamond horse armor can be worn by horses to greatly increase their protection from harm.= +Place it on a horse to put on the horse armor. Donkeys and mules can't wear horse armor.= diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_diamond_horse_armor.png b/mods/ITEMS/mcl_mobitems/textures/mcl_mobitems_diamond_horse_armor.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_diamond_horse_armor.png rename to mods/ITEMS/mcl_mobitems/textures/mcl_mobitems_diamond_horse_armor.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_gold_horse_armor.png b/mods/ITEMS/mcl_mobitems/textures/mcl_mobitems_gold_horse_armor.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_gold_horse_armor.png rename to mods/ITEMS/mcl_mobitems/textures/mcl_mobitems_gold_horse_armor.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_iron_horse_armor.png b/mods/ITEMS/mcl_mobitems/textures/mcl_mobitems_iron_horse_armor.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_iron_horse_armor.png rename to mods/ITEMS/mcl_mobitems/textures/mcl_mobitems_iron_horse_armor.png diff --git a/mods/ENTITIES/mcl_mobs/textures/mobs_nametag.png b/mods/ITEMS/mcl_mobitems/textures/mcl_mobitems_nametag.png similarity index 100% rename from mods/ENTITIES/mcl_mobs/textures/mobs_nametag.png rename to mods/ITEMS/mcl_mobitems/textures/mcl_mobitems_nametag.png diff --git a/mods/ITEMS/mcl_mobspawners/init.lua b/mods/ITEMS/mcl_mobspawners/init.lua index fe01f4c52..5ddbd3853 100644 --- a/mods/ITEMS/mcl_mobspawners/init.lua +++ b/mods/ITEMS/mcl_mobspawners/init.lua @@ -2,7 +2,7 @@ local S = minetest.get_translator("mcl_mobspawners") mcl_mobspawners = {} -local default_mob = "mobs_mc:pig" +local default_mob = "mcl_mobs:pig" -- Mob spawner local spawner_default = default_mob.." 0 15 4 15" @@ -34,22 +34,22 @@ end -- Manually set the doll sizes for large mobs -- TODO: Relocate this code to mobs_mc local doll_size_overrides = { - ["mobs_mc:guardian"] = { x = 0.6, y = 0.6 }, - ["mobs_mc:guardian_elder"] = { x = 0.72, y = 0.72 }, - ["mobs_mc:enderman"] = { x = 0.8, y = 0.8 }, - ["mobs_mc:iron_golem"] = { x = 0.9, y = 0.9 }, - ["mobs_mc:ghast"] = { x = 1.05, y = 1.05 }, - ["mobs_mc:wither"] = { x = 1.2, y = 1.2 }, - ["mobs_mc:enderdragon"] = { x = 0.16, y = 0.16 }, - ["mobs_mc:witch"] = { x = 0.95, y = 0.95 }, + ["mcl_mobs:guardian"] = { x = 0.6, y = 0.6 }, + ["mcl_mobs:guardian_elder"] = { x = 0.72, y = 0.72 }, + ["mcl_mobs:enderman"] = { x = 0.8, y = 0.8 }, + ["mcl_mobs:iron_golem"] = { x = 0.9, y = 0.9 }, + ["mcl_mobs:ghast"] = { x = 1.05, y = 1.05 }, + ["mcl_mobs:wither"] = { x = 1.2, y = 1.2 }, + ["mcl_mobs:enderdragon"] = { x = 0.16, y = 0.16 }, + ["mcl_mobs:witch"] = { x = 0.95, y = 0.95 }, } local spawn_count_overrides = { - ["mobs_mc:enderdragon"] = 1, - ["mobs_mc:wither"] = 1, - ["mobs_mc:ghast"] = 1, - ["mobs_mc:guardian_elder"] = 1, - ["mobs_mc:guardian"] = 2, - ["mobs_mc:iron_golem"] = 2, + ["mcl_mobs:enderdragon"] = 1, + ["mcl_mobs:wither"] = 1, + ["mcl_mobs:ghast"] = 1, + ["mcl_mobs:guardian_elder"] = 1, + ["mcl_mobs:guardian"] = 2, + ["mcl_mobs:iron_golem"] = 2, } local function set_doll_properties(doll, mob) @@ -152,7 +152,8 @@ local spawn_mobs = function(pos, elapsed) end -- are we spawning a registered mob? - if not mobs.spawning_mobs[mob] then + -- if not mobs.spawning_mobs[mob] then + if true then minetest.log("error", "[mcl_mobspawners] Mob Spawner: Mob doesn't exist: "..mob) return end diff --git a/mods/ITEMS/mcl_monster_eggs/init.lua b/mods/ITEMS/mcl_monster_eggs/init.lua index dd986d127..35b4e3d9a 100644 --- a/mods/ITEMS/mcl_monster_eggs/init.lua +++ b/mods/ITEMS/mcl_monster_eggs/init.lua @@ -5,7 +5,7 @@ local S = minetest.get_translator("mcl_monster_eggs") local spawn_silverfish = function(pos, oldnode, oldmetadata, digger) if not minetest.is_creative_enabled("") then - minetest.add_entity(pos, "mobs_mc:silverfish") + minetest.add_entity(pos, "mcl_mobs:silverfish") end end diff --git a/mods/ITEMS/mcl_monster_eggs/mod.conf b/mods/ITEMS/mcl_monster_eggs/mod.conf index b29601864..02f4d11c4 100644 --- a/mods/ITEMS/mcl_monster_eggs/mod.conf +++ b/mods/ITEMS/mcl_monster_eggs/mod.conf @@ -1,3 +1,3 @@ name = mcl_monster_eggs description = Adds infested blocks: Blocks which which disguise themselves as stone blocks and spawn a silverfish when broken. -depends = mcl_sounds, mobs_mc +depends = mcl_sounds, mcl_mobs diff --git a/mods/ITEMS/mcl_potions/functions.lua b/mods/ITEMS/mcl_potions/functions.lua index 55a98ba9d..cc0b5c792 100644 --- a/mods/ITEMS/mcl_potions/functions.lua +++ b/mods/ITEMS/mcl_potions/functions.lua @@ -165,7 +165,7 @@ minetest.register_globalstep(function(dtime) if is_player then player:set_hp(math.min(player:get_properties().hp_max or 20, player:get_hp() + 1), { type = "set_hp", other = "regeneration" }) EF.regenerating[player].heal_timer = 0 - elseif entity and entity._cmi_is_mob then + elseif entity and entity.is_mob then entity.health = math.min(entity.hp_max, entity.health + 1) EF.regenerating[player].heal_timer = 0 else -- stop regenerating if not a player or mob @@ -537,7 +537,7 @@ function mcl_potions.is_obj_hit(self, pos) if entity and entity.name ~= self.object:get_luaentity().name then - if entity._cmi_is_mob then + if entity.is_mob then return true end @@ -563,7 +563,7 @@ function mcl_potions.make_invisible(player, toggle) if toggle then -- hide player - skin_file = "mobs_mc_empty.png" + skin_file = "empty.png" if entity then EF.invisible[player].old_size = entity.visual_size @@ -572,7 +572,7 @@ function mcl_potions.make_invisible(player, toggle) end if player:is_player() then - mcl_player.player_set_skin(player, "mobs_mc_empty.png") + mcl_player.player_set_skin(player, "empty.png") elseif not player:is_player() then player:set_properties({visual_size = {x = 0, y = 0}}) end @@ -678,7 +678,7 @@ function mcl_potions.healing_func(player, hp) hp = 1 end - if obj and obj._cmi_is_mob then + if obj and obj.is_mob then obj.health = math.max(obj.health + hp, obj.hp_max) elseif player:is_player() then player:set_hp(math.min(player:get_hp() + hp, player:get_properties().hp_max), { type = "set_hp", other = "healing" }) diff --git a/mods/ITEMS/mcl_potions/init.lua b/mods/ITEMS/mcl_potions/init.lua index 6cfa0dc50..140522853 100644 --- a/mods/ITEMS/mcl_potions/init.lua +++ b/mods/ITEMS/mcl_potions/init.lua @@ -280,7 +280,7 @@ local water_splash = function(obj, damage) end -- Damage mobs that are vulnerable to water local lua = obj:get_luaentity() - if lua and lua._cmi_is_mob then + if lua and lua.is_mob then obj:punch(obj, 1.0, { full_punch_interval = 1.0, damage_groups = {water_vulnerable=damage}, @@ -458,4 +458,4 @@ mcl_wip.register_wip_item("mcl_potions:night_vision_plus_splash") mcl_wip.register_wip_item("mcl_potions:night_vision_lingering") mcl_wip.register_wip_item("mcl_potions:night_vision_plus_lingering") mcl_wip.register_wip_item("mcl_potions:night_vision_arrow") -mcl_wip.register_wip_item("mcl_potions:night_vision_plus_arrow") \ No newline at end of file +mcl_wip.register_wip_item("mcl_potions:night_vision_plus_arrow") diff --git a/mods/ITEMS/mcl_potions/lingering.lua b/mods/ITEMS/mcl_potions/lingering.lua index f4f0e249d..2f21e8b2e 100644 --- a/mods/ITEMS/mcl_potions/lingering.lua +++ b/mods/ITEMS/mcl_potions/lingering.lua @@ -67,7 +67,7 @@ minetest.register_globalstep(function(dtime) for _, obj in pairs(minetest.get_objects_inside_radius(pos, d)) do local entity = obj:get_luaentity() - if obj:is_player() or entity._cmi_is_mob then + if obj:is_player() or entity.is_mob then vals.def.potion_fun(obj) -- TODO: Apply timer penalty only if the potion effect was acutally applied diff --git a/mods/ITEMS/mcl_potions/splash.lua b/mods/ITEMS/mcl_potions/splash.lua index f986134d6..b18527646 100644 --- a/mods/ITEMS/mcl_potions/splash.lua +++ b/mods/ITEMS/mcl_potions/splash.lua @@ -106,7 +106,7 @@ function mcl_potions.register_splash(name, descr, color, def) for _,obj in pairs(minetest.get_objects_inside_radius(pos, 4)) do local entity = obj:get_luaentity() - if obj:is_player() or entity._cmi_is_mob then + if obj:is_player() or entity.is_mob then local pos2 = obj:get_pos() local rad = math.floor(math.sqrt((pos2.x-pos.x)^2 + (pos2.y-pos.y)^2 + (pos2.z-pos.z)^2)) diff --git a/mods/ITEMS/mcl_potions/tipped_arrow.lua b/mods/ITEMS/mcl_potions/tipped_arrow.lua index abeae8106..78daf0439 100644 --- a/mods/ITEMS/mcl_potions/tipped_arrow.lua +++ b/mods/ITEMS/mcl_potions/tipped_arrow.lua @@ -193,7 +193,7 @@ function mcl_potions.register_arrow(name, desc, color, def) maxsize = 2, collisiondetection = false, vertical = false, - texture = "mobs_mc_arrow_particle.png", + texture = "mcl_mobs_arrow_particle.png", glow = 1, }) end @@ -216,7 +216,7 @@ function mcl_potions.register_arrow(name, desc, color, def) if obj ~= self._shooter and obj:is_player() then ok = true elseif obj:get_luaentity() ~= nil then - if obj ~= self._shooter and obj:get_luaentity()._cmi_is_mob then + if obj ~= self._shooter and obj:get_luaentity().is_mob then ok = true end end @@ -238,7 +238,7 @@ function mcl_potions.register_arrow(name, desc, color, def) local obj = closest_object local is_player = obj:is_player() local lua = obj:get_luaentity() - if obj ~= self._shooter and (is_player or (lua and lua._cmi_is_mob)) then + if obj ~= self._shooter and (is_player or (lua and lua.is_mob)) then if obj:get_hp() > 0 then -- Check if there is no solid node between arrow and object @@ -260,7 +260,7 @@ function mcl_potions.register_arrow(name, desc, color, def) -- Punch target object but avoid hurting enderman. if lua then - if lua.name ~= "mobs_mc:enderman" then + if lua.name ~= "mcl_mobs:enderman" then obj:punch(self.object, 1.0, { full_punch_interval=1.0, damage_groups={fleshy=self._damage}, @@ -288,7 +288,7 @@ function mcl_potions.register_arrow(name, desc, color, def) -- NOTE: Range has been reduced because mobs unload much earlier than that ... >_> -- TODO: This achievement should be given for the kill, not just a hit if self._shooter and self._shooter:is_player() and vector.distance(pos, self._startpos) >= 20 then - if mod_awards and (entity_name == "mobs_mc:skeleton" or entity_name == "mobs_mc:stray" or entity_name == "mobs_mc:witherskeleton") then + if mod_awards and (entity_name == "mcl_mobs:skeleton" or entity_name == "mcl_mobs:stray" or entity_name == "mcl_mobs:witherskeleton") then awards.unlock(self._shooter:get_player_name(), "mcl:snipeSkeleton") end end diff --git a/mods/ITEMS/mcl_throwing/register.lua b/mods/ITEMS/mcl_throwing/register.lua index c2af9717f..b127c31c9 100644 --- a/mods/ITEMS/mcl_throwing/register.lua +++ b/mods/ITEMS/mcl_throwing/register.lua @@ -57,7 +57,7 @@ local check_object_hit = function(self, pos, dmg) -- TODO: Deal knockback self.object:remove() return true - elseif (entity._cmi_is_mob == true or entity._hittable_by_projectile) and (self._thrower ~= object) then + elseif (entity.is_mob == true or entity._hittable_by_projectile) and (self._thrower ~= object) then -- FIXME: Knockback is broken object:punch(self.object, 1.0, { full_punch_interval = 1.0, @@ -152,7 +152,7 @@ local egg_on_step = function(self, dtime) ent.child = true end if r == 1 then - make_child(minetest.add_entity(self._lastpos, "mobs_mc:chicken")) + make_child(minetest.add_entity(self._lastpos, "mcl_mobs:chicken")) -- BONUS ROUND: 1/32 chance to spawn 3 additional chicks local r = math.random(1,32) @@ -164,7 +164,7 @@ local egg_on_step = function(self, dtime) } for o=1, 3 do local pos = vector.add(self._lastpos, offsets[o]) - make_child(minetest.add_entity(pos, "mobs_mc:chicken")) + make_child(minetest.add_entity(pos, "mcl_mobs:chicken")) end end end @@ -269,7 +269,7 @@ local pearl_on_step = function(self, dtime) -- 5% chance to spawn endermite at the player's origin local r = math.random(1,20) if r == 1 then - minetest.add_entity(oldpos, "mobs_mc:endermite") + minetest.add_entity(oldpos, "mcl_mobs:endermite") end end diff --git a/mods/ITEMS/mcl_torches/api.lua b/mods/ITEMS/mcl_torches/api.lua index c98bda3d9..ea81d6dfb 100644 --- a/mods/ITEMS/mcl_torches/api.lua +++ b/mods/ITEMS/mcl_torches/api.lua @@ -1,4 +1,4 @@ -local smoke_pdef = { +local smokedef = mcl_particles.get_smoke_def({ amount = 0.5, maxexptime = 2.0, minvel = { x = 0.0, y = 0.5, z = 0.0 }, @@ -7,7 +7,7 @@ local smoke_pdef = { maxsize = 1.5, minrelpos = { x = -1/16, y = 0.04, z = -1/16 }, maxrelpos = { x = 1/16, y = 0.06, z = 1/16 }, -} +}) local spawn_flames_floor = function(pos) -- Flames @@ -26,10 +26,11 @@ local spawn_flames_floor = function(pos) glow = minetest.registered_nodes[minetest.get_node(pos).name].light_source, }, "low") -- Smoke - mcl_particles.spawn_smoke(pos, "torch", smoke_pdef) + mcl_particles.add_node_smoke_particlespawner(pos, smokedef) end local spawn_flames_wall = function(pos) + --[[ --local minrelpos, maxrelpos local node = minetest.get_node(pos) local dir = minetest.wallmounted_to_dir(node.param2) @@ -69,7 +70,8 @@ local spawn_flames_wall = function(pos) glow = minetest.registered_nodes[node.name].light_source, }, "low") -- Smoke - mcl_particles.spawn_smoke(pos, "torch", smoke_pdef) + mcl_particles.add_node_smoke_particlespawner(pos, smokedef) + --]] end local remove_flames = function(pos) diff --git a/mods/ITEMS/mcl_totems/init.lua b/mods/ITEMS/mcl_totems/init.lua index 499d7362d..062a5055a 100644 --- a/mods/ITEMS/mcl_totems/init.lua +++ b/mods/ITEMS/mcl_totems/init.lua @@ -1,5 +1,25 @@ +local S = minetest.get_translator("mcl_totems") + +mcl_totems = { + totem_fail_nodes = { + ["mcl_core:void"] = true, + ["mcl_core:realm_barrier"] = true + }, +} + local hud_totem = {} +minetest.register_craftitem("mcl_totems:totem", { + description = S("Totem of Undying"), + _tt_help = minetest.colorize(mcl_colors.GREEN, S("Protects you from death while wielding it")), + _doc_items_longdesc = S("A totem of undying is a rare artifact which may safe you from certain death."), + _doc_items_usagehelp = S("The totem only works while you hold it in your hand. If you receive fatal damage, you are saved from death and you get a second chance with 1 HP. The totem is destroyed in the process, however."), + inventory_image = "mcl_totems_totem.png", + wield_image = "mcl_totems_totem.png", + stack_max = 1, + groups = {combat_item = 1}, +}) + minetest.register_on_leaveplayer(function(player) hud_totem[player] = nil end) @@ -10,14 +30,12 @@ mcl_damage.register_modifier(function(obj, damage, reason) local hp = obj:get_hp() if hp - damage <= 0 then local wield = obj:get_wielded_item() - if wield:get_name() == "mobs_mc:totem" then + if wield:get_name() == "mcl_totems:totem" then local ppos = obj:get_pos() local pnname = minetest.get_node(ppos).name -- Some exceptions when _not_ to save the player - for n=1, #mobs_mc.misc.totem_fail_nodes do - if pnname == mobs_mc.misc.totem_fail_nodes[n] then - return - end + if mcl_totems.fail_nodes[pnname] then + return end -- Reset breath as well if obj:get_breath() < 11 then diff --git a/mods/ITEMS/mcl_totems/locale/mcl_totems.de.tr b/mods/ITEMS/mcl_totems/locale/mcl_totems.de.tr new file mode 100644 index 000000000..e0ac4f2f1 --- /dev/null +++ b/mods/ITEMS/mcl_totems/locale/mcl_totems.de.tr @@ -0,0 +1,5 @@ +# textdomain: mcl_totems +Totem of Undying=Totem der Unsterblichkeit +A totem of undying is a rare artifact which may safe you from certain death.=Ein Totem der Unsterblichkeit ist ein seltenes Artefakt, dass Sie vor dem sicheren Tod bewahren kann. +The totem only works while you hold it in your hand. If you receive fatal damage, you are saved from death and you get a second chance with 1 HP. The totem is destroyed in the process, however.=Der Totem funktioniert nur, während Sie ihn halten. Wenn Sie normalerweise tödlich hohen Schaden erhalten, werden Sie vor dem Tod bewahrt und Sie erhalten eine zweite Chance mit 1 TP. Der Totem wird dabei zerstört. +Protects you from death while wielding it=Schützt vor dem Tod, wenn es gehalten wird diff --git a/mods/ITEMS/mcl_totems/locale/mcl_totems.es.tr b/mods/ITEMS/mcl_totems/locale/mcl_totems.es.tr new file mode 100644 index 000000000..2b451ccb1 --- /dev/null +++ b/mods/ITEMS/mcl_totems/locale/mcl_totems.es.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_totems +Totem of Undying=Tótem de la inmortalidad +A totem of undying is a rare artifact which may safe you from certain death.=Un tótem de la inmortalidad es un artefacto raro que puede salvarte de una muerte segura. +The totem only works while you hold it in your hand. If you receive fatal damage, you are saved from death and you get a second chance with 1 HP. The totem is destroyed in the process, however.=El tótem solo funciona mientras lo sostienes en tu mano. Si recibes un daño crítico, no mueres y obtienes una segunda oportunidad con 1 HP. Sin embargo, el tótem se destruye en el proceso. diff --git a/mods/ITEMS/mcl_totems/locale/mcl_totems.fr.tr b/mods/ITEMS/mcl_totems/locale/mcl_totems.fr.tr new file mode 100644 index 000000000..174251f3c --- /dev/null +++ b/mods/ITEMS/mcl_totems/locale/mcl_totems.fr.tr @@ -0,0 +1,5 @@ +# textdomain: mcl_totems +Totem of Undying=Totem d'immortalité +A totem of undying is a rare artifact which may safe you from certain death.=Un totem d'immortalité est un artefact rare qui peut vous protéger d'une mort certaine. +The totem only works while you hold it in your hand. If you receive fatal damage, you are saved from death and you get a second chance with 1 HP. The totem is destroyed in the process, however.=Le totem ne fonctionne que lorsque vous le tenez dans votre main. Si vous recevez des dégâts mortels, vous êtes sauvé de la mort et vous obtenez une seconde chance avec 1 HP. Cependant, le totem est détruit. +Protects you from death while wielding it=Vous protège de la mort en la maniant diff --git a/mods/ITEMS/mcl_totems/locale/mcl_totems.ru.tr b/mods/ITEMS/mcl_totems/locale/mcl_totems.ru.tr new file mode 100644 index 000000000..d293efe01 --- /dev/null +++ b/mods/ITEMS/mcl_totems/locale/mcl_totems.ru.tr @@ -0,0 +1,5 @@ +# textdomain: mcl_totems +Totem of Undying=Тотем бессмертия +A totem of undying is a rare artifact which may safe you from certain death.=Тотем бессмертия это редкий артефакт, способный спасти вас от смерти. +The totem only works while you hold it in your hand. If you receive fatal damage, you are saved from death and you get a second chance with 1 HP. The totem is destroyed in the process, however.=Тотем работает только когда вы держите его в руке. Если вы получаете смертельный урон, вы спасаетесь от смерти и получаете второй шанс с 1 HP. Однако тотем при этом уничтожается. +Protects you from death while wielding it=Защищает вас от смерти, пока вы владеете им diff --git a/mods/ITEMS/mcl_totems/locale/template.txt b/mods/ITEMS/mcl_totems/locale/template.txt new file mode 100644 index 000000000..7afebc44c --- /dev/null +++ b/mods/ITEMS/mcl_totems/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: mcl_totems +Totem of Undying= +A totem of undying is a rare artifact which may safe you from certain death.= +The totem only works while you hold it in your hand. If you receive fatal damage, you are saved from death and you get a second chance with 1 HP. The totem is destroyed in the process, however.= +Protects you from death while wielding it= diff --git a/mods/ITEMS/mcl_totems/mod.conf b/mods/ITEMS/mcl_totems/mod.conf index 4ba94defc..ea5f80225 100644 --- a/mods/ITEMS/mcl_totems/mod.conf +++ b/mods/ITEMS/mcl_totems/mod.conf @@ -1,2 +1,2 @@ name = mcl_totems -depends = mobs_mc, mcl_damage +depends = mcl_damage, mcl_colors diff --git a/mods/ENTITIES/mobs_mc/sounds/mcl_totems_totem.ogg b/mods/ITEMS/mcl_totems/sounds/mcl_totems_totem.ogg similarity index 100% rename from mods/ENTITIES/mobs_mc/sounds/mcl_totems_totem.ogg rename to mods/ITEMS/mcl_totems/sounds/mcl_totems_totem.ogg diff --git a/mods/ENTITIES/mobs_mc/textures/mcl_totems_totem.png b/mods/ITEMS/mcl_totems/textures/mcl_totems_totem.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mcl_totems_totem.png rename to mods/ITEMS/mcl_totems/textures/mcl_totems_totem.png diff --git a/mods/MAPGEN/mcl_dungeons/init.lua b/mods/MAPGEN/mcl_dungeons/init.lua index 58e23b12e..a18fb8c15 100644 --- a/mods/MAPGEN/mcl_dungeons/init.lua +++ b/mods/MAPGEN/mcl_dungeons/init.lua @@ -317,15 +317,15 @@ local function ecb_spawn_dungeon(blockpos, action, calls_remaining, param) stacks_min = 1, stacks_max = 3, items = { - { itemstring = "mcl_mobs:nametag", weight = 20 }, + { itemstring = "mcl_mobitems:nametag", weight = 20 }, { itemstring = "mcl_mobitems:saddle", weight = 20 }, { itemstring = "mcl_jukebox:record_1", weight = 15 }, { itemstring = "mcl_jukebox:record_4", weight = 15 }, - { itemstring = "mobs_mc:iron_horse_armor", weight = 15 }, + { itemstring = "mcl_mobitems:iron_horse_armor", weight = 15 }, { itemstring = "mcl_core:apple_gold", weight = 15 }, { itemstack = mcl_enchanting.get_uniform_randomly_enchanted_book({"soul_speed"}, pr), weight = 10 }, - { itemstring = "mobs_mc:gold_horse_armor", weight = 10 }, - { itemstring = "mobs_mc:diamond_horse_armor", weight = 5 }, + { itemstring = "mcl_mobitems:gold_horse_armor", weight = 10 }, + { itemstring = "mcl_mobitems:diamond_horse_armor", weight = 5 }, { itemstring = "mcl_core:apple_gold_enchanted", weight = 2 }, } }, @@ -381,10 +381,10 @@ local function ecb_spawn_dungeon(blockpos, action, calls_remaining, param) -- ... and place it and select a random mob set_node(sp, {name = "mcl_mobspawners:spawner"}) local mobs = { - "mobs_mc:zombie", - "mobs_mc:zombie", - "mobs_mc:spider", - "mobs_mc:skeleton", + "mcl_mobs:zombie", + "mcl_mobs:zombie", + "mcl_mobs:spider", + "mcl_mobs:skeleton", } local spawner_mob = mobs[pr:next(1, #mobs)] diff --git a/mods/MAPGEN/mcl_dungeons/mod.conf b/mods/MAPGEN/mcl_dungeons/mod.conf index fe02286fa..e22929928 100644 --- a/mods/MAPGEN/mcl_dungeons/mod.conf +++ b/mods/MAPGEN/mcl_dungeons/mod.conf @@ -1,4 +1,4 @@ name = mcl_dungeons author = Wuzzy description = Generates random dungeons in the world -depends = mcl_init, mcl_core, mcl_chests, mcl_mobs, mcl_mobspawners, mcl_mapgen_core, mobs_mc +depends = mcl_init, mcl_core, mcl_chests, mcl_mobs, mcl_mobspawners, mcl_mapgen_core diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index bdcdb1b4d..5f230223f 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -1248,7 +1248,7 @@ local function generate_clay(minp, maxp, blockseed, voxelmanip_data, voxelmanip_ end local function generate_end_exit_portal(pos) - local obj = minetest.add_entity(vector.add(pos, vector.new(3, 11, 3)), "mobs_mc:enderdragon") + local obj = minetest.add_entity(vector.add(pos, vector.new(3, 11, 3)), "mcl_mobitems:enderdragon") if obj then local dragon_entity = obj:get_luaentity() dragon_entity._initial = true diff --git a/mods/MAPGEN/mcl_structures/init.lua b/mods/MAPGEN/mcl_structures/init.lua index e3f6b4829..0645d7bff 100644 --- a/mods/MAPGEN/mcl_structures/init.lua +++ b/mods/MAPGEN/mcl_structures/init.lua @@ -337,7 +337,7 @@ local function shrine_placement_callback(p1, p2, size, rotation, pr) local spawners = minetest.find_nodes_in_area(p1, p2, "mcl_mobspawners:spawner") for s=1, #spawners do --local meta = minetest.get_meta(spawners[s]) - mcl_mobspawners.setup_spawner(spawners[s], "mobs_mc:silverfish") + mcl_mobspawners.setup_spawner(spawners[s], "mcl_mobitems:silverfish") end -- Shuffle stone brick types @@ -454,9 +454,9 @@ local function temple_placement_callback(p1, p2, size, rotation, pr) { itemstring = "mcl_core:iron_ingot", weight = 15, amount_min = 1, amount_max = 5 }, { itemstring = "mcl_core:emerald", weight = 15, amount_min = 1, amount_max = 3 }, { itemstring = "", weight = 15, }, - { itemstring = "mobs_mc:iron_horse_armor", weight = 15, }, - { itemstring = "mobs_mc:gold_horse_armor", weight = 10, }, - { itemstring = "mobs_mc:diamond_horse_armor", weight = 5, }, + { itemstring = "mcl_mobitems:iron_horse_armor", weight = 15, }, + { itemstring = "mcl_mobitems:gold_horse_armor", weight = 10, }, + { itemstring = "mcl_mobitems:diamond_horse_armor", weight = 5, }, { itemstring = "mcl_core:diamond", weight = 5, amount_min = 1, amount_max = 3 }, { itemstring = "mcl_core:apple_gold_enchanted", weight = 2, }, } diff --git a/mods/MAPGEN/mcl_villages/init.lua b/mods/MAPGEN/mcl_villages/init.lua index ccc3f585d..a05dfc280 100644 --- a/mods/MAPGEN/mcl_villages/init.lua +++ b/mods/MAPGEN/mcl_villages/init.lua @@ -30,25 +30,6 @@ minetest.register_node("mcl_villages:stonebrickcarved", { _mcl_hardness = 1.5, }) - - - ---[[ Enable for testing, but use MineClone2's own spawn code if/when merging. --- --- register inhabitants --- -if minetest.get_modpath("mobs_mc") ~= nil then - mobs:register_spawn("mobs_mc:villager", --name - {"mcl_core:stonebrickcarved"}, --nodes - 15, --max_light - 0, --min_light - 20, --chance - 7, --active_object_count - 31000, --max_height - nil) --day_toggle -end ---]] - -- -- on map generation, try to build a settlement -- diff --git a/mods/MAPGEN/mcl_villages/mod.conf b/mods/MAPGEN/mcl_villages/mod.conf index d8e2aa7d4..8f32bf018 100644 --- a/mods/MAPGEN/mcl_villages/mod.conf +++ b/mods/MAPGEN/mcl_villages/mod.conf @@ -2,4 +2,4 @@ name = mcl_villages author = Rochambeau description = This mod adds settlements on world generation. depends = mcl_util, mcl_mapgen_core, mcl_structures, mcl_core, mcl_loot -optional_depends = mcl_farming, mobs_mc +optional_depends = mcl_farming diff --git a/mods/MAPGEN/mcl_villages/utils.lua b/mods/MAPGEN/mcl_villages/utils.lua index 993de11c4..ba56d10c9 100644 --- a/mods/MAPGEN/mcl_villages/utils.lua +++ b/mods/MAPGEN/mcl_villages/utils.lua @@ -145,9 +145,9 @@ function settlements.fill_chest(pos, pr) { itemstring = "mcl_core:obsidian", weight = 5, amount_min = 3, amount_max = 7 }, { itemstring = "mcl_core:sapling", weight = 5, amount_min = 3, amount_max = 7 }, { itemstring = "mcl_mobitems:saddle", weight = 3 }, - { itemstring = "mobs_mc:iron_horse_armor", weight = 1 }, - { itemstring = "mobs_mc:gold_horse_armor", weight = 1 }, - { itemstring = "mobs_mc:diamond_horse_armor", weight = 1 }, + { itemstring = "mcl_mobitems:iron_horse_armor", weight = 1 }, + { itemstring = "mcl_mobitems:gold_horse_armor", weight = 1 }, + { itemstring = "mcl_mobitems:diamond_horse_armor", weight = 1 }, } }} local items = mcl_loot.get_multi_loot(loottable, prand) diff --git a/mods/MAPGEN/tsm_railcorridors/gameconfig.lua b/mods/MAPGEN/tsm_railcorridors/gameconfig.lua index 904c3af08..8fc3c5adf 100644 --- a/mods/MAPGEN/tsm_railcorridors/gameconfig.lua +++ b/mods/MAPGEN/tsm_railcorridors/gameconfig.lua @@ -53,7 +53,7 @@ end -- All spawners spawn cave spiders function tsm_railcorridors.on_construct_spawner(pos) - mcl_mobspawners.setup_spawner(pos, "mobs_mc:cave_spider", 0, 7) + mcl_mobspawners.setup_spawner(pos, "mcl_mobitems:cave_spider", 0, 7) end -- MineClone 2's treasure function. Gets all treasures for a single chest. diff --git a/mods/MISC/mcl_commands/kill.lua b/mods/MISC/mcl_commands/kill.lua index 85754a0ec..be1e7525b 100644 --- a/mods/MISC/mcl_commands/kill.lua +++ b/mods/MISC/mcl_commands/kill.lua @@ -17,7 +17,7 @@ local function handle_kill_command(suspect, victim) -- If player holds a totem of undying, destroy it before killing, -- so it doesn't rescue the player. local wield = victimref:get_wielded_item() - if wield:get_name() == "mobs_mc:totem" then + if wield:get_name() == "mcl_mobs:totem" then victimref:set_wielded_item("") end -- DIE! diff --git a/mods/MISC/mcl_commands/summon.lua b/mods/MISC/mcl_commands/summon.lua index eb6066ff8..4b372a50f 100644 --- a/mods/MISC/mcl_commands/summon.lua +++ b/mods/MISC/mcl_commands/summon.lua @@ -4,7 +4,7 @@ local orig_func = minetest.registered_chatcommands["spawnentity"].func local cmd = table.copy(minetest.registered_chatcommands["spawnentity"]) cmd.func = function(name, param) local ent = minetest.registered_entities[param] - if minetest.settings:get_bool("only_peaceful_mobs", false) and ent and ent._cmi_is_mob and ent.type == "monster" then + if minetest.settings:get_bool("only_peaceful_mobs", false) and ent and ent.is_mob and ent.type == "monster" then return false, S("Only peaceful mobs allowed!") else local bool, msg = orig_func(name, param) @@ -12,4 +12,4 @@ cmd.func = function(name, param) end end minetest.unregister_chatcommand("spawnentity") -minetest.register_chatcommand("summon", cmd) \ No newline at end of file +minetest.register_chatcommand("summon", cmd) diff --git a/mods/PLAYER/mcl_player/init.lua b/mods/PLAYER/mcl_player/init.lua index 6cf2f0014..383690f3a 100644 --- a/mods/PLAYER/mcl_player/init.lua +++ b/mods/PLAYER/mcl_player/init.lua @@ -52,7 +52,6 @@ local player_model = {} local player_textures = {} local player_anim = {} local player_sneak = {} -mcl_player.player_attached = {} function mcl_player.player_get_animation(player) local name = player:get_player_name() @@ -149,7 +148,6 @@ end -- Update appearance when the player joins minetest.register_on_joinplayer(function(player) local name = player:get_player_name() - mcl_player.player_attached[name] = false mcl_player.player_set_model(player, "character.b3d") player_textures[name] = {"blank.png", "blank.png", "blank.png"} --player:set_local_animation({x=0, y=79}, {x=168, y=187}, {x=189, y=198}, {x=200, y=219}, 30) @@ -165,7 +163,6 @@ end) -- Localize for better performance. local player_set_animation = mcl_player.player_set_animation -local player_attached = mcl_player.player_attached -- Check each player and apply animations minetest.register_globalstep(function(dtime) @@ -173,7 +170,7 @@ minetest.register_globalstep(function(dtime) local name = player:get_player_name() local model_name = player_model[name] local model = model_name and models[model_name] - if model and not player_attached[name] then + if model and not mcl_mount.mounted[player] then local controls = player:get_player_control() local walking = false local animation_speed_mod = model.animation_speed or 30 diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 9436ae94d..1e581fc06 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -38,7 +38,7 @@ local player_collision = function(player) for _,object in pairs(minetest.get_objects_inside_radius(pos, width)) do if object and (object:is_player() - or (object:get_luaentity()._cmi_is_mob == true and object ~= player)) then + or (object:get_luaentity().is_mob == true and object ~= player)) then local pos2 = object:get_pos() local vec = {x = pos.x - pos2.x, z = pos.z - pos2.z}