From a6b20364a35134d71e0ad54c86e39f83e76ba78d Mon Sep 17 00:00:00 2001 From: kay27 Date: Mon, 11 Jul 2022 04:37:05 +0300 Subject: [PATCH] #363 Flush transitional merge (might be overwritten) --- .gitignore | 3 + API.md | 2 +- CODE_OF_CONDUCT.md | 128 - GROUPS.md | 6 +- README_locale/README.zh_TW.md | 324 ++ game.conf | 3 +- list-what-to-merge-from-mcl2.txt | 69 + mods/CORE/mcl_attached/init.lua | 84 +- mods/CORE/mcl_damage/API.md | 15 + mods/CORE/mcl_damage/init.lua | 4 +- .../locale/mcl_explosions.zh_TW.tr | 2 + mods/CORE/mcl_util/init.lua | 35 +- mods/CORE/mcl_worlds/init.lua | 1 + mods/CORE/tga_encoder/init.lua | 30 +- mods/CORE/walkover/init.lua | 38 +- mods/ENTITIES/mcl_boats/init.lua | 4 +- .../mcl_boats/locale/mcl_boats.zh_TW.tr | 11 + mods/ENTITIES/mcl_burning/api.lua | 101 +- mods/ENTITIES/mcl_burning/init.lua | 110 +- .../locale/mcl_falling_nodes.zh_TW.tr | 3 + mods/ENTITIES/mcl_item_entity/init.lua | 44 +- mods/ENTITIES/mcl_minecarts/init.lua | 5 +- mods/ENTITIES/mcl_minecarts/rails.lua | 2 +- mods/ENTITIES/mcl_mobs/api.lua | 4513 +++++++++++++++++ mods/ENTITIES/mcl_mobs/api/mount.lua | 456 -- mods/ENTITIES/mcl_mobs/crafts.lua | 2 +- mods/ENTITIES/mcl_mobs/init.lua | 8 +- mods/ENTITIES/mcl_mobs/locale/mcl_mobs.pl.tr | 11 - .../mcl_mobs/locale/mcl_mobs.zh_TW.tr | 11 + mods/ENTITIES/mcl_mobs/lucky_block.lua | 8 + mods/ENTITIES/mcl_mobs/mod.conf | 1 - .../mcl_mobs/{README.md => readme.MD} | 0 mods/ENTITIES/mcl_mobs/sounds/attributes.txt | 4 - .../mcl_mobs/sounds/default_punch.1.ogg | Bin 12658 -> 0 bytes .../mcl_mobs/sounds/default_punch.2.ogg | Bin 12801 -> 0 bytes .../mcl_mobs/sounds/default_punch.3.ogg | Bin 12943 -> 0 bytes .../mcl_mobs/sounds/default_punch.ogg | Bin 0 -> 5946 bytes mods/ENTITIES/mcl_mobs/spawning.lua | 488 ++ mods/ENTITIES/mcl_mobs/todo.txt | 1 - .../locale/mcl_paintings.zh_TW.tr | 2 + mods/ENTITIES/mcl_wither_spawning/init.lua | 51 + mods/ENTITIES/mcl_wither_spawning/mod.conf | 4 + .../schems/wither_spawn_x.we | 1 + .../schems/wither_spawn_z.we | 1 + mods/ENTITIES/mobs_mc/0_gameconfig.lua | 334 -- mods/ENTITIES/mobs_mc/2_throwing.lua | 402 -- mods/ENTITIES/mobs_mc/3_shared.lua | 63 - mods/ENTITIES/mobs_mc/4_heads.lua | 63 - mods/ENTITIES/mobs_mc/5_spawn_abm_check.lua | 20 - mods/ENTITIES/mobs_mc/LICENSE-media.md | 6 +- mods/ENTITIES/mobs_mc/README.md | 5 - mods/ENTITIES/mobs_mc/agent.lua | 39 - mods/ENTITIES/mobs_mc/bat.lua | 17 +- mods/ENTITIES/mobs_mc/chicken.lua | 138 +- mods/ENTITIES/mobs_mc/common.lua | 0 mods/ENTITIES/mobs_mc/cow+mooshroom.lua | 190 +- mods/ENTITIES/mobs_mc/creeper.lua | 89 +- mods/ENTITIES/mobs_mc/ender_dragon.lua | 40 +- mods/ENTITIES/mobs_mc/enderman.lua | 171 +- mods/ENTITIES/mobs_mc/endermite.lua | 9 +- mods/ENTITIES/mobs_mc/gameconfig.md | 59 - mods/ENTITIES/mobs_mc/ghast.lua | 81 +- mods/ENTITIES/mobs_mc/guardian.lua | 29 +- mods/ENTITIES/mobs_mc/guardian_elder.lua | 31 +- mods/ENTITIES/mobs_mc/horse.lua | 221 +- mods/ENTITIES/mobs_mc/init.lua | 120 +- mods/ENTITIES/mobs_mc/llama.lua | 225 +- mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr | 12 - mods/ENTITIES/mobs_mc/locale/mobs_mc.es.tr | 11 - mods/ENTITIES/mobs_mc/locale/mobs_mc.pl.tr | 75 - mods/ENTITIES/mobs_mc/mod.conf | 2 +- mods/ENTITIES/mobs_mc/models/attributes.txt | 1 - .../ENTITIES/mobs_mc/models/mobs_mc_ghast.b3d | Bin 69843 -> 75657 bytes .../mobs_mc/models/mobs_mc_villager.b3d | Bin 213725 -> 67116 bytes mods/ENTITIES/mobs_mc/ocelot.lua | 53 +- mods/ENTITIES/mobs_mc/parrot.lua | 117 +- mods/ENTITIES/mobs_mc/pig.lua | 161 +- mods/ENTITIES/mobs_mc/polar_bear.lua | 18 +- mods/ENTITIES/mobs_mc/sheep.lua | 183 +- mods/ENTITIES/mobs_mc/shulker.lua | 19 +- mods/ENTITIES/mobs_mc/skeleton+stray.lua | 76 +- mods/ENTITIES/mobs_mc/skeleton_wither.lua | 20 +- mods/ENTITIES/mobs_mc/slime+magma_cube.lua | 89 +- mods/ENTITIES/mobs_mc/snowman.lua | 30 +- .../mobs_mc/sounds/mobs_mc_villager.4.ogg | Bin 14731 -> 10341 bytes .../mobs_mc/sounds/mobs_mc_villager.5.ogg | Bin 11187 -> 14731 bytes .../mobs_mc/sounds/mobs_mc_villager.6.ogg | Bin 11068 -> 11187 bytes .../mobs_mc/sounds/mobs_mc_villager.7.ogg | Bin 0 -> 11068 bytes .../sounds/mobs_mc_villager_accept.1.ogg | Bin 0 -> 9793 bytes .../sounds/mobs_mc_villager_accept.2.ogg | Bin 0 -> 9058 bytes .../sounds/mobs_mc_villager_hurt.1.ogg | Bin 10341 -> 6981 bytes .../sounds/mobs_mc_villager_hurt.2.ogg | Bin 0 -> 6749 bytes .../sounds/mobs_mc_villager_trade.1.ogg | Bin 0 -> 6518 bytes .../sounds/mobs_mc_villager_trade.2.ogg | Bin 0 -> 10273 bytes .../sounds/mobs_mc_villager_trade.3.ogg | Bin 0 -> 8553 bytes .../sounds/mobs_mc_villager_trade.4.ogg | Bin 0 -> 7427 bytes mods/ENTITIES/mobs_mc/squid.lua | 17 +- .../mobs_mc/textures/mobs_mc_cat_black.png | Bin 606 -> 385 bytes .../mobs_mc_enderman_cactus_background.png | Bin 0 -> 99 bytes .../mobs_mc/textures/mobs_mc_llama_chest.png | Bin 20594 -> 0 bytes .../textures/mobs_mc_llama_decor_black.png | Bin 4602 -> 5546 bytes .../textures/mobs_mc_llama_decor_blue.png | Bin 6585 -> 1367 bytes .../textures/mobs_mc_llama_decor_brown.png | Bin 6231 -> 4272 bytes .../textures/mobs_mc_llama_decor_cyan.png | Bin 7612 -> 1494 bytes .../textures/mobs_mc_llama_decor_gray.png | Bin 5236 -> 4355 bytes .../textures/mobs_mc_llama_decor_green.png | Bin 5809 -> 936 bytes .../mobs_mc_llama_decor_light_blue.png | Bin 7643 -> 1600 bytes .../mobs_mc_llama_decor_light_gray.png | Bin 6354 -> 5020 bytes .../textures/mobs_mc_llama_decor_lime.png | Bin 7388 -> 1803 bytes .../textures/mobs_mc_llama_decor_magenta.png | Bin 7352 -> 1944 bytes .../textures/mobs_mc_llama_decor_orange.png | Bin 7396 -> 966 bytes .../textures/mobs_mc_llama_decor_pink.png | Bin 7732 -> 5506 bytes .../textures/mobs_mc_llama_decor_purple.png | Bin 5790 -> 1619 bytes .../textures/mobs_mc_llama_decor_red.png | Bin 6659 -> 5457 bytes .../textures/mobs_mc_llama_decor_white.png | Bin 6866 -> 4405 bytes .../textures/mobs_mc_llama_decor_yellow.png | Bin 7571 -> 5354 bytes .../mobs_mc/textures/mobs_mc_llama_gray.png | Bin 14050 -> 12043 bytes .../mobs_mc/textures/mobs_mc_llama_white.png | Bin 12785 -> 10936 bytes .../mobs_mc_spawn_icon_rabbit_caerbannog.png | Bin 1897 -> 0 bytes .../mobs_mc/textures/mobs_mc_spit.png | Bin 677 -> 0 bytes .../textures/mobs_mc_villager_armorer.png | Bin 0 -> 971 bytes .../textures/mobs_mc_villager_butcher.png | Bin 866 -> 989 bytes .../mobs_mc_villager_cartographer.png | Bin 0 -> 1145 bytes .../textures/mobs_mc_villager_farmer.png | Bin 848 -> 1091 bytes .../textures/mobs_mc_villager_fisherman.png | Bin 0 -> 1054 bytes .../textures/mobs_mc_villager_fletcher.png | Bin 0 -> 950 bytes .../mobs_mc_villager_leatherworker.png | Bin 0 -> 933 bytes .../textures/mobs_mc_villager_librarian.png | Bin 896 -> 1098 bytes .../textures/mobs_mc_villager_nitwit.png | Bin 0 -> 1008 bytes .../textures/mobs_mc_villager_priest.png | Bin 768 -> 921 bytes .../textures/mobs_mc_villager_sheperd.png | Bin 0 -> 983 bytes .../textures/mobs_mc_villager_smith.png | Bin 866 -> 941 bytes .../textures/mobs_mc_villager_toolsmith.png | Bin 0 -> 964 bytes .../textures/mobs_mc_villager_weaponsmith.png | Bin 0 -> 967 bytes mods/ENTITIES/mobs_mc/vex.lua | 7 +- mods/ENTITIES/mobs_mc/villager.lua | 654 ++- mods/ENTITIES/mobs_mc/villager_evoker.lua | 12 +- mods/ENTITIES/mobs_mc/villager_illusioner.lua | 12 +- mods/ENTITIES/mobs_mc/villager_vindicator.lua | 12 +- mods/ENTITIES/mobs_mc/villager_zombie.lua | 44 +- mods/ENTITIES/mobs_mc/witch.lua | 26 +- mods/ENTITIES/mobs_mc/wither.lua | 21 +- mods/ENTITIES/mobs_mc/wolf.lua | 115 +- mods/ENTITIES/mobs_mc/zombiepig.lua | 54 +- .../lightning/locale/lightning.zh_TW.tr | 4 + .../locale/mcl_void_damage.zh_TW.tr | 3 + .../mcl_weather/locale/mcl_weather.zh_TW.tr | 8 + mods/ENVIRONMENT/mcl_weather/nether_dust.lua | 16 +- mods/ENVIRONMENT/mcl_weather/rain.lua | 65 +- mods/ENVIRONMENT/mcl_weather/skycolor.lua | 21 +- mods/ENVIRONMENT/mcl_weather/snow.lua | 30 +- .../locale/doc_identifier.zh_TW.tr | 18 + mods/HELP/mcl_craftguide/init.lua | 2 +- .../textures/craftguide_furnace.png | Bin 0 -> 300 bytes mods/HELP/mcl_doc/init.lua | 8 + mods/HELP/mcl_item_id/init.lua | 4 +- mods/HELP/tt/init.lua | 4 +- mods/HUD/awards/chat_commands.lua | 22 +- mods/HUD/awards/locale/awards.de.tr | 1 + mods/HUD/awards/locale/template.txt | 1 + mods/HUD/hudbars/locale/hudbars.zh_TW.tr | 6 + mods/HUD/mcl_achievements/init.lua | 79 +- mods/HUD/mcl_achievements/locale/template.txt | 9 +- mods/HUD/mcl_bossbars/init.lua | 2 +- mods/HUD/mcl_experience/bottle.lua | 5 + mods/HUD/mcl_experience/init.lua | 27 +- .../locale/mcl_experience.zh_TW.tr | 7 + .../mcl_hbarmor/locale/mcl_hbarmor.zh_TW.tr | 2 + mods/HUD/mcl_inventory/creative.lua | 19 +- .../locale/mcl_inventory.zh_TW.tr | 21 + mods/HUD/mcl_offhand/init.lua | 9 +- mods/ITEMS/REDSTONE/mcl_comparators/init.lua | 5 +- mods/ITEMS/REDSTONE/mcl_dispensers/init.lua | 8 +- mods/ITEMS/REDSTONE/mcl_droppers/init_new.lua | 220 - mods/ITEMS/REDSTONE/mesecons_mvps/init.lua | 501 +- .../REDSTONE/mesecons_pressureplates/init.lua | 2 +- .../REDSTONE/mesecons_solarpanel/init.lua | 86 +- mods/ITEMS/mcl_anvils/init.lua | 14 + .../mcl_anvils/locale/mcl_anvils.zh_TW.tr | 16 + mods/ITEMS/mcl_armor/API.md | 288 ++ mods/ITEMS/mcl_armor/api.lua | 21 +- .../ITEMS/mcl_armor/locale/mcl_armor.zh_TW.tr | 23 + mods/ITEMS/mcl_armor/player.lua | 2 +- mods/ITEMS/mcl_armor/register.lua | 18 +- .../mcl_armor_boots_chain_preview.png | Bin 156 -> 0 bytes .../mcl_armor_boots_diamond_preview.png | Bin 157 -> 0 bytes .../textures/mcl_armor_boots_gold_preview.png | Bin 150 -> 0 bytes .../textures/mcl_armor_boots_iron_preview.png | Bin 140 -> 0 bytes .../mcl_armor_boots_leather_preview.png | Bin 131 -> 0 bytes .../mcl_armor_chestplate_chain_preview.png | Bin 255 -> 0 bytes .../mcl_armor_chestplate_diamond_preview.png | Bin 210 -> 0 bytes .../mcl_armor_chestplate_gold_preview.png | Bin 202 -> 0 bytes .../mcl_armor_chestplate_iron_preview.png | Bin 215 -> 0 bytes .../mcl_armor_chestplate_leather_preview.png | Bin 150 -> 0 bytes .../mcl_armor_helmet_chain_preview.png | Bin 149 -> 0 bytes .../mcl_armor_helmet_diamond_preview.png | Bin 208 -> 0 bytes .../mcl_armor_helmet_gold_preview.png | Bin 190 -> 0 bytes .../mcl_armor_helmet_iron_preview.png | Bin 162 -> 0 bytes .../mcl_armor_helmet_leather_preview.png | Bin 147 -> 0 bytes .../mcl_armor_leggings_chain_preview.png | Bin 133 -> 0 bytes .../mcl_armor_leggings_diamond_preview.png | Bin 197 -> 0 bytes .../mcl_armor_leggings_gold_preview.png | Bin 171 -> 0 bytes .../mcl_armor_leggings_iron_preview.png | Bin 168 -> 0 bytes .../mcl_armor_leggings_leather_preview.png | Bin 165 -> 0 bytes .../locale/mcl_armor_stand.zh_TW.tr | 5 + mods/ITEMS/mcl_barrels/init.lua | 204 + .../mcl_barrels/locale/mcl_barrels.de.tr | 5 + .../mcl_barrels/locale/mcl_barrels.es.tr | 5 + .../mcl_barrels/locale/mcl_barrels.fr.tr | 5 + .../mcl_barrels/locale/mcl_barrels.pl.tr | 5 + .../mcl_barrels/locale/mcl_barrels.ru.tr | 5 + mods/ITEMS/mcl_barrels/locale/template.txt | 5 + mods/ITEMS/mcl_barrels/mod.conf | 3 + .../textures/mcl_barrels_barrel_bottom.png | Bin 0 -> 542 bytes .../textures/mcl_barrels_barrel_side.png | Bin 0 -> 499 bytes .../textures/mcl_barrels_barrel_top.png | Bin 0 -> 566 bytes .../textures/mcl_barrels_barrel_top_open.png | Bin 0 -> 421 bytes mods/ITEMS/mcl_beds/functions.lua | 2 +- mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr | 1 + mods/ITEMS/mcl_beds/locale/mcl_beds.zh_TW.tr | 41 + mods/ITEMS/mcl_beds/mod.conf | 4 +- mods/ITEMS/mcl_beds/respawn_anchor.lua | 251 +- mods/ITEMS/mcl_bells/README.md | 16 + mods/ITEMS/mcl_bells/init.lua | 50 + mods/ITEMS/mcl_bells/locale/mcl_bells.fr.tr | 2 + mods/ITEMS/mcl_bells/locale/template.txt | 2 + mods/ITEMS/mcl_bells/mod.conf | 3 + .../sounds/mcl_bells_bell_stroke.ogg | Bin 0 -> 61797 bytes .../mcl_bells/textures/mcl_bells_bell.png | Bin 0 -> 261 bytes .../textures/mcl_bells_bell_bottom.png | Bin 0 -> 760 bytes .../textures/mcl_bells_bell_side.png | Bin 0 -> 695 bytes .../mcl_bells/textures/mcl_bells_bell_top.png | Bin 0 -> 656 bytes mods/ITEMS/mcl_blackstone/README.md | 4 +- mods/ITEMS/mcl_blackstone/init.lua | 610 +-- .../locale/mcl_blackstone.de.tr | 2 +- mods/ITEMS/mcl_blackstone/locale/template.txt | 3 +- mods/ITEMS/mcl_blackstone/mod.conf | 3 +- .../mcl_blackstone_nether_fossil_1.mts | Bin 0 -> 78 bytes .../mcl_blackstone_nether_fossil_2.mts | Bin 0 -> 112 bytes .../mcl_blackstone_nether_fossil_3.mts | Bin 0 -> 116 bytes .../mcl_blackstone_nether_fossil_4.mts | Bin 0 -> 123 bytes .../ITEMS/mcl_blackstone/textures/lantern.png | Bin 0 -> 1328 bytes .../textures/lantern_bottom.png | Bin 0 -> 1209 bytes .../mcl_blackstone/textures/lantern_top.png | Bin 0 -> 1043 bytes .../textures/mcl_blackstone.png | Bin 0 -> 1656 bytes mods/ITEMS/mcl_books/init.lua | 5 +- .../ITEMS/mcl_books/locale/mcl_books.zh_TW.tr | 27 + mods/ITEMS/mcl_bows/arrow.lua | 65 +- mods/ITEMS/mcl_bows/crossbow.lua | 2 +- mods/ITEMS/mcl_bows/locale/mcl_bows.zh_TW.tr | 14 + mods/ITEMS/mcl_bows/mod.conf | 5 +- mods/ITEMS/mcl_bows/rocket.lua | 78 +- mods/ITEMS/mcl_brewing/init.lua | 5 +- .../mcl_brewing/locale/mcl_brewing.zh_TW.tr | 10 + mods/ITEMS/mcl_buckets/init.lua | 295 +- .../mcl_buckets/locale/mcl_buckets.zh_TW.tr | 17 + mods/ITEMS/mcl_buckets/mod.conf | 2 +- mods/ITEMS/mcl_buckets/register.lua | 27 +- mods/ITEMS/mcl_cake/init.lua | 11 +- mods/ITEMS/mcl_cake/locale/mcl_cake.zh_TW.tr | 12 + mods/ITEMS/mcl_cauldrons/init.lua | 79 +- .../locale/mcl_cauldrons.zh_TW.tr | 11 + mods/ITEMS/mcl_cauldrons/mod.conf | 2 +- mods/ITEMS/mcl_chests/init.lua | 61 +- .../textures/mcl_chests_ender_present.png | Bin 0 -> 286 bytes .../mcl_chests/textures/mcl_chests_noise.png | Bin 0 -> 5338 bytes .../textures/mcl_chests_noise_double.png | Bin 0 -> 9345 bytes .../mcl_chests_normal_double_present.png | Bin 0 -> 307 bytes .../textures/mcl_chests_normal_present.png | Bin 0 -> 285 bytes .../mcl_chests_trapped_double_present.png | Bin 0 -> 307 bytes .../textures/mcl_chests_trapped_present.png | Bin 0 -> 286 bytes .../ITEMS/mcl_clock/locale/mcl_clock.zh_TW.tr | 5 + .../mcl_cocoas/locale/mcl_cocoas.zh_TW.tr | 6 + mods/ITEMS/mcl_compass/API.md | 20 + mods/ITEMS/mcl_compass/init.lua | 393 +- .../mcl_compass/locale/mcl_compass.de.tr | 7 +- .../mcl_compass/locale/mcl_compass.es.tr | 8 +- .../mcl_compass/locale/mcl_compass.fr.tr | 9 +- .../mcl_compass/locale/mcl_compass.pl.tr | 7 +- .../mcl_compass/locale/mcl_compass.ru.tr | 7 +- .../mcl_compass/locale/mcl_compass.zh_TW.tr | 9 + mods/ITEMS/mcl_compass/locale/template.txt | 7 +- mods/ITEMS/mcl_compass/mod.conf | 4 +- mods/ITEMS/mcl_composters/init.lua | 135 +- mods/ITEMS/mcl_copper/README.md | 9 +- mods/ITEMS/mcl_copper/crafting.lua | 27 +- mods/ITEMS/mcl_copper/functions.lua | 42 +- mods/ITEMS/mcl_copper/items.lua | 9 +- mods/ITEMS/mcl_copper/nodes.lua | 50 +- mods/ITEMS/mcl_core/crafting.lua | 14 +- mods/ITEMS/mcl_core/craftitems.lua | 2 +- mods/ITEMS/mcl_core/functions.lua | 72 +- mods/ITEMS/mcl_core/locale/mcl_core.zh_TW.tr | 257 + mods/ITEMS/mcl_core/nodes_base.lua | 41 +- mods/ITEMS/mcl_core/nodes_cactuscane.lua | 12 +- mods/ITEMS/mcl_core/nodes_climb.lua | 6 +- mods/ITEMS/mcl_core/nodes_misc.lua | 2 +- mods/ITEMS/mcl_core/nodes_trees.lua | 12 +- .../textures/default_glass_detail.png | Bin 4942 -> 120 bytes .../mcl_core_crying_obsidian_tear.png | Bin 0 -> 91 bytes .../mcl_core_crying_obsidian_tear2.png | Bin 0 -> 86 bytes .../mcl_core_crying_obsidian_tear3.png | Bin 0 -> 83 bytes .../textures/mcl_core_glass_black_detail.png | Bin 4706 -> 113 bytes .../textures/mcl_core_glass_blue_detail.png | Bin 4710 -> 113 bytes .../textures/mcl_core_glass_brown_detail.png | Bin 4709 -> 113 bytes .../textures/mcl_core_glass_cyan_detail.png | Bin 4710 -> 113 bytes .../textures/mcl_core_glass_gray_detail.png | Bin 4703 -> 113 bytes .../textures/mcl_core_glass_green_detail.png | Bin 4708 -> 113 bytes .../mcl_core_glass_light_blue_detail.png | Bin 4708 -> 113 bytes .../textures/mcl_core_glass_lime_detail.png | Bin 4712 -> 113 bytes .../mcl_core_glass_magenta_detail.png | Bin 4707 -> 113 bytes .../textures/mcl_core_glass_orange_detail.png | Bin 4712 -> 113 bytes .../textures/mcl_core_glass_pink_detail.png | Bin 4708 -> 113 bytes .../textures/mcl_core_glass_purple_detail.png | Bin 4710 -> 113 bytes .../textures/mcl_core_glass_red_detail.png | Bin 4706 -> 113 bytes .../textures/mcl_core_glass_silver_detail.png | Bin 4705 -> 113 bytes .../textures/mcl_core_glass_white_detail.png | Bin 4706 -> 113 bytes .../textures/mcl_core_glass_yellow_detail.png | Bin 4710 -> 113 bytes ...fault_papyrus.png => mcl_core_papyrus.png} | Bin mods/ITEMS/mcl_crafting_table/init.lua | 140 +- .../locale/mcl_crafting_table.zh_TW.tr | 8 + mods/ITEMS/mcl_crimson/init.lua | 485 ++ .../mcl_crimson/locale/mcl_crimson.de.tr | 24 + .../mcl_crimson/locale/mcl_crimson.fr.tr | 23 + mods/ITEMS/mcl_crimson/locale/template.txt | 23 + mods/ITEMS/mcl_crimson/mod.conf | 4 + .../schematics/crimson_fungus_1.mts | Bin 0 -> 200 bytes .../schematics/crimson_fungus_2.mts | Bin 0 -> 208 bytes .../schematics/crimson_fungus_3.mts | Bin 0 -> 273 bytes .../schematics/warped_fungus_1.mts | Bin 0 -> 209 bytes .../schematics/warped_fungus_2.mts | Bin 0 -> 193 bytes .../schematics/warped_fungus_3.mts | Bin 0 -> 223 bytes .../mcl_crimson/textures/crimson_hyphae.png | Bin 0 -> 6257 bytes .../textures/crimson_hyphae_side.png | Bin 0 -> 525 bytes .../textures/crimson_hyphae_wood.png | Bin 0 -> 446 bytes .../mcl_crimson/textures/crimson_nylium.png | Bin 0 -> 6202 bytes .../textures/crimson_nylium_side.png | Bin 0 -> 324 bytes .../mcl_crimson/textures/crimson_roots.png | Bin 0 -> 6202 bytes .../textures/crimson_stem_stripped_side.png | Bin 0 -> 193 bytes .../textures/crimson_stem_stripped_top.png | Bin 0 -> 6699 bytes .../textures/farming_crimson_fungus.png | Bin 0 -> 307 bytes .../textures/farming_warped_fungus.png | Bin 0 -> 172 bytes .../mcl_crimson/textures/nether_sprouts.png | Bin 0 -> 314 bytes .../textures/nether_wart_block.png | Bin 0 -> 565 bytes .../mcl_crimson/textures/shroomlight.png | Bin 0 -> 428 bytes .../textures/stripped_crimson_stem.png | Bin 0 -> 6365 bytes .../textures/stripped_crimson_stem_side.png | Bin 0 -> 193 bytes .../textures/stripped_crimson_stem_top.png | Bin 0 -> 231 bytes .../textures/stripped_warped_stem.png | Bin 0 -> 6600 bytes .../textures/stripped_warped_stem_side.png | Bin 0 -> 200 bytes .../textures/stripped_warped_stem_top.png | Bin 0 -> 239 bytes .../mcl_crimson/textures/twisting_vines.png | Bin 0 -> 475 bytes .../textures/twisting_vines_plant.png | Bin 0 -> 581 bytes .../mcl_crimson/textures/warped_hyphae.png | Bin 0 -> 6259 bytes .../textures/warped_hyphae_side.png | Bin 0 -> 479 bytes .../textures/warped_hyphae_wood.png | Bin 0 -> 461 bytes .../textures/warped_hyphae_wood_2nd.png | Bin 0 -> 434 bytes .../mcl_crimson/textures/warped_nylium.png | Bin 0 -> 426 bytes .../textures/warped_nylium_side.png | Bin 0 -> 402 bytes .../mcl_crimson/textures/warped_roots.png | Bin 0 -> 462 bytes .../textures/warped_stem_stripped_side.png | Bin 0 -> 200 bytes .../textures/warped_stem_stripped_top.png | Bin 0 -> 7039 bytes .../textures/warped_wart_block.png | Bin 0 -> 6232 bytes mods/ITEMS/mcl_doors/api_doors.lua | 1118 ++-- mods/ITEMS/mcl_doors/api_trapdoors.lua | 462 +- mods/ITEMS/mcl_doors/init.lua | 18 +- .../ITEMS/mcl_doors/locale/mcl_doors.zh_TW.tr | 24 + mods/ITEMS/mcl_dye/init.lua | 2 +- mods/ITEMS/mcl_dye/locale/mcl_dye.zh_TW.tr | 25 + mods/ITEMS/mcl_enchanting/enchantments.lua | 9 +- mods/ITEMS/mcl_enchanting/engine.lua | 32 +- mods/ITEMS/mcl_enchanting/groupcaps.lua | 7 +- mods/ITEMS/mcl_end/building.lua | 22 +- mods/ITEMS/mcl_farming/beetroot.lua | 4 +- mods/ITEMS/mcl_farming/carrots.lua | 2 +- mods/ITEMS/mcl_farming/hoes.lua | 598 +-- .../mcl_farming/locale/mcl_farming.zh_TW.tr | 99 + mods/ITEMS/mcl_farming/melon.lua | 9 +- mods/ITEMS/mcl_farming/potatoes.lua | 4 +- mods/ITEMS/mcl_farming/pumpkin.lua | 43 +- mods/ITEMS/mcl_farming/shared_functions.lua | 6 +- mods/ITEMS/mcl_farming/soil.lua | 2 +- .../mcl_farming_pumpkin_face_preview.png | Bin 240 -> 0 bytes mods/ITEMS/mcl_farming/wheat.lua | 14 +- mods/ITEMS/mcl_fences/init.lua | 612 +-- .../mcl_fences/locale/mcl_fences.zh_TW.tr | 18 + mods/ITEMS/mcl_fire/init.lua | 127 +- mods/ITEMS/mcl_fire/locale/mcl_fire.zh_TW.tr | 19 + mods/ITEMS/mcl_fishing/init.lua | 4 + .../mcl_fishing/locale/mcl_fishing.zh_TW.tr | 18 + .../locale/mcl_flowerpots.zh_TW.tr | 26 + mods/ITEMS/mcl_flowers/init.lua | 41 +- .../mcl_flowers/locale/mcl_flowers.zh_TW.tr | 32 + mods/ITEMS/mcl_furnaces/init.lua | 6 +- .../mcl_furnaces/locale/mcl_furnaces.zh_TW.tr | 9 + mods/ITEMS/mcl_grindstone/init.lua | 39 + mods/ITEMS/mcl_grindstone/mod.conf | 3 + .../textures/grindstone_front.png | Bin 0 -> 420 bytes .../textures/grindstone_side.png | Bin 0 -> 416 bytes .../textures/grindstone_top.png | Bin 0 -> 339 bytes mods/ITEMS/mcl_heads/init.lua | 1 - .../ITEMS/mcl_heads/locale/mcl_heads.zh_TW.tr | 11 + .../textures/mcl_heads_creeper_preview.png | Bin 165 -> 0 bytes .../textures/mcl_heads_skeleton_preview.png | Bin 156 -> 0 bytes .../textures/mcl_heads_steve_preview.png | Bin 166 -> 0 bytes .../mcl_heads_wither_skeleton_preview.png | Bin 156 -> 0 bytes .../textures/mcl_heads_zombie_preview.png | Bin 161 -> 0 bytes mods/ITEMS/mcl_hoppers/init.lua | 8 +- .../mcl_hoppers/locale/mcl_hoppers.zh_TW.tr | 16 + mods/ITEMS/mcl_itemframes/init.lua | 68 + .../locale/mcl_itemframes.zh_TW.tr | 5 + .../mcl_jukebox/locale/mcl_jukebox.zh_TW.tr | 10 + mods/ITEMS/mcl_lanterns/init.lua | 95 + .../mcl_lanterns/locale/mcl_lanterns.fr.tr | 6 + mods/ITEMS/mcl_lanterns/locale/template.txt | 6 + mods/ITEMS/mcl_lanterns/mod.conf | 7 + mods/ITEMS/mcl_lanterns/register.lua | 19 +- mods/ITEMS/mcl_maps/colors.json | 2 +- mods/ITEMS/mcl_maps/init.lua | 28 + mods/ITEMS/mcl_maps/locale/mcl_maps.zh_TW.tr | 10 + mods/ITEMS/mcl_mobitems/init.lua | 510 ++ .../mcl_mobitems/locale/mcl_mobitems.de.tr | 7 + .../mcl_mobitems/locale/mcl_mobitems.es.tr | 9 +- .../mcl_mobitems/locale/mcl_mobitems.fr.tr | 14 +- .../mcl_mobitems/locale/mcl_mobitems.ru.tr | 13 + mods/ITEMS/mcl_mobitems/locale/template.txt | 13 + .../mcl_mobitems_diamond_horse_armor.png | Bin 0 -> 207 bytes .../mcl_mobitems_gold_horse_armor.png | Bin 0 -> 187 bytes .../mcl_mobitems_heart_of_the_sea.png | Bin 0 -> 350 bytes .../mcl_mobitems_heart_of_the_sea_split.png | Bin 0 -> 440 bytes .../mcl_mobitems_horse_armor_diamond.png} | Bin .../mcl_mobitems_horse_armor_gold.png} | Bin .../mcl_mobitems_horse_armor_iron.png} | Bin .../mcl_mobitems_iron_horse_armor.png | Bin 0 -> 216 bytes .../textures/mcl_mobitems_nautilus_shell.png | Bin 0 -> 548 bytes mods/ITEMS/mcl_mobspawners/init.lua | 2 +- .../locale/mcl_mobspawners.zh_TW.tr | 5 + .../locale/mcl_monster_eggs.zh_TW.tr | 9 + mods/ITEMS/mcl_mushrooms/huge.lua | 15 + .../locale/mcl_mushrooms.zh_TW.tr | 24 + mods/ITEMS/mcl_mushrooms/small.lua | 16 + mods/ITEMS/mcl_nether/init.lua | 40 +- mods/ITEMS/mcl_nether/nether_wart.lua | 4 + mods/ITEMS/mcl_ocean/kelp.lua | 17 +- mods/ITEMS/mcl_ocean/prismarine.lua | 2 +- mods/ITEMS/mcl_ocean/sea_pickle.lua | 7 + mods/ITEMS/mcl_ocean/seagrass.lua | 4 + .../mcl_portals/locale/mcl_portals.zh_TW.tr | 15 + mods/ITEMS/mcl_portals/portal_end.lua | 6 +- mods/ITEMS/mcl_portals/portal_nether.lua | 74 + mods/ITEMS/mcl_potions/functions.lua | 14 +- mods/ITEMS/mcl_potions/init.lua | 2 +- mods/ITEMS/mcl_potions/lingering.lua | 129 +- mods/ITEMS/mcl_potions/splash.lua | 7 +- mods/ITEMS/mcl_potions/tipped_arrow.lua | 48 +- mods/ITEMS/mcl_raw_ores/init.lua | 42 + mods/ITEMS/mcl_raw_ores/mod.conf | 4 + mods/ITEMS/mcl_shields/init.lua | 311 ++ .../ITEMS/mcl_signs/locale/mcl_signs.zh_TW.tr | 9 + mods/ITEMS/mcl_smithing_table/init.lua | 49 + .../locale/mcl_anvils.de.tr | 16 + .../locale/mcl_anvils.es.tr | 15 + .../locale/mcl_anvils.fr.tr | 16 + .../locale/mcl_anvils.ru.tr | 16 + .../mcl_smithing_table/locale/template.txt | 19 + mods/ITEMS/mcl_smoker/README.md | 9 + mods/ITEMS/mcl_smoker/init.lua | 124 + .../mcl_sponges/locale/mcl_sponges.zh_TW.tr | 10 + mods/ITEMS/mcl_spyglass/init.lua | 71 + mods/ITEMS/mcl_spyglass/mod.conf | 4 + mods/ITEMS/mcl_sus_stew/LICENSE | 232 + mods/ITEMS/mcl_sus_stew/Note | 1 + mods/ITEMS/mcl_sus_stew/README.md | 3 + mods/ITEMS/mcl_sus_stew/init.lua | 130 + mods/ITEMS/mcl_sus_stew/mod.conf | 3 + mods/ITEMS/mcl_sus_stew/textures/sus_stew.png | Bin 0 -> 445 bytes .../mcl_throwing/locale/mcl_throwing.zh_TW.tr | 12 + mods/ITEMS/mcl_throwing/mod.conf | 2 +- mods/ITEMS/mcl_throwing/register.lua | 17 +- mods/ITEMS/mcl_tnt/locale/mcl_tnt.zh_TW.tr | 8 + mods/ITEMS/mcl_tools/crafting.lua | 16 +- mods/ITEMS/mcl_tools/init.lua | 38 +- .../ITEMS/mcl_tools/locale/mcl_tools.zh_TW.tr | 32 + .../mcl_torches/locale/mcl_torches.zh_TW.tr | 3 + mods/ITEMS/mcl_totems/init.lua | 38 +- 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 + .../mcl_totems}/textures/mcl_totems_totem.png | Bin .../ITEMS/mcl_walls/locale/mcl_walls.zh_TW.tr | 16 + mods/ITEMS/mcl_wool/init.lua | 3 +- .../ITEMS/mclx_core/locale/mclx_core.zh_TW.tr | 5 + .../mclx_fences/locale/mclx_fences.zh_TW.tr | 4 + .../screwdriver/locale/screwdriver.zh_TW.tr | 2 + mods/ITEMS/xpanes/locale/xpanes.zh_TW.tr | 23 + mods/MAPGEN/mcl_biomes/init.lua | 786 ++- mods/MAPGEN/mcl_biomes/mod.conf | 4 + mods/MAPGEN/mcl_dungeons/init.lua | 19 +- mods/MAPGEN/mcl_mapgen_core/init.lua | 1050 ++++ mods/MAPGEN/mcl_nether_fortresses/init.lua | 29 + mods/MAPGEN/mcl_nether_fortresses/mod.conf | 3 + .../schematics/nether_outpost.mts | Bin 0 -> 1392 bytes mods/MAPGEN/mcl_strongholds/init.lua | 106 + mods/MAPGEN/mcl_structures/API.md | 38 + mods/MAPGEN/mcl_structures/api.lua | 171 + mods/MAPGEN/mcl_structures/desert_temple.lua | 63 + mods/MAPGEN/mcl_structures/geode.lua | 88 + mods/MAPGEN/mcl_structures/igloo.lua | 164 + mods/MAPGEN/mcl_structures/init.lua | 189 + mods/MAPGEN/mcl_structures/jungle_temple.lua | 45 + .../locale/mcl_structures.zh_TW.tr | 7 + mods/MAPGEN/mcl_structures/mod.conf | 6 + mods/MAPGEN/mcl_structures/ocean_ruins.lua | 132 + .../mcl_structures/schematics/coral_cora.mts | Bin 0 -> 719 bytes .../mcl_structures_coral_brain_1.mts | Bin 0 -> 157 bytes .../mcl_structures_coral_brain_2.mts | Bin 0 -> 124 bytes .../mcl_structures_coral_bubble_1.mts | Bin 0 -> 146 bytes .../mcl_structures_coral_bubble_2.mts | Bin 0 -> 129 bytes .../mcl_structures_coral_fire_1.mts | Bin 0 -> 152 bytes .../mcl_structures_coral_fire_2.mts | Bin 0 -> 127 bytes .../mcl_structures_coral_horn_1.mts | Bin 0 -> 152 bytes .../mcl_structures_coral_horn_2.mts | Bin 0 -> 125 bytes .../mcl_structures_coral_tube_1.mts | Bin 0 -> 138 bytes .../mcl_structures_coral_tube_2.mts | Bin 0 -> 126 bytes .../mcl_structures_jungle_temple_nice.mts | Bin 0 -> 3997 bytes .../mcl_structures_ocean_ruins_cold_1.mts | Bin 0 -> 333 bytes .../mcl_structures_ocean_ruins_cold_2.mts | Bin 0 -> 396 bytes .../mcl_structures_ocean_ruins_cold_3.mts | Bin 0 -> 697 bytes .../mcl_structures_ocean_ruins_warm_1.mts | Bin 0 -> 311 bytes .../mcl_structures_ocean_ruins_warm_2.mts | Bin 0 -> 331 bytes .../mcl_structures_ocean_ruins_warm_3.mts | Bin 0 -> 536 bytes .../mcl_structures_ocean_ruins_warm_4.mts | Bin 0 -> 390 bytes ...structures_shipwreck_full_back_damaged.mts | Bin 0 -> 1203 bytes .../mcl_structures_shipwreck_full_damaged.mts | Bin 0 -> 1518 bytes .../mcl_structures_shipwreck_full_normal.mts | Bin 0 -> 1545 bytes .../mcl_structures_shipwreck_half_back.mts | Bin 0 -> 1248 bytes .../mcl_structures_shipwreck_half_front.mts | Bin 0 -> 903 bytes .../mcl_structures_woodland_cabin.mts | Bin 0 -> 2736 bytes .../mcl_structures_woodland_outpost.mts | Bin 0 -> 3341 bytes mods/MAPGEN/mcl_structures/shipwrecks.lua | 161 + mods/MAPGEN/mcl_structures/witch_hut.lua | 50 + .../mcl_structures/woodland_mansion.lua | 58 + mods/MAPGEN/mcl_terrain_features/init.lua | 269 + mods/MAPGEN/mcl_terrain_features/mod.conf | 3 + mods/MAPGEN/mcl_villages/buildings.lua | 332 ++ mods/MAPGEN/mcl_villages/const.lua | 76 + mods/MAPGEN/mcl_villages/init.lua | 90 +- .../mcl_villages/schematics/belltower.mts | Bin 0 -> 211 bytes mods/MAPGEN/mcl_villages/utils.lua | 232 + mods/MAPGEN/tsm_railcorridors/init.lua | 22 +- mods/MISC/findbiome/locale/findbiome.zh_TW.tr | 10 + mods/MISC/mcl_commands/kill.lua | 6 - .../mcl_commands/locale/mcl_commands.ru.tr | 9 + .../mcl_commands/locale/mcl_commands.zh_TW.tr | 23 + mods/MISC/mcl_commands/mod.conf | 1 + mods/MISC/mcl_commands/seed.lua | 2 +- mods/MISC/mcl_commands/summon.lua | 9 + mods/MISC/mcl_privs/init.lua | 24 +- mods/MISC/mcl_privs/locale/mcl_privs.zh_TW.tr | 2 + mods/MISC/mcl_wip/locale/mcl_wip.zh_TW.tr | 4 + mods/PLAYER/mcl_hunger/api.lua | 2 +- mods/PLAYER/mcl_hunger/init.lua | 11 +- .../mcl_hunger/locale/mcl_hunger.zh_TW.tr | 8 + mods/PLAYER/mcl_player/init.lua | 18 +- mods/PLAYER/mcl_player/mod.conf | 1 + mods/PLAYER/mcl_playerplus/init.lua | 68 +- .../locale/mcl_playerplus.zh_TW.tr | 3 + mods/PLAYER/mcl_playerplus/mod.conf | 4 + mods/PLAYER/mcl_skins/.gitignore | 4 + mods/PLAYER/mcl_skins/init.lua | 34 +- .../mcl_skins/locale/mcl_skins.zh_TW.tr | 13 + .../mcl_skins/textures/mcl_skins_player_1.png | Bin 2625 -> 0 bytes .../textures/mcl_skins_player_dummy.png | Bin 982 -> 0 bytes mods/PLAYER/mcl_spawn/init.lua | 27 + mods/PLAYER/mcl_spawn/locale/mcl_spawn.de.tr | 3 +- .../mcl_spawn/locale/mcl_spawn.zh_TW.tr | 4 + mods/PLAYER/mcl_spawn/locale/template.txt | 3 +- mods/PLAYER/mcl_wieldview/init.lua | 79 + settingtypes.txt | 15 +- tools/Conversion_Table.csv | 2 +- tools/strip_trailing_whitespace.sh | 2 + 583 files changed, 20081 insertions(+), 6801 deletions(-) delete mode 100644 CODE_OF_CONDUCT.md create mode 100644 README_locale/README.zh_TW.md create mode 100644 list-what-to-merge-from-mcl2.txt create mode 100644 mods/CORE/mcl_damage/API.md create mode 100644 mods/CORE/mcl_explosions/locale/mcl_explosions.zh_TW.tr create mode 100644 mods/ENTITIES/mcl_boats/locale/mcl_boats.zh_TW.tr create mode 100644 mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.zh_TW.tr create mode 100644 mods/ENTITIES/mcl_mobs/api.lua delete mode 100644 mods/ENTITIES/mcl_mobs/api/mount.lua delete mode 100644 mods/ENTITIES/mcl_mobs/locale/mcl_mobs.pl.tr create mode 100644 mods/ENTITIES/mcl_mobs/locale/mcl_mobs.zh_TW.tr create mode 100644 mods/ENTITIES/mcl_mobs/lucky_block.lua rename mods/ENTITIES/mcl_mobs/{README.md => readme.MD} (100%) delete mode 100644 mods/ENTITIES/mcl_mobs/sounds/attributes.txt delete mode 100644 mods/ENTITIES/mcl_mobs/sounds/default_punch.1.ogg delete mode 100644 mods/ENTITIES/mcl_mobs/sounds/default_punch.2.ogg delete mode 100644 mods/ENTITIES/mcl_mobs/sounds/default_punch.3.ogg create mode 100644 mods/ENTITIES/mcl_mobs/sounds/default_punch.ogg create mode 100644 mods/ENTITIES/mcl_mobs/spawning.lua delete mode 100644 mods/ENTITIES/mcl_mobs/todo.txt create mode 100644 mods/ENTITIES/mcl_paintings/locale/mcl_paintings.zh_TW.tr create mode 100644 mods/ENTITIES/mcl_wither_spawning/init.lua create mode 100644 mods/ENTITIES/mcl_wither_spawning/mod.conf create mode 100644 mods/ENTITIES/mcl_wither_spawning/schems/wither_spawn_x.we create mode 100644 mods/ENTITIES/mcl_wither_spawning/schems/wither_spawn_z.we delete mode 100644 mods/ENTITIES/mobs_mc/0_gameconfig.lua delete mode 100644 mods/ENTITIES/mobs_mc/2_throwing.lua delete mode 100644 mods/ENTITIES/mobs_mc/3_shared.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/agent.lua create mode 100644 mods/ENTITIES/mobs_mc/common.lua delete mode 100644 mods/ENTITIES/mobs_mc/gameconfig.md delete mode 100644 mods/ENTITIES/mobs_mc/locale/mobs_mc.pl.tr delete mode 100644 mods/ENTITIES/mobs_mc/models/attributes.txt create mode 100644 mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.7.ogg create mode 100644 mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_accept.1.ogg create mode 100644 mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_accept.2.ogg create mode 100644 mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_hurt.2.ogg create mode 100644 mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_trade.1.ogg create mode 100644 mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_trade.2.ogg create mode 100644 mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_trade.3.ogg create mode 100644 mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_trade.4.ogg create mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_enderman_cactus_background.png delete mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_chest.png delete mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_rabbit_caerbannog.png delete mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_spit.png create mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_armorer.png create mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_cartographer.png create mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_fisherman.png create mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_fletcher.png create mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_leatherworker.png create mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_nitwit.png create mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_sheperd.png create mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_toolsmith.png create mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_weaponsmith.png create mode 100644 mods/ENVIRONMENT/lightning/locale/lightning.zh_TW.tr create mode 100644 mods/ENVIRONMENT/mcl_void_damage/locale/mcl_void_damage.zh_TW.tr create mode 100644 mods/ENVIRONMENT/mcl_weather/locale/mcl_weather.zh_TW.tr create mode 100644 mods/HELP/doc/doc_identifier/locale/doc_identifier.zh_TW.tr create mode 100644 mods/HELP/mcl_craftguide/textures/craftguide_furnace.png create mode 100644 mods/HUD/hudbars/locale/hudbars.zh_TW.tr create mode 100644 mods/HUD/mcl_experience/locale/mcl_experience.zh_TW.tr create mode 100644 mods/HUD/mcl_hbarmor/locale/mcl_hbarmor.zh_TW.tr create mode 100644 mods/HUD/mcl_inventory/locale/mcl_inventory.zh_TW.tr delete mode 100644 mods/ITEMS/REDSTONE/mcl_droppers/init_new.lua create mode 100644 mods/ITEMS/mcl_anvils/locale/mcl_anvils.zh_TW.tr create mode 100644 mods/ITEMS/mcl_armor/API.md create mode 100644 mods/ITEMS/mcl_armor/locale/mcl_armor.zh_TW.tr delete mode 100644 mods/ITEMS/mcl_armor/textures/mcl_armor_boots_chain_preview.png delete mode 100644 mods/ITEMS/mcl_armor/textures/mcl_armor_boots_diamond_preview.png delete mode 100644 mods/ITEMS/mcl_armor/textures/mcl_armor_boots_gold_preview.png delete mode 100644 mods/ITEMS/mcl_armor/textures/mcl_armor_boots_iron_preview.png delete mode 100644 mods/ITEMS/mcl_armor/textures/mcl_armor_boots_leather_preview.png delete mode 100644 mods/ITEMS/mcl_armor/textures/mcl_armor_chestplate_chain_preview.png delete mode 100644 mods/ITEMS/mcl_armor/textures/mcl_armor_chestplate_diamond_preview.png delete mode 100644 mods/ITEMS/mcl_armor/textures/mcl_armor_chestplate_gold_preview.png delete mode 100644 mods/ITEMS/mcl_armor/textures/mcl_armor_chestplate_iron_preview.png delete mode 100644 mods/ITEMS/mcl_armor/textures/mcl_armor_chestplate_leather_preview.png delete mode 100644 mods/ITEMS/mcl_armor/textures/mcl_armor_helmet_chain_preview.png delete mode 100644 mods/ITEMS/mcl_armor/textures/mcl_armor_helmet_diamond_preview.png delete mode 100644 mods/ITEMS/mcl_armor/textures/mcl_armor_helmet_gold_preview.png delete mode 100644 mods/ITEMS/mcl_armor/textures/mcl_armor_helmet_iron_preview.png delete mode 100644 mods/ITEMS/mcl_armor/textures/mcl_armor_helmet_leather_preview.png delete mode 100644 mods/ITEMS/mcl_armor/textures/mcl_armor_leggings_chain_preview.png delete mode 100644 mods/ITEMS/mcl_armor/textures/mcl_armor_leggings_diamond_preview.png delete mode 100644 mods/ITEMS/mcl_armor/textures/mcl_armor_leggings_gold_preview.png delete mode 100644 mods/ITEMS/mcl_armor/textures/mcl_armor_leggings_iron_preview.png delete mode 100644 mods/ITEMS/mcl_armor/textures/mcl_armor_leggings_leather_preview.png create mode 100644 mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.zh_TW.tr create mode 100644 mods/ITEMS/mcl_barrels/init.lua create mode 100644 mods/ITEMS/mcl_barrels/locale/mcl_barrels.de.tr create mode 100644 mods/ITEMS/mcl_barrels/locale/mcl_barrels.es.tr create mode 100644 mods/ITEMS/mcl_barrels/locale/mcl_barrels.fr.tr create mode 100644 mods/ITEMS/mcl_barrels/locale/mcl_barrels.pl.tr create mode 100644 mods/ITEMS/mcl_barrels/locale/mcl_barrels.ru.tr create mode 100644 mods/ITEMS/mcl_barrels/locale/template.txt create mode 100644 mods/ITEMS/mcl_barrels/mod.conf create mode 100755 mods/ITEMS/mcl_barrels/textures/mcl_barrels_barrel_bottom.png create mode 100755 mods/ITEMS/mcl_barrels/textures/mcl_barrels_barrel_side.png create mode 100755 mods/ITEMS/mcl_barrels/textures/mcl_barrels_barrel_top.png create mode 100755 mods/ITEMS/mcl_barrels/textures/mcl_barrels_barrel_top_open.png create mode 100644 mods/ITEMS/mcl_beds/locale/mcl_beds.zh_TW.tr create mode 100644 mods/ITEMS/mcl_bells/README.md create mode 100644 mods/ITEMS/mcl_bells/init.lua create mode 100644 mods/ITEMS/mcl_bells/locale/mcl_bells.fr.tr create mode 100644 mods/ITEMS/mcl_bells/locale/template.txt create mode 100644 mods/ITEMS/mcl_bells/mod.conf create mode 100755 mods/ITEMS/mcl_bells/sounds/mcl_bells_bell_stroke.ogg create mode 100644 mods/ITEMS/mcl_bells/textures/mcl_bells_bell.png create mode 100644 mods/ITEMS/mcl_bells/textures/mcl_bells_bell_bottom.png create mode 100644 mods/ITEMS/mcl_bells/textures/mcl_bells_bell_side.png create mode 100644 mods/ITEMS/mcl_bells/textures/mcl_bells_bell_top.png create mode 100644 mods/ITEMS/mcl_blackstone/schematics/mcl_blackstone_nether_fossil_1.mts create mode 100644 mods/ITEMS/mcl_blackstone/schematics/mcl_blackstone_nether_fossil_2.mts create mode 100644 mods/ITEMS/mcl_blackstone/schematics/mcl_blackstone_nether_fossil_3.mts create mode 100644 mods/ITEMS/mcl_blackstone/schematics/mcl_blackstone_nether_fossil_4.mts create mode 100644 mods/ITEMS/mcl_blackstone/textures/lantern.png create mode 100644 mods/ITEMS/mcl_blackstone/textures/lantern_bottom.png create mode 100644 mods/ITEMS/mcl_blackstone/textures/lantern_top.png create mode 100644 mods/ITEMS/mcl_blackstone/textures/mcl_blackstone.png create mode 100644 mods/ITEMS/mcl_books/locale/mcl_books.zh_TW.tr create mode 100644 mods/ITEMS/mcl_bows/locale/mcl_bows.zh_TW.tr create mode 100644 mods/ITEMS/mcl_brewing/locale/mcl_brewing.zh_TW.tr create mode 100644 mods/ITEMS/mcl_buckets/locale/mcl_buckets.zh_TW.tr create mode 100644 mods/ITEMS/mcl_cake/locale/mcl_cake.zh_TW.tr create mode 100644 mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.zh_TW.tr create mode 100644 mods/ITEMS/mcl_chests/textures/mcl_chests_ender_present.png create mode 100644 mods/ITEMS/mcl_chests/textures/mcl_chests_noise.png create mode 100644 mods/ITEMS/mcl_chests/textures/mcl_chests_noise_double.png create mode 100644 mods/ITEMS/mcl_chests/textures/mcl_chests_normal_double_present.png create mode 100644 mods/ITEMS/mcl_chests/textures/mcl_chests_normal_present.png create mode 100644 mods/ITEMS/mcl_chests/textures/mcl_chests_trapped_double_present.png create mode 100644 mods/ITEMS/mcl_chests/textures/mcl_chests_trapped_present.png create mode 100644 mods/ITEMS/mcl_clock/locale/mcl_clock.zh_TW.tr create mode 100644 mods/ITEMS/mcl_cocoas/locale/mcl_cocoas.zh_TW.tr create mode 100644 mods/ITEMS/mcl_compass/API.md create mode 100644 mods/ITEMS/mcl_compass/locale/mcl_compass.zh_TW.tr create mode 100644 mods/ITEMS/mcl_core/locale/mcl_core.zh_TW.tr create mode 100644 mods/ITEMS/mcl_core/textures/mcl_core_crying_obsidian_tear.png create mode 100644 mods/ITEMS/mcl_core/textures/mcl_core_crying_obsidian_tear2.png create mode 100644 mods/ITEMS/mcl_core/textures/mcl_core_crying_obsidian_tear3.png rename mods/ITEMS/mcl_core/textures/{default_papyrus.png => mcl_core_papyrus.png} (100%) create mode 100644 mods/ITEMS/mcl_crafting_table/locale/mcl_crafting_table.zh_TW.tr create mode 100644 mods/ITEMS/mcl_crimson/init.lua create mode 100644 mods/ITEMS/mcl_crimson/locale/mcl_crimson.de.tr create mode 100644 mods/ITEMS/mcl_crimson/locale/mcl_crimson.fr.tr create mode 100644 mods/ITEMS/mcl_crimson/locale/template.txt create mode 100644 mods/ITEMS/mcl_crimson/mod.conf create mode 100644 mods/ITEMS/mcl_crimson/schematics/crimson_fungus_1.mts create mode 100644 mods/ITEMS/mcl_crimson/schematics/crimson_fungus_2.mts create mode 100644 mods/ITEMS/mcl_crimson/schematics/crimson_fungus_3.mts create mode 100644 mods/ITEMS/mcl_crimson/schematics/warped_fungus_1.mts create mode 100644 mods/ITEMS/mcl_crimson/schematics/warped_fungus_2.mts create mode 100644 mods/ITEMS/mcl_crimson/schematics/warped_fungus_3.mts create mode 100644 mods/ITEMS/mcl_crimson/textures/crimson_hyphae.png create mode 100644 mods/ITEMS/mcl_crimson/textures/crimson_hyphae_side.png create mode 100644 mods/ITEMS/mcl_crimson/textures/crimson_hyphae_wood.png create mode 100644 mods/ITEMS/mcl_crimson/textures/crimson_nylium.png create mode 100644 mods/ITEMS/mcl_crimson/textures/crimson_nylium_side.png create mode 100644 mods/ITEMS/mcl_crimson/textures/crimson_roots.png create mode 100644 mods/ITEMS/mcl_crimson/textures/crimson_stem_stripped_side.png create mode 100644 mods/ITEMS/mcl_crimson/textures/crimson_stem_stripped_top.png create mode 100644 mods/ITEMS/mcl_crimson/textures/farming_crimson_fungus.png create mode 100644 mods/ITEMS/mcl_crimson/textures/farming_warped_fungus.png create mode 100644 mods/ITEMS/mcl_crimson/textures/nether_sprouts.png create mode 100644 mods/ITEMS/mcl_crimson/textures/nether_wart_block.png create mode 100644 mods/ITEMS/mcl_crimson/textures/shroomlight.png create mode 100644 mods/ITEMS/mcl_crimson/textures/stripped_crimson_stem.png create mode 100644 mods/ITEMS/mcl_crimson/textures/stripped_crimson_stem_side.png create mode 100644 mods/ITEMS/mcl_crimson/textures/stripped_crimson_stem_top.png create mode 100644 mods/ITEMS/mcl_crimson/textures/stripped_warped_stem.png create mode 100644 mods/ITEMS/mcl_crimson/textures/stripped_warped_stem_side.png create mode 100644 mods/ITEMS/mcl_crimson/textures/stripped_warped_stem_top.png create mode 100644 mods/ITEMS/mcl_crimson/textures/twisting_vines.png create mode 100644 mods/ITEMS/mcl_crimson/textures/twisting_vines_plant.png create mode 100644 mods/ITEMS/mcl_crimson/textures/warped_hyphae.png create mode 100644 mods/ITEMS/mcl_crimson/textures/warped_hyphae_side.png create mode 100644 mods/ITEMS/mcl_crimson/textures/warped_hyphae_wood.png create mode 100644 mods/ITEMS/mcl_crimson/textures/warped_hyphae_wood_2nd.png create mode 100644 mods/ITEMS/mcl_crimson/textures/warped_nylium.png create mode 100644 mods/ITEMS/mcl_crimson/textures/warped_nylium_side.png create mode 100644 mods/ITEMS/mcl_crimson/textures/warped_roots.png create mode 100644 mods/ITEMS/mcl_crimson/textures/warped_stem_stripped_side.png create mode 100644 mods/ITEMS/mcl_crimson/textures/warped_stem_stripped_top.png create mode 100644 mods/ITEMS/mcl_crimson/textures/warped_wart_block.png create mode 100644 mods/ITEMS/mcl_doors/locale/mcl_doors.zh_TW.tr create mode 100644 mods/ITEMS/mcl_dye/locale/mcl_dye.zh_TW.tr create mode 100644 mods/ITEMS/mcl_farming/locale/mcl_farming.zh_TW.tr delete mode 100644 mods/ITEMS/mcl_farming/textures/mcl_farming_pumpkin_face_preview.png create mode 100644 mods/ITEMS/mcl_fences/locale/mcl_fences.zh_TW.tr create mode 100644 mods/ITEMS/mcl_fire/locale/mcl_fire.zh_TW.tr create mode 100644 mods/ITEMS/mcl_fishing/locale/mcl_fishing.zh_TW.tr create mode 100644 mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.zh_TW.tr create mode 100644 mods/ITEMS/mcl_flowers/locale/mcl_flowers.zh_TW.tr create mode 100644 mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.zh_TW.tr create mode 100644 mods/ITEMS/mcl_grindstone/init.lua create mode 100644 mods/ITEMS/mcl_grindstone/mod.conf create mode 100644 mods/ITEMS/mcl_grindstone/textures/grindstone_front.png create mode 100644 mods/ITEMS/mcl_grindstone/textures/grindstone_side.png create mode 100644 mods/ITEMS/mcl_grindstone/textures/grindstone_top.png create mode 100644 mods/ITEMS/mcl_heads/locale/mcl_heads.zh_TW.tr delete mode 100644 mods/ITEMS/mcl_heads/textures/mcl_heads_creeper_preview.png delete mode 100644 mods/ITEMS/mcl_heads/textures/mcl_heads_skeleton_preview.png delete mode 100644 mods/ITEMS/mcl_heads/textures/mcl_heads_steve_preview.png delete mode 100644 mods/ITEMS/mcl_heads/textures/mcl_heads_wither_skeleton_preview.png delete mode 100644 mods/ITEMS/mcl_heads/textures/mcl_heads_zombie_preview.png create mode 100644 mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.zh_TW.tr create mode 100644 mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.zh_TW.tr create mode 100644 mods/ITEMS/mcl_jukebox/locale/mcl_jukebox.zh_TW.tr create mode 100644 mods/ITEMS/mcl_lanterns/locale/mcl_lanterns.fr.tr create mode 100644 mods/ITEMS/mcl_lanterns/locale/template.txt create mode 100644 mods/ITEMS/mcl_maps/locale/mcl_maps.zh_TW.tr create mode 100644 mods/ITEMS/mcl_mobitems/textures/mcl_mobitems_diamond_horse_armor.png create mode 100644 mods/ITEMS/mcl_mobitems/textures/mcl_mobitems_gold_horse_armor.png create mode 100644 mods/ITEMS/mcl_mobitems/textures/mcl_mobitems_heart_of_the_sea.png create mode 100644 mods/ITEMS/mcl_mobitems/textures/mcl_mobitems_heart_of_the_sea_split.png rename mods/{ENTITIES/mobs_mc/textures/mobs_mc_horse_armor_diamond.png => ITEMS/mcl_mobitems/textures/mcl_mobitems_horse_armor_diamond.png} (100%) rename mods/{ENTITIES/mobs_mc/textures/mobs_mc_horse_armor_gold.png => ITEMS/mcl_mobitems/textures/mcl_mobitems_horse_armor_gold.png} (100%) rename mods/{ENTITIES/mobs_mc/textures/mobs_mc_horse_armor_iron.png => ITEMS/mcl_mobitems/textures/mcl_mobitems_horse_armor_iron.png} (100%) create mode 100644 mods/ITEMS/mcl_mobitems/textures/mcl_mobitems_iron_horse_armor.png create mode 100644 mods/ITEMS/mcl_mobitems/textures/mcl_mobitems_nautilus_shell.png create mode 100644 mods/ITEMS/mcl_mobspawners/locale/mcl_mobspawners.zh_TW.tr create mode 100644 mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.zh_TW.tr create mode 100644 mods/ITEMS/mcl_mushrooms/locale/mcl_mushrooms.zh_TW.tr create mode 100644 mods/ITEMS/mcl_portals/locale/mcl_portals.zh_TW.tr create mode 100644 mods/ITEMS/mcl_signs/locale/mcl_signs.zh_TW.tr create mode 100644 mods/ITEMS/mcl_smithing_table/locale/mcl_anvils.de.tr create mode 100644 mods/ITEMS/mcl_smithing_table/locale/mcl_anvils.es.tr create mode 100644 mods/ITEMS/mcl_smithing_table/locale/mcl_anvils.fr.tr create mode 100644 mods/ITEMS/mcl_smithing_table/locale/mcl_anvils.ru.tr create mode 100644 mods/ITEMS/mcl_sponges/locale/mcl_sponges.zh_TW.tr create mode 100644 mods/ITEMS/mcl_sus_stew/LICENSE create mode 100644 mods/ITEMS/mcl_sus_stew/Note create mode 100644 mods/ITEMS/mcl_sus_stew/README.md create mode 100644 mods/ITEMS/mcl_sus_stew/init.lua create mode 100644 mods/ITEMS/mcl_sus_stew/mod.conf create mode 100644 mods/ITEMS/mcl_sus_stew/textures/sus_stew.png create mode 100644 mods/ITEMS/mcl_throwing/locale/mcl_throwing.zh_TW.tr create mode 100644 mods/ITEMS/mcl_tnt/locale/mcl_tnt.zh_TW.tr create mode 100644 mods/ITEMS/mcl_tools/locale/mcl_tools.zh_TW.tr create mode 100644 mods/ITEMS/mcl_torches/locale/mcl_torches.zh_TW.tr 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}/textures/mcl_totems_totem.png (100%) create mode 100644 mods/ITEMS/mcl_walls/locale/mcl_walls.zh_TW.tr create mode 100644 mods/ITEMS/mclx_core/locale/mclx_core.zh_TW.tr create mode 100644 mods/ITEMS/mclx_fences/locale/mclx_fences.zh_TW.tr create mode 100644 mods/ITEMS/screwdriver/locale/screwdriver.zh_TW.tr create mode 100644 mods/ITEMS/xpanes/locale/xpanes.zh_TW.tr create mode 100644 mods/MAPGEN/mcl_nether_fortresses/init.lua create mode 100644 mods/MAPGEN/mcl_nether_fortresses/mod.conf create mode 100644 mods/MAPGEN/mcl_nether_fortresses/schematics/nether_outpost.mts create mode 100644 mods/MAPGEN/mcl_strongholds/init.lua create mode 100644 mods/MAPGEN/mcl_structures/API.md create mode 100644 mods/MAPGEN/mcl_structures/api.lua create mode 100644 mods/MAPGEN/mcl_structures/geode.lua create mode 100644 mods/MAPGEN/mcl_structures/locale/mcl_structures.zh_TW.tr create mode 100644 mods/MAPGEN/mcl_structures/ocean_ruins.lua create mode 100644 mods/MAPGEN/mcl_structures/schematics/coral_cora.mts create mode 100644 mods/MAPGEN/mcl_structures/schematics/mcl_structures_coral_brain_1.mts create mode 100644 mods/MAPGEN/mcl_structures/schematics/mcl_structures_coral_brain_2.mts create mode 100644 mods/MAPGEN/mcl_structures/schematics/mcl_structures_coral_bubble_1.mts create mode 100644 mods/MAPGEN/mcl_structures/schematics/mcl_structures_coral_bubble_2.mts create mode 100644 mods/MAPGEN/mcl_structures/schematics/mcl_structures_coral_fire_1.mts create mode 100644 mods/MAPGEN/mcl_structures/schematics/mcl_structures_coral_fire_2.mts create mode 100644 mods/MAPGEN/mcl_structures/schematics/mcl_structures_coral_horn_1.mts create mode 100644 mods/MAPGEN/mcl_structures/schematics/mcl_structures_coral_horn_2.mts create mode 100644 mods/MAPGEN/mcl_structures/schematics/mcl_structures_coral_tube_1.mts create mode 100644 mods/MAPGEN/mcl_structures/schematics/mcl_structures_coral_tube_2.mts create mode 100644 mods/MAPGEN/mcl_structures/schematics/mcl_structures_jungle_temple_nice.mts create mode 100644 mods/MAPGEN/mcl_structures/schematics/mcl_structures_ocean_ruins_cold_1.mts create mode 100644 mods/MAPGEN/mcl_structures/schematics/mcl_structures_ocean_ruins_cold_2.mts create mode 100644 mods/MAPGEN/mcl_structures/schematics/mcl_structures_ocean_ruins_cold_3.mts create mode 100644 mods/MAPGEN/mcl_structures/schematics/mcl_structures_ocean_ruins_warm_1.mts create mode 100644 mods/MAPGEN/mcl_structures/schematics/mcl_structures_ocean_ruins_warm_2.mts create mode 100644 mods/MAPGEN/mcl_structures/schematics/mcl_structures_ocean_ruins_warm_3.mts create mode 100644 mods/MAPGEN/mcl_structures/schematics/mcl_structures_ocean_ruins_warm_4.mts create mode 100644 mods/MAPGEN/mcl_structures/schematics/mcl_structures_shipwreck_full_back_damaged.mts create mode 100644 mods/MAPGEN/mcl_structures/schematics/mcl_structures_shipwreck_full_damaged.mts create mode 100644 mods/MAPGEN/mcl_structures/schematics/mcl_structures_shipwreck_full_normal.mts create mode 100644 mods/MAPGEN/mcl_structures/schematics/mcl_structures_shipwreck_half_back.mts create mode 100644 mods/MAPGEN/mcl_structures/schematics/mcl_structures_shipwreck_half_front.mts create mode 100644 mods/MAPGEN/mcl_structures/schematics/mcl_structures_woodland_cabin.mts create mode 100644 mods/MAPGEN/mcl_structures/schematics/mcl_structures_woodland_outpost.mts create mode 100644 mods/MAPGEN/mcl_structures/shipwrecks.lua create mode 100644 mods/MAPGEN/mcl_structures/woodland_mansion.lua create mode 100644 mods/MAPGEN/mcl_terrain_features/init.lua create mode 100644 mods/MAPGEN/mcl_terrain_features/mod.conf create mode 100644 mods/MAPGEN/mcl_villages/buildings.lua create mode 100644 mods/MAPGEN/mcl_villages/const.lua create mode 100644 mods/MAPGEN/mcl_villages/schematics/belltower.mts create mode 100644 mods/MAPGEN/mcl_villages/utils.lua create mode 100644 mods/MISC/findbiome/locale/findbiome.zh_TW.tr create mode 100644 mods/MISC/mcl_commands/locale/mcl_commands.zh_TW.tr create mode 100644 mods/MISC/mcl_privs/locale/mcl_privs.zh_TW.tr create mode 100644 mods/MISC/mcl_wip/locale/mcl_wip.zh_TW.tr create mode 100644 mods/PLAYER/mcl_hunger/locale/mcl_hunger.zh_TW.tr create mode 100644 mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.zh_TW.tr create mode 100644 mods/PLAYER/mcl_skins/.gitignore create mode 100644 mods/PLAYER/mcl_skins/locale/mcl_skins.zh_TW.tr delete mode 100644 mods/PLAYER/mcl_skins/textures/mcl_skins_player_1.png delete mode 100644 mods/PLAYER/mcl_skins/textures/mcl_skins_player_dummy.png create mode 100644 mods/PLAYER/mcl_spawn/locale/mcl_spawn.zh_TW.tr create mode 100755 tools/strip_trailing_whitespace.sh diff --git a/.gitignore b/.gitignore index 393885da7..8228ba34a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ # Text Editor TMP Files *.swp +*.blend1 +*.blend2 +*.blend3 diff --git a/API.md b/API.md index 3c609ddae..0203b5c73 100644 --- a/API.md +++ b/API.md @@ -42,7 +42,7 @@ A lot of things are possible by using one of the APIs in the mods. Note that not * Buckets: `ITEMS/mcl_buckets` * Dispenser support: `ITEMS/REDSTONE/mcl_dispensers` -## Mobs +### Mobs * Mobs: `ENTITIES/mcl_mobs` MineClone 5 uses its own mobs framework, called “Mobs Redo: MineClone 5 Edition” or “MRM” for short. diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md deleted file mode 100644 index 8086a2f44..000000000 --- a/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,128 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -We as members, contributors, and leaders pledge to make participation in our -community a harassment-free experience for everyone, regardless of age, body -size, visible or invisible disability, ethnicity, sex characteristics, gender -identity and expression, level of experience, education, socio-economic status, -nationality, personal appearance, race, religion, or sexual identity -and orientation. - -We pledge to act and interact in ways that contribute to an open, welcoming, -diverse, inclusive, and healthy community. - -## Our Standards - -Examples of behavior that contributes to a positive environment for our -community include: - -* Demonstrating empathy and kindness toward other people -* Being respectful of differing opinions, viewpoints, and experiences -* Giving and gracefully accepting constructive feedback -* Accepting responsibility and apologizing to those affected by our mistakes, - and learning from the experience -* Focusing on what is best not just for us as individuals, but for the - overall community - -Examples of unacceptable behavior include: - -* The use of sexualized language or imagery, and sexual attention or - advances of any kind -* Trolling, insulting or derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or email - address, without their explicit permission -* Other conduct which could reasonably be considered inappropriate in a - professional setting - -## Enforcement Responsibilities - -Community leaders are responsible for clarifying and enforcing our standards of -acceptable behavior and will take appropriate and fair corrective action in -response to any behavior that they deem inappropriate, threatening, offensive, -or harmful. - -Community leaders have the right and responsibility to remove, edit, or reject -comments, commits, code, wiki edits, issues, and other contributions that are -not aligned to this Code of Conduct, and will communicate reasons for moderation -decisions when appropriate. - -## Scope - -This Code of Conduct applies within all community spaces, and also applies when -an individual is officially representing the community in public spaces. -Examples of representing our community include using an official e-mail address, -posting via an official social media account, or acting as an appointed -representative at an online or offline event. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported to the community leaders responsible for enforcement at -eliasfleckenstein@web.de. -All complaints will be reviewed and investigated promptly and fairly. - -All community leaders are obligated to respect the privacy and security of the -reporter of any incident. - -## Enforcement Guidelines - -Community leaders will follow these Community Impact Guidelines in determining -the consequences for any action they deem in violation of this Code of Conduct: - -### 1. Correction - -**Community Impact**: Use of inappropriate language or other behavior deemed -unprofessional or unwelcome in the community. - -**Consequence**: A private, written warning from community leaders, providing -clarity around the nature of the violation and an explanation of why the -behavior was inappropriate. A public apology may be requested. - -### 2. Warning - -**Community Impact**: A violation through a single incident or series -of actions. - -**Consequence**: A warning with consequences for continued behavior. No -interaction with the people involved, including unsolicited interaction with -those enforcing the Code of Conduct, for a specified period of time. This -includes avoiding interactions in community spaces as well as external channels -like social media. Violating these terms may lead to a temporary or -permanent ban. - -### 3. Temporary Ban - -**Community Impact**: A serious violation of community standards, including -sustained inappropriate behavior. - -**Consequence**: A temporary ban from any sort of interaction or public -communication with the community for a specified period of time. No public or -private interaction with the people involved, including unsolicited interaction -with those enforcing the Code of Conduct, is allowed during this period. -Violating these terms may lead to a permanent ban. - -### 4. Permanent Ban - -**Community Impact**: Demonstrating a pattern of violation of community -standards, including sustained inappropriate behavior, harassment of an -individual, or aggression toward or disparagement of classes of individuals. - -**Consequence**: A permanent ban from any sort of public interaction within -the community. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], -version 2.0, available at -https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. - -Community Impact Guidelines were inspired by [Mozilla's code of conduct -enforcement ladder](https://github.com/mozilla/diversity). - -[homepage]: https://www.contributor-covenant.org - -For answers to common questions about this code of conduct, see the FAQ at -https://www.contributor-covenant.org/faq. Translations are available at -https://www.contributor-covenant.org/translations. diff --git a/GROUPS.md b/GROUPS.md index a6d63d82d..3610b98bb 100644 --- a/GROUPS.md +++ b/GROUPS.md @@ -41,6 +41,7 @@ Please read to learn how digging times * `flammable=-1` Does not get destroyed by fire * `fire_encouragement`: How quickly this block catches fire * `fire_flammability`: How fast the block will burn away +* `path_creation_possible=1`: Node can be turned into grass path by using a shovel on it * `spreading_dirt_type=1`: A dirt-type block with a cover (e.g. grass) which may spread to neighbor dirt blocks * `dirtifies_below_solid=1`: This node turns into dirt immediately when a solid or dirtifier node is placed on top * `dirtifier=1`: This node turns nodes the above group into dirt when placed above @@ -56,6 +57,7 @@ Please read to learn how digging times * `no_eat_delay=1`: Only for foodstuffs. When eating this, all eating delays are ignored. * `can_eat_when_full=1`: Only for foodstuffs. This item can be eaten when the user has a full hunger bar * `attached_node_facedir=1`: Like `attached_node`, but for facedir nodes +* `supported_node=1`: Like `attached_node`, but can be placed on any nodes that do not have the `drawtype="airlike"` attribute. * `cauldron`: Cauldron. 1: Empty. 2-4: Water height * `anvil`: Anvil. 1: No damage. 2-3: Higher damage levels * `no_rename=1`: Item cannot be renamed by anvil @@ -71,7 +73,7 @@ Please read to learn how digging times * `coral_block=X`: Coral block (1 = alive, 2 = dead) * `coral_species=X`: Specifies the species of a coral; equal X means equal species * `set_on_fire=X`: Sets any (not fire-resistant) mob or player on fire for X seconds when touching -* `compostability`: Amount from 1 to 100 that defines the percentage of likelyhood that the composter will advance a level. +* `compostability=X`: Amount from 1 to 100 that defines the percentage of likelyhood that the composter will advance a level. #### Footnotes @@ -100,6 +102,8 @@ Please read to learn how digging times * `water_bucket=1`: Bucket containing a liquid of group “water” * `enchantability=X`: How good the enchantments are the item gets (1 equals book) * `enchanted=1`: The item is already enchanted, meaning that it can't be enchanted using an enchanting table +* `cobble=1`: Cobblestone of any kind +* `soul_block`: Fire burning on these blocks turns to soul fire, can be used to craft soul torch ### Material groups diff --git a/README_locale/README.zh_TW.md b/README_locale/README.zh_TW.md new file mode 100644 index 000000000..eb7540247 --- /dev/null +++ b/README_locale/README.zh_TW.md @@ -0,0 +1,324 @@ +# MineClone 2 +一個非官方的Minetest遊戲,遊玩方式和Minecraft類似。由davedevils從MineClone分拆。 +由許多人開發。並非由Mojang Studios開發。 + +版本:0.71.0 + +### 遊玩 +你開始在一個完全由方塊隨機生成的世界裡。你可以探索這個世界,挖掘和建造世界上幾乎所有的方塊,以創造新的結構。你可以選擇在「生存模式」中進行遊戲,在這個模式中,你必須與怪物戰鬥,飢餓求生,並在遊戲的其他各個環節中慢慢進步,如採礦、養殖、建造機器等等。 + +或者你也可以在「創造模式」中玩,在這個模式中,你可以瞬間建造大部分東西。 +#### Gameplay summary + +* 沙盒式遊戲,沒有明確目標 +* 生存:與怪物和飢餓搏鬥 +* 挖礦來獲得礦物和寶物 +* 附魔:獲得經驗值並以附魔強化你的工具 +* 使用收集的方塊來創造偉大的建築 +* 收集鮮花(和其他染料來源),令世界多姿多彩 +* 找些種子並開始耕種 +* 尋找或合成數百個物品之一 +* 建立一個鐵路系統,並從礦車中得到樂趣 +* 用紅石電路建造複雜的機器 +* 在創造模式下,你幾乎可以免費建造任何東西,而且沒有限制。 + +## 如何開始 +### 開始生存 +* **挖樹幹**直到其破裂並收集木材 +* 將木頭**放入2×2的格子中**(你的物品欄中的「合成格子」),然後製作4塊木材。 +* 將4塊木材按2×2的形狀擺放在合成格子裡,製作成合成臺。 +* **右鍵單擊製作臺**以獲得3×3製作網格,製作更複雜的東西 +* 使用**合成指南**(書形圖標)了解所有可能的合成方式 +* **製作一個木鎬**,這樣你就可以挖石頭了。 +* 不同的工具可以打破不同種類的方塊。試試吧! +* 繼續玩你想玩的。盡情享受吧! + +### 耕種 +* 找到種子 +* 合成鋤頭 +* 用鋤頭右鍵點擊泥土或類似的方塊,創建農田 +* 將種子放在農田上,看著它們長出來 +* Collect plant when fully grown +* If near water, farmland becomes wet and speeds up growth + +### Furnace +* Craft furnace +* Furnace allows you to obtain more items +* Upper slot must contain a smeltable item (example: iron ore) +* Lower slot must contain a fuel item (example: coal) +* See tooltips in crafting guide to learn about fuels and smeltable items + +### Additional help +More help about the gameplay, blocks items and much more can be found from inside +the game. You can access the help from your inventory menu. + +### Special items +The following items are interesting for Creative Mode and for adventure +map builders. They can not be obtained in-game or in the creative inventory. + +* Barrier: `mcl_core:barrier` + +Use the `/giveme` chat command to obtain them. See the in-game help for +an explanation. + +#### Incomplete items +These items do not work yet, but you can get them with `/giveme` for testing: + +* Minecart with Chest: `mcl_minecarts:chest_minecart` +* Minecart with Furnace: `mcl_minecarts:furnace_minecart` +* Minecart with Hopper: `mcl_minecarts:hopper_minecart` +* Minecart with Command Block: `mcl_minecarts:command_block_minecart` + +## Installation +This game requires [Minetest](http://minetest.net) to run (version 5.0.0 or +later). So you need to install Minetest first. Only stable versions of Minetest +are officially supported. +There is no support for running MineClone 2 in development versions of Minetest. + +To install MineClone 2 (if you haven't already), move this directory into the +“games” directory of your Minetest data directory. Consult the help of +Minetest to learn more. + +## Project description +The main goal of **MineClone 2** is to be a clone of Minecraft and to be released as free software. + +* **開發目標:我的世界, Java版, 版本 1.12** +* MineClone2還包括Minetest支持的Optifine功能。 +* 後期Minecraft版本的功能可能會偷偷加入,但它們的優先級較低。 +* 總的來說,Minecraft的目標是在Minetest目前允許的情況下進行克隆。 +* 克隆Minecraft是最優先的。 +* MineClone2將使用不同的圖形和聲音,但風格相似。 +* 克隆界面沒有優先權。只會被粗略地模仿。 +* 在Minetest中發現的局限性將在開發過程中被記錄和報告。 + +## 完成程度 +該遊戲目前處於**alpha**階段。 +它是可玩的,但尚未完成,預計會出現許多錯誤。 +向後兼容性是**不能保證的**,更新你的世界可能會造成大大小小的bug(比如「缺少節點」的錯誤甚至崩潰)。 + +已經實現以下功能: + +* 工具,武器 +* 盔甲 +* 合成和熔煉系統:2×2 合成格, 合成臺 (3×3 合成格), 熔爐, 合成教學 +* 儲物箱,大型儲物箱,終界箱和界伏盒 +* 熔爐, 漏斗 +* 飢餓和飽食 +* 大多數怪物和動物 +* Minecraft 1.12中的所有礦物 +* 主世界的大部分方塊 +* 水和岩漿 +* 天氣 +* 28個生態域 +* 地獄,熾熱的維度 +* 紅石電路(部分) +* 礦車(部分) +* 狀態效果(部分) +* 經驗系統 +* 附魔 +* 釀造,藥水,藥水箭(部分) +* 船 +* 火 +* 建築方塊:樓梯、半磚、門、地板門、柵欄、柵欄門、牆。 +* 時鐘 +* 指南針 +* 海綿 +* 史萊姆方塊(不與紅石互動) +* 小植物和樹苗 +* 染料 +* 旗幟 +* 裝飾方塊:玻璃、染色玻璃、玻璃片、鐵柵欄、陶土(和染色版本)、頭顱等 +* 物品展示框 +* 唱片機 +* 床 +* 物品欄 +* 創造模式物品欄 +* 生產 +* 書和羽毛筆 +* 一些服務器命令 +* 還有更多! + +以下是不完整的特性: + +* 生成結構(特別是村莊) +* 一些怪物和動物 +* 紅石系統 +* 終界 +* 特殊的礦車 +* 一些不簡單的方塊和物品。 + +額外功能(在Minecraft 1.11中沒有)。 + +* 內置合成指南,向你展示製作和熔煉的配方 +* 遊戲中的幫助系統包含了大量關於遊戲基礎知識、方塊、物品等方面的幫助。 +* 臨時製作配方。它們的存在只是為了在你不在創造模式下時,提供一些其他無法獲得的物品。這些配方將隨著開發的進行和更多功能的出現而被移除。 +* v6地圖生成器中箱子裡的樹苗。 +* 完全可修改(得益於Minetest強大的Lua API)。 +* 新的方塊和物品: + * 查找工具,顯示觸及事物的幫助 + * 更多的半磚和樓梯 + * 地獄磚柵欄門 + * 紅地獄磚柵欄 + * 紅地獄磚柵欄門 + +與Minecraft的技性術差異: + +* 高度限制為31000格(遠高於Minecraft) +* 水平世界大小約為62000×62000格(比Minecraft中的小得多,但仍然非常大)。 +* 仍然非常不完整和有問題 +* 塊、物品、敵人和其他功能缺失。 +* 一些項目的名稱略有不同,以便於區分。 +* 唱片機的音樂不同 +* 不同的材質(像素完美) +* 不同的聲音(各種來源) +* 不同的引擎(Minetest) + +...最後,MineClone2是自由軟件! + +## 錯誤報告 +請在此處報告所有錯誤和缺少的功能: + + + +## Chating with the community +我們有Discord交流羣: + + + + +## Other readme files + +* `LICENSE.txt`:GPLv3許可文本 +* `CONTRIBUTING.md`: 為那些想參與貢獻的人提供資訊 +* `MISSING_ENGINE_FEATURES.md`: MineClone2需要改进,Minetest中缺失的功能列表。 +* `API.md`: 關於MineClone2的API + +## 參與者 +有這麼多人要列出(抱歉)。詳情請查看各mod目錄。本節只是粗略地介紹了本遊戲的核心作者。 + +### 程式碼 +* [Wuzzy](https://forum.minetest.net/memberlist.php?mode=viewprofile&u=3082):大多數mod的主要程序員(已退休) +* davedevils:MineClone 2的原型——「MineClone」的創造者 +* [ex-bart](https://github.com/ex-bart):紅石比較器 +* [Rootyjr](https://github.com/Rootyjr):釣竿和錯誤修復 +* [aligator](https://github.com/aligator):改進門 +* [ryvnf](https://github.com/ryvnf):爆炸物理 +* MysticTempest:錯誤修復 +* [bzoss](https://github.com/bzoss):狀態效果,釀造,藥水 +* kay27 :經驗系統,錯誤修復和優化(當前維護者) +* [EliasFleckenstein03](https://github.com/EliasFleckenstein03):終界水晶,附魔,燃燒的怪物/玩家,箱子的動畫和錯誤修復(當前維護者) +* epCode:更好的玩家動畫,新徽標 +* 2mac:修復動力鐵軌的錯誤 +* 更多:待篇寫 (請查看各mod目錄) + +#### Mod(概括) + +* `controls`: Arcelmi +* `flowlib`: Qwertymine13 +* `walkover`: lordfingle +* `drippingwater`: kddekadenz +* `mobs_mc`: maikerumine, 22i and others +* `awards`: rubenwardy +* `screwdriver`: RealBadAngel, Maciej Kastakin, Minetest contributors +* `xpanes`: Minetest contributors +* `mesecons` mods: Jeija and contributors +* `wieldview`: Stuart Jones +* `mcl_meshhand`: Based on `newhand` by jordan4ibanez +* `mcl_mobs`: Based on Mobs Redo [`mobs`] by TenPlus1 and contributors +* 大多其他的Mod: Wuzzy + +每个mod的详细參與者可以在各个mod目录中找到。 + +### 圖形 +* [XSSheep](http://www.minecraftforum.net/members/XSSheep):主要作者;Minecraft 1.11的Pixel Perfection资源包的制作者 +* [Wuzzy](https://forum.minetest.net/memberlist.php?mode=viewprofile&u=3082):主菜單圖像和各種編輯和添加的材質包 +* [kingoscargames](https://github.com/kingoscargames):現有材質的各種編輯和添加 +* [leorockway](https://github.com/leorockway):怪物紋理的一些編輯 +* [xMrVizzy](https://minecraft.curseforge.com/members/xMrVizzy):釉陶(材質以後會被替換) +* yutyo :MineClone2標志 +* 其他:GUI圖片 + +### 翻譯 +* Wuzzy:德語 +* Rocher Laurent :法語 +* wuniversales:西班牙語 +* kay27 :俄語 +* [Emoji](https://toyshost2.ddns.net):繁體中文 + +### 模型 +* [22i](https://github.com/22i):所有模型的作者 +* [tobyplowy](https://github.com/tobyplowy):對上述模型進行UV映射修復 + +### 聲音和音樂 +多種來源。 有關詳細信息,請參見相應的mod目錄。 + +### 特殊感謝 + +* Wuzzy,感謝他啟動和維護MineClone2多年。 +* celeron55,創建Minetest。 +* Minetest的社區提供了大量的mods選擇,其中一些最終被納入MineClone 2。 +* Jordach,為《Big Freaking Dig》的唱片機音樂合輯而來 +* 花了太多時間為Minecraft Wiki寫作的工作狂。它是創建這個遊戲的寶貴資源。 +* Notch和Jeb是Minecraft背后的主要力量 +* XSSheep用於創建Pixel Perfection資源包。 +* [22i](https://github.com/22i) 提供出色的模型和支持 +* [maikerumine](http://github.com/maikerumine) 揭開生物和生物群落的序幕 + +## 給程序員的信息 +你可以在「API.md」中找到有趣和有用的信息。 + +## 法律信息 +這是一款粉絲開發的遊戲,並非由Mojang AB開發或認可。 + +複製是一種愛的行為。請複制和分享! <3 +下面是詳細的法律條文,有需要的朋友可以參考。 + +### License of source code +``` +MineClone 2 (by kay27, EliasFleckenstein, Wuzzy, davedevils and countless others) +is an imitation of Minecraft. + +MineClone 2 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 (in the LICENSE.txt file) for more +details. + +In the mods you might find in the read-me or license +text files a different license. This counts as dual-licensing. +You can choose which license applies to you: Either the +license of MineClone 2 (GNU GPLv3) or the mod's license. + +MineClone 2 is a direct continuation of the discontinued MineClone +project by davedevils. + +Mod credits: +See `README.txt` or `README.md` in each mod directory for information about other authors. +For mods that do not have such a file, the license is the source code license +of MineClone 2 and the author is Wuzzy. +``` + +### License of media (textures and sounds) +``` +No non-free licenses are used anywhere. + +The textures, unless otherwise noted, are based on the Pixel Perfection resource pack for Minecraft 1.11, +authored by XSSheep. Most textures are verbatim copies, while some textures have been changed or redone +from scratch. +The glazed terracotta textures have been created by (MysticTempest)[https://github.com/MysticTempest]. +Source: +License: [CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/) + +The main menu images are release under: [CC0](https://creativecommons.org/publicdomain/zero/1.0/) + +All other files, unless mentioned otherwise, fall under: +Creative Commons Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +http://creativecommons.org/licenses/by-sa/3.0/ + +See README.txt in each mod directory for detailed information about other authors. +``` diff --git a/game.conf b/game.conf index c74b86ee9..14c1bf9f3 100644 --- a/game.conf +++ b/game.conf @@ -1,2 +1,3 @@ -name = MineClone 5 +title = MineClone 5 +author = MineClone 5 Community description = A survival sandbox game. Survive, gather, hunt, build, explore, and do much more. diff --git a/list-what-to-merge-from-mcl2.txt b/list-what-to-merge-from-mcl2.txt new file mode 100644 index 000000000..4cc4c287f --- /dev/null +++ b/list-what-to-merge-from-mcl2.txt @@ -0,0 +1,69 @@ +mods/ITEMS/mcl_fire/init.lua +mods/ITEMS/mcl_flowers/init.lua +mods/ITEMS/mcl_itemframes/init.lua +mods/ITEMS/mcl_lanterns/init.lua +mods/ITEMS/mcl_lanterns/mod.conf +mods/ITEMS/mcl_lanterns/register.lua +mods/ITEMS/mcl_maps/init.lua +mods/ITEMS/mcl_mobitems/init.lua +mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.fr.tr +mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.ru.tr +mods/ITEMS/mcl_mushrooms/huge.lua +mods/ITEMS/mcl_mushrooms/small.lua +mods/ITEMS/mcl_nether/init.lua +mods/ITEMS/mcl_nether/nether_wart.lua +mods/ITEMS/mcl_nether/textures/mcl_nether_netheriteblock.png +mods/ITEMS/mcl_ocean/kelp.lua +mods/ITEMS/mcl_ocean/sea_pickle.lua +mods/ITEMS/mcl_ocean/seagrass.lua +mods/ITEMS/mcl_portals/portal_end.lua +mods/ITEMS/mcl_portals/portal_nether.lua +mods/ITEMS/mcl_raw_ores/init.lua +mods/ITEMS/mcl_raw_ores/mod.conf +mods/ITEMS/mcl_shields/init.lua +mods/ITEMS/mcl_smithing_table/init.lua +mods/ITEMS/mcl_smithing_table/locale/template.txt +mods/ITEMS/mcl_smithing_table/textures/mcl_smithing_table_bottom.png +mods/ITEMS/mcl_smithing_table/textures/mcl_smithing_table_front.png +mods/ITEMS/mcl_smithing_table/textures/mcl_smithing_table_side.png +mods/ITEMS/mcl_smithing_table/textures/mcl_smithing_table_top.png +mods/ITEMS/mcl_smoker/README.md +mods/ITEMS/mcl_smoker/init.lua +mods/ITEMS/mcl_spyglass/init.lua +mods/ITEMS/mcl_spyglass/mod.conf +mods/ITEMS/mcl_tools/init.lua +mods/ITEMS/mcl_totems/init.lua +mods/MAPGEN/mcl_biomes/init.lua +mods/MAPGEN/mcl_biomes/mod.conf +mods/MAPGEN/mcl_dungeons/init.lua +mods/MAPGEN/mcl_mapgen_core/init.lua +mods/MAPGEN/mcl_strongholds/init.lua +mods/MAPGEN/mcl_structures/desert_temple.lua +mods/MAPGEN/mcl_structures/igloo.lua +mods/MAPGEN/mcl_structures/init.lua +mods/MAPGEN/mcl_structures/jungle_temple.lua +mods/MAPGEN/mcl_structures/mod.conf +mods/MAPGEN/mcl_structures/witch_hut.lua +mods/MAPGEN/mcl_villages/buildings.lua +mods/MAPGEN/mcl_villages/const.lua +mods/MAPGEN/mcl_villages/init.lua +mods/MAPGEN/mcl_villages/schematics/blacksmith.mts +mods/MAPGEN/mcl_villages/schematics/butcher.mts +mods/MAPGEN/mcl_villages/schematics/church.mts +mods/MAPGEN/mcl_villages/schematics/farm.mts +mods/MAPGEN/mcl_villages/schematics/lamp.mts +mods/MAPGEN/mcl_villages/schematics/large_house.mts +mods/MAPGEN/mcl_villages/schematics/library.mts +mods/MAPGEN/mcl_villages/schematics/medium_house.mts +mods/MAPGEN/mcl_villages/schematics/small_house.mts +mods/MAPGEN/mcl_villages/schematics/tavern.mts +mods/MAPGEN/mcl_villages/schematics/well.mts +mods/MAPGEN/mcl_villages/utils.lua +mods/MISC/mcl_commands/locale/mcl_commands.ru.tr +mods/MISC/mcl_commands/summon.lua +mods/MISC/mcl_privs/init.lua +mods/PLAYER/mcl_player/init.lua +mods/PLAYER/mcl_playerplus/init.lua +mods/PLAYER/mcl_playerplus/mod.conf +mods/PLAYER/mcl_spawn/init.lua +mods/PLAYER/mcl_wieldview/init.lua diff --git a/mods/CORE/mcl_attached/init.lua b/mods/CORE/mcl_attached/init.lua index 4f538e104..c4a7a3337 100644 --- a/mods/CORE/mcl_attached/init.lua +++ b/mods/CORE/mcl_attached/init.lua @@ -1,29 +1,93 @@ +-- Overrides the builtin minetest.check_single_for_falling. +-- We need to do this in order to handle nodes in mineclone specific groups +-- "supported_node" and "attached_node_facedir". +-- +-- Nodes in group "supported_node" can be placed on any node that does not +-- have the "airlike" drawtype. Carpets are an example of this type. + local vector = vector local facedir_to_dir = minetest.facedir_to_dir local get_item_group = minetest.get_item_group local remove_node = minetest.remove_node local get_node = minetest.get_node +local get_meta = minetest.get_meta +local registered_nodes = minetest.registered_nodes +local get_node_drops = minetest.get_node_drops +local add_item = minetest.add_item +-- drop_attached_node(p) +-- +-- This function is copied verbatim from minetest/builtin/game/falling.lua +-- We need this to do the exact same dropping node handling in our override +-- minetest.check_single_for_falling() function as in the builtin function. +-- +local function drop_attached_node(p) + local n = get_node(p) + local drops = get_node_drops(n, "") + local def = registered_nodes[n.name] + if def and def.preserve_metadata then + local oldmeta = get_meta(p):to_table().fields + -- Copy pos and node because the callback can modify them. + local pos_copy = vector.new(p) + local node_copy = {name=n.name, param1=n.param1, param2=n.param2} + local drop_stacks = {} + for k, v in pairs(drops) do + drop_stacks[k] = ItemStack(v) + end + drops = drop_stacks + def.preserve_metadata(pos_copy, node_copy, oldmeta, drops) + end + if def and def.sounds and def.sounds.fall then + core.sound_play(def.sounds.fall, {pos = p}, true) + end + remove_node(p) + for _, item in pairs(drops) do + local pos = { + x = p.x + math.random()/2 - 0.25, + y = p.y + math.random()/2 - 0.25, + z = p.z + math.random()/2 - 0.25, + } + add_item(pos, item) + end +end + +-- minetest.check_single_for_falling(pos) +-- +-- * causes an unsupported `group:falling_node` node to fall and causes an +-- unattached `group:attached_node` or `group:attached_node_facedir` node +-- or unsupported `group:supported_node` node to drop. +-- * does not spread these updates to neighbours. +-- +-- Returns true if the node at has spawned a falling node or has been +-- dropped as item(s). +-- local original_function = minetest.check_single_for_falling function minetest.check_single_for_falling(pos) - local ret_o = original_function(pos) - local ret = false - local node = minetest.get_node(pos) + if original_function(pos) then + return true + end + + local node = get_node(pos) if get_item_group(node.name, "attached_node_facedir") ~= 0 then local dir = facedir_to_dir(node.param2) if dir then if get_item_group(get_node(vector.add(pos, dir)).name, "solid") == 0 then - remove_node(pos) - local drops = minetest.get_node_drops(node.name, "") - for dr=1, #drops do - minetest.add_item(pos, drops[dr]) - end - ret = true + drop_attached_node(pos) + return true end end end - return ret_o or ret + + if get_item_group(node.name, "supported_node") ~= 0 then + local def = registered_nodes[get_node(vector.offset(pos, 0, -1, 0)).name] + if def and def.drawtype == "airlike" then + drop_attached_node(pos) + return true + end + end + + return false end diff --git a/mods/CORE/mcl_damage/API.md b/mods/CORE/mcl_damage/API.md new file mode 100644 index 000000000..9ffdcb9f4 --- /dev/null +++ b/mods/CORE/mcl_damage/API.md @@ -0,0 +1,15 @@ +# mcl_damage + +This mod is intended to overall minetest's native damage system, to provide a better integration between features that deals with entities' health. + +WARNING: Not using it inside your mods may cause strange bugs (using the native damage system may cause conflicts with this system). + +## Callbacks + +To modify the amount of damage made by something: + +```lua +--obj: an ObjectRef +mcl_damage.register_modifier(function(obj, damage, reason) +end, 0) +``` \ No newline at end of file diff --git a/mods/CORE/mcl_damage/init.lua b/mods/CORE/mcl_damage/init.lua index 8b2acbb35..262b0cf55 100644 --- a/mods/CORE/mcl_damage/init.lua +++ b/mods/CORE/mcl_damage/init.lua @@ -14,7 +14,7 @@ mcl_damage = { cactus = {}, fall = {bypasses_armor = true}, fly_into_wall = {bypasses_armor = true}, -- unused - out_of_world = {bypasses_armor = true, bypasses_magic = true, bypasses_invulnerability = true}, + out_of_world = {bypasses_armor = true, bypasses_magic = true, bypasses_invulnerability = true, bypasses_totem = true}, generic = {bypasses_armor = true}, magic = {is_magic = true, bypasses_armor = true}, dragon_breath = {is_magic = true, bypasses_armor = true}, -- this is only used for dragon fireball; dragon fireball does not actually deal impact damage tho, so this is unreachable @@ -78,7 +78,7 @@ function mcl_damage.from_punch(mcl_reason, object) mcl_reason.type = "arrow" 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_explosions/locale/mcl_explosions.zh_TW.tr b/mods/CORE/mcl_explosions/locale/mcl_explosions.zh_TW.tr new file mode 100644 index 000000000..9cac9b412 --- /dev/null +++ b/mods/CORE/mcl_explosions/locale/mcl_explosions.zh_TW.tr @@ -0,0 +1,2 @@ +# textdomain:mcl_explosions +@1 was caught in an explosion.=@1 被炸飛了 diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua index c899b5148..02ae93c49 100644 --- a/mods/CORE/mcl_util/init.lua +++ b/mods/CORE/mcl_util/init.lua @@ -271,6 +271,32 @@ function mcl_util.get_first_occupied_inventory_slot(inventory, listname) return mcl_util.get_eligible_transfer_item_slot(inventory, listname) end +local function drop_item_stack(pos, stack) + if not stack or stack:is_empty() then return end + local drop_offset = vector.new(math.random() - 0.5, 0, math.random() - 0.5) + minetest.add_item(vector.add(pos, drop_offset), stack) +end + +function mcl_util.drop_items_from_meta_container(listname) + return function(pos, oldnode, oldmetadata) + if oldmetadata and oldmetadata.inventory then + -- process in after_dig_node callback + local main = oldmetadata.inventory.main + if not main then return end + for _, stack in pairs(main) do + drop_item_stack(pos, stack) + end + else + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + for i = 1, inv:get_size("main") do + drop_item_stack(pos, inv:get_stack("main", i)) + end + meta:from_table() + end + end +end + -- Returns true if item (itemstring or ItemStack) can be used as a furnace fuel. -- Returns false otherwise function mcl_util.is_fuel(item) @@ -412,7 +438,7 @@ function mcl_util.deal_damage(target, damage, mcl_reason) if luaentity.deal_damage then luaentity:deal_damage(damage, mcl_reason or {type = "generic"}) return - elseif luaentity._cmi_is_mob then + elseif luaentity.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 @@ -433,7 +459,7 @@ end function mcl_util.get_hp(obj) local luaentity = obj:get_luaentity() - if luaentity and luaentity._cmi_is_mob then + if luaentity and luaentity.is_mob then return luaentity.health else return obj:get_hp() @@ -487,12 +513,11 @@ function mcl_util.replace_mob(obj, mob) return obj end -function mcl_util.get_pointed_thing(player) +function mcl_util.get_pointed_thing(player, liquids) local pos = vector.offset(player:get_pos(), 0, player:get_properties().eye_height, 0) local look_dir = vector.multiply(player:get_look_dir(), 5) local pos2 = vector.add(pos, look_dir) - local ray = minetest.raycast(pos, pos2, false, true) - + local ray = minetest.raycast(pos, pos2, false, liquids) if ray then for pointed_thing in ray do return pointed_thing diff --git a/mods/CORE/mcl_worlds/init.lua b/mods/CORE/mcl_worlds/init.lua index d31913599..2b4bb6aa7 100644 --- a/mods/CORE/mcl_worlds/init.lua +++ b/mods/CORE/mcl_worlds/init.lua @@ -156,6 +156,7 @@ end) function mcl_worlds.get_cloud_parameters() if mcl_mapgen.name == "valleys" then return { + -- valleys has a much higher average elevation thus often "normal" landscape ends up in the clouds height = 384, speed = {x=-2, z=0}, thickness=5, diff --git a/mods/CORE/tga_encoder/init.lua b/mods/CORE/tga_encoder/init.lua index ed387eec0..453a8c693 100644 --- a/mods/CORE/tga_encoder/init.lua +++ b/mods/CORE/tga_encoder/init.lua @@ -557,35 +557,7 @@ function image:encode(properties) self:encode_footer() -- footer end -function image:save(filename, properties) - local properties = properties or {} - properties.colormap = properties.colormap or {} - properties.compression = properties.compression or "RAW" - - self.pixel_depth = #self.pixels[1][1] * 8 - - local color_format_defaults_by_pixel_depth = { - [8] = "Y8", - [24] = "B8G8R8", - [32] = "B8G8R8A8", - } - if nil == properties.color_format then - if 0 ~= #properties.colormap then - properties.color_format = - color_format_defaults_by_pixel_depth[ - #properties.colormap[1] * 8 - ] - else - properties.color_format = - color_format_defaults_by_pixel_depth[ - self.pixel_depth - ] - end - end - assert( nil ~= properties.color_format ) - - self:encode(properties) - +function image:save(filename) local f = assert(io.open(filename, "wb")) f:write(self.data) f:close() diff --git a/mods/CORE/walkover/init.lua b/mods/CORE/walkover/init.lua index 4d712c308..eb9de4218 100644 --- a/mods/CORE/walkover/init.lua +++ b/mods/CORE/walkover/init.lua @@ -2,47 +2,45 @@ local get_connected_players = minetest.get_connected_players local get_node = minetest.get_node -local vector_add = vector.add +local vector = vector local ceil = math.ceil local pairs = pairs walkover = {} -walkover.registered_globals = {} - -function walkover.register_global(func) - table.insert(walkover.registered_globals, func) -end local on_walk = {} local registered_globals = {} +walkover.registered_globals = registered_globals + +function walkover.register_global(func) + table.insert(registered_globals, func) +end + minetest.register_on_mods_loaded(function() for name,def in pairs(minetest.registered_nodes) do if def.on_walk_over then on_walk[name] = def.on_walk_over end end - for _,func in ipairs(walkover.registered_globals) do --cache registered globals - table.insert(registered_globals, func) - end end) local timer = 0 minetest.register_globalstep(function(dtime) - timer = timer + dtime; + timer = timer + dtime if timer >= 0.3 then - for _,player in pairs(get_connected_players()) do - local pp = player:get_pos() - pp.y = ceil(pp.y) - local loc = vector_add(pp, {x=0,y=-1,z=0}) - if loc then - local nodeiamon = get_node(loc) - if nodeiamon then - if on_walk[nodeiamon.name] then - on_walk[nodeiamon.name](loc, nodeiamon, player) + for _, player in pairs(get_connected_players()) do + local ppos = player:get_pos() + ppos.y = ceil(ppos.y) + local npos = vector.add(ppos, vector.new(0, -1, 0)) + if npos then + local node = get_node(npos) + if node then + if on_walk[node.name] then + on_walk[node.name](npos, node, player) end for i = 1, #registered_globals do - registered_globals[i](loc, nodeiamon, player) + registered_globals[i](npos, node, player) end end end diff --git a/mods/ENTITIES/mcl_boats/init.lua b/mods/ENTITIES/mcl_boats/init.lua index c848a858e..f084c3c92 100644 --- a/mods/ENTITIES/mcl_boats/init.lua +++ b/mods/ENTITIES/mcl_boats/init.lua @@ -127,9 +127,11 @@ end local boat = { physical = true, + pointable = true, -- Warning: Do not change the position of the collisionbox top surface, -- lowering it causes the boat to fall through the world if underwater collisionbox = {-0.5, -0.35, -0.5, 0.5, 0.3, 0.5}, + selectionbox = {-0.7, -0.35, -0.7, 0.7, 0.3, 0.7}, visual = "mesh", mesh = "mcl_boats_boat.b3d", textures = {"mcl_boats_texture_oak_boat.png", "mcl_boats_texture_oak_boat.png", "mcl_boats_texture_oak_boat.png", "mcl_boats_texture_oak_boat.png", "mcl_boats_texture_oak_boat.png"}, @@ -336,7 +338,7 @@ 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 + if entity and entity.is_mob then attach_object(self, obj) break end diff --git a/mods/ENTITIES/mcl_boats/locale/mcl_boats.zh_TW.tr b/mods/ENTITIES/mcl_boats/locale/mcl_boats.zh_TW.tr new file mode 100644 index 000000000..c1c404f2a --- /dev/null +++ b/mods/ENTITIES/mcl_boats/locale/mcl_boats.zh_TW.tr @@ -0,0 +1,11 @@ +# textdomain: mcl_boats +Acacia Boat=相思木船 +Birch Boat=白樺木船 +Boat=船 +Boats are used to travel on the surface of water.=船是用來在水上行走的交通工具。 +Dark Oak Boat=黑橡木船 +Jungle Boat=叢林木船 +Oak Boat=橡木船 +Rightclick on a water source to place the boat. Rightclick the boat to enter it. Use [Left] and [Right] to steer, [Forwards] to speed up and [Backwards] to slow down or move backwards. Rightclick the boat again to leave it, punch the boat to make it drop as an item.=右鍵單擊水源以放置船。右鍵單擊船以搭乘它。使用[左]和[右]進行轉向,[向前]加快速度,[向後]減速或向後移動。再次右鍵單擊船以離開它,打擊船以使其掉落為物品。 +Spruce Boat=杉木船 +Water vehicle=水上交通工具 diff --git a/mods/ENTITIES/mcl_burning/api.lua b/mods/ENTITIES/mcl_burning/api.lua index 969985205..1d07e96f0 100644 --- a/mods/ENTITIES/mcl_burning/api.lua +++ b/mods/ENTITIES/mcl_burning/api.lua @@ -26,20 +26,64 @@ function mcl_burning.get_collisionbox(obj, smaller, storage) end end +local find_nodes_in_area = minetest.find_nodes_in_area + function mcl_burning.get_touching_nodes(obj, nodenames, storage) local pos = obj:get_pos() local minp, maxp = mcl_burning.get_collisionbox(obj, true, storage) - local nodes = minetest.find_nodes_in_area(vector.add(pos, minp), vector.add(pos, maxp), nodenames) + local nodes = find_nodes_in_area(vector.add(pos, minp), vector.add(pos, maxp), nodenames) return nodes end +-- Manages the fire animation on a burning player's HUD +-- +-- Parameters: +-- player - a valid player object; +-- +-- If the player already has a fire HUD, updates the burning animation. +-- If the fire does not have a fire HUD, initializes the HUD. +-- +function mcl_burning.update_hud(player) + local animation_frames = tonumber(minetest.settings:get("fire_animation_frames")) or 8 + local hud_flame_animated = "mcl_burning_hud_flame_animated.png^[opacity:180^[verticalframe:" .. animation_frames .. ":" + + local storage = mcl_burning.get_storage(player) + if not storage.fire_hud_id then + storage.animation_frame = 1 + storage.fire_hud_id = player:hud_add({ + hud_elem_type = "image", + position = {x = 0.5, y = 0.5}, + scale = {x = -100, y = -100}, + text = hud_flame_animated .. storage.animation_frame, + z_index = 1000, + }) + else + storage.animation_frame = storage.animation_frame + 1 + if storage.animation_frame > animation_frames - 1 then + storage.animation_frame = 0 + end + player:hud_change(storage.fire_hud_id, "text", hud_flame_animated .. storage.animation_frame) + end +end + +-- Sets and object state as burning and adds a fire animation to the object. +-- +-- Parameters: +-- obj - may be a player or a lua_entity; +-- burn_time - sets the object's burn duration; +-- +-- If obj is a player, adds a fire animation to the HUD, if obj is a +-- lua_entity, adds an animated fire entity to obj. +-- The effective burn duration is modified by obj's armor protection. +-- If obj was already burning, its burn duration is updated if the current +-- duration is less than burn_time. +-- If obj is dead, fireproof or a creative player, this function does nothing. +-- function mcl_burning.set_on_fire(obj, burn_time) if obj:get_hp() < 0 then return end - local storage = mcl_burning.get_storage(obj) - local luaentity = obj:get_luaentity() if luaentity and luaentity.fire_resistant then return @@ -60,52 +104,43 @@ function mcl_burning.set_on_fire(obj, burn_time) end end end - if max_fire_prot_lvl > 0 then burn_time = burn_time - math.floor(burn_time * max_fire_prot_lvl * 0.15) end end - if not storage.burn_time or burn_time >= storage.burn_time then - if obj:is_player() then - mcl_burning.channels[obj]:send_all(tostring(mcl_burning.animation_frames)) - mcl_burning.channels[obj]:send_all("start") + local storage = mcl_burning.get_storage(obj) + if storage.burn_time then + if burn_time > storage.burn_time then + storage.burn_time = burn_time end - storage.burn_time = burn_time - storage.fire_damage_timer = 0 + return + end + storage.burn_time = 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 minp, maxp = mcl_burning.get_collisionbox(obj, false, storage) + local size = vector.subtract(maxp, minp) + size = vector.multiply(size, vector.new(1.1, 1.2, 1.1)) + size = vector.divide(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 fire_entity = minetest.add_entity(obj:get_pos(), "mcl_burning:fire") + fire_entity:set_properties({visual_size = size}) + fire_entity:set_attach(obj, "", vector.new(0, size.y * 5, 0), vector.new(0, 0, 0)) - 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() - - for _, other in pairs(minetest.get_objects_inside_radius(fire_entity:get_pos(), 0)) do - local other_luaentity = other:get_luaentity() - if other_luaentity and other_luaentity.name == "mcl_burning:fire" and other_luaentity ~= fire_luaentity then - other:remove() - break - end - end + if obj:is_player() then + mcl_burning.update_hud(obj) end end function mcl_burning.extinguish(obj) + if not obj:get_pos() then return end if mcl_burning.is_burning(obj) then local storage = mcl_burning.get_storage(obj) if obj:is_player() then - mcl_burning.channels[obj]:send_all("stop") + if storage.fire_hud_id then + obj:hud_remove(storage.fire_hud_id) + end mcl_burning.storage[obj] = {} else storage.burn_time = nil diff --git a/mods/ENTITIES/mcl_burning/init.lua b/mods/ENTITIES/mcl_burning/init.lua index 077b1e1a8..ffa406a8b 100644 --- a/mods/ENTITIES/mcl_burning/init.lua +++ b/mods/ENTITIES/mcl_burning/init.lua @@ -1,18 +1,27 @@ local modpath = minetest.get_modpath(minetest.get_current_modname()) -local pairs = pairs - -local get_connected_players = minetest.get_connected_players -local get_item_group = minetest.get_item_group - mcl_burning = { - storage = {}, - channels = {}, - animation_frames = tonumber(minetest.settings:get("fire_animation_frames")) or 8 + -- the storage table holds a list of objects (players,luaentities) and tables + -- associated with these objects. These tables have the following attributes: + -- burn_time: + -- Remaining time that object will burn. + -- fire_damage_timer: + -- Timer for dealing damage every second while burning. + -- fire_hud_id: + -- HUD id of the flames animation on a burning player's HUD. + -- animation_frame: + -- The HUD's current animation frame, used by update_hud(). + -- collisionbox_cache: + -- Used by mcl_burning.get_collisionbox() to avoid recalculations. + storage = {} } dofile(modpath .. "/api.lua") +local pairs = pairs +local get_connected_players = minetest.get_connected_players +local get_item_group = minetest.get_item_group + minetest.register_globalstep(function(dtime) for _, player in pairs(get_connected_players()) do local storage = mcl_burning.storage[player] @@ -48,25 +57,43 @@ minetest.register_on_respawnplayer(function(player) mcl_burning.extinguish(player) end) -function mcl_burning.init_player(player) - local meta = player:get_meta() - -- NOTE: mcl_burning:data may be "return nil" (which deserialize into nil) for reasons unknown. - if meta:get_string("mcl_burning:data"):find("return nil", 1, true) then - minetest.log("warning", "[mcl_burning] 'mcl_burning:data' player meta field is invalid! Please report this bug") +minetest.register_on_joinplayer(function(player) + local storage = {} + local burn_data = player:get_meta():get_string("mcl_burning:data") + if burn_data ~= "" then + storage = minetest.deserialize(burn_data) or storage end - mcl_burning.storage[player] = meta:contains("mcl_burning:data") and minetest.deserialize(meta:get_string("mcl_burning:data")) or {} - mcl_burning.channels[player] = minetest.mod_channel_join("mcl_burning:" .. player:get_player_name()) + mcl_burning.storage[player] = storage + if storage.burn_time and storage.burn_time > 0 then + mcl_burning.update_hud(player) + end +end) + +local function on_leaveplayer(player) + local storage = mcl_burning.storage[player] + if not storage then + -- For some unexplained reasons, mcl_burning.storage can be `nil` here. + -- Logging this exception to assist in finding the cause of this. + minetest.log("warning", "on_leaveplayer: missing mcl_burning.storage " + .. "for player " .. player:get_player_name()) + storage = {} + end + storage.fire_hud_id = nil + player:get_meta():set_string("mcl_burning:data", minetest.serialize(storage)) + mcl_burning.storage[player] = nil end -minetest.register_on_joinplayer(function(player) - mcl_burning.init_player(player) -end) - minetest.register_on_leaveplayer(function(player) - player:get_meta():set_string("mcl_burning:data", minetest.serialize(mcl_burning.storage[player])) - mcl_burning.storage[player] = nil + on_leaveplayer(player) end) +minetest.register_on_shutdown(function() + for _,player in ipairs(minetest.get_connected_players()) do + on_leaveplayer(player) + end +end) + +local animation_frames = tonumber(minetest.settings:get("fire_animation_frames")) or 8 minetest.register_entity("mcl_burning:fire", { initial_properties = { @@ -74,42 +101,35 @@ minetest.register_entity("mcl_burning:fire", { collisionbox = {0, 0, 0, 0, 0, 0}, visual = "upright_sprite", textures = { - name = "mcl_burning_entity_flame_animated.png", - animation = { - type = "vertical_frames", - aspect_w = 16, - aspect_h = 16, - length = 1.0, - }, + "mcl_burning_entity_flame_animated.png", + "mcl_burning_entity_flame_animated.png" }, - spritediv = {x = 1, y = mcl_burning.animation_frames}, + spritediv = {x = 1, y = animation_frames}, pointable = false, glow = -1, backface_culling = false, }, - animation_frame = 0, - animation_timer = 0, + _mcl_animation_timer = 0, on_activate = function(self) - self.object:set_sprite({x = 0, y = 0}, mcl_burning.animation_frames, 1.0 / mcl_burning.animation_frames) + self.object:set_sprite({x = 0, y = 0}, animation_frames, 1.0 / animation_frames) end, - on_step = function(self) - if not self:sanity_check() then - self.object:remove() - end - end, - sanity_check = function(self) + on_step = function(self, dtime) local parent = self.object:get_attach() - if not parent then - return false + self.object:remove() + return end - local storage = mcl_burning.get_storage(parent) - if not storage or not storage.burn_time then - return false + self.object:remove() + return + end + if parent:is_player() then + self._mcl_animation_timer = self._mcl_animation_timer + dtime + if self._mcl_animation_timer >= 0.1 then + self._mcl_animation_timer = 0 + mcl_burning.update_hud(parent) + end end - - return true end, }) diff --git a/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.zh_TW.tr b/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.zh_TW.tr new file mode 100644 index 000000000..2772fb357 --- /dev/null +++ b/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.zh_TW.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_falling_nodes +@1 was smashed by a falling anvil.=@1 被鐵砧壓扁了。 +@1 was smashed by a falling block.=@1 被掉下來的方塊壓扁了。 diff --git a/mods/ENTITIES/mcl_item_entity/init.lua b/mods/ENTITIES/mcl_item_entity/init.lua index 244c910d5..cbbec663e 100644 --- a/mods/ENTITIES/mcl_item_entity/init.lua +++ b/mods/ENTITIES/mcl_item_entity/init.lua @@ -86,7 +86,6 @@ local function enable_physics(object, luaentity, ignore_check) object:set_properties({ physical = true }) - object:set_velocity({x=0,y=0,z=0}) object:set_acceleration({x=0,y=-get_gravity(),z=0}) end end @@ -118,7 +117,7 @@ minetest.register_globalstep(function(dtime) if tick == true and pool[name] > 0 then minetest.sound_play("item_drop_pickup", { pos = pos, - gain = 0.7, + gain = 0.3, max_hear_distance = 16, pitch = math.random(70,110)/100 }) @@ -264,6 +263,8 @@ function minetest.handle_node_drops(pos, drops, digger) local silk_touch_drop = false local nodedef = minetest.registered_nodes[dug_node.name] + if not nodedef then return end + if shearsy_level and shearsy_level > 0 and nodedef._mcl_shears_drop then if nodedef._mcl_shears_drop == true then drops = { dug_node.name } @@ -424,7 +425,11 @@ minetest.register_entity(":__builtin:item", { end local stack = ItemStack(itemstring) if minetest.get_item_group(stack:get_name(), "compass") > 0 then - stack:set_name("mcl_compass:16") + if string.find(stack:get_name(), "_lodestone") then + stack:set_name("mcl_compass:18_lodestone") + else + stack:set_name("mcl_compass:18") + end itemstring = stack:to_string() self.itemstring = itemstring end @@ -777,8 +782,8 @@ minetest.register_entity(":__builtin:item", { return end - -- Move item around on flowing liquids - if def and def.liquidtype == "flowing" then + -- Move item around on flowing liquids; add 'source' check to allow items to continue flowing a bit in the source block of flowing water. + if def and def.liquidtype == "flowing" or def.liquidtype == "source" then --[[ Get flowing direction (function call from flowlib), if there's a liquid. NOTE: According to Qwertymine, flowlib.quickflow is only reliable for liquids with a flowing distance of 7. @@ -787,35 +792,33 @@ minetest.register_entity(":__builtin:item", { -- Just to make sure we don't manipulate the speed for no reason if vec.x ~= 0 or vec.y ~= 0 or vec.z ~= 0 then -- Minecraft Wiki: Flowing speed is "about 1.39 meters per second" - local f = item_drop_settings.fluid_flow_rate --1.39 - + local f = item_drop_settings.fluid_flow_rate or 1.2 --1.39 -- Apply the force of the flowing liquid onto the item's velocity - local newv = vector.multiply(vec, f) + local newv = vector.multiply(vec, f) self.object:set_acceleration({x = 0, y = 0, z = 0}) - local oldvel = self.object:get_velocity() -- v is vector, vel is velocity - -- drag local fluid_drag = item_drop_settings.fluid_drag - - local floornn = minetest.get_node({x=p.x, y=p.y-0.5, z=p.z}).name - local floornode = floornn and minetest.registered_nodes[floornn] + local floornn = minetest.get_node({x=p.x, y=p.y-0.5, z=p.z}).name + local floornode = floornn and minetest.registered_nodes[floornn] if floornode and minetest.get_item_group(floornode.name, "slippery") then - -- scale fluid drag on slippery floors - fluid_drag = fluid_drag * item_drop_settings.slippery_fluid_drag_factor + -- scale fluid drag on slippery floors + fluid_drag = fluid_drag * item_drop_settings.slippery_fluid_drag_factor end - newv.x = newv.x - (oldvel.x - newv.x) * fluid_drag * dtime - newv.y = newv.y - (oldvel.y - newv.y) * fluid_drag * dtime - newv.z = newv.z - (oldvel.z - newv.z) * fluid_drag * dtime + newv.x = newv.x - (oldvel.x - newv.x) * fluid_drag * dtime + newv.y = newv.y - (oldvel.y - newv.y) * fluid_drag * dtime + newv.z = newv.z - (oldvel.z - newv.z) * fluid_drag * dtime - newv.y = newv.y + -0.22 -- (keep slight downward thrust from previous version of code) + newv.y = newv.y + -0.22 -- (keep slight downward thrust from previous version of code) -- NOTE: is there any particular reason we have this, anyway? -- since fluid drag is now on, we could as well just -- apply gravity here; drag will slow down the fall -- realistically self.object:set_velocity({x = oldvel.x + newv.x * dtime, y = oldvel.y + newv.y * dtime, z = oldvel.z + newv.z * dtime}) + -- Swap to acceleration instead of a static speed to better mimic MC mechanics. + -- self.object:set_acceleration({x = newv.x, y = -0.22, z = newv.z}) self.physical_state = true self._flowing = true @@ -836,8 +839,7 @@ minetest.register_entity(":__builtin:item", { local nn = minetest.get_node({x=p.x, y=p.y-0.5, z=p.z}).name local v = self.object:get_velocity() local node = nn and minetest.registered_nodes[nn] - - if not node or node.walkable and v.y == 0 then + if not node or node.walkable and v.y == 0 and not node.groups.slippery then if self.physical_state then local own_stack = ItemStack(self.object:get_luaentity().itemstring) -- Merge with close entities of the same item diff --git a/mods/ENTITIES/mcl_minecarts/init.lua b/mods/ENTITIES/mcl_minecarts/init.lua index 4294c4630..0d603bbd1 100644 --- a/mods/ENTITIES/mcl_minecarts/init.lua +++ b/mods/ENTITIES/mcl_minecarts/init.lua @@ -432,7 +432,8 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick, o -- Slow down or speed up local acc = dir.y * -1.8 local friction = 0.4 - local speed_mod = minetest.registered_nodes[minetest.get_node(pos).name]._rail_acceleration + local ndef = minetest.registered_nodes[minetest.get_node(pos).name] + local speed_mod = ndef and ndef._rail_acceleration acc = acc - friction @@ -861,4 +862,4 @@ if has_mcl_wip then mcl_wip.register_wip_item("mcl_minecarts:furnace_minecart") mcl_wip.register_wip_item("mcl_minecarts:command_block_minecart") mcl_wip.register_wip_item("mcl_minecarts:hopper_minecart") -end \ No newline at end of file +end diff --git a/mods/ENTITIES/mcl_minecarts/rails.lua b/mods/ENTITIES/mcl_minecarts/rails.lua index 91282f253..5117fe48c 100644 --- a/mods/ENTITIES/mcl_minecarts/rails.lua +++ b/mods/ENTITIES/mcl_minecarts/rails.lua @@ -21,7 +21,7 @@ local function register_rail(itemstring, tiles, def_extras, creative) stack_max = 64, groups = groups, sounds = mcl_sounds.node_sound_metal_defaults(), - _mcl_blast_resistance = 3.5, + _mcl_blast_resistance = 0.7, _mcl_hardness = 0.7, after_destruct = function(pos) -- Scan for minecarts in this pos and force them to execute their "floating" check. diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua new file mode 100644 index 000000000..8c9d8216e --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -0,0 +1,4513 @@ + +-- API for Mobs Redo: MineClone 2 Edition (MRM) + +mcl_mobs = {} + +local MAX_MOB_NAME_LENGTH = 30 +local HORNY_TIME = 30 +local HORNY_AGAIN_TIME = 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 ENTITY_CRAMMING_MAX = 24 +local CRAMMING_DAMAGE = 3 + +local MOB_CAP = {} +MOB_CAP.hostile = 70 +MOB_CAP.passive = 10 +MOB_CAP.ambient = 15 +MOB_CAP.water = 15 + +-- Localize +local S = minetest.get_translator("mcl_mobs") + +-- Invisibility mod check +mcl_mobs.invis = {} + +-- localize math functions +local pi = math.pi +local sin = math.sin +local cos = math.cos +local abs = math.abs +local min = math.min +local max = math.max +local atann = math.atan +local random = math.random +local floor = math.floor + +local atan = function(x) + if not x or x ~= x then + return 0 + else + return atann(x) + end +end + + +-- Load 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) + +-- 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 + +-- 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" +mcl_mobs.fallback_node = minetest.registered_aliases["mapgen_dirt"] or "mcl_core:dirt" + +minetest.register_chatcommand("clearmobs",{ + privs={maphack=true}, + params = "||", + description=S("Removes all spawned mobs except nametagged and tamed ones. all removes all mobs, nametagged only nametagged ones and with the range paramter all mobs in a distance of the current player are removed."), + func=function(n,param) + local p = minetest.get_player_by_name(n) + local num=tonumber(param) + for _,o in pairs(minetest.luaentities) do + if o.is_mob then + if param == "all" or + ( param == "nametagged" and o.nametag ) or + ( param == "" and not o.nametag and not o.tamed ) or + ( num and num > 0 and vector.distance(p:get_pos(),o.object:get_pos()) <= num ) then + o.object:remove() + end + end + end +end}) + +----For Water Flowing: +local enable_physics = function(object, luaentity, ignore_check) + if luaentity.physical_state == false or ignore_check == true then + luaentity.physical_state = true + object:set_properties({ + physical = true + }) + object:set_velocity({x=0,y=0,z=0}) + object:set_acceleration({x=0,y=-9.81,z=0}) + end +end + +local disable_physics = function(object, luaentity, ignore_check, reset_movement) + if luaentity.physical_state == true or ignore_check == true then + luaentity.physical_state = false + object:set_properties({ + physical = false + }) + if reset_movement ~= false then + object:set_velocity({x=0,y=0,z=0}) + object:set_acceleration({x=0,y=0,z=0}) + end + end +end + + +-- play sound +local mob_sound = function(self, soundname, is_opinion, fixed_pitch) + + local soundinfo + if self.sounds_child and self.child then + soundinfo = self.sounds_child + elseif self.sounds then + soundinfo = self.sounds + end + if not soundinfo then + return + end + local sound = soundinfo[soundname] + if sound then + if is_opinion and self.opinion_sound_cooloff > 0 then + return + end + local pitch + if not fixed_pitch then + local base_pitch = soundinfo.base_pitch + if not base_pitch then + base_pitch = 1 + end + if self.child and (not self.sounds_child) then + -- Children have higher pitch + pitch = base_pitch * 1.5 + else + pitch = base_pitch + end + -- randomize the pitch a bit + pitch = pitch + math.random(-10, 10) * 0.005 + end + minetest.sound_play(sound, { + object = self.object, + gain = 1.0, + max_hear_distance = self.sounds.distance, + pitch = pitch, + }, true) + self.opinion_sound_cooloff = 1 + end +end + +-- Return true if object is in view_range +local function object_in_range(self, object) + if not object then + return false + end + local factor + -- Apply view range reduction for special player armor + if object:is_player() then + local factors = mcl_armor.player_view_range_factors[object] + factor = factors and factors[self.name] + end + -- Distance check + local dist + if factor and factor == 0 then + return false + elseif factor then + dist = self.view_range * factor + else + dist = self.view_range + end + + local p1, p2 = self.object:get_pos(), object:get_pos() + return p1 and p2 and (vector.distance(p1, p2) <= dist) +end + +-- attack player/mob +local do_attack = function(self, player) + + if self.state == "attack" or self.state == "die" then + return + end + + self.attack = player + self.state = "attack" + + -- TODO: Implement war_cry sound without being annoying + --if random(0, 100) < 90 then + --mob_sound(self, "war_cry", true) + --end +end + + +-- collision function borrowed amended from jordan4ibanez open_ai mod +local collision = function(self) + + local pos = self.object:get_pos() + local vel = self.object:get_velocity() + local x = 0 + local z = 0 + local width = -self.collisionbox[1] + self.collisionbox[4] + 0.5 + + for _,object in pairs(minetest.get_objects_inside_radius(pos, width)) do + + local ent = object:get_luaentity() + if object:is_player() or (ent and ent.is_mob and object ~= self.object) then + + local pos2 = object:get_pos() + local vec = {x = pos.x - pos2.x, z = pos.z - pos2.z} + local force = (width + 0.5) - vector.distance( + {x = pos.x, y = 0, z = pos.z}, + {x = pos2.x, y = 0, z = pos2.z}) + + x = x + (vec.x * force) + z = z + (vec.z * force) + end + end + + return({x,z}) +end + +-- move mob in facing direction +local set_velocity = function(self, v) + + local c_x, c_y = 0, 0 + + -- can mob be pushed, if so calculate direction + if self.pushable then + c_x, c_y = unpack(collision(self)) + end + + -- halt mob if it has been ordered to stay + if self.order == "stand" then + self.object:set_velocity({x = 0, y = 0, z = 0}) + return + end + + local yaw = (self.object:get_yaw() or 0) + self.rotate + + self.object:set_velocity({ + x = (sin(yaw) * -v) + c_x, + y = self.object:get_velocity().y, + z = (cos(yaw) * v) + c_y, + }) +end + + + +-- calculate mob velocity +local get_velocity = function(self) + + local v = self.object:get_velocity() + if v then + return (v.x * v.x + v.z * v.z) ^ 0.5 + end + + return 0 +end + +local function update_roll(self) + local is_Fleckenstein = self.nametag == "Fleckenstein" + local was_Fleckenstein = false + + local rot = self.object:get_rotation() + rot.z = is_Fleckenstein and pi or 0 + self.object:set_rotation(rot) + + local cbox = table.copy(self.collisionbox) + local acbox = self.object:get_properties().collisionbox + + if math.abs(cbox[2] - acbox[2]) > 0.1 then + was_Fleckenstein = true + end + + if is_Fleckenstein ~= was_Fleckenstein then + local pos = self.object:get_pos() + pos.y = pos.y + (acbox[2] + acbox[5]) + self.object:set_pos(pos) + end + + if is_Fleckenstein then + cbox[2], cbox[5] = -cbox[5], -cbox[2] + end + + self.object:set_properties({collisionbox = cbox}) +end + +-- set and return valid yaw +local set_yaw = function(self, yaw, delay, dtime) + + if not yaw or yaw ~= yaw then + yaw = 0 + end + + delay = delay or 0 + + if delay == 0 then + if self.shaking and dtime then + yaw = yaw + (math.random() * 2 - 1) * 5 * dtime + end + self.object:set_yaw(yaw) + update_roll(self) + return yaw + end + + self.target_yaw = yaw + self.delay = delay + + return self.target_yaw +end + +-- global function to set mob yaw +function mcl_mobs:yaw(self, yaw, delay, dtime) + set_yaw(self, yaw, delay, dtime) +end + +local add_texture_mod = function(self, mod) + local full_mod = "" + local already_added = false + for i=1, #self.texture_mods do + if mod == self.texture_mods[i] then + already_added = true + end + full_mod = full_mod .. self.texture_mods[i] + end + if not already_added then + full_mod = full_mod .. mod + table.insert(self.texture_mods, mod) + end + self.object:set_texture_mod(full_mod) +end +local remove_texture_mod = function(self, mod) + local full_mod = "" + local remove = {} + for i=1, #self.texture_mods do + if self.texture_mods[i] ~= mod then + full_mod = full_mod .. self.texture_mods[i] + else + table.insert(remove, i) + end + end + for i=#remove, 1 do + table.remove(self.texture_mods, remove[i]) + end + self.object:set_texture_mod(full_mod) +end + +-- are we flying in what we are suppose to? (taikedz) +local flight_check = function(self) + + local nod = self.standing_in + local def = minetest.registered_nodes[nod] + + if not def then return false end -- nil check + + local fly_in + if type(self.fly_in) == "string" then + fly_in = { self.fly_in } + elseif type(self.fly_in) == "table" then + fly_in = self.fly_in + else + return false + end + + for _,checknode in pairs(fly_in) do + if nod == checknode then + return true + elseif checknode == "__airlike" or def.walkable == false and + (def.liquidtype == "none" or minetest.get_item_group(nod, "fake_liquid") == 1) then + return true + end + end + + return false +end + +-- set defined animation +local set_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 flight_check(self) and self.fly and anim == "walk" then anim = "fly" end + + self.animation.current = self.animation.current or "" + + if (anim == self.animation.current + or not self.animation[anim .. "_start"] + or not self.animation[anim .. "_end"]) and self.state ~= "die" then + return + end + + self.animation.current = anim + + 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) +end + + +-- above function exported for mount.lua +function mcl_mobs:set_animation(self, anim) + set_animation(self, anim) +end + +-- Returns true is node can deal damage to self +local is_node_dangerous = function(self, nodename) + local nn = nodename + if self.lava_damage > 0 then + if minetest.get_item_group(nn, "lava") ~= 0 then + return true + end + end + if self.fire_damage > 0 then + if minetest.get_item_group(nn, "fire") ~= 0 then + return true + end + end + if minetest.registered_nodes[nn] and minetest.registered_nodes[nn].damage_per_second and minetest.registered_nodes[nn].damage_per_second > 0 then + return true + end + return false +end + + +-- Returns true if node is a water hazard +local is_node_waterhazard = function(self, nodename) + local nn = nodename + if self.water_damage > 0 then + if minetest.get_item_group(nn, "water") ~= 0 then + return true + end + end + if minetest.registered_nodes[nn] and minetest.registered_nodes[nn].drowning and minetest.registered_nodes[nn].drowning > 0 then + if self.breath_max ~= -1 then + -- check if the mob is water-breathing _and_ the block is water; only return true if neither is the case + -- this will prevent water-breathing mobs to classify water or e.g. sand below them as dangerous + if not self.breathes_in_water and minetest.get_item_group(nn, "water") ~= 0 then + return true + end + end + end + return false +end + + +-- check line of sight (BrunoMine) +local line_of_sight = function(self, pos1, pos2, stepsize) + + stepsize = stepsize or 1 + + local s, pos = minetest.line_of_sight(pos1, pos2, stepsize) + + -- normal walking and flying mobs can see you through air + if s == true then + return true + end + + -- New pos1 to be analyzed + local npos1 = {x = pos1.x, y = pos1.y, z = pos1.z} + + local r, pos = minetest.line_of_sight(npos1, pos2, stepsize) + + -- Checks the return + if r == true then return true end + + -- Nodename found + local nn = minetest.get_node(pos).name + + -- Target Distance (td) to travel + local td = vector.distance(pos1, pos2) + + -- Actual Distance (ad) traveled + local ad = 0 + + -- It continues to advance in the line of sight in search of a real + -- obstruction which counts as 'normal' nodebox. + while minetest.registered_nodes[nn] + and minetest.registered_nodes[nn].walkable == false do + + -- Check if you can still move forward + if td < ad + stepsize then + return true -- Reached the target + end + + -- Moves the analyzed pos + local d = vector.distance(pos1, pos2) + + npos1.x = ((pos2.x - pos1.x) / d * stepsize) + pos1.x + npos1.y = ((pos2.y - pos1.y) / d * stepsize) + pos1.y + npos1.z = ((pos2.z - pos1.z) / d * stepsize) + pos1.z + + -- NaN checks + if d == 0 + or npos1.x ~= npos1.x + or npos1.y ~= npos1.y + or npos1.z ~= npos1.z then + return false + end + + ad = ad + stepsize + + -- scan again + r, pos = minetest.line_of_sight(npos1, pos2, stepsize) + + if r == true then return true end + + -- New Nodename found + nn = minetest.get_node(pos).name + + end + + return false +end + +-- custom particle effects +local effect = function(pos, amount, texture, min_size, max_size, radius, gravity, glow, go_down) + + radius = radius or 2 + min_size = min_size or 0.5 + max_size = max_size or 1 + gravity = gravity or -10 + glow = glow or 0 + go_down = go_down or false + + local ym + if go_down then + ym = 0 + else + ym = -radius + end + + minetest.add_particlespawner({ + amount = amount, + time = 0.25, + minpos = pos, + maxpos = pos, + minvel = {x = -radius, y = ym, z = -radius}, + maxvel = {x = radius, y = radius, z = radius}, + minacc = {x = 0, y = gravity, z = 0}, + maxacc = {x = 0, y = gravity, z = 0}, + minexptime = 0.1, + maxexptime = 1, + minsize = min_size, + maxsize = max_size, + texture = texture, + glow = glow, + }) +end + +local damage_effect = function(self, damage) + -- damage particles + if (not disable_blood) and damage > 0 then + + local amount_large = math.floor(damage / 2) + local amount_small = damage % 2 + + local pos = self.object:get_pos() + + pos.y = pos.y + (self.collisionbox[5] - self.collisionbox[2]) * .5 + + local texture = "mobs_blood.png" + -- full heart damage (one particle for each 2 HP damage) + if amount_large > 0 then + effect(pos, amount_large, texture, 2, 2, 1.75, 0, nil, true) + end + -- half heart damage (one additional particle if damage is an odd number) + if amount_small > 0 then + -- TODO: Use "half heart" + effect(pos, amount_small, texture, 1, 1, 1.75, 0, nil, true) + end + end +end + +mcl_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=pi/2}) + max = vector.rotate(max, {x=0, y=yaw, z=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 + +local update_tag = function(self) + local tag + if mobs_debug then + tag = "nametag = '"..tostring(self.nametag).."'\n".. + "state = '"..tostring(self.state).."'\n".. + "order = '"..tostring(self.order).."'\n".. + "attack = "..tostring(self.attack).."\n".. + "health = "..tostring(self.health).."\n".. + "breath = "..tostring(self.breath).."\n".. + "gotten = "..tostring(self.gotten).."\n".. + "tamed = "..tostring(self.tamed).."\n".. + "horny = "..tostring(self.horny).."\n".. + "hornytimer = "..tostring(self.hornytimer).."\n".. + "runaway_timer = "..tostring(self.runaway_timer).."\n".. + "following = "..tostring(self.following) + else + tag = self.nametag + end + self.object:set_properties({ + nametag = tag, + }) + + update_roll(self) +end + +-- drop items +local item_drop = function(self, cooked, looting_level) + + -- no drops if disabled by setting + if not mobs_drop_items then return end + + 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 random() < chance then + num = 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 = random(-10, 10) / 9, + y = 6, + z = random(-10, 10) / 9, + }) + elseif obj then + obj:remove() -- item does not exist + end + end + end + + self.drops = {} +end + + +-- check if mob is dead or only hurt +local check_for_death = function(self, cause, cmi_cause) + + if self.state == "die" then + return true + end + + -- has health actually changed? + if self.health == self.old_health and self.health > 0 then + return false + end + + local damaged = self.health < self.old_health + self.old_health = self.health + + -- still got some health? + if self.health > 0 then + + -- make sure health isn't higher than max + if self.health > self.hp_max then + self.health = self.hp_max + end + + -- play damage sound if health was reduced and make mob flash red. + if damaged then + add_texture_mod(self, "^[colorize:red:130") + minetest.after(.2, function(self) + if self and self.object then + remove_texture_mod(self, "^[colorize:red:130") + end + end, self) + mob_sound(self, "damage") + end + + -- backup nametag so we can show health stats + if not self.nametag2 then + self.nametag2 = self.nametag or "" + end + + if show_health + and (cmi_cause and cmi_cause.type == "punch") then + + self.htimer = 2 + self.nametag = "♥ " .. self.health .. " / " .. self.hp_max + + update_tag(self) + end + + return false + end + + mob_sound(self, "death") + + local function death_handle(self) + -- dropped cooked item if mob died in fire or lava + if cause == "lava" or cause == "fire" then + item_drop(self, true, 0) + else + local wielditem = ItemStack() + if cause == "hit" then + local puncher = cmi_cause.puncher + if puncher then + wielditem = puncher:get_wielded_item() + end + end + local cooked = mcl_burning.is_burning(self.object) or mcl_enchanting.has_enchantment(wielditem, "fire_aspect") + local looting = mcl_enchanting.get_enchantment(wielditem, "looting") + item_drop(self, cooked, looting) + + if ((not self.child) or self.type ~= "animal") and (minetest.get_us_time() - self.xp_timestamp <= 5000000) then + mcl_experience.throw_xp(self.object:get_pos(), math.random(self.xp_min, self.xp_max)) + end + end + end + + -- execute custom death function + if self.on_die then + + local pos = self.object:get_pos() + local on_die_exit = self.on_die(self, pos, cmi_cause) + if on_die_exit ~= true then + death_handle(self) + end + + if on_die_exit == true then + self.state = "die" + mcl_burning.extinguish(self.object) + self.object:remove() + return true + end + end + + local collisionbox + if self.collisionbox then + collisionbox = table.copy(self.collisionbox) + end + + self.state = "die" + self.attack = nil + self.v_start = false + self.fall_speed = DEFAULT_FALL_SPEED + self.timer = 0 + self.blinktimer = 0 + remove_texture_mod(self, "^[colorize:#FF000040") + remove_texture_mod(self, "^[brighten") + self.passive = true + + self.object:set_properties({ + pointable = false, + collide_with_objects = false, + }) + + set_velocity(self, 0) + local acc = self.object:get_acceleration() + acc.x, acc.y, acc.z = 0, DEFAULT_FALL_SPEED, 0 + self.object:set_acceleration(acc) + + local length + -- default death function and die animation (if defined) + if self.instant_death then + length = 0 + elseif self.animation + and self.animation.die_start + and self.animation.die_end then + + local frames = self.animation.die_end - self.animation.die_start + local speed = self.animation.die_speed or 15 + length = max(frames / speed, 0) + DEATH_DELAY + set_animation(self, "die") + else + local rot = self.object:get_rotation() + rot.z = pi/2 + self.object:set_rotation(rot) + length = 1 + DEATH_DELAY + set_animation(self, "stand", true) + end + + + -- Remove body after a few seconds and drop stuff + local kill = function(self) + if not self.object:get_luaentity() then + return + end + + death_handle(self) + local dpos = self.object:get_pos() + local cbox = self.collisionbox + local yaw = self.object:get_rotation().y + mcl_burning.extinguish(self.object) + self.object:remove() + mcl_mobs.death_effect(dpos, yaw, cbox, not self.instant_death) + end + if length <= 0 then + kill(self) + else + minetest.after(length, kill, self) + end + + return true +end + + +-- check if within physical map limits (-30911 to 30927) +local within_limits, wmin, wmax = nil, -30913, 30928 +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 + + +-- is mob facing a cliff or danger +local is_at_cliff_or_danger = function(self) + + if self.fear_height == 0 then -- 0 for no falling protection! + return false + end + + if not self.object:get_luaentity() then + return false + end + local yaw = self.object:get_yaw() + local dir_x = -sin(yaw) * (self.collisionbox[4] + 0.5) + local dir_z = cos(yaw) * (self.collisionbox[4] + 0.5) + local pos = self.object:get_pos() + local ypos = pos.y + self.collisionbox[2] -- just above floor + + local free_fall, blocker = minetest.line_of_sight( + {x = pos.x + dir_x, y = ypos, z = pos.z + dir_z}, + {x = pos.x + dir_x, y = ypos - self.fear_height, z = pos.z + dir_z}) + if free_fall then + return true + else + local bnode = minetest.get_node(blocker) + local danger = is_node_dangerous(self, bnode.name) + if danger then + return true + else + local def = minetest.registered_nodes[bnode.name] + if def and def.walkable then + return false + end + end + end + + return false +end + + +-- copy the 'mob facing cliff_or_danger check' from above, and rework to avoid water +local is_at_water_danger = function(self) + + + if not self.object:get_luaentity() then + return false + end + local yaw = self.object:get_yaw() + local dir_x = -sin(yaw) * (self.collisionbox[4] + 0.5) + local dir_z = cos(yaw) * (self.collisionbox[4] + 0.5) + local pos = self.object:get_pos() + local ypos = pos.y + self.collisionbox[2] -- just above floor + + local free_fall, blocker = minetest.line_of_sight( + {x = pos.x + dir_x, y = ypos, z = pos.z + dir_z}, + {x = pos.x + dir_x, y = ypos - 3, z = pos.z + dir_z}) + if free_fall then + return true + else + local bnode = minetest.get_node(blocker) + local waterdanger = is_node_waterhazard(self, bnode.name) + if + waterdanger and (is_node_waterhazard(self, self.standing_in) or is_node_waterhazard(self, self.standing_on)) then + return false + elseif waterdanger and (is_node_waterhazard(self, self.standing_in) or is_node_waterhazard(self, self.standing_on)) == false then + return true + else + local def = minetest.registered_nodes[bnode.name] + if def and def.walkable then + return false + end + end + end + + return false +end + + +-- get node but use fallback for nil or unknown +local node_ok = function(pos, fallback) + + fallback = fallback or mcl_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 + +local function get_light(pos, tod) + if minetest.get_node_or_nil(pos) then + local lightfunc = minetest.get_natural_light or minetest.get_node_light + return lightfunc(pos, tod) + else + return 0 + end +end + +-- environmental damage (water, lava, fire, light etc.) +local do_env_damage = function(self) + + -- feed/tame text timer (so mob 'full' messages dont spam chat) + if self.htimer > 0 then + self.htimer = self.htimer - 1 + end + + -- reset nametag after showing health stats + if self.htimer < 1 and self.nametag2 then + + self.nametag = self.nametag2 + self.nametag2 = nil + + update_tag(self) + end + + local pos = self.object:get_pos() + + self.time_of_day = minetest.get_timeofday() + + -- remove mob if beyond map limits + if not within_limits(pos, 0) then + mcl_burning.extinguish(self.object) + self.object:remove() + return true + end + + + -- Deal light damage to mob, returns true if mob died + local deal_light_damage = function(self, pos, damage) + if not ((mcl_weather.rain.raining or mcl_weather.state == "snow") and mcl_weather.is_outdoor(pos)) then + self.health = self.health - damage + + effect(pos, 5, "mcl_particles_smoke.png") + + if check_for_death(self, "light", {type = "light"}) then + return true + end + end + end + + -- Use get_node_light for Minetest version 5.3 where get_natural_light + -- does not exist yet. + local sunlight = get_light(pos, self.time_of_day) + + -- bright light harms mob + if self.light_damage ~= 0 and (sunlight or 0) > 12 then + if deal_light_damage(self, pos, self.light_damage) then + return true + end + end + local _, dim = mcl_worlds.y_to_layer(pos.y) + if (self.sunlight_damage ~= 0 or self.ignited_by_sunlight) and (sunlight or 0) >= minetest.LIGHT_MAX and dim == "overworld" then + if self.ignited_by_sunlight then + mcl_burning.set_on_fire(self.object, 10) + else + deal_light_damage(self, pos, self.sunlight_damage) + return true + end + end + + local y_level = self.collisionbox[2] + + if self.child then + y_level = self.collisionbox[2] * 0.5 + end + + -- what is mob standing in? + pos.y = pos.y + y_level + 0.25 -- foot level + local pos2 = {x=pos.x, y=pos.y-1, z=pos.z} + self.standing_in = node_ok(pos, "air").name + self.standing_on = node_ok(pos2, "air").name + + -- don't fall when on ignore, just stand still + if self.standing_in == "ignore" then + self.object:set_velocity({x = 0, y = 0, z = 0}) + end + + local nodef = minetest.registered_nodes[self.standing_in] + + -- rain + if self.rain_damage > 0 then + if mcl_weather.rain.raining and mcl_weather.is_outdoor(pos) then + + self.health = self.health - self.rain_damage + + if check_for_death(self, "rain", {type = "environment", + pos = pos, node = self.standing_in}) then + return true + end + end + end + + pos.y = pos.y + 1 -- for particle effect position + + -- water damage + if self.water_damage > 0 + and nodef.groups.water then + + if self.water_damage ~= 0 then + + self.health = self.health - self.water_damage + + effect(pos, 5, "mcl_particles_smoke.png", nil, nil, 1, nil) + + if check_for_death(self, "water", {type = "environment", + pos = pos, node = self.standing_in}) then + return true + end + end + + -- lava damage + elseif self.lava_damage > 0 + and (nodef.groups.lava) then + + if self.lava_damage ~= 0 then + + self.health = self.health - self.lava_damage + + effect(pos, 5, "fire_basic_flame.png", nil, nil, 1, nil) + + if check_for_death(self, "lava", {type = "environment", + pos = pos, node = self.standing_in}) then + return true + end + end + + -- fire damage + elseif self.fire_damage > 0 + and (nodef.groups.fire) then + + if self.fire_damage ~= 0 then + + self.health = self.health - self.fire_damage + + effect(pos, 5, "fire_basic_flame.png", nil, nil, 1, nil) + + if check_for_death(self, "fire", {type = "environment", + pos = pos, node = self.standing_in}) then + return true + end + end + + -- damage_per_second node check + elseif nodef.damage_per_second ~= 0 and not nodef.groups.lava and not nodef.groups.fire then + + self.health = self.health - nodef.damage_per_second + + effect(pos, 5, "mcl_particles_smoke.png") + + if check_for_death(self, "dps", {type = "environment", + pos = pos, node = self.standing_in}) then + return true + end + end + + -- Drowning damage + if self.breath_max ~= -1 then + local drowning = false + if self.breathes_in_water then + if minetest.get_item_group(self.standing_in, "water") == 0 then + drowning = true + end + elseif nodef.drowning > 0 then + drowning = true + end + if drowning then + + self.breath = math.max(0, self.breath - 1) + + effect(pos, 2, "bubble.png", nil, nil, 1, nil) + if self.breath <= 0 then + local dmg + if nodef.drowning > 0 then + dmg = nodef.drowning + else + dmg = 4 + end + damage_effect(self, dmg) + self.health = self.health - dmg + end + if check_for_death(self, "drowning", {type = "environment", + pos = pos, node = self.standing_in}) then + return true + end + else + self.breath = math.min(self.breath_max, self.breath + 1) + end + end + + --- suffocation inside solid node + -- FIXME: Redundant with mcl_playerplus + if (self.suffocation == true) + and (nodef.walkable == nil or nodef.walkable == true) + and (nodef.collision_box == nil or nodef.collision_box.type == "regular") + and (nodef.node_box == nil or nodef.node_box.type == "regular") + and (nodef.groups.disable_suffocation ~= 1) + and (nodef.groups.opaque == 1) then + + -- Short grace period before starting to take suffocation damage. + -- This is different from players, who take damage instantly. + -- This has been done because mobs might briefly be inside solid nodes + -- when e.g. climbing up stairs. + -- This is a bit hacky because it assumes that do_env_damage + -- is called roughly every second only. + self.suffocation_timer = self.suffocation_timer + 1 + if self.suffocation_timer >= 3 then + -- 2 damage per second + -- TODO: Deal this damage once every 1/2 second + self.health = self.health - 2 + + if check_for_death(self, "suffocation", {type = "environment", + pos = pos, node = self.standing_in}) then + return true + end + end + else + self.suffocation_timer = 0 + end + + return check_for_death(self, "", {type = "unknown"}) +end + + +-- jump if facing a solid node (not fences or gates) +local do_jump = function(self) + + if not self.jump + or self.jump_height == 0 + or self.fly + or (self.child and self.type ~= "monster") + or self.order == "stand" then + return false + end + + self.facing_fence = false + + -- something stopping us while moving? + if self.state ~= "stand" + and get_velocity(self) > 0.5 + and self.object:get_velocity().y ~= 0 then + return false + end + + local pos = self.object:get_pos() + local yaw = self.object:get_yaw() + + -- what is mob standing on? + pos.y = pos.y + self.collisionbox[2] - 0.2 + + local nod = node_ok(pos) + + if minetest.registered_nodes[nod.name].walkable == false then + return false + end + + -- where is front + local dir_x = -sin(yaw) * (self.collisionbox[4] + 0.5) + local dir_z = cos(yaw) * (self.collisionbox[4] + 0.5) + + -- what is in front of mob? + nod = node_ok({ + x = pos.x + dir_x, + y = pos.y + 0.5, + z = pos.z + dir_z + }) + + -- this is used to detect if there's a block on top of the block in front of the mob. + -- If there is, there is no point in jumping as we won't manage. + local nodTop = node_ok({ + x = pos.x + dir_x, + y = pos.y + 1.5, + z = pos.z + dir_z + }, "air") + + -- we don't attempt to jump if there's a stack of blocks blocking + if minetest.registered_nodes[nodTop.name].walkable == true then + return false + end + + -- thin blocks that do not need to be jumped + if nod.name == node_snow then + return false + end + + local ndef = minetest.registered_nodes[nod.name] + if self.walk_chance == 0 or ndef and ndef.walkable then + + if minetest.get_item_group(nod.name, "fence") == 0 + and minetest.get_item_group(nod.name, "fence_gate") == 0 + and minetest.get_item_group(nod.name, "wall") == 0 then + + local v = self.object:get_velocity() + + v.y = self.jump_height + + set_animation(self, "jump") -- only when defined + + self.object:set_velocity(v) + + -- when in air move forward + minetest.after(0.3, function(self, v) + if (not self.object) or (not self.object:get_luaentity()) or (self.state == "die") then + return + end + self.object:set_acceleration({ + x = v.x * 2, + y = -10, + z = v.z * 2, + }) + end, self, v) + + if self.jump_sound_cooloff <= 0 then + mob_sound(self, "jump") + self.jump_sound_cooloff = 0.5 + end + else + self.facing_fence = true + end + + -- if we jumped against a block/wall 4 times then turn + if self.object:get_velocity().x ~= 0 + and self.object:get_velocity().z ~= 0 then + + self.jump_count = (self.jump_count or 0) + 1 + + if self.jump_count == 4 then + + local yaw = self.object:get_yaw() or 0 + + yaw = set_yaw(self, yaw + 1.35, 8) + + self.jump_count = 0 + end + end + + return true + end + + return false +end + + +-- blast damage to entities nearby +local entity_physics = function(pos, radius) + + radius = radius * 2 + + local objs = minetest.get_objects_inside_radius(pos, radius) + local obj_pos, dist + + for n = 1, #objs do + + obj_pos = objs[n]:get_pos() + + dist = vector.distance(pos, obj_pos) + if dist < 1 then dist = 1 end + + local damage = floor((4 / dist) * radius) + local ent = objs[n]:get_luaentity() + + -- punches work on entities AND players + objs[n]:punch(objs[n], 1.0, { + full_punch_interval = 1.0, + damage_groups = {fleshy = damage}, + }, pos) + end +end + + +-- should mob follow what I'm holding ? +local follow_holding = function(self, clicker) + if self.nofollow then return false end + + if mcl_mobs.invis[clicker:get_player_name()] then + return false + end + + local item = clicker:get_wielded_item() + local t = type(self.follow) + + -- single item + if t == "string" + and item:get_name() == self.follow then + return true + + -- multiple items + elseif t == "table" then + + for no = 1, #self.follow do + + if self.follow[no] == item:get_name() then + return true + end + end + end + + return false +end + + +-- find two animals of same type and breed if nearby and horny +local breed = function(self) + + -- child takes a long time before growing into adult + if self.child == true then + + -- When a child, hornytimer is used to count age until adulthood + self.hornytimer = self.hornytimer + 1 + + if self.hornytimer >= CHILD_GROW_TIME then + + self.child = false + self.hornytimer = 0 + + self.object:set_properties({ + textures = self.base_texture, + mesh = self.base_mesh, + visual_size = self.base_size, + collisionbox = self.base_colbox, + selectionbox = self.base_selbox, + }) + + -- custom function when child grows up + if self.on_grown then + self.on_grown(self) + else + -- jump when fully grown so as not to fall into ground + self.object:set_velocity({ + x = 0, + y = self.jump_height, + z = 0 + }) + end + end + + return + end + + -- horny animal can mate for HORNY_TIME seconds, + -- afterwards horny animal cannot mate again for HORNY_AGAIN_TIME seconds + if self.horny == true + and self.hornytimer < HORNY_TIME + HORNY_AGAIN_TIME then + + self.hornytimer = self.hornytimer + 1 + + if self.hornytimer >= HORNY_TIME + HORNY_AGAIN_TIME then + self.hornytimer = 0 + self.horny = false + end + end + + -- find another same animal who is also horny and mate if nearby + if self.horny == true + and self.hornytimer <= HORNY_TIME then + + local pos = self.object:get_pos() + + effect({x = pos.x, y = pos.y + 1, z = pos.z}, 8, "heart.png", 3, 4, 1, 0.1) + + local objs = minetest.get_objects_inside_radius(pos, 3) + local num = 0 + local ent = nil + + for n = 1, #objs do + + ent = objs[n]:get_luaentity() + + -- check for same animal with different colour + local canmate = false + + if ent then + + if ent.name == self.name then + canmate = true + else + local entname = string.split(ent.name,":") + local selfname = string.split(self.name,":") + + if entname[1] == selfname[1] then + entname = string.split(entname[2],"_") + selfname = string.split(selfname[2],"_") + + if entname[1] == selfname[1] then + canmate = true + end + end + end + end + + if ent + and canmate == true + and ent.horny == true + and ent.hornytimer <= HORNY_TIME then + num = num + 1 + end + + -- found your mate? then have a baby + if num > 1 then + + self.hornytimer = HORNY_TIME + 1 + ent.hornytimer = HORNY_TIME + 1 + + -- spawn baby + minetest.after(5, function(parent1, parent2, pos) + if not parent1.object:get_luaentity() then + return + end + if not parent2.object:get_luaentity() then + return + end + + mcl_experience.throw_xp(pos, math.random(1, 7)) + + -- custom breed function + if parent1.on_breed then + -- when false, skip going any further + if parent1.on_breed(parent1, parent2) == false then + return + end + end + + local child = mcl_mobs:spawn_child(pos, parent1.name) + + local ent_c = child:get_luaentity() + + + -- Use texture of one of the parents + local p = math.random(1, 2) + if p == 1 then + ent_c.base_texture = parent1.base_texture + else + ent_c.base_texture = parent2.base_texture + end + child:set_properties({ + textures = ent_c.base_texture + }) + + -- tamed and owned by parents' owner + ent_c.tamed = true + ent_c.owner = parent1.owner + end, self, ent, pos) + + num = 0 + + break + end + end + end +end + + +-- find and replace what mob is looking for (grass, wheat etc.) +local replace = function(self, pos) + + if not self.replace_rate + or not self.replace_what + or self.child == true + or self.object:get_velocity().y ~= 0 + or random(1, self.replace_rate) > 1 then + return + end + + local what, with, y_offset + + if type(self.replace_what[1]) == "table" then + + local num = random(#self.replace_what) + + what = self.replace_what[num][1] or "" + with = self.replace_what[num][2] or "" + y_offset = self.replace_what[num][3] or 0 + else + what = self.replace_what + with = self.replace_with or "" + y_offset = self.replace_offset or 0 + end + + pos.y = pos.y + y_offset + + local node = minetest.get_node(pos) + if node.name == what then + + local oldnode = {name = what, param2 = node.param2} + local newnode = {name = with, param2 = node.param2} + local on_replace_return + + if self.on_replace then + on_replace_return = self.on_replace(self, pos, oldnode, newnode) + end + + if on_replace_return ~= false then + + if mobs_griefing then + minetest.set_node(pos, newnode) + end + + end + end +end + + +-- check if daytime and also if mob is docile during daylight hours +local day_docile = function(self) + + if self.docile_by_day == false then + + return false + + elseif self.docile_by_day == true + and self.time_of_day > 0.2 + and self.time_of_day < 0.8 then + + return true + end +end + + +local los_switcher = false +local height_switcher = false + +-- path finding and smart mob routine by rnd, line_of_sight and other edits by Elkien3 +local smart_mobs = function(self, s, p, dist, dtime) + + local s1 = self.path.lastpos + + local target_pos = self.attack:get_pos() + + -- is it becoming stuck? + if abs(s1.x - s.x) + abs(s1.z - s.z) < .5 then + self.path.stuck_timer = self.path.stuck_timer + dtime + else + self.path.stuck_timer = 0 + end + + self.path.lastpos = {x = s.x, y = s.y, z = s.z} + + local use_pathfind = false + local has_lineofsight = minetest.line_of_sight( + {x = s.x, y = (s.y) + .5, z = s.z}, + {x = target_pos.x, y = (target_pos.y) + 1.5, z = target_pos.z}, .2) + + -- im stuck, search for path + if not has_lineofsight then + + if los_switcher == true then + use_pathfind = true + los_switcher = false + end -- cannot see target! + else + if los_switcher == false then + + los_switcher = true + use_pathfind = false + + minetest.after(1, function(self) + if not self.object:get_luaentity() then + return + end + if has_lineofsight then self.path.following = false end + end, self) + end -- can see target! + end + + if (self.path.stuck_timer > stuck_timeout and not self.path.following) then + + use_pathfind = true + self.path.stuck_timer = 0 + + minetest.after(1, function(self) + if not self.object:get_luaentity() then + return + end + if has_lineofsight then self.path.following = false end + end, self) + end + + if (self.path.stuck_timer > stuck_path_timeout and self.path.following) then + + use_pathfind = true + self.path.stuck_timer = 0 + + minetest.after(1, function(self) + if not self.object:get_luaentity() then + return + end + if has_lineofsight then self.path.following = false end + end, self) + end + + if math.abs(vector.subtract(s,target_pos).y) > self.stepheight then + + if height_switcher then + use_pathfind = true + height_switcher = false + end + else + if not height_switcher then + use_pathfind = false + height_switcher = true + end + end + + if use_pathfind then + -- lets try find a path, first take care of positions + -- since pathfinder is very sensitive + local sheight = self.collisionbox[5] - self.collisionbox[2] + + -- round position to center of node to avoid stuck in walls + -- also adjust height for player models! + s.x = floor(s.x + 0.5) + s.z = floor(s.z + 0.5) + + local ssight, sground = minetest.line_of_sight(s, { + x = s.x, y = s.y - 4, z = s.z}, 1) + + -- determine node above ground + if not ssight then + s.y = sground.y + 1 + end + + local p1 = self.attack:get_pos() + + p1.x = floor(p1.x + 0.5) + p1.y = floor(p1.y + 0.5) + p1.z = floor(p1.z + 0.5) + + local dropheight = 12 + if self.fear_height ~= 0 then dropheight = self.fear_height end + local jumpheight = 0 + if self.jump and self.jump_height >= 4 then + jumpheight = math.min(math.ceil(self.jump_height / 4), 4) + elseif self.stepheight > 0.5 then + jumpheight = 1 + end + self.path.way = minetest.find_path(s, p1, 16, jumpheight, dropheight, "A*_noprefetch") + + self.state = "" + do_attack(self, self.attack) + + -- no path found, try something else + if not self.path.way then + + self.path.following = false + + -- lets make way by digging/building if not accessible + if self.pathfinding == 2 and mobs_griefing then + + -- is player higher than mob? + if s.y < p1.y then + + -- build upwards + if not minetest.is_protected(s, "") then + + local ndef1 = minetest.registered_nodes[self.standing_in] + + if ndef1 and (ndef1.buildable_to or ndef1.groups.liquid) then + + minetest.set_node(s, {name = mcl_mobs.fallback_node}) + end + end + + local sheight = math.ceil(self.collisionbox[5]) + 1 + + -- assume mob is 2 blocks high so it digs above its head + s.y = s.y + sheight + + -- remove one block above to make room to jump + if not minetest.is_protected(s, "") then + + local node1 = node_ok(s, "air").name + local ndef1 = minetest.registered_nodes[node1] + + if node1 ~= "air" + and node1 ~= "ignore" + and ndef1 + and not ndef1.groups.level + and not ndef1.groups.unbreakable + and not ndef1.groups.liquid then + + minetest.set_node(s, {name = "air"}) + minetest.add_item(s, ItemStack(node1)) + + end + end + + s.y = s.y - sheight + self.object:set_pos({x = s.x, y = s.y + 2, z = s.z}) + + else -- dig 2 blocks to make door toward player direction + + local yaw1 = self.object:get_yaw() + pi / 2 + local p1 = { + x = s.x + cos(yaw1), + y = s.y, + z = s.z + sin(yaw1) + } + + if not minetest.is_protected(p1, "") then + + local node1 = node_ok(p1, "air").name + local ndef1 = minetest.registered_nodes[node1] + + if node1 ~= "air" + and node1 ~= "ignore" + and ndef1 + and not ndef1.groups.level + and not ndef1.groups.unbreakable + and not ndef1.groups.liquid then + + minetest.add_item(p1, ItemStack(node1)) + minetest.set_node(p1, {name = "air"}) + end + + p1.y = p1.y + 1 + node1 = node_ok(p1, "air").name + ndef1 = minetest.registered_nodes[node1] + + if node1 ~= "air" + and node1 ~= "ignore" + and ndef1 + and not ndef1.groups.level + and not ndef1.groups.unbreakable + and not ndef1.groups.liquid then + + minetest.add_item(p1, ItemStack(node1)) + minetest.set_node(p1, {name = "air"}) + end + + end + end + end + + -- will try again in 2 seconds + self.path.stuck_timer = stuck_timeout - 2 + elseif s.y < p1.y and (not self.fly) then + do_jump(self) --add jump to pathfinding + self.path.following = true + -- Yay, I found path! + -- TODO: Implement war_cry sound without being annoying + --mob_sound(self, "war_cry", true) + else + set_velocity(self, self.walk_velocity) + + -- follow path now that it has it + self.path.following = true + end + end +end + + +-- specific attacks +local specific_attack = function(list, what) + + -- no list so attack default (player, animals etc.) + if list == nil then + return true + end + + -- found entity on list to attack? + for no = 1, #list do + + if list[no] == what then + return true + end + end + + return false +end + +-- monster find someone to attack +local monster_attack = function(self) + + if self.type ~= "monster" + or not damage_enabled + or minetest.is_creative_enabled("") + or self.passive + or self.state == "attack" + or day_docile(self) then + return + end + + local s = self.object:get_pos() + local p, sp, dist + local player, obj, min_player + local type, name = "", "" + local min_dist = self.view_range + 1 + local objs = minetest.get_objects_inside_radius(s, self.view_range) + + for n = 1, #objs do + + if objs[n]:is_player() then + + if mcl_mobs.invis[ objs[n]:get_player_name() ] or (not object_in_range(self, objs[n])) then + type = "" + else + player = objs[n] + type = "player" + name = "player" + end + else + obj = objs[n]:get_luaentity() + + if obj then + player = obj.object + type = obj.type + name = obj.name or "" + end + end + + -- find specific mob to attack, failing that attack player/npc/animal + if specific_attack(self.specific_attack, name) + and (type == "player" or type == "npc" + or (type == "animal" and self.attack_animals == true)) then + + p = player:get_pos() + sp = s + + dist = vector.distance(p, s) + + -- aim higher to make looking up hills more realistic + p.y = p.y + 1 + sp.y = sp.y + 1 + + + -- choose closest player to attack + if dist < min_dist + and line_of_sight(self, sp, p, 2) == true then + min_dist = dist + min_player = player + end + end + end + + -- attack player + if min_player then + do_attack(self, min_player) + end +end + + +-- npc, find closest monster to attack +local npc_attack = function(self) + + if self.type ~= "npc" + or not self.attacks_monsters + or self.state == "attack" then + return + end + + local p, sp, obj, min_player + local s = self.object:get_pos() + local min_dist = self.view_range + 1 + local objs = minetest.get_objects_inside_radius(s, self.view_range) + + for n = 1, #objs do + + obj = objs[n]:get_luaentity() + + if obj and obj.type == "monster" then + + p = obj.object:get_pos() + sp = s + + local dist = vector.distance(p, s) + + -- aim higher to make looking up hills more realistic + p.y = p.y + 1 + sp.y = sp.y + 1 + + if dist < min_dist + and line_of_sight(self, sp, p, 2) == true then + min_dist = dist + min_player = obj.object + end + end + end + + if min_player then + do_attack(self, min_player) + end +end + + +-- specific runaway +local specific_runaway = function(list, what) + + -- no list so do not run + if list == nil then + return false + end + + -- found entity on list to attack? + for no = 1, #list do + + if list[no] == what then + return true + end + end + + return false +end + + +-- find someone to runaway from +local runaway_from = function(self) + + if not self.runaway_from and self.state ~= "flop" then + return + end + + local s = self.object:get_pos() + local p, sp, dist + local player, obj, min_player + local type, name = "", "" + local min_dist = self.view_range + 1 + local objs = minetest.get_objects_inside_radius(s, self.view_range) + + for n = 1, #objs do + + if objs[n]:is_player() then + + if mcl_mobs.invis[ objs[n]:get_player_name() ] + or self.owner == objs[n]:get_player_name() + or (not object_in_range(self, objs[n])) then + type = "" + else + player = objs[n] + type = "player" + name = "player" + end + else + obj = objs[n]:get_luaentity() + + if obj then + player = obj.object + type = obj.type + name = obj.name or "" + end + end + + -- find specific mob to runaway from + if name ~= "" and name ~= self.name + and specific_runaway(self.runaway_from, name) then + + p = player:get_pos() + sp = s + + -- aim higher to make looking up hills more realistic + p.y = p.y + 1 + sp.y = sp.y + 1 + + dist = vector.distance(p, s) + + + -- choose closest player/mpb to runaway from + if dist < min_dist + and line_of_sight(self, sp, p, 2) == true then + min_dist = dist + min_player = player + end + end + end + + if min_player then + + local lp = player:get_pos() + local vec = { + x = lp.x - s.x, + y = lp.y - s.y, + z = lp.z - s.z + } + + local yaw = (atan(vec.z / vec.x) + 3 * pi / 2) - self.rotate + + if lp.x > s.x then + yaw = yaw + pi + end + + yaw = set_yaw(self, yaw, 4) + self.state = "runaway" + self.runaway_timer = 3 + self.following = nil + end +end + + +-- follow player if owner or holding item, if fish outta water then flop +local follow_flop = function(self) + + -- find player to follow + if (self.follow ~= "" + or self.order == "follow") + and not self.following + and self.state ~= "attack" + and self.order ~= "sit" + and self.state ~= "runaway" then + + local s = self.object:get_pos() + local players = minetest.get_connected_players() + + for n = 1, #players do + + if (object_in_range(self, players[n])) + and not mcl_mobs.invis[ players[n]:get_player_name() ] then + + self.following = players[n] + + break + end + end + end + + if self.type == "npc" + and self.order == "follow" + and self.state ~= "attack" + and self.order ~= "sit" + and self.owner ~= "" then + + -- npc stop following player if not owner + if self.following + and self.owner + and self.owner ~= self.following:get_player_name() then + self.following = nil + end + else + -- stop following player if not holding specific item, + -- mob is horny, fleeing or attacking + if self.following + and self.following:is_player() + and (follow_holding(self, self.following) == false or + self.horny or self.state == "runaway") then + self.following = nil + end + + end + + -- follow that thing + if self.following then + + local s = self.object:get_pos() + local p + + if self.following:is_player() then + + p = self.following:get_pos() + + elseif self.following.object then + + p = self.following.object:get_pos() + end + + if p then + + local dist = vector.distance(p, s) + + -- dont follow if out of range + if (not object_in_range(self, self.following)) then + self.following = nil + else + local vec = { + x = p.x - s.x, + z = p.z - s.z + } + + local yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate + + if p.x > s.x then yaw = yaw + pi end + + set_yaw(self, yaw, 2.35) + + -- anyone but standing npc's can move along + if dist > 3 + and self.order ~= "stand" then + + set_velocity(self, self.follow_velocity) + + if self.walk_chance ~= 0 then + set_animation(self, "run") + end + else + set_velocity(self, 0) + set_animation(self, "stand") + end + + return + end + end + end + + -- swimmers flop when out of their element, and swim again when back in + if self.fly then + local s = self.object:get_pos() + if not flight_check(self, s) then + + self.state = "flop" + self.object:set_acceleration({x = 0, y = DEFAULT_FALL_SPEED, z = 0}) + + local sdef = minetest.registered_nodes[self.standing_on] + -- Flop on ground + if sdef and sdef.walkable then + mob_sound(self, "flop") + self.object:set_velocity({ + x = math.random(-FLOP_HOR_SPEED, FLOP_HOR_SPEED), + y = FLOP_HEIGHT, + z = math.random(-FLOP_HOR_SPEED, FLOP_HOR_SPEED), + }) + end + + set_animation(self, "stand", true) + + return + elseif self.state == "flop" then + self.state = "stand" + self.object:set_acceleration({x = 0, y = 0, z = 0}) + set_velocity(self, 0) + end + end +end + + +-- dogshoot attack switch and counter function +local dogswitch = function(self, dtime) + + -- switch mode not activated + if not self.dogshoot_switch + or not dtime then + return 0 + end + + self.dogshoot_count = self.dogshoot_count + dtime + + if (self.dogshoot_switch == 1 + and self.dogshoot_count > self.dogshoot_count_max) + or (self.dogshoot_switch == 2 + and self.dogshoot_count > self.dogshoot_count2_max) then + + self.dogshoot_count = 0 + + if self.dogshoot_switch == 1 then + self.dogshoot_switch = 2 + else + self.dogshoot_switch = 1 + end + end + + return self.dogshoot_switch +end + +local function go_to_pos(entity,b) + if not entity then return end + local s=entity.object:get_pos() + if vector.distance(b,s) < 1 then + --set_velocity(entity,0) + return true + end + local v = { x = b.x - s.x, z = b.z - s.z } + local yaw = (math.atan(v.z / v.x) + math.pi / 2) - entity.rotate + if b.x > s.x then yaw = yaw + math.pi end + entity.object:set_yaw(yaw) + set_velocity(entity,entity.follow_velocity) + mcl_mobs:set_animation(entity, "walk") +end + +local function check_doors(self) + local p = self.object:get_pos() + local t = minetest.get_timeofday() + local dd = minetest.find_nodes_in_area(vector.offset(p,-1,-1,-1),vector.offset(p,1,1,1),{"group:door"}) + for _,d in pairs(dd) do + local n = minetest.get_node(d) + if n.name:find("_b_") then + local def = minetest.registered_nodes[n.name] + local closed = n.name:find("_b_1") + if t < 0.3 or t > 0.8 then + if not closed then def.on_rightclick(d,n,self) end + else + if closed then def.on_rightclick(d,n,self) end + end + + end + end +end + +local gowp_etime = 0 + +local function check_gowp(self,dtime) + gowp_etime = gowp_etime + dtime + if gowp_etime < 1 then return end + gowp_etime = 0 + local p = self.object:get_pos() + if not p or not self._target then return end + if vector.distance(p,self._target) < 2 or ( self.waypoints and #self.waypoints == 0 ) then + self.waypoints = nil + self._target = nil + self.current_target = nil + self.state = "walk" + if self.callback_arrived then return self.callback_arrived(self) end + return true + end + if self.waypoints and ( not self.current_target or vector.distance(p,self.current_target) < 1.5 ) then + self.current_target = table.remove(self.waypoints, 1) + --minetest.log("nextwp:".. tostring(self.current_target) ) + elseif self.current_target then + go_to_pos(self,self.current_target) + end + + if self.current_target and not minetest.line_of_sight(self.object:get_pos(),self.current_target) then + self.waypoints=minetest.find_path(p,self._target,150,1,4) + if not self.waypoints then self.state = "walk" end --give up + self.current_target = nil + return + end + if not self.current_target then + --minetest.log("no path") + self.state = "walk" + end +end + +-- execute current state (stand, walk, run, attacks) +-- returns true if mob has died +local do_states = function(self, dtime) + if self.can_open_doors then check_doors(self) end + + local yaw = self.object:get_yaw() or 0 + + if self.state == "stand" then + if random(1, 4) == 1 then + + local s = self.object:get_pos() + local objs = minetest.get_objects_inside_radius(s, 3) + local lp + for n = 1, #objs do + if objs[n]:is_player() then + lp = objs[n]:get_pos() + break + end + end + + -- look at any players nearby, otherwise turn randomly + if lp and self.look_at_players then + + local vec = { + x = lp.x - s.x, + z = lp.z - s.z + } + + yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate + + if lp.x > s.x then yaw = yaw + pi end + else + yaw = yaw + random(-0.5, 0.5) + end + + yaw = set_yaw(self, yaw, 8) + end + + set_velocity(self, 0) + set_animation(self, "stand") + + -- npc's ordered to stand stay standing + if self.type ~= "npc" + or self.order ~= "stand" then + + if self.walk_chance ~= 0 + and self.facing_fence ~= true + and random(1, 100) <= self.walk_chance + and is_at_cliff_or_danger(self) == false then + + set_velocity(self, self.walk_velocity) + self.state = "walk" + set_animation(self, "walk") + end + end + + elseif self.state == "gowp" then + check_gowp(self,dtime) + + elseif self.state == "walk" then + local s = self.object:get_pos() + local lp = nil + + -- is there something I need to avoid? + if (self.water_damage > 0 + and self.lava_damage > 0) + or self.breath_max ~= -1 then + + lp = minetest.find_node_near(s, 1, {"group:water", "group:lava"}) + + elseif self.water_damage > 0 then + + lp = minetest.find_node_near(s, 1, {"group:water"}) + + elseif self.lava_damage > 0 then + + lp = minetest.find_node_near(s, 1, {"group:lava"}) + + elseif self.fire_damage > 0 then + + lp = minetest.find_node_near(s, 1, {"group:fire"}) + + end + + local is_in_danger = false + if lp then + -- If mob in or on dangerous block, look for land + if (is_node_dangerous(self, self.standing_in) or + is_node_dangerous(self, self.standing_on)) or (is_node_waterhazard(self, self.standing_in) or is_node_waterhazard(self, self.standing_on)) and (not self.fly) then + is_in_danger = true + + -- If mob in or on dangerous block, look for land + if is_in_danger then + -- Better way to find shore - copied from upstream + lp = minetest.find_nodes_in_area_under_air( + {x = s.x - 5, y = s.y - 0.5, z = s.z - 5}, + {x = s.x + 5, y = s.y + 1, z = s.z + 5}, + {"group:solid"}) + + lp = #lp > 0 and lp[random(#lp)] + + -- did we find land? + if lp then + + local vec = { + x = lp.x - s.x, + z = lp.z - s.z + } + + yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate + + + if lp.x > s.x then yaw = yaw + pi end + + -- look towards land and move in that direction + yaw = set_yaw(self, yaw, 6) + set_velocity(self, self.walk_velocity) + + end + end + + -- A danger is near but mob is not inside + else + + -- Randomly turn + if random(1, 100) <= 30 then + yaw = yaw + random(-0.5, 0.5) + yaw = set_yaw(self, yaw, 8) + end + end + + yaw = set_yaw(self, yaw, 8) + + -- otherwise randomly turn + elseif random(1, 100) <= 30 then + + yaw = yaw + random(-0.5, 0.5) + yaw = set_yaw(self, yaw, 8) + end + + -- stand for great fall or danger or fence in front + local cliff_or_danger = false + if is_in_danger then + cliff_or_danger = is_at_cliff_or_danger(self) + end + if self.facing_fence == true + or cliff_or_danger + or random(1, 100) <= 30 then + + set_velocity(self, 0) + self.state = "stand" + set_animation(self, "stand") + local yaw = self.object:get_yaw() or 0 + yaw = set_yaw(self, yaw + 0.78, 8) + else + + set_velocity(self, self.walk_velocity) + + if flight_check(self) + and self.animation + and self.animation.fly_start + and self.animation.fly_end then + set_animation(self, "fly") + else + set_animation(self, "walk") + end + end + + -- runaway when punched + elseif self.state == "runaway" then + + self.runaway_timer = self.runaway_timer + 1 + + -- stop after 5 seconds or when at cliff + if self.runaway_timer > 5 + or is_at_cliff_or_danger(self) then + self.runaway_timer = 0 + set_velocity(self, 0) + self.state = "stand" + set_animation(self, "stand") + local yaw = self.object:get_yaw() or 0 + yaw = set_yaw(self, yaw + 0.78, 8) + else + set_velocity(self, self.run_velocity) + set_animation(self, "run") + end + + -- attack routines (explode, dogfight, shoot, dogshoot) + elseif self.state == "attack" then + + local s = self.object:get_pos() + local p = self.attack:get_pos() or s + + -- stop attacking if player invisible or out of range + if not self.attack + or not self.attack:get_pos() + or not object_in_range(self, self.attack) + or self.attack:get_hp() <= 0 + or (self.attack:is_player() and mcl_mobs.invis[ self.attack:get_player_name() ]) then + + self.state = "stand" + set_velocity(self, 0) + set_animation(self, "stand") + self.attack = nil + self.v_start = false + self.timer = 0 + self.blinktimer = 0 + self.path.way = nil + + return + end + + -- calculate distance from mob and enemy + local dist = vector.distance(p, s) + + if self.attack_type == "explode" then + + local vec = { + x = p.x - s.x, + z = p.z - s.z + } + + yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate + + if p.x > s.x then yaw = yaw + pi end + + yaw = set_yaw(self, yaw, 0, dtime) + + local node_break_radius = self.explosion_radius or 1 + local entity_damage_radius = self.explosion_damage_radius + or (node_break_radius * 2) + + -- start timer when in reach and line of sight + if not self.v_start + and dist <= self.reach + and line_of_sight(self, s, p, 2) then + + self.v_start = true + self.timer = 0 + self.blinktimer = 0 + mob_sound(self, "fuse", nil, false) + + -- stop timer if out of reach or direct line of sight + elseif self.allow_fuse_reset + and self.v_start + and (dist >= self.explosiontimer_reset_radius + or not line_of_sight(self, s, p, 2)) then + self.v_start = false + self.timer = 0 + self.blinktimer = 0 + self.blinkstatus = false + remove_texture_mod(self, "^[brighten") + end + + -- walk right up to player unless the timer is active + if self.v_start and (self.stop_to_explode or dist < self.reach) then + set_velocity(self, 0) + else + set_velocity(self, self.run_velocity) + end + + if self.animation and self.animation.run_start then + set_animation(self, "run") + else + set_animation(self, "walk") + end + + if self.v_start then + + self.timer = self.timer + dtime + self.blinktimer = (self.blinktimer or 0) + dtime + + if self.blinktimer > 0.2 then + + self.blinktimer = 0 + + if self.blinkstatus then + remove_texture_mod(self, "^[brighten") + else + add_texture_mod(self, "^[brighten") + end + + self.blinkstatus = not self.blinkstatus + end + + if self.timer > self.explosion_timer then + + local pos = self.object:get_pos() + + if mobs_griefing and not minetest.is_protected(pos, "") then + mcl_explosions.explode(mcl_util.get_object_center(self.object), self.explosion_strength, { drop_chance = 1.0 }, self.object) + else + minetest.sound_play(self.sounds.explode, { + pos = pos, + gain = 1.0, + max_hear_distance = self.sounds.distance or 32 + }, true) + + entity_physics(pos, entity_damage_radius) + effect(pos, 32, "mcl_particles_smoke.png", nil, nil, node_break_radius, 1, 0) + end + mcl_burning.extinguish(self.object) + self.object:remove() + + return true + end + end + + elseif self.attack_type == "dogfight" + or (self.attack_type == "dogshoot" and dogswitch(self, dtime) == 2) + or (self.attack_type == "dogshoot" and dist <= self.reach and dogswitch(self) == 0) then + + if self.fly + and dist > self.reach then + + local p1 = s + local me_y = floor(p1.y) + local p2 = p + local p_y = floor(p2.y + 1) + local v = self.object:get_velocity() + + if flight_check(self, s) then + + if me_y < p_y then + + self.object:set_velocity({ + x = v.x, + y = 1 * self.walk_velocity, + z = v.z + }) + + elseif me_y > p_y then + + self.object:set_velocity({ + x = v.x, + y = -1 * self.walk_velocity, + z = v.z + }) + end + else + if me_y < p_y then + + self.object:set_velocity({ + x = v.x, + y = 0.01, + z = v.z + }) + + elseif me_y > p_y then + + self.object:set_velocity({ + x = v.x, + y = -0.01, + z = v.z + }) + end + end + + end + + -- rnd: new movement direction + if self.path.following + and self.path.way + and self.attack_type ~= "dogshoot" then + + -- no paths longer than 50 + if #self.path.way > 50 + or dist < self.reach then + self.path.following = false + return + end + + local p1 = self.path.way[1] + + if not p1 then + self.path.following = false + return + end + + if abs(p1.x-s.x) + abs(p1.z - s.z) < 0.6 then + -- reached waypoint, remove it from queue + table.remove(self.path.way, 1) + end + + -- set new temporary target + p = {x = p1.x, y = p1.y, z = p1.z} + end + + local vec = { + x = p.x - s.x, + z = p.z - s.z + } + + yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate + + if p.x > s.x then yaw = yaw + pi end + + yaw = set_yaw(self, yaw, 0, dtime) + + -- move towards enemy if beyond mob reach + if dist > self.reach then + + -- path finding by rnd + if self.pathfinding -- only if mob has pathfinding enabled + and enable_pathfinding then + + smart_mobs(self, s, p, dist, dtime) + end + + if is_at_cliff_or_danger(self) then + + set_velocity(self, 0) + set_animation(self, "stand") + local yaw = self.object:get_yaw() or 0 + yaw = set_yaw(self, yaw + 0.78, 8) + else + + if self.path.stuck then + set_velocity(self, self.walk_velocity) + else + set_velocity(self, self.run_velocity) + end + + if self.animation and self.animation.run_start then + set_animation(self, "run") + else + set_animation(self, "walk") + end + end + + else -- rnd: if inside reach range + + self.path.stuck = false + self.path.stuck_timer = 0 + self.path.following = false -- not stuck anymore + + set_velocity(self, 0) + + if not self.custom_attack then + + if self.timer > 1 then + + self.timer = 0 + + if self.double_melee_attack + and random(1, 2) == 1 then + set_animation(self, "punch2") + else + set_animation(self, "punch") + end + + local p2 = p + local s2 = s + + p2.y = p2.y + .5 + s2.y = s2.y + .5 + + if line_of_sight(self, p2, s2) == true then + + -- play attack sound + mob_sound(self, "attack") + + -- punch player (or what player is attached to) + local attached = self.attack:get_attach() + if attached then + self.attack = attached + end + self.attack:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups = {fleshy = self.damage} + }, nil) + end + end + else -- call custom attack every second + if self.custom_attack + and self.timer > 1 then + + self.timer = 0 + + self.custom_attack(self, p) + end + end + end + + elseif self.attack_type == "shoot" + or (self.attack_type == "dogshoot" and dogswitch(self, dtime) == 1) + or (self.attack_type == "dogshoot" and dist > self.reach and dogswitch(self) == 0) then + + p.y = p.y - .5 + s.y = s.y + .5 + + local dist = vector.distance(p, s) + local vec = { + x = p.x - s.x, + y = p.y - s.y, + z = p.z - s.z + } + + yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate + + if p.x > s.x then yaw = yaw + pi end + + yaw = set_yaw(self, yaw, 0, dtime) + + set_velocity(self, 0) + + local p = self.object:get_pos() + p.y = p.y + (self.collisionbox[2] + self.collisionbox[5]) / 2 + + if self.shoot_interval + and self.timer > self.shoot_interval + and not minetest.raycast(p, self.attack:get_pos(), false, false):next() + and random(1, 100) <= 60 then + + self.timer = 0 + set_animation(self, "shoot") + + -- play shoot attack sound + mob_sound(self, "shoot_attack") + + -- Shoot arrow + if minetest.registered_entities[self.arrow] then + + local arrow, ent + local v = 1 + if not self.shoot_arrow then + self.firing = true + minetest.after(1, function() + self.firing = false + end) + arrow = minetest.add_entity(p, self.arrow) + ent = arrow:get_luaentity() + if ent.velocity then + v = ent.velocity + end + ent.switch = 1 + ent.owner_id = tostring(self.object) -- add unique owner id to arrow + + -- important for mcl_shields + ent._shooter = self.object + ent._saved_shooter_pos = self.object:get_pos() + end + + local amount = (vec.x * vec.x + vec.y * vec.y + vec.z * vec.z) ^ 0.5 + -- offset makes shoot aim accurate + vec.y = vec.y + self.shoot_offset + vec.x = vec.x * (v / amount) + vec.y = vec.y * (v / amount) + vec.z = vec.z * (v / amount) + if self.shoot_arrow then + vec = vector.normalize(vec) + self:shoot_arrow(p, vec) + else + arrow:set_velocity(vec) + end + end + end + end + end +end + +local plane_adjacents = { + vector.new(1,0,0), + vector.new(-1,0,0), + vector.new(0,0,1), + vector.new(0,0,-1), +} + + +local gopath_last = os.time() +function mcl_mobs:gopath(self,target,callback_arrived) + if os.time() - gopath_last < 15 then return end + gopath_last = os.time() + local p = self.object:get_pos() + local t = vector.offset(target,0,1,0) + local wp = minetest.find_path(p,t,150,1,4) + if not wp then + local d = minetest.find_node_near(target,16,{"group:door"}) + if d then + for _,v in pairs(plane_adjacents) do + local pos = vector.add(d,v) + local n = minetest.get_node(pos) + if n.name == "air" then + wp = minetest.find_path(p,pos,150,1,4) + if wp then break end + end + end + end + end + if wp and #wp > 0 then + self._target = t + self.callback_arrived = callback_arrived + self.waypoints = wp + self.state = "gowp" + return true + else + self.state = "walk" + self.waypoints = nil + self.current_target = nil + --minetest.log("no path found") + end +end + +local function player_near(pos) + for _,o in pairs(minetest.get_objects_inside_radius(pos,2)) do + if o:is_player() then return true end + end +end + +local function check_item_pickup(self) + if self.pick_up and #self.pick_up > 0 then + local p = self.object:get_pos() + for _,o in pairs(minetest.get_objects_inside_radius(p,2)) do + local l=o:get_luaentity() + if l and l.name == "__builtin:item" then + for k,v in pairs(self.pick_up) do + if not player_near(p) and self.on_pick_up and l.itemstring:find(v) then + if self.on_pick_up(self,l) == nil then o:remove() end + end + end + end + end + end +end + +local function damage_mob(self,reason,damage) + if not self.health then return end + damage = floor(damage) + if damage > 0 then + self.health = self.health - damage + + effect(self.object:get_pos(), 5, "mcl_particles_smoke.png", 1, 2, 2, nil) + + if check_for_death(self, reason, {type = reason}) then + return true + end + end +end + +local function check_entity_cramming(self) + local p = self.object:get_pos() + local oo = minetest.get_objects_inside_radius(p,1) + local mobs = {} + for _,o in pairs(oo) do + local l = o:get_luaentity() + if l and l.is_mob and l.health > 0 then table.insert(mobs,l) end + end + local clear = #mobs < ENTITY_CRAMMING_MAX + local ncram = {} + for _,l in pairs(mobs) do + if l then + if clear then + l.cram = nil + elseif l.cram == nil and not self.child then + table.insert(ncram,l) + elseif l.cram then + damage_mob(l,"cramming",CRAMMING_DAMAGE) + end + end + end + for i,l in pairs(ncram) do + if i > ENTITY_CRAMMING_MAX then + l.cram = true + else + l.cram = nil + end + end +end + +-- falling and fall damage +-- returns true if mob died +local falling = function(self, pos) + + if self.fly and self.state ~= "die" then + return + end + + if mcl_portals ~= nil then + if mcl_portals.nether_portal_cooloff(self.object) then + return false -- mob has teleported through Nether portal - it's 99% not falling + end + end + + -- floating in water (or falling) + local v = self.object:get_velocity() + + if v.y > 0 then + + -- apply gravity when moving up + self.object:set_acceleration({ + x = 0, + y = -10, + z = 0 + }) + + elseif v.y <= 0 and v.y > self.fall_speed then + + -- fall downwards at set speed + self.object:set_acceleration({ + x = 0, + y = self.fall_speed, + z = 0 + }) + else + -- stop accelerating once max fall speed hit + self.object:set_acceleration({x = 0, y = 0, z = 0}) + end + + if minetest.registered_nodes[node_ok(pos).name].groups.lava then + + if self.floats_on_lava == 1 then + + self.object:set_acceleration({ + x = 0, + y = -self.fall_speed / (max(1, v.y) ^ 2), + z = 0 + }) + end + end + + -- in water then float up + if minetest.registered_nodes[node_ok(pos).name].groups.water then + + if self.floats == 1 then + + self.object:set_acceleration({ + x = 0, + y = -self.fall_speed / (max(1, v.y) ^ 2), + z = 0 + }) + end + else + + -- fall damage onto solid ground + if self.fall_damage == 1 + and self.object:get_velocity().y == 0 then + + local d = (self.old_y or 0) - self.object:get_pos().y + + if d > 5 then + + local add = minetest.get_item_group(self.standing_on, "fall_damage_add_percent") + local damage = d - 5 + if add ~= 0 then + damage = damage + damage * (add/100) + end + damage_mob(self,"fall",damage) + end + + self.old_y = self.object:get_pos().y + end + end +end + +local teleport = function(self, target) + if self.do_teleport then + if self.do_teleport(self, target) == false then + return + end + end +end + + +-- deal damage and effects when mob punched +local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) + + -- 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 + + -- error checking when mod profiling is enabled + if not tool_capabilities then + minetest.log("warning", "[mobs] Mod profiling enabled, damage not enabled") + return + end + + local is_player = hitter:is_player() + + if is_player then + -- is mob protected? + if self.protected and minetest.is_protected(self.object:get_pos(), hitter:get_player_name()) then + return + end + + -- set/update 'drop xp' timestamp if hitted by player + self.xp_timestamp = minetest.get_us_time() + end + + + -- punch interval + local weapon = hitter:get_wielded_item() + local punch_interval = 1.4 + + -- exhaust attacker + if 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 + + -- quick error check incase it ends up 0 (serialize.h check test) + if tflp == 0 then + tflp = 0.2 + end + + + for group,_ in pairs( (tool_capabilities.damage_groups or {}) ) do + + tmp = tflp / (tool_capabilities.full_punch_interval or 1.4) + + if tmp < 0 then + tmp = 0.0 + elseif tmp > 1 then + tmp = 1.0 + end + + damage = damage + (tool_capabilities.damage_groups[group] or 0) + * tmp * ((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 - 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) + if minetest.is_creative_enabled("") ~= true + and 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 = floor(65535/tool_capabilities.punch_attack_uses) + weapon:add_wear(wear) + hitter:set_wielded_item(weapon) + end + end, hitter:get_player_name()) + end + end + + local die = false + + + if damage >= 0 then + -- 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 + -- weapon sounds + if weapon:get_definition().sounds ~= nil then + + local s = random(0, #weapon:get_definition().sounds) + + minetest.sound_play(weapon:get_definition().sounds[s], { + object = self.object, --hitter, + max_hear_distance = 8 + }, true) + else + minetest.sound_play("default_punch", { + object = self.object, + max_hear_distance = 5 + }, true) + end + + damage_effect(self, damage) + + -- do damage + self.health = self.health - damage + + -- skip future functions if dead, except alerting others + if check_for_death(self, "hit", {type = "punch", puncher = hitter}) then + die = true + end + end + -- knock back effect (only on full punch) + if not die + and self.knock_back + and tflp >= punch_interval then + + local v = self.object:get_velocity() + local r = 1.4 - min(punch_interval, 1.4) + local kb = r * 2.0 + local up = 2 + + -- if already in air then dont go up anymore when hit + if v.y ~= 0 + or self.fly then + up = 0 + end + + -- direction error check + dir = dir or {x = 0, y = 0, z = 0} + + -- check if tool already has specific knockback value + if tool_capabilities.damage_groups["knockback"] then + kb = tool_capabilities.damage_groups["knockback"] + else + kb = kb * 1.5 + end + + + local luaentity + if hitter then + luaentity = hitter:get_luaentity() + end + if hitter and is_player then + local wielditem = hitter:get_wielded_item() + kb = kb + 3 * mcl_enchanting.get_enchantment(wielditem, "knockback") + elseif luaentity and luaentity._knockback then + kb = kb + luaentity._knockback + end + + self.object:set_velocity({ + x = dir.x * kb, + y = dir.y * kb + up * 2, + z = dir.z * kb + }) + + self.pause_timer = 0.25 + end + end -- END if damage + + -- if skittish then run away + if not die and self.runaway == true and self.state ~= "flop" then + + local lp = hitter:get_pos() + local s = self.object:get_pos() + local vec = { + x = lp.x - s.x, + y = lp.y - s.y, + z = lp.z - s.z + } + + local yaw = (atan(vec.z / vec.x) + 3 * pi / 2) - self.rotate + + if lp.x > s.x then + yaw = yaw + pi + end + + yaw = set_yaw(self, yaw, 6) + self.state = "runaway" + self.runaway_timer = 0 + self.following = nil + end + + local name = hitter:get_player_name() or "" + + -- attack puncher and call other mobs for help + if self.passive == false + and self.state ~= "flop" + and (self.child == false or self.type == "monster") + and hitter:get_player_name() ~= self.owner + and not mcl_mobs.invis[ name ] then + + if not die then + -- attack whoever punched mob + self.state = "" + do_attack(self, hitter) + end + + -- alert others to the attack + local objs = minetest.get_objects_inside_radius(hitter:get_pos(), self.view_range) + local obj = nil + + for n = 1, #objs do + + obj = objs[n]:get_luaentity() + + if obj then + + -- only alert members of same mob or friends + if obj.group_attack + and obj.state ~= "attack" + and obj.owner ~= name then + if obj.name == self.name then + do_attack(obj, hitter) + elseif type(obj.group_attack) == "table" then + for i=1, #obj.group_attack do + if obj.name == obj.group_attack[i] then + do_attack(obj, hitter) + break + end + end + end + end + + -- have owned mobs attack player threat + if obj.owner == name and obj.owner_loyal then + do_attack(obj, self.object) + end + end + end + end +end + +local mob_detach_child = function(self, child) + + if self.driver == child then + self.driver = nil + end + +end + +-- get entity staticdata +local mob_staticdata = function(self) + +--[[ + -- remove mob when out of range unless tamed + if remove_far + and self.can_despawn + and self.remove_ok + and ((not self.nametag) or (self.nametag == "")) + and self.lifetimer <= 20 then + + minetest.log("action", "Mob "..name.." despawns in mob_staticdata at "..minetest.pos_to_string(self.object.get_pos(), 1)) + mcl_burning.extinguish(self.object) + self.object:remove() + + return ""-- nil + end +--]] + self.remove_ok = true + self.attack = nil + self.following = nil + self.state = "stand" + + 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 +local 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 + + -- 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[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 child objects to half size + if self.child == true then + + vis_size = { + x = self.base_size.x * .5, + y = self.base_size.y * .5, + } + + if def.child_texture then + textures = def.child_texture[1] + end + + colbox = { + self.base_colbox[1] * .5, + self.base_colbox[2] * .5, + self.base_colbox[3] * .5, + self.base_colbox[4] * .5, + self.base_colbox[5] * .5, + self.base_colbox[6] * .5 + } + selbox = { + self.base_selbox[1] * .5, + self.base_selbox[2] * .5, + self.base_selbox[3] * .5, + self.base_selbox[4] * .5, + self.base_selbox[5] * .5, + self.base_selbox[6] * .5 + } + end + + if self.health == 0 then + self.health = random (self.hp_min, self.hp_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.object:set_texture_mod("") + + self.v_start = false + self.timer = 0 + self.blinktimer = 0 + self.blinkstatus = false + + -- check existing nametag + if not self.nametag then + self.nametag = def.nametag + end + + -- set anything changed above + self.object:set_properties(self) + set_yaw(self, (random(0, 360) - 180) / 180 * pi, 6) + update_tag(self) + 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 +end + + +-- main mob function +local mob_step = function(self, dtime) + check_item_pickup(self) + if not self.fire_resistant then + mcl_burning.tick(self.object, dtime, self) + end + + local pos = self.object:get_pos() + local yaw = 0 + + if mobs_debug then + update_tag(self) + end + + if self.state == "die" then + return + end + + if self.jump_sound_cooloff > 0 then + self.jump_sound_cooloff = self.jump_sound_cooloff - dtime + end + if self.opinion_sound_cooloff > 0 then + self.opinion_sound_cooloff = self.opinion_sound_cooloff - dtime + end + if falling(self, pos) then + -- Return if mob died after falling + return + end + + -- smooth rotation by ThomasMonroe314 + + if self.delay and self.delay > 0 then + + local yaw = self.object:get_yaw() or 0 + + if self.delay == 1 then + yaw = self.target_yaw + else + local dif = abs(yaw - self.target_yaw) + + if yaw > self.target_yaw then + + if dif > pi then + dif = 2 * pi - dif -- need to add + yaw = yaw + dif / self.delay + else + yaw = yaw - dif / self.delay -- need to subtract + end + + elseif yaw < self.target_yaw then + + if dif > pi then + dif = 2 * pi - dif + yaw = yaw - dif / self.delay -- need to subtract + else + yaw = yaw + dif / self.delay -- need to add + end + end + + if yaw > (pi * 2) then yaw = yaw - (pi * 2) end + if yaw < 0 then yaw = yaw + (pi * 2) end + end + + self.delay = self.delay - 1 + if self.shaking then + yaw = yaw + (math.random() * 2 - 1) * 5 * dtime + end + self.object:set_yaw(yaw) + update_roll(self) + end + + -- end rotation + + -- run custom function (defined in mob lua file) + if self.do_custom then + + -- when false skip going any further + if self.do_custom(self, dtime) == false then + return + end + end + + -- knockback timer + if self.pause_timer > 0 then + + self.pause_timer = self.pause_timer - dtime + + return + end + + -- attack timer + self.timer = self.timer + dtime + + if self.state ~= "attack" and self.state ~= "gowp" then + if self.timer < 1 then + return + end + + self.timer = 0 + end + + -- never go over 100 + if self.timer > 100 then + self.timer = 1 + end + + -- mob plays random sound at times + if random(1, 70) == 1 then + mob_sound(self, "random", true) + end + + -- environmental damage timer (every 1 second) + self.env_damage_timer = self.env_damage_timer + dtime + + if (self.state == "attack" and self.env_damage_timer > 1) + or self.state ~= "attack" then + check_entity_cramming(self) + self.env_damage_timer = 0 + + -- check for environmental damage (water, fire, lava etc.) + if do_env_damage(self) then + return + end + + -- node replace check (cow eats grass etc.) + replace(self, pos) + end + + monster_attack(self) + + npc_attack(self) + + breed(self) + + if do_states(self, dtime) then + return + end + + if not self.object:get_luaentity() then + return false + end + + do_jump(self) + + runaway_from(self) + + if is_at_water_danger(self) and self.state ~= "attack" then + if random(1, 10) <= 6 then + set_velocity(self, 0) + self.state = "stand" + set_animation(self, "stand") + yaw = yaw + random(-0.5, 0.5) + yaw = set_yaw(self, yaw, 8) + end + end + + -- Add water flowing for mobs from mcl_item_entity + local p, node, nn, def + p = self.object:get_pos() + node = minetest.get_node_or_nil(p) + if node then + nn = node.name + def = minetest.registered_nodes[nn] + end + + -- Move item around on flowing liquids + if def and def.liquidtype == "flowing" then + + --[[ Get flowing direction (function call from flowlib), if there's a liquid. + NOTE: According to Qwertymine, flowlib.quickflow is only reliable for liquids with a flowing distance of 7. + Luckily, this is exactly what we need if we only care about water, which has this flowing distance. ]] + local vec = flowlib.quick_flow(p, node) + -- Just to make sure we don't manipulate the speed for no reason + if vec.x ~= 0 or vec.y ~= 0 or vec.z ~= 0 then + -- Minecraft Wiki: Flowing speed is "about 1.39 meters per second" + local f = 1.39 + -- Set new item moving speed into the direciton of the liquid + local newv = vector.multiply(vec, f) + self.object:set_acceleration({x = 0, y = 0, z = 0}) + self.object:set_velocity({x = newv.x, y = -0.22, z = newv.z}) + + self.physical_state = true + self._flowing = true + self.object:set_properties({ + physical = true + }) + return + end + elseif self._flowing == true then + -- Disable flowing physics if not on/in flowing liquid + self._flowing = false + enable_physics(self.object, self, true) + return + end + + --Mob following code. + follow_flop(self) + + if is_at_cliff_or_danger(self) then + set_velocity(self, 0) + self.state = "stand" + set_animation(self, "stand") + local yaw = self.object:get_yaw() or 0 + yaw = set_yaw(self, yaw + 0.78, 8) + end + + -- Despawning: when lifetimer expires, remove mob + if remove_far + and self.can_despawn == true + and ((not self.nametag) or (self.nametag == "")) + and self.state ~= "attack" + and self.following == nil then + + self.lifetimer = self.lifetimer - dtime + if self.despawn_immediately or self.lifetimer <= 0 then + minetest.log("action", "Mob "..self.name.." despawns in mob_step at "..minetest.pos_to_string(pos, 1)) + mcl_burning.extinguish(self.object) + self.object:remove() + elseif self.lifetimer <= 10 then + if math.random(10) < 4 then + self.despawn_immediately = true + else + self.lifetimer = 20 + end + end + end +end + + +-- 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 + + +mcl_mobs.spawning_mobs = {} + +-- 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 + + update_tag(self) + + if not minetest.is_creative_enabled(clicker:get_player_name()) then + item:take_item() + clicker:set_wielded_item(item) + end + return true + end + + end + return false +end + +local create_mob_on_rightclick = function(on_rightclick) + return function(self, clicker) + local stop = on_rightclick_prefix(self, clicker) + if (not stop) and (on_rightclick) then + on_rightclick(self, clicker) + end + end +end + +-- register mob entity +function mcl_mobs:register_mob(name, def) + + mcl_mobs.spawning_mobs[name] = true + +local can_despawn +if def.can_despawn ~= nil then + can_despawn = def.can_despawn +elseif def.spawn_class == "passive" then + can_despawn = false +else + can_despawn = true +end + +local function scale_difficulty(value, default, min, special) + if (not value) or (value == default) or (value == special) then + return default + else + return max(min, value * difficulty) + end +end + +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 + +minetest.register_entity(name, { + + use_texture_alpha = def.use_texture_alpha, + stepheight = def.stepheight or 0.6, + name = name, + description = def.description, + 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 = math.rad(def.rotate or 0), -- 0=front, 90=side, 180=back, 270=side2 + lifetimer = def.lifetimer or 57.73, + hp_min = scale_difficulty(def.hp_min, 5, 1), + hp_max = scale_difficulty(def.hp_max, 10, 1), + xp_min = def.xp_min or 0, + xp_max = def.xp_max or 0, + xp_timestamp = 0, + breath_max = def.breath_max or 15, + breathes_in_water = def.breathes_in_water or false, + physical = true, + collisionbox = collisionbox, + 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 = create_mob_on_rightclick(def.on_rightclick), + arrow = def.arrow, + shoot_interval = def.shoot_interval, + sounds = def.sounds or {}, + animation = def.animation, + follow = def.follow, + nofollow = def.nofollow, + can_open_doors = def.can_open_doors, + 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, + env_damage_timer = 0, + tamed = false, + pause_timer = 0, + horny = false, + hornytimer = 0, + gotten = false, + health = 0, + 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, + is_mob = true, + pushable = def.pushable or true, + + + -- MCL2 extensions + teleport = 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, + pick_up = def.pick_up, + 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, + -- End of MCL2 extensions + + on_spawn = def.on_spawn, + + on_blast = def.on_blast or do_tnt, + + on_step = mob_step, + + do_punch = def.do_punch, + + on_punch = mob_punch, + + on_breed = def.on_breed, + + on_grown = def.on_grown, + + on_pick_up = def.on_pick_up, + + on_detach_child = mob_detach_child, + + on_activate = function(self, staticdata, dtime) + --this is a temporary hack so mobs stop + --glitching and acting really weird with the + --default built in engine collision detection + self.is_mob = true + self.object:set_properties({ + collide_with_objects = false, + }) + return mob_activate(self, staticdata, def, dtime) + end, + + get_staticdata = function(self) + return 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 mcl_mobs:register_mob function + + +-- register arrow for shoot attack +function mcl_mobs:register_arrow(name, def) + + if not name or not def then return end -- errorcheck + + minetest.register_entity(name, { + + 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, + on_punch = function(self) + local vel = self.object:get_velocity() + self.object:set_velocity({x=vel.x * -1, y=vel.y * -1, z=vel.z * -1}) + end, + collisionbox = def.collisionbox or {0, 0, 0, 0, 0, 0}, + automatic_face_movement_dir = def.rotate + and (def.rotate - (pi / 180)) or false, + + on_activate = def.on_activate, + + on_step = def.on_step or function(self, dtime) + + self.timer = self.timer + 1 + + local pos = self.object:get_pos() + + if self.switch == 0 + or self.timer > 150 + or not 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 + + minetest.add_particle({ + pos = 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 = node_ok(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 + + self.hit_player(self, player) + self.object:remove(); + return + end + + local entity = player:get_luaentity() + + if entity + and self.hit_mob + and entity.is_mob == true + and tostring(player) ~= self.owner_id + and entity.name ~= self.object:get_luaentity().name then + self.hit_mob(self, player) + self.object:remove(); + return + end + + if entity + and self.hit_object + and (not entity.is_mob) + and tostring(player) ~= self.owner_id + and entity.name ~= self.object:get_luaentity().name then + self.hit_object(self, player) + self.object:remove(); + return + end + end + end + + self.lastpos = pos + end + }) +end + + +-- no damage to nodes explosion +function mcl_mobs:safe_boom(self, pos, strength) + minetest.sound_play(self.sounds and self.sounds.explode or "tnt_explode", { + pos = pos, + gain = 1.0, + max_hear_distance = self.sounds and self.sounds.distance or 32 + }, true) + local radius = strength + entity_physics(pos, radius) + effect(pos, 32, "mcl_particles_smoke.png", radius * 3, radius * 5, radius, 1, 0) +end + + +-- make explosion with protection and tnt mod check +function mcl_mobs:boom(self, pos, strength, fire) + if mobs_griefing and not minetest.is_protected(pos, "") then + mcl_explosions.explode(pos, strength, { drop_chance = 1.0, fire = fire }, self.object) + else + mcl_mobs:safe_boom(self, pos, strength) + end + + -- delete the object after it punched the player to avoid nil entities in e.g. mcl_shields!! + self.object:remove() +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 mcl_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 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 minetest.is_creative_enabled(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 + + pos.y = pos.y - 0.5 + + 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 minetest.is_creative_enabled(placer:get_player_name()) then + itemstack:take_item() + end + end + + return itemstack + end, + }) + +end + + +-- No-op in MCL2 (capturing mobs is not possible). +-- Provided for compability with Mobs Redo +function mcl_mobs:capture_mob(self, clicker, chance_hand, chance_net, chance_lasso, force_take, replacewith) + return false +end + + +-- No-op in MCL2 (protecting mobs is not possible). +function mcl_mobs:protect(self, clicker) + return false +end + + +-- feeding, taming and breeding (thanks blert2112) +function mcl_mobs:feed_tame(self, clicker, feed_count, breed, tame) + if not self.follow then + return false + end + + -- can eat/tame with item in hand + if self.nofollow or follow_holding(self, clicker) then + + -- if not in creative then take item + if not minetest.is_creative_enabled(clicker:get_player_name()) then + + local item = clicker:get_wielded_item() + + item:take_item() + + clicker:set_wielded_item(item) + end + + mob_sound(self, "eat", nil, true) + + -- increase health + self.health = self.health + 4 + + if self.health >= self.hp_max then + + self.health = self.hp_max + + if self.htimer < 1 then + self.htimer = 5 + end + end + + self.object:set_hp(self.health) + + update_tag(self) + + -- make children grow quicker + if self.child == true then + + -- deduct 10% of the time to adulthood + self.hornytimer = self.hornytimer + ((CHILD_GROW_TIME - self.hornytimer) * 0.1) + + return true + end + + -- feed and tame + self.food = (self.food or 0) + 1 + if self.food >= feed_count then + + self.food = 0 + + if breed and self.hornytimer == 0 then + self.horny = true + end + + if tame then + + self.tamed = true + + if not self.owner or self.owner == "" then + self.owner = clicker:get_player_name() + end + end + + -- make sound when fed so many times + mob_sound(self, "random", true) + end + + return true + end + + return false +end + +-- Spawn a child +function mcl_mobs:spawn_child(pos, mob_type) + local child = minetest.add_entity(pos, mob_type) + if not child then + return + end + + local ent = child:get_luaentity() + effect(pos, 15, "mcl_particles_smoke.png", 1, 2, 2, 15, 5) + + ent.child = true + + local textures + -- using specific child texture (if found) + if ent.child_texture then + textures = ent.child_texture[1] + end + + -- and resize to half height + child:set_properties({ + textures = textures, + visual_size = { + x = ent.base_size.x * .5, + y = ent.base_size.y * .5, + }, + collisionbox = { + ent.base_colbox[1] * .5, + ent.base_colbox[2] * .5, + ent.base_colbox[3] * .5, + ent.base_colbox[4] * .5, + ent.base_colbox[5] * .5, + ent.base_colbox[6] * .5, + }, + selectionbox = { + ent.base_selbox[1] * .5, + ent.base_selbox[2] * .5, + ent.base_selbox[3] * .5, + ent.base_selbox[4] * .5, + ent.base_selbox[5] * .5, + ent.base_selbox[6] * .5, + }, + }) + + return child +end + + +-- compatibility function for old entities to new modpack entities +function mcl_mobs:alias_mob(old_name, new_name) + + -- spawn egg + minetest.register_alias(old_name, new_name) + + -- entity + minetest.register_entity(":" .. old_name, { + + physical = false, + + on_step = function(self) + + if minetest.registered_entities[new_name] then + minetest.add_entity(self.object:get_pos(), new_name) + end + + self.object:remove() + end + }) + +end + + +local timer = 0 +minetest.register_globalstep(function(dtime) + timer = timer + dtime + if timer < 1 then return end + for _, player in pairs(minetest.get_connected_players()) do + local pos = player:get_pos() + for _, obj in pairs(minetest.get_objects_inside_radius(pos, 47)) do + local lua = obj:get_luaentity() + if lua and lua.is_mob then + lua.lifetimer = math.max(20, lua.lifetimer) + lua.despawn_immediately = false + end + end + end + timer = 0 +end) diff --git a/mods/ENTITIES/mcl_mobs/api/mount.lua b/mods/ENTITIES/mcl_mobs/api/mount.lua deleted file mode 100644 index dc56ee353..000000000 --- a/mods/ENTITIES/mcl_mobs/api/mount.lua +++ /dev/null @@ -1,456 +0,0 @@ - --- lib_mount by Blert2112 (edited by TenPlus1) - ---local enable_crash = false ---local crash_threshold = 6.5 -- ignored if enable_crash=false - -local math = math -local vector = vector - ------------------------------------------------------------------------------- - --- --- Helper functions --- - ---[[local function node_ok(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 {name = fallback} -end]] - - ---[[local function node_is(pos) - - local node = node_ok(pos) - - if node.name == "air" then - return "air" - end - - if minetest.get_item_group(node.name, "lava") ~= 0 then - return "lava" - end - - if minetest.get_item_group(node.name, "liquid") ~= 0 then - return "liquid" - end - - if minetest.registered_nodes[node.name].walkable == true then - return "walkable" - end - - return "other" -end]] - - -local function get_sign(i) - - i = i or 0 - - 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} -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} - - 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 - -- rot_view = math.pi/2 - --end - - --local acce_y = 0 - local velo = entity.object:get_velocity() - - entity.v = get_v(velo) * get_sign(entity.v) - - -- process controls - if entity.driver then - - local ctrl = entity.driver:get_player_control() - - -- move forwards - if ctrl.up then - - mobs.set_velocity(entity, entity.run_velocity) - - mobs.set_mob_animation(entity, moving_anim) - - -- move backwards - elseif ctrl.down then - - mobs.set_velocity(entity, -entity.run_velocity) - - mobs.set_mob_animation(entity, moving_anim) - - --halt - else - - mobs.set_velocity(entity, 0) - - mobs.set_mob_animation(entity, stand_anim) - end - - -- mob rotation - local rotate = entity.rotate - if rotate then - local driver_look_horizontal = entity.driver:get_look_horizontal() or 0 - local yaw = driver_look_horizontal - rotate - entity.yaw = yaw - entity.object:set_yaw(yaw) - end - - --[[ - if can_fly then - - -- fly up - if ctrl.jump then - velo.y = velo.y + 1 - if velo.y > entity.accel then velo.y = entity.accel end - - elseif velo.y > 0 then - velo.y = velo.y - 0.1 - if velo.y < 0 then velo.y = 0 end - end - - -- fly down - if ctrl.sneak then - velo.y = velo.y - 1 - if velo.y < -entity.accel then velo.y = -entity.accel end - - elseif velo.y < 0 then - velo.y = velo.y + 0.1 - if velo.y > 0 then velo.y = 0 end - end - - else - ]]-- - - -- jump - if ctrl.jump then - - mobs.jump(entity) - end - - --end - end - - --[[ - -- set moving animation - if moving_anim then - mobs:set_mob_animation(entity, moving_anim) - end - - -- Stop! - local s = get_sign(entity.v) - - entity.v = entity.v - 0.02 * s - - if s ~= get_sign(entity.v) then - - entity.object:set_velocity({x = 0, y = 0, z = 0}) - entity.v = 0 - return - end - - -- enforce speed limit forward and reverse - local max_spd = entity.max_speed_reverse - - if get_sign(entity.v) >= 0 then - max_spd = entity.max_speed_forward - end - - if math.abs(entity.v) > max_spd then - entity.v = entity.v - get_sign(entity.v) - end - - -- Set position, velocity and acceleration - local p = entity.object:get_pos() - local new_velo - local new_acce = {x = 0, y = -9.8, z = 0} - - p.y = p.y - 0.5 - - local ni = node_is(p) - local v = entity.v - - if ni == "air" then - - if can_fly == true then - new_acce.y = 0 - end - - elseif ni == "liquid" or ni == "lava" then - - if ni == "lava" and entity.lava_damage ~= 0 then - - entity.lava_counter = (entity.lava_counter or 0) + dtime - - if entity.lava_counter > 1 then - - minetest.sound_play("default_punch", { - object = entity.object, - max_hear_distance = 5 - }, true) - - entity.object:punch(entity.object, 1.0, { - full_punch_interval = 1.0, - damage_groups = {fleshy = entity.lava_damage} - }, nil) - - entity.lava_counter = 0 - end - end - - if entity.terrain_type == 2 - or entity.terrain_type == 3 then - - new_acce.y = 0 - p.y = p.y + 1 - - if node_is(p) == "liquid" then - - if velo.y >= 5 then - velo.y = 5 - elseif velo.y < 0 then - new_acce.y = 20 - else - new_acce.y = 5 - end - else - if math.abs(velo.y) < 1 then - local pos = entity.object:get_pos() - pos.y = math.floor(pos.y) + 0.5 - entity.object:set_pos(pos) - velo.y = 0 - end - end - else - v = v * 0.25 - end - end - - new_velo = get_velocity(v, entity.object:get_yaw() - rot_view, velo.y) - new_acce.y = new_acce.y + acce_y - - entity.object:set_velocity(new_velo) - entity.object:set_acceleration(new_acce) - - -- CRASH! - if enable_crash then - - local intensity = entity.v2 - v - - if intensity >= crash_threshold then - - entity.object:punch(entity.object, 1.0, { - full_punch_interval = 1.0, - damage_groups = {fleshy = intensity} - }, nil) - - end - end - - entity.v2 = v - ]]-- -end - - --- directional flying routine by D00Med (edited by TenPlus1) - -function mobs.fly(entity, dtime, speed, shoots, arrow, moving_anim, stand_anim) - if true then - print("succ") - return - end - local ctrl = entity.driver:get_player_control() - local velo = entity.object:get_velocity() - local dir = entity.driver:get_look_dir() - local yaw = entity.driver:get_look_horizontal() + 1.57 -- offset fix between old and new commands - - if ctrl.up then - entity.object:set_velocity({ - x = dir.x * speed, - y = dir.y * speed + 2, - z = dir.z * speed - }) - - elseif ctrl.down then - entity.object:set_velocity({ - x = -dir.x * speed, - y = dir.y * speed + 2, - z = -dir.z * speed - }) - - elseif not ctrl.down or ctrl.up or ctrl.jump then - entity.object:set_velocity({x = 0, y = -2, z = 0}) - end - - entity.object:set_yaw(yaw + math.pi + math.pi / 2 - entity.rotate) - - -- firing arrows - if ctrl.LMB and ctrl.sneak and shoots then - - local pos = entity.object:get_pos() - local obj = minetest.add_entity({ - x = pos.x + 0 + dir.x * 2.5, - y = pos.y + 1.5 + dir.y, - z = pos.z + 0 + dir.z * 2.5}, arrow) - - local ent = obj:get_luaentity() - if ent then - ent.switch = 1 -- for mob specific arrows - ent.owner_id = tostring(entity.object) -- so arrows dont hurt entity you are riding - local vec = {x = dir.x * 6, y = dir.y * 6, z = dir.z * 6} - local yaw = entity.driver:get_look_horizontal() - obj:set_yaw(yaw + math.pi / 2) - obj:set_velocity(vec) - else - obj:remove() - end - end - - -- change animation if stopped - if velo.x == 0 and velo.y == 0 and velo.z == 0 then - - mobs:set_mob_animation(entity, stand_anim) - else - -- moving animation - mobs:set_mob_animation(entity, moving_anim) - end -end diff --git a/mods/ENTITIES/mcl_mobs/crafts.lua b/mods/ENTITIES/mcl_mobs/crafts.lua index 2b23c6f58..e8a5b60fc 100644 --- a/mods/ENTITIES/mcl_mobs/crafts.lua +++ b/mods/ENTITIES/mcl_mobs/crafts.lua @@ -1,5 +1,5 @@ -local S = minetest.get_translator(minetest.get_current_modname()) +local S = minetest.get_translator("mcl_mobs") -- name tag minetest.register_craftitem("mcl_mobs:nametag", { diff --git a/mods/ENTITIES/mcl_mobs/init.lua b/mods/ENTITIES/mcl_mobs/init.lua index b0daba2c4..69246b470 100644 --- a/mods/ENTITIES/mcl_mobs/init.lua +++ b/mods/ENTITIES/mcl_mobs/init.lua @@ -1,16 +1,14 @@ local path = minetest.get_modpath(minetest.get_current_modname()) -local api_path = path.."/api" - -- Mob API -dofile(api_path .. "/api.lua") +dofile(path .. "/api.lua") -- Spawning Algorithm -dofile(api_path .. "/spawning.lua") +dofile(path .. "/spawning.lua") -- Rideable Mobs -dofile(api_path .. "/mount.lua") +dofile(path .. "/mount.lua") -- Mob Items dofile(path .. "/crafts.lua") \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.pl.tr b/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.pl.tr deleted file mode 100644 index 96dc1ea15..000000000 --- a/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.pl.tr +++ /dev/null @@ -1,11 +0,0 @@ -# textdomain: mcl_mobs -Peaceful mode active! No monsters will spawn.=Tryb pokojowy aktywowany! Potwory nie będą się pojawiać. -This allows you to place a single mob.=To pozwala na przywołanie jednego moba. -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.=Postaw to w miejscu w którym chcesz aby pojawił się mob. Zwierzęta pojawią się jako oswojone chyba, że będziesz się skradał podczas stawiania. Jeśli postawisz to na spawnerze to zmienisz którego moba przywołuje. -You need the “maphack” privilege to change the mob spawner.=Potrzebujesz przywileju "maphack", aby zmienić spawner. -Name Tag=Znacznik -A name tag is an item to name a mob.=Znacznik jest przedmiotem pozwalającym nazwać moba. -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.=Zanim użyjesz znacznika musisz wybrać imię przy kowadle. Następnie możesz użyć znacznika by nazwać moba. To zużywa znacznik. -Only peaceful mobs allowed!=Tylko pokojowe moby są dozwolone! -Give names to mobs=Nazwij moby -Set name at anvil=Wybierz imię przy kowadle diff --git a/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.zh_TW.tr b/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.zh_TW.tr new file mode 100644 index 000000000..90d24fd21 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.zh_TW.tr @@ -0,0 +1,11 @@ +# 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=在鐵砧上設置名字 diff --git a/mods/ENTITIES/mcl_mobs/lucky_block.lua b/mods/ENTITIES/mcl_mobs/lucky_block.lua new file mode 100644 index 000000000..ea90de74a --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/lucky_block.lua @@ -0,0 +1,8 @@ + +if minetest.get_modpath("lucky_block") then + + lucky_block:add_blocks({ + {"dro", {"mcl_mobs:nametag"}, 1}, + {"lig"}, + }) +end diff --git a/mods/ENTITIES/mcl_mobs/mod.conf b/mods/ENTITIES/mcl_mobs/mod.conf index 6d3a8acc0..a39187ba8 100644 --- a/mods/ENTITIES/mcl_mobs/mod.conf +++ b/mods/ENTITIES/mcl_mobs/mod.conf @@ -1,5 +1,4 @@ name = mcl_mobs -author = PilzAdam description = Adds a mob API for mods to add animals or monsters, etc. depends = mcl_mapgen, mcl_particles optional_depends = mcl_weather, mcl_explosions, mcl_hunger, mcl_worlds, cmi, doc_identifier, mcl_armor, mcl_portals, mcl_experience diff --git a/mods/ENTITIES/mcl_mobs/README.md b/mods/ENTITIES/mcl_mobs/readme.MD similarity index 100% rename from mods/ENTITIES/mcl_mobs/README.md rename to mods/ENTITIES/mcl_mobs/readme.MD diff --git a/mods/ENTITIES/mcl_mobs/sounds/attributes.txt b/mods/ENTITIES/mcl_mobs/sounds/attributes.txt deleted file mode 100644 index 1228dd9d7..000000000 --- a/mods/ENTITIES/mcl_mobs/sounds/attributes.txt +++ /dev/null @@ -1,4 +0,0 @@ - -default_punch.1 = https://freesound.org/people/Merrick079/sounds/566436/ -default_punch.2 = https://freesound.org/people/Merrick079/sounds/566435/ -default_punch.3 = https://freesound.org/people/Merrick079/sounds/566434/ diff --git a/mods/ENTITIES/mcl_mobs/sounds/default_punch.1.ogg b/mods/ENTITIES/mcl_mobs/sounds/default_punch.1.ogg deleted file mode 100644 index 4d7ba8015eb13ce415ea09f4223a427bc4d2e17d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12658 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 diff --git a/mods/ENTITIES/mcl_mobs/sounds/default_punch.2.ogg b/mods/ENTITIES/mcl_mobs/sounds/default_punch.2.ogg deleted file mode 100644 index c022d94f871345810b7d90ab953a01985e2d369b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12801 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 R&zZhFM!opw0l>!ge*lM|2+9Be diff --git a/mods/ENTITIES/mcl_mobs/sounds/default_punch.3.ogg b/mods/ENTITIES/mcl_mobs/sounds/default_punch.3.ogg deleted file mode 100644 index 4c5e3f9b301e682372399f6213210a42d86fc558..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12943 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 0) and math_floor(x + 0.5) or math_ceil(x - 0.5) end + +--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 + +local pairs = pairs + +-- range for mob count +local aoc_range = 32 + +--do mobs spawn? +local mobs_spawn = minetest.settings:get_bool("mobs_spawn", true) ~= false + + +local noise_params = { + offset = 0, + scale = 3, + spread = { + x = 301, + y = 50, + z = 304, + }, + seed = 100, + octaves = 3, + persistence = 0.5, +} + +-- THIS IS THE BIG LIST OF ALL BIOMES - used for programming/updating mobs +-- Also used for missing parameter +-- Please update the list when adding new biomes! + +local list_of_all_biomes = { + + -- underground: + + "FlowerForest_underground", + "JungleEdge_underground", + "ColdTaiga_underground", + "IcePlains_underground", + "IcePlainsSpikes_underground", + "MegaTaiga_underground", + "Taiga_underground", + "ExtremeHills+_underground", + "JungleM_underground", + "ExtremeHillsM_underground", + "JungleEdgeM_underground", + + -- ocean: + + "RoofedForest_ocean", + "JungleEdgeM_ocean", + "BirchForestM_ocean", + "BirchForest_ocean", + "IcePlains_deep_ocean", + "Jungle_deep_ocean", + "Savanna_ocean", + "MesaPlateauF_ocean", + "ExtremeHillsM_deep_ocean", + "Savanna_deep_ocean", + "SunflowerPlains_ocean", + "Swampland_deep_ocean", + "Swampland_ocean", + "MegaSpruceTaiga_deep_ocean", + "ExtremeHillsM_ocean", + "JungleEdgeM_deep_ocean", + "SunflowerPlains_deep_ocean", + "BirchForest_deep_ocean", + "IcePlainsSpikes_ocean", + "Mesa_ocean", + "StoneBeach_ocean", + "Plains_deep_ocean", + "JungleEdge_deep_ocean", + "SavannaM_deep_ocean", + "Desert_deep_ocean", + "Mesa_deep_ocean", + "ColdTaiga_deep_ocean", + "Plains_ocean", + "MesaPlateauFM_ocean", + "Forest_deep_ocean", + "JungleM_deep_ocean", + "FlowerForest_deep_ocean", + "MushroomIsland_ocean", + "MegaTaiga_ocean", + "StoneBeach_deep_ocean", + "IcePlainsSpikes_deep_ocean", + "ColdTaiga_ocean", + "SavannaM_ocean", + "MesaPlateauF_deep_ocean", + "MesaBryce_deep_ocean", + "ExtremeHills+_deep_ocean", + "ExtremeHills_ocean", + "MushroomIsland_deep_ocean", + "Forest_ocean", + "MegaTaiga_deep_ocean", + "JungleEdge_ocean", + "MesaBryce_ocean", + "MegaSpruceTaiga_ocean", + "ExtremeHills+_ocean", + "Jungle_ocean", + "RoofedForest_deep_ocean", + "IcePlains_ocean", + "FlowerForest_ocean", + "ExtremeHills_deep_ocean", + "MesaPlateauFM_deep_ocean", + "Desert_ocean", + "Taiga_ocean", + "BirchForestM_deep_ocean", + "Taiga_deep_ocean", + "JungleM_ocean", + + -- water or beach? + + "MesaPlateauFM_sandlevel", + "MesaPlateauF_sandlevel", + "MesaBryce_sandlevel", + "Mesa_sandlevel", + + -- beach: + + "FlowerForest_beach", + "Forest_beach", + "StoneBeach", + "ColdTaiga_beach_water", + "Taiga_beach", + "Savanna_beach", + "Plains_beach", + "ExtremeHills_beach", + "ColdTaiga_beach", + "Swampland_shore", + "MushroomIslandShore", + "JungleM_shore", + "Jungle_shore", + + -- dimension biome: + + "Nether", + "End", + + -- Overworld regular: + + "Mesa", + "FlowerForest", + "Swampland", + "Taiga", + "ExtremeHills", + "Jungle", + "Savanna", + "BirchForest", + "MegaSpruceTaiga", + "MegaTaiga", + "ExtremeHills+", + "Forest", + "Plains", + "Desert", + "ColdTaiga", + "MushroomIsland", + "IcePlainsSpikes", + "SunflowerPlains", + "IcePlains", + "RoofedForest", + "ExtremeHills+_snowtop", + "MesaPlateauFM_grasstop", + "JungleEdgeM", + "ExtremeHillsM", + "JungleM", + "BirchForestM", + "MesaPlateauF", + "MesaPlateauFM", + "MesaPlateauF_grasstop", + "MesaBryce", + "JungleEdge", + "SavannaM", + "Nether", + "WarpedForest", + "SoulsandValley" +} + +-- count how many mobs are in an area +local function count_mobs(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().is_mob then + num = num + 1 + end + end + return num +end + + +-- global functions + +function mcl_mobs:spawn_abm_check(pos, node, name) + -- global function to add additional spawn checks + -- return true to stop spawning mob +end + + +--[[ + Custom elements changed: + +name: +the mobs name + +dimension: +"overworld" +"nether" +"end" + +types of spawning: +"water" +"ground" +"lava" + +biomes: tells the spawner to allow certain mobs to spawn in certain biomes +{"this", "that", "grasslands", "whatever"} + + +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 +local spawn_dictionary = {} +local summary_chance = 0 + +function mcl_mobs:spawn_setup(def) + if not mobs_spawn then return end + + if not def then + minetest.log("warning", "Empty mob spawn setup definition") + return + end + + local name = def.name + if not name then + minetest.log("warning", "Missing mob name") + return + end + + local dimension = def.dimension or "overworld" + local type_of_spawning = def.type_of_spawning or "ground" + local biomes = def.biomes or list_of_all_biomes + local min_light = def.min_light or 0 + local max_light = def.max_light or (minetest.LIGHT_MAX + 1) + local chance = def.chance or 1000 + local aoc = def.aoc or aoc_range + local min_height = def.min_height or mcl_mapgen.overworld.min + local max_height = def.max_height or mcl_mapgen.overworld.max + local day_toggle = def.day_toggle + local on_spawn = def.on_spawn + local check_position = def.check_position + + -- chance/spawn number override in minetest.conf for registered mob + local numbers = minetest.settings:get(name) + if numbers then + numbers = numbers:split(",") + chance = tonumber(numbers[1]) or chance + aoc = tonumber(numbers[2]) or aoc + if chance == 0 then + minetest.log("warning", string.format("[mcl_mobs] %s has spawning disabled", name)) + return + end + minetest.log("action", string.format("[mcl_mobs] Chance setting for %s changed to %s (total: %s)", name, chance, aoc)) + end + + if chance < 1 then + chance = 1 + minetest.log("warning", "Chance shouldn't be less than 1 (mob name: " .. name ..")") + end + + spawn_dictionary[#spawn_dictionary + 1] = { + name = name, + dimension = dimension, + type_of_spawning = type_of_spawning, + biomes = biomes, + min_light = min_light, + max_light = max_light, + chance = chance, + aoc = aoc, + min_height = min_height, + max_height = max_height, + day_toggle = day_toggle, + check_position = check_position, + on_spawn = on_spawn, + } + summary_chance = summary_chance + chance +end + +function mcl_mobs:spawn_specific(name, dimension, type_of_spawning, biomes, min_light, max_light, interval, chance, aoc, min_height, max_height, day_toggle, on_spawn) + + -- Do mobs spawn at all? + if not mobs_spawn then + return + end + + -- chance/spawn number override in minetest.conf for registered mob + local numbers = minetest.settings:get(name) + + if numbers then + numbers = numbers:split(",") + chance = tonumber(numbers[1]) or chance + aoc = tonumber(numbers[2]) or aoc + + if chance == 0 then + minetest.log("warning", string.format("[mcl_mobs] %s has spawning disabled", name)) + return + end + + minetest.log("action", string.format("[mcl_mobs] Chance setting for %s changed to %s (total: %s)", name, chance, aoc)) + end + + --load information into the spawn dictionary + local key = #spawn_dictionary + 1 + spawn_dictionary[key] = {} + spawn_dictionary[key]["name"] = name + spawn_dictionary[key]["dimension"] = dimension + spawn_dictionary[key]["type_of_spawning"] = type_of_spawning + spawn_dictionary[key]["biomes"] = biomes + spawn_dictionary[key]["min_light"] = min_light + spawn_dictionary[key]["max_light"] = max_light + spawn_dictionary[key]["chance"] = chance + spawn_dictionary[key]["aoc"] = aoc + spawn_dictionary[key]["min_height"] = min_height + spawn_dictionary[key]["max_height"] = max_height + spawn_dictionary[key]["day_toggle"] = day_toggle + + summary_chance = summary_chance + chance +end + +local two_pi = 2 * math.pi +local function get_next_mob_spawn_pos(pos) + local distance = math_random(25, 32) + local angle = math_random() * two_pi + return { + x = math_round(pos.x + distance * math_cos(angle)), + y = pos.y, + z = math_round(pos.z + distance * math_sin(angle)) + } +end + +local function decypher_limits(posy) + posy = math_floor(posy) + return posy - 32, posy + 32 +end + +--a simple helper function for mob_spawn +local function biome_check(biome_list, biome_goal) + for _, data in pairs(biome_list) do + if data == biome_goal then + return true + end + end + + return false +end + +local function is_farm_animal(n) + return n == "mobs_mc:pig" or n == "mobs_mc:cow" or n == "mobs_mc:sheep" or n == "mobs_mc:chicken" or n == "mobs_mc:horse" or n == "mobs_mc:donkey" +end + +if mobs_spawn then + + local perlin_noise + + local function spawn_a_mob(pos, dimension, y_min, y_max) + local dimension = dimension or mcl_worlds.pos_to_dimension(pos) + local goal_pos = get_next_mob_spawn_pos(pos) + local spawning_position_list = find_nodes_in_area_under_air( + {x = goal_pos.x, y = y_min, z = goal_pos.z}, + {x = goal_pos.x, y = y_max, z = goal_pos.z}, + {"group:solid", "group:water", "group:lava"} + ) + if #spawning_position_list <= 0 then return end + local spawning_position = spawning_position_list[math_random(1, #spawning_position_list)] + + --hard code mob limit in area to 5 for now + if count_mobs(spawning_position) >= 5 then return end + + local gotten_node = get_node(spawning_position).name + local gotten_biome = minetest.get_biome_data(spawning_position) + if not gotten_node or not gotten_biome then return end + gotten_biome = get_biome_name(gotten_biome.biome) --makes it easier to work with + + --add this so mobs don't spawn inside nodes + spawning_position.y = spawning_position.y + 1 + + --only need to poll for node light if everything else worked + local gotten_light = get_node_light(spawning_position) + + local is_water = get_item_group(gotten_node, "water") ~= 0 + local is_lava = get_item_group(gotten_node, "lava") ~= 0 + local is_ground = not (is_water or is_lava) + local is_grass = minetest.get_item_group(gotten_node,"grass_block") ~= 0 + local has_bed = minetest.find_node_near(pos,25,{"group:bed"}) + + if not is_ground then + spawning_position.y = spawning_position.y - 1 + end + + local mob_def + + --create a disconnected clone of the spawn dictionary + --prevents memory leak + local mob_library_worker_table = table_copy(spawn_dictionary) + + --grab mob that fits into the spawning location + --randomly grab a mob, don't exclude any possibilities + perlin_noise = perlin_noise or minetest_get_perlin(noise_params) + local noise = perlin_noise:get_3d(spawning_position) + local current_summary_chance = summary_chance + table.shuffle(mob_library_worker_table) + while #mob_library_worker_table > 0 do + local mob_chance_offset = (math_round(noise * current_summary_chance + 12345) % current_summary_chance) + 1 + local mob_index = 1 + local mob_chance = mob_library_worker_table[mob_index].chance + local step_chance = mob_chance + while step_chance < mob_chance_offset do + mob_index = mob_index + 1 + mob_chance = mob_library_worker_table[mob_index].chance + step_chance = step_chance + mob_chance + end + local mob_def = mob_library_worker_table[mob_index] + local mob_type = minetest.registered_entities[mob_def.name].type + if mob_def + and spawning_position.y >= mob_def.min_height + and spawning_position.y <= mob_def.max_height + and mob_def.dimension == dimension + and biome_check(mob_def.biomes, gotten_biome) + and gotten_light >= mob_def.min_light + and gotten_light <= mob_def.max_light + and (is_ground or mob_def.type_of_spawning ~= "ground") + and (mob_def.check_position and mob_def.check_position(spawning_position) or true) + and (not is_farm_animal(mob_def.name) or is_grass) + and (mob_type ~= "npc" or has_bed) + then + --everything is correct, spawn mob + local object = minetest.add_entity(spawning_position, mob_def.name) + if object then + return mob_def.on_spawn and mob_def.on_spawn(object, pos) + end + end + current_summary_chance = current_summary_chance - mob_chance + table_remove(mob_library_worker_table, mob_index) + end + end + + + --MAIN LOOP + + local timer = 0 + minetest.register_globalstep(function(dtime) + timer = timer + dtime + if timer < 10 then return end + timer = 0 + for _, player in pairs(get_connected_players()) do + local pos = player:get_pos() + local dimension = mcl_worlds.pos_to_dimension(pos) + -- ignore void and unloaded area + if dimension ~= "void" and dimension ~= "default" then + local y_min, y_max = decypher_limits(pos.y) + for i = 1, math_random(1, 4) do + spawn_a_mob(pos, dimension, y_min, y_max) + end + end + end + end) +end 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_paintings/locale/mcl_paintings.zh_TW.tr b/mods/ENTITIES/mcl_paintings/locale/mcl_paintings.zh_TW.tr new file mode 100644 index 000000000..d4b792185 --- /dev/null +++ b/mods/ENTITIES/mcl_paintings/locale/mcl_paintings.zh_TW.tr @@ -0,0 +1,2 @@ +# textdomain:mcl_paintings +Painting=畫 diff --git a/mods/ENTITIES/mcl_wither_spawning/init.lua b/mods/ENTITIES/mcl_wither_spawning/init.lua new file mode 100644 index 000000000..2f1d744d8 --- /dev/null +++ b/mods/ENTITIES/mcl_wither_spawning/init.lua @@ -0,0 +1,51 @@ +local dim = {"x", "z"} + +local modpath = minetest.get_modpath(minetest.get_current_modname()) + +local function load_schem(filename) + local file = io.open(modpath .. "/schems/" .. filename, "r") + local data = minetest.deserialize(file:read()) + file:close() + return data +end + +local wither_spawn_schems = {} + +for _, d in pairs(dim) do + wither_spawn_schems[d] = load_schem("wither_spawn_" .. d .. ".we") +end + +local function check_schem(pos, schem) + for _, n in pairs(schem) do + if minetest.get_node(vector.add(pos, n)).name ~= n.name then + return false + end + end + return true +end + +local function remove_schem(pos, schem) + for _, n in pairs(schem) do + minetest.remove_node(vector.add(pos, n)) + end +end + +local function wither_spawn(pos) + for _, d in pairs(dim) do + for i = 0, 2 do + local p = vector.add(pos, {x = 0, y = -2, z = 0, [d] = -i}) + local schem = wither_spawn_schems[d] + if check_schem(p, schem) then + remove_schem(p, schem) + minetest.add_entity(vector.add(p, {x = 0, y = 1, z = 0, [d] = 1}), "mobs_mc:wither") + end + end + end +end + +local wither_head = minetest.registered_nodes["mcl_heads:wither_skeleton"] +local old_on_place = wither_head.on_place +function wither_head.on_place(itemstack, placer, pointed) + minetest.after(0, wither_spawn, pointed.above) + old_on_place(itemstack, placer, pointed) +end diff --git a/mods/ENTITIES/mcl_wither_spawning/mod.conf b/mods/ENTITIES/mcl_wither_spawning/mod.conf new file mode 100644 index 000000000..d144bb1ea --- /dev/null +++ b/mods/ENTITIES/mcl_wither_spawning/mod.conf @@ -0,0 +1,4 @@ +name = mcl_wither_spawning +description = Wither Spawning for MineClone2 +author = Fleckenstein +depends = mobs_mc, mcl_heads diff --git a/mods/ENTITIES/mcl_wither_spawning/schems/wither_spawn_x.we b/mods/ENTITIES/mcl_wither_spawning/schems/wither_spawn_x.we new file mode 100644 index 000000000..6394bdc3f --- /dev/null +++ b/mods/ENTITIES/mcl_wither_spawning/schems/wither_spawn_x.we @@ -0,0 +1 @@ +return {{["y"] = 1, ["x"] = 0, ["name"] = "mcl_nether:soul_sand", ["z"] = 0}, {["y"] = 2, ["x"] = 0, ["name"] = "mcl_heads:wither_skeleton", ["z"] = 0, ["param2"] = 2, ["param1"] = 15}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_nether:soul_sand", ["z"] = 0}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_nether:soul_sand", ["z"] = 0}, {["y"] = 2, ["x"] = 1, ["name"] = "mcl_heads:wither_skeleton", ["z"] = 0, ["param2"] = 2, ["param1"] = 15}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_nether:soul_sand", ["z"] = 0}, {["y"] = 2, ["x"] = 2, ["name"] = "mcl_heads:wither_skeleton", ["z"] = 0, ["param2"] = 2, ["param1"] = 15}} diff --git a/mods/ENTITIES/mcl_wither_spawning/schems/wither_spawn_z.we b/mods/ENTITIES/mcl_wither_spawning/schems/wither_spawn_z.we new file mode 100644 index 000000000..6b1775773 --- /dev/null +++ b/mods/ENTITIES/mcl_wither_spawning/schems/wither_spawn_z.we @@ -0,0 +1 @@ +return {{["y"] = 0, ["x"] = 0, ["name"] = "mcl_nether:soul_sand", ["z"] = 1}, {["y"] = 1, ["x"] = 0, ["name"] = "mcl_nether:soul_sand", ["z"] = 0}, {["y"] = 1, ["x"] = 0, ["name"] = "mcl_nether:soul_sand", ["z"] = 1}, {["y"] = 1, ["x"] = 0, ["name"] = "mcl_nether:soul_sand", ["z"] = 2}, {["y"] = 2, ["x"] = 0, ["name"] = "mcl_heads:wither_skeleton", ["z"] = 0, ["param2"] = 1, ["param1"] = 15}, {["y"] = 2, ["x"] = 0, ["name"] = "mcl_heads:wither_skeleton", ["z"] = 1, ["param2"] = 1, ["param1"] = 15}, {["y"] = 2, ["x"] = 0, ["name"] = "mcl_heads:wither_skeleton", ["z"] = 2, ["param2"] = 1, ["param1"] = 15}} diff --git a/mods/ENTITIES/mobs_mc/0_gameconfig.lua b/mods/ENTITIES/mobs_mc/0_gameconfig.lua deleted file mode 100644 index f21d946fe..000000000 --- a/mods/ENTITIES/mobs_mc/0_gameconfig.lua +++ /dev/null @@ -1,334 +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", - - -- 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/2_throwing.lua b/mods/ENTITIES/mobs_mc/2_throwing.lua deleted file mode 100644 index d97351ac0..000000000 --- a/mods/ENTITIES/mobs_mc/2_throwing.lua +++ /dev/null @@ -1,402 +0,0 @@ ---MCmobs v0.5 ---maikerumine ---made for MC like Survival game ---License for code WTFPL and otherwise stated in readmes - --- 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(minetest.get_current_modname()) - ---maikerumines throwing code ---arrow (weapon) - -local c = mobs_mc.is_item_variable_overridden - -minetest.register_node("mobs_mc:arrow_box", { - drawtype = "nodebox", - is_ground_content = false, - node_box = { - type = "fixed", - fixed = { - -- Shaft - {-6.5/17, -1.5/17, -1.5/17, -4.5/17, 1.5/17, 1.5/17}, - {-4.5/17, -0.5/17, -0.5/17, 5.5/17, 0.5/17, 0.5/17}, - {5.5/17, -1.5/17, -1.5/17, 6.5/17, 1.5/17, 1.5/17}, - -- Tip - {-4.5/17, 2.5/17, 2.5/17, -3.5/17, -2.5/17, -2.5/17}, - {-8.5/17, 0.5/17, 0.5/17, -6.5/17, -0.5/17, -0.5/17}, - -- Fletching - {6.5/17, 1.5/17, 1.5/17, 7.5/17, 2.5/17, 2.5/17}, - {7.5/17, -2.5/17, 2.5/17, 6.5/17, -1.5/17, 1.5/17}, - {7.5/17, 2.5/17, -2.5/17, 6.5/17, 1.5/17, -1.5/17}, - {6.5/17, -1.5/17, -1.5/17, 7.5/17, -2.5/17, -2.5/17}, - - {7.5/17, 2.5/17, 2.5/17, 8.5/17, 3.5/17, 3.5/17}, - {8.5/17, -3.5/17, 3.5/17, 7.5/17, -2.5/17, 2.5/17}, - {8.5/17, 3.5/17, -3.5/17, 7.5/17, 2.5/17, -2.5/17}, - {7.5/17, -2.5/17, -2.5/17, 8.5/17, -3.5/17, -3.5/17}, - } - }, - tiles = {"mcl_bows_arrow.png^[transformFX", "mcl_bows_arrow.png^[transformFX", "mcl_bows_arrow_back.png", "mcl_bows_arrow_front.png", "mcl_bows_arrow.png", "mcl_bows_arrow.png^[transformFX"}, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false, - paramtype = "light", - paramtype2 = "facedir", - sunlight_propagates = true, - groups = {not_in_creative_inventory=1, dig_immediate=3}, - node_placement_prediction = "", - on_construct = function(pos) - minetest.log("error", "[mobs_mc] Trying to construct mobs_mc:arrow_box at "..minetest.pos_to_string(pos)) - minetest.remove_node(pos) - end, - drop = "", -}) - -local THROWING_ARROW_ENTITY={ - physical = false, - timer=0, - visual = "wielditem", - visual_size = {x=0.1, y=0.1}, - textures = {"mobs_mc:arrow_box"}, - velocity = 10, - lastpos={}, - collisionbox = {0,0,0,0,0,0}, -} - ---ARROW CODE -THROWING_ARROW_ENTITY.on_step = function(self, dtime) - self.timer=self.timer+dtime - local pos = self.object:get_pos() - local node = minetest.get_node(pos) - - minetest.add_particle({ - pos = pos, - velocity = {x=0, y=0, z=0}, - acceleration = {x=0, y=0, z=0}, - expirationtime = .3, - size = 1, - collisiondetection = false, - vertical = false, - texture = "mobs_mc_arrow_particle.png", - }) - - if self.timer>0.2 then - local objs = minetest.get_objects_inside_radius({x=pos.x,y=pos.y,z=pos.z}, 1.5) - for k, obj in pairs(objs) do - if obj:get_luaentity() then - if obj:get_luaentity().name ~= "mobs_mc:arrow_entity" and obj:get_luaentity().name ~= "__builtin:item" then - local damage = 3 - minetest.sound_play("damage", {pos = pos}, true) - obj:punch(self.object, 1.0, { - full_punch_interval=1.0, - damage_groups={fleshy=damage}, - }, nil) - self.object:remove() - end - else - local damage = 3 - minetest.sound_play("damage", {pos = pos}, true) - obj:punch(self.object, 1.0, { - full_punch_interval=1.0, - damage_groups={fleshy=damage}, - }, nil) - self.object:remove() - end - end - end - - if self.lastpos.x~=nil then - if node.name ~= "air" then - minetest.sound_play("bowhit1", {pos = pos}, true) - minetest.add_item(self.lastpos, "mobs_mc:arrow") - self.object:remove() - end - end - self.lastpos={x=pos.x, y=pos.y, z=pos.z} -end - -minetest.register_entity("mobs_mc:arrow_entity", THROWING_ARROW_ENTITY) - -local arrows = { - {"mobs_mc:arrow", "mobs_mc:arrow_entity" }, -} - -local throwing_shoot_arrow = function(itemstack, player) - for _,arrow in pairs(arrows) do - if player:get_inventory():get_stack("main", player:get_wield_index()+1):get_name() == arrow[1] then - if not minetest.is_creative_enabled(player:get_player_name()) then - player:get_inventory():remove_item("main", arrow[1]) - end - local playerpos = player:get_pos() - local obj = minetest.add_entity({x=playerpos.x,y=playerpos.y+1.5,z=playerpos.z}, arrow[2]) --mc - local dir = player:get_look_dir() - obj:set_velocity({x=dir.x*22, y=dir.y*22, z=dir.z*22}) - obj:set_acceleration({x=dir.x*-3, y=-10, z=dir.z*-3}) - obj:set_yaw(player:get_look_yaw()+math.pi) - minetest.sound_play("throwing_sound", {pos=playerpos}, true) - if obj:get_luaentity().player == "" then - obj:get_luaentity().player = player - end - obj:get_luaentity().node = player:get_inventory():get_stack("main", 1):get_name() - return true - end - end - return false -end - -if c("arrow") then - minetest.register_craftitem("mobs_mc:arrow", { - description = "Arrow", - _doc_items_longdesc = "Arrows are ammunition for bows.", - _doc_items_usagehelp = "To use arrows as ammunition for a bow, put them in the inventory slot following the bow. Slots are counted left to right, top to bottom.", - inventory_image = "mcl_bows_arrow_inv.png", - }) -end - -if c("arrow") and c("flint") and c("feather") and c("stick") then - minetest.register_craft({ - output = "mobs_mc:arrow 4", - recipe = { - {mobs_mc.items.flint}, - {mobs_mc.items.stick}, - {mobs_mc.items.feather}, - } - }) -end - -if c("bow") then - minetest.register_tool("mobs_mc:bow_wood", { - description = "Bow", - _doc_items_longdesc = "Bows are ranged weapons to shoot arrows at your foes.", - _doc_items_usagehelp = "To use the bow, you first need to have at least one arrow in slot following the bow. Leftclick to shoot. Each hit deals 3 damage.", - inventory_image = "mcl_bows_bow.png", - on_use = function(itemstack, user, pointed_thing) - if throwing_shoot_arrow(itemstack, user, pointed_thing) then - if not minetest.is_creative_enabled(user:get_player_name()) then - itemstack:add_wear(65535/50) - end - end - return itemstack - end, - }) - - minetest.register_craft({ - output = "mobs_mc:bow_wood", - recipe = { - {mobs_mc.items.string, mobs_mc.items.stick, ""}, - {mobs_mc.items.string, "", mobs_mc.items.stick}, - {mobs_mc.items.string, mobs_mc.items.stick, ""}, - } - }) -end - -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_VELOCITY = 19 - - mobs:register_arrow("mobs_mc:egg_entity", { - visual = "sprite", - visual_size = {x=.5, y=.5}, - textures = {"mobs_chicken_egg.png"}, - velocity = egg_VELOCITY, - - hit_player = function(self, player) - player:punch(minetest.get_player_by_name(self.playername) or self.object, 1.0, { - full_punch_interval = 1.0, - damage_groups = {}, - }, nil) - end, - - hit_mob = function(self, mob) - mob:punch(minetest.get_player_by_name(self.playername) or self.object, 1.0, { - full_punch_interval = 1.0, - damage_groups = {}, - }, nil) - end, - - hit_node = function(self, pos, node) - - if math.random(1, 10) > 1 then - return - end - - pos.y = pos.y + 1 - - local nod = minetest.get_node_or_nil(pos) - - if not nod - or not minetest.registered_nodes[nod.name] - or minetest.registered_nodes[nod.name].walkable == true then - return - end - - local mob = minetest.add_entity(pos, "mobs_mc:chicken") - local ent2 = mob:get_luaentity() - - mob:set_properties({ - visual_size = { - x = ent2.base_size.x / 2, - y = ent2.base_size.y / 2 - }, - collisionbox = { - ent2.base_colbox[1] / 2, - ent2.base_colbox[2] / 2, - ent2.base_colbox[3] / 2, - ent2.base_colbox[4] / 2, - ent2.base_colbox[5] / 2, - ent2.base_colbox[6] / 2 - }, - }) - - ent2.child = true - ent2.tamed = true - ent2.owner = self.playername - end - }) - - -- shoot egg - local function mobs_shoot_egg(item, player, pointed_thing) - - local playerpos = player:get_pos() - - minetest.sound_play("default_place_node_hard", { - pos = playerpos, - gain = 1.0, - max_hear_distance = 5, - }, true) - - local obj = minetest.add_entity({ - x = playerpos.x, - y = playerpos.y +1.5, - z = playerpos.z - }, "mobs_mc:egg_entity") - - local ent = obj:get_luaentity() - local dir = player:get_look_dir() - - ent.velocity = egg_VELOCITY -- needed for api internal timing - ent.switch = 1 -- needed so that egg doesn't despawn straight away - - obj:set_velocity({ - x = dir.x * egg_VELOCITY, - y = dir.y * egg_VELOCITY, - z = dir.z * egg_VELOCITY - }) - - obj:set_acceleration({ - x = dir.x * -3, - y = -egg_GRAVITY, - z = dir.z * -3 - }) - - -- pass player name to egg for chick ownership - local ent2 = obj:get_luaentity() - ent2.playername = player:get_player_name() - - if not minetest.is_creative_enabled(player:get_player_name()) then - item:take_item() - end - - return item - end - - minetest.register_craftitem("mobs_mc:egg", { - description = "Egg", - _doc_items_longdesc = "Eggs can be thrown and break on impact. There is a small chance that 1 or even 4 chicks will pop out", - _doc_items_usagehelp = how_to_throw, - inventory_image = "mobs_chicken_egg.png", - on_use = mobs_shoot_egg, - }) -end - --- Snowball - -local snowball_GRAVITY = 9 -local snowball_VELOCITY = 19 - -mobs:register_arrow("mobs_mc:snowball_entity", { - visual = "sprite", - visual_size = {x=.5, y=.5}, - textures = {"mcl_throwing_snowball.png"}, - velocity = snowball_VELOCITY, - - hit_player = function(self, player) - -- FIXME: No knockback - player:punch(self.object, 1.0, { - full_punch_interval = 1.0, - damage_groups = {}, - }, nil) - end, - - hit_mob = function(self, mob) - -- Hurt blazes, but not damage to anything else - local dmg = {} - if mob:get_luaentity().name == "mobs_mc:blaze" then - dmg = {fleshy = 3} - end - -- FIXME: No knockback - mob:punch(self.object, 1.0, { - full_punch_interval = 1.0, - damage_groups = dmg, - }, nil) - end, - -}) - -if c("snowball") then - -- shoot snowball - local function mobs_shoot_snowball(item, player, pointed_thing) - - local playerpos = player:get_pos() - - local obj = minetest.add_entity({ - x = playerpos.x, - y = playerpos.y +1.5, - z = playerpos.z - }, "mobs_mc:snowball_entity") - - local ent = obj:get_luaentity() - local dir = player:get_look_dir() - - ent.velocity = snowball_VELOCITY -- needed for api internal timing - ent.switch = 1 -- needed so that egg doesn't despawn straight away - - obj:set_velocity({ - x = dir.x * snowball_VELOCITY, - y = dir.y * snowball_VELOCITY, - z = dir.z * snowball_VELOCITY - }) - - obj:set_acceleration({ - x = dir.x * -3, - y = -snowball_GRAVITY, - z = dir.z * -3 - }) - - -- pass player name to egg for chick ownership - local ent2 = obj:get_luaentity() - ent2.playername = player:get_player_name() - - if not minetest.is_creative_enabled(player:get_player_name()) then - item:take_item() - end - - return item - end - - - -- Snowball - minetest.register_craftitem("mobs_mc:snowball", { - description = "Snowball", - _doc_items_longdesc = "Snowballs can be thrown at your enemies. A snowball deals 3 damage to blazes, but is harmless to anything else.", - _doc_items_usagehelp = how_to_throw, - inventory_image = "mcl_throwing_snowball.png", - on_use = mobs_shoot_snowball, - }) -end - ---end maikerumine code diff --git a/mods/ENTITIES/mobs_mc/3_shared.lua b/mods/ENTITIES/mobs_mc/3_shared.lua deleted file mode 100644 index fce0850b4..000000000 --- a/mods/ENTITIES/mobs_mc/3_shared.lua +++ /dev/null @@ -1,63 +0,0 @@ -local pr = PseudoRandom(os.time()*5) - -local offsets = {} -for x=-2, 2 do - for z=-2, 2 do - table.insert(offsets, {x=x, y=0, z=z}) - end -end - ---[[ Periodically check and teleport mob to owner if not sitting (order ~= "sit") and -the owner is too far away. To be used with do_custom. Note: Optimized for mobs smaller than 1×1×1. -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 ]] -mobs_mc.make_owner_teleport_function = function(dist, teleport_check_interval) - return function(self, dtime) - -- No teleportation if no owner or if sitting - if not self.owner or self.order == "sit" then - return - end - if not teleport_check_interval then - teleport_check_interval = 4 - end - if not dist then - dist = 12 - end - if self._teleport_timer == nil then - self._teleport_timer = teleport_check_interval - return - end - self._teleport_timer = self._teleport_timer - dtime - if self._teleport_timer <= 0 then - self._teleport_timer = teleport_check_interval - local mob_pos = self.object:get_pos() - local owner = minetest.get_player_by_name(self.owner) - if not owner then - -- No owner found, no teleportation - return - end - local owner_pos = owner:get_pos() - local dist_from_owner = vector.distance(owner_pos, mob_pos) - if dist_from_owner > dist then - -- Check for nodes below air in a 5×1×5 area around the owner position - local check_offsets = table.copy(offsets) - -- Attempt to place mob near player. Must be placed on walkable node below a non-walkable one. Place inside that air node. - while #check_offsets > 0 do - local r = pr:next(1, #check_offsets) - local telepos = vector.add(owner_pos, check_offsets[r]) - local telepos_below = {x=telepos.x, y=telepos.y-1, z=telepos.z} - table.remove(check_offsets, r) - -- Long story short, spawn on a platform - if minetest.registered_nodes[minetest.get_node(telepos).name].walkable == false and - minetest.registered_nodes[minetest.get_node(telepos_below).name].walkable == true then - -- Correct position found! Let's teleport. - self.object:set_pos(telepos) - return - end - end - end - end - 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 ecd09ee02..000000000 --- a/mods/ENTITIES/mobs_mc/4_heads.lua +++ /dev/null @@ -1,63 +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. --- TODO: Add translation. - ---local S = local S = minetest.get_translator(minetest.get_current_modname()) - --- 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-media.md b/mods/ENTITIES/mobs_mc/LICENSE-media.md index 3bfe70a15..4e3de49f1 100644 --- a/mods/ENTITIES/mobs_mc/LICENSE-media.md +++ b/mods/ENTITIES/mobs_mc/LICENSE-media.md @@ -75,6 +75,7 @@ Origin of those models: * `mobs_mc_mushroom_brown.png` (CC0) * “Spawn egg” textures (`mobs_mc_spawn_icon_*`) by 22i +* Llama decor (carpet) textures (`mobs_mc_llama_decor_*`) by erlehmann and rudzik8 * Any other texture not mentioned here are licensed under the MIT License ## Sounds @@ -190,10 +191,9 @@ Origin of those models: * [Spennnyyy](https://freesound.org/people/Spennnyyy/) (CC0) * `mcl_totems_totem.ogg` * Source: -* [Baŝto](https://opengameart.org/users/ba%C5%9Dto) (remixer) and [kantouth](https://freesound.org/people/kantouth/) (original author) +* [Baŝto](https://opengameart.org/users/ba%C5%9Dto) * `mobs_mc_skeleton_random.*.ogg` (CC BY 3.0) * Source: - * Based on: * [spookymodem](https://freesound.org/people/spookymodem/) * `mobs_mc_skeleton_death.ogg` (CC0) * @@ -307,4 +307,4 @@ Origin of those models: Note: Many of these sounds have been more or less modified to fit the game. -Sounds not mentioned here are licensed under CC0. +Sounds not mentioned hre are licensed under CC0. diff --git a/mods/ENTITIES/mobs_mc/README.md b/mods/ENTITIES/mobs_mc/README.md index 4718c6b1f..c29a71c8e 100644 --- a/mods/ENTITIES/mobs_mc/README.md +++ b/mods/ENTITIES/mobs_mc/README.md @@ -18,11 +18,6 @@ This mod adds mobs which closely resemble the mobs from the game Minecraft, vers * 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) diff --git a/mods/ENTITIES/mobs_mc/agent.lua b/mods/ENTITIES/mobs_mc/agent.lua deleted file mode 100644 index 8475f92fc..000000000 --- a/mods/ENTITIES/mobs_mc/agent.lua +++ /dev/null @@ -1,39 +0,0 @@ ---################### ---################### AGENT - seemingly unused ---################### - -local S = minetest.get_translator(minetest.get_current_modname()) - -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/bat.lua b/mods/ENTITIES/mobs_mc/bat.lua index 5492add74..b41dabcba 100644 --- a/mods/ENTITIES/mobs_mc/bat.lua +++ b/mods/ENTITIES/mobs_mc/bat.lua @@ -1,16 +1,13 @@ --License for code WTFPL and otherwise stated in readmes -local S = minetest.get_translator(minetest.get_current_modname()) +local S = minetest.get_translator("mobs_mc") -mobs:register_mob("mobs_mc:bat", { +mcl_mobs:register_mob("mobs_mc:bat", { description = S("Bat"), type = "animal", spawn_class = "ambient", can_despawn = true, passive = true, - rotate = 270, - tilt_fly = true, - fly = true, hp_min = 6, hp_max = 6, collisionbox = {-0.25, -0.01, -0.25, 0.25, 0.89, 0.25}, @@ -48,7 +45,9 @@ mobs:register_mob("mobs_mc:bat", { fall_damage = 0, view_range = 16, fear_height = 0, + jump = false, + fly = true, makes_footstep_sound = false, }) @@ -66,7 +65,7 @@ else end -- Spawn on solid blocks at or below Sea level and the selected light level -mobs:spawn_specific( +mcl_mobs:spawn_specific( "mobs_mc:bat", "overworld", "ground", @@ -139,9 +138,9 @@ maxlight, 20, 5000, 2, -mobs_mc.spawn_height.overworld_min, -mobs_mc.spawn_height.water-1) +mcl_vars.mg_overworld_min, +mobs_mc.water_level-1) -- spawn eggs -mobs:register_egg("mobs_mc:bat", S("Bat"), "mobs_mc_spawn_icon_bat.png", 0) +mcl_mobs:register_egg("mobs_mc:bat", S("Bat"), "mobs_mc_spawn_icon_bat.png", 0) diff --git a/mods/ENTITIES/mobs_mc/chicken.lua b/mods/ENTITIES/mobs_mc/chicken.lua index ffaebca2b..a36b58502 100644 --- a/mods/ENTITIES/mobs_mc/chicken.lua +++ b/mods/ENTITIES/mobs_mc/chicken.lua @@ -1,6 +1,6 @@ --License for code WTFPL and otherwise stated in readmes -local S = minetest.get_translator(minetest.get_current_modname()) +local S = minetest.get_translator("mobs_mc") --################### --################### CHICKEN @@ -8,7 +8,7 @@ local S = minetest.get_translator(minetest.get_current_modname()) -mobs:register_mob("mobs_mc:chicken", { +mcl_mobs:register_mob("mobs_mc:chicken", { description = S("Chicken"), type = "animal", spawn_class = "passive", @@ -18,8 +18,7 @@ mobs:register_mob("mobs_mc:chicken", { xp_min = 1, xp_max = 3, collisionbox = {-0.2, -0.01, -0.2, 0.2, 0.69, 0.2}, - skittish = true, - fall_slow = true, + runaway = true, floats = 1, visual = "mesh", mesh = "mobs_mc_chicken.b3d", @@ -27,17 +26,16 @@ mobs:register_mob("mobs_mc:chicken", { {"mobs_mc_chicken.png"}, }, visual_size = {x=2.2, y=2.2}, - rotate = 270, + makes_footstep_sound = true, walk_velocity = 1, - run_velocity = 3, drops = { - {name = mobs_mc.items.chicken_raw, + {name = "mcl_mobitems:chicken", chance = 1, min = 1, max = 1, looting = "common",}, - {name = mobs_mc.items.feather, + {name = "mcl_mobitems:feather", chance = 1, min = 0, max = 2, @@ -66,25 +64,19 @@ mobs:register_mob("mobs_mc:chicken", { run_start = 0, run_end = 40, }, - follow = "mcl_farming:wheat_seeds", - breed_distance = 1.5, - baby_size = 0.5, - follow_distance = 2, + follow = { + "mcl_farming:wheat_seeds", + "mcl_farming:melon_seeds", + "mcl_farming:pumpkin_seeds", + "mcl_farming:beetroot_seeds", + }, view_range = 16, fear_height = 4, - --why do chickend breed if they lay eggs?? on_rightclick = function(self, clicker) - --attempt to enter breed state - if mobs.enter_breed_state(self,clicker) then - return - end - - --make baby grow faster - if self.baby then - mobs.make_baby_grow_faster(self,clicker) - return - end + if mcl_mobs:feed_tame(self, clicker, 1, true, true) then return end + if mcl_mobs:protect(self, clicker) then return end + if mcl_mobs:capture_mob(self, clicker, 0, 60, 5, false, nil) then return end end, do_custom = function(self, dtime) @@ -102,7 +94,7 @@ mobs:register_mob("mobs_mc:chicken", { local pos = self.object:get_pos() - minetest.add_item(pos, mobs_mc.items.egg) + minetest.add_item(pos, "mcl_throwing:egg") minetest.sound_play("mobs_mc_chicken_lay_egg", { pos = pos, @@ -111,83 +103,57 @@ mobs:register_mob("mobs_mc:chicken", { }, true) end, - --head code - has_head = true, - head_bone = "head", - - swap_y_with_x = false, - reverse_head_yaw = false, - - head_bone_pos_y = 1.675, - head_bone_pos_z = 0, - - head_height_offset = 0.55, - head_direction_offset = 0.0925, - - head_pitch_modifier = -math.pi/2, - --end head code }) --spawn -mobs:spawn_specific( +mcl_mobs:spawn_specific( "mobs_mc:chicken", "overworld", "ground", { - "FlowerForest_beach", - "Forest_beach", - "StoneBeach", - "ColdTaiga_beach_water", - "Taiga_beach", - "Savanna_beach", - "Plains_beach", - "ExtremeHills_beach", - "ColdTaiga_beach", - "Swampland_shore", - "JungleM_shore", - "Jungle_shore", - "MesaPlateauFM_sandlevel", - "MesaPlateauF_sandlevel", - "MesaBryce_sandlevel", - "Mesa_sandlevel", - "Mesa", - "FlowerForest", - "Swampland", - "Taiga", - "ExtremeHills", - "Jungle", - "Savanna", - "BirchForest", - "MegaSpruceTaiga", - "MegaTaiga", - "ExtremeHills+", - "Forest", - "Plains", - "Desert", - "ColdTaiga", + "flat", "IcePlainsSpikes", - "SunflowerPlains", - "IcePlains", - "RoofedForest", - "ExtremeHills+_snowtop", - "MesaPlateauFM_grasstop", - "JungleEdgeM", + "ColdTaiga", + "ColdTaiga_beach", + "ColdTaiga_beach_water", + "MegaTaiga", + "MegaSpruceTaiga", + "ExtremeHills", + "ExtremeHills_beach", "ExtremeHillsM", - "JungleM", + "ExtremeHills+", + "ExtremeHills+_snowtop", + "StoneBeach", + "Plains", + "Plains_beach", + "SunflowerPlains", + "Taiga", + "Taiga_beach", + "Forest", + "Forest_beach", + "FlowerForest", + "FlowerForest_beach", + "BirchForest", "BirchForestM", - "MesaPlateauF", - "MesaPlateauFM", - "MesaPlateauF_grasstop", - "MesaBryce", - "JungleEdge", + "RoofedForest", + "Savanna", + "Savanna_beach", "SavannaM", + "Jungle", + "Jungle_shore", + "JungleM", + "JungleM_shore", + "JungleEdge", + "JungleEdgeM", + "Swampland", + "Swampland_shore" }, 9, minetest.LIGHT_MAX+1, 30, 17000, 3, -mobs_mc.spawn_height.water, -mobs_mc.spawn_height.overworld_max) +mobs_mc.water_level, +mcl_vars.mg_overworld_max) -- spawn eggs -mobs:register_egg("mobs_mc:chicken", S("Chicken"), "mobs_mc_spawn_icon_chicken.png", 0) +mcl_mobs:register_egg("mobs_mc:chicken", S("Chicken"), "mobs_mc_spawn_icon_chicken.png", 0) diff --git a/mods/ENTITIES/mobs_mc/common.lua b/mods/ENTITIES/mobs_mc/common.lua new file mode 100644 index 000000000..e69de29bb diff --git a/mods/ENTITIES/mobs_mc/cow+mooshroom.lua b/mods/ENTITIES/mobs_mc/cow+mooshroom.lua index 17c4e1e62..b2d6158bc 100644 --- a/mods/ENTITIES/mobs_mc/cow+mooshroom.lua +++ b/mods/ENTITIES/mobs_mc/cow+mooshroom.lua @@ -1,6 +1,6 @@ --License for code WTFPL and otherwise stated in readmes -local S = minetest.get_translator(minetest.get_current_modname()) +local S = minetest.get_translator("mobs_mc") local cow_def = { description = S("Cow"), @@ -10,7 +10,6 @@ local cow_def = { hp_max = 10, xp_min = 1, xp_max = 3, - rotate = 270, collisionbox = {-0.45, -0.01, -0.45, 0.45, 1.39, 0.45}, visual = "mesh", mesh = "mobs_mc_cow.b3d", @@ -21,20 +20,19 @@ local cow_def = { visual_size = {x=2.8, y=2.8}, makes_footstep_sound = true, walk_velocity = 1, - run_velocity = 3, drops = { - {name = mobs_mc.items.beef_raw, + {name = "mcl_mobitems:beef", chance = 1, min = 1, max = 3, looting = "common",}, - {name = mobs_mc.items.leather, + {name = "mcl_mobitems:leather", chance = 1, min = 0, max = 2, looting = "common",}, }, - skittish = true, + runaway = true, sounds = { random = "mobs_mc_cow", damage = "mobs_mc_cow_hurt", @@ -49,60 +47,37 @@ local cow_def = { walk_end = 40, run_start = 0, run_end = 40, }, - --follow = mobs_mc.follow.cow, on_rightclick = function(self, clicker) + if mcl_mobs:feed_tame(self, clicker, 1, true, true) then return end + if mcl_mobs:protect(self, clicker) then return end - --attempt to enter breed state - if mobs.enter_breed_state(self,clicker) then - return - end - - --make baby grow faster - if self.baby then - mobs.make_baby_grow_faster(self,clicker) + if self.child then return end local item = clicker:get_wielded_item() - if item:get_name() == mobs_mc.items.bucket and clicker:get_inventory() then + if item:get_name() == "mcl_buckets:bucket_empty" and clicker:get_inventory() then local inv = clicker:get_inventory() - inv:remove_item("main", mobs_mc.items.bucket) + inv:remove_item("main", "mcl_buckets:bucket_empty") minetest.sound_play("mobs_mc_cow_milk", {pos=self.object:get_pos(), gain=0.6}) -- if room add bucket of milk to inventory, otherwise drop as item - if inv:room_for_item("main", {name=mobs_mc.items.milk}) then - clicker:get_inventory():add_item("main", mobs_mc.items.milk) + if inv:room_for_item("main", {name = "mcl_mobitems:milk_bucket"}) then + clicker:get_inventory():add_item("main", "mcl_mobitems:milk_bucket") else local pos = self.object:get_pos() pos.y = pos.y + 0.5 - minetest.add_item(pos, {name = mobs_mc.items.milk}) + minetest.add_item(pos, {name = "mcl_mobitems:milk_bucket"}) end return end + mcl_mobs:capture_mob(self, clicker, 0, 5, 60, false, nil) end, - breed_distance = 1.5, - baby_size = 0.5, - follow_distance = 2, - follow = mobs_mc.items.wheat, + follow = "mcl_farming:wheat_item", view_range = 10, fear_height = 4, - - --head code - has_head = true, - head_bone = "head", - - swap_y_with_x = false, - reverse_head_yaw = false, - - head_bone_pos_y = 3.6, - head_bone_pos_z = -0.6, - - head_height_offset = 1.0525, - head_direction_offset = 0.5, - head_pitch_modifier = 0, - --end head code } -mobs:register_mob("mobs_mc:cow", cow_def) +mcl_mobs:register_mob("mobs_mc:cow", cow_def) -- Mooshroom local mooshroom_def = table.copy(cow_def) @@ -110,27 +85,22 @@ mooshroom_def.description = S("Mooshroom") mooshroom_def.mesh = "mobs_mc_cow.b3d" mooshroom_def.textures = { {"mobs_mc_mooshroom.png", "mobs_mc_mushroom_red.png"}, {"mobs_mc_mooshroom_brown.png", "mobs_mc_mushroom_brown.png" } } mooshroom_def.on_rightclick = function(self, clicker) - --attempt to enter breed state - if mobs.enter_breed_state(self,clicker) then + if mcl_mobs:feed_tame(self, clicker, 1, true, true) then return end + if mcl_mobs:protect(self, clicker) then return end + + if self.child then return end - - --make baby grow faster - if self.baby then - mobs.make_baby_grow_faster(self,clicker) - return - end - local item = clicker:get_wielded_item() -- Use shears to get mushrooms and turn mooshroom into cow - if item:get_name() == mobs_mc.items.shears then + if item:get_name() == "mcl_tools:shears" then local pos = self.object:get_pos() minetest.sound_play("mcl_tools_shears_cut", {pos = pos}, true) if self.base_texture[1] == "mobs_mc_mooshroom_brown.png" then - minetest.add_item({x=pos.x, y=pos.y+1.4, z=pos.z}, mobs_mc.items.mushroom_brown .. " 5") + minetest.add_item({x=pos.x, y=pos.y+1.4, z=pos.z}, "mcl_mushrooms:mushroom_brown 5") else - minetest.add_item({x=pos.x, y=pos.y+1.4, z=pos.z}, mobs_mc.items.mushroom_red .. " 5") + minetest.add_item({x=pos.x, y=pos.y+1.4, z=pos.z}, "mcl_mushrooms:mushroom_red 5") end local oldyaw = self.object:get_yaw() @@ -139,105 +109,95 @@ mooshroom_def.on_rightclick = function(self, clicker) cow:set_yaw(oldyaw) if not minetest.is_creative_enabled(clicker:get_player_name()) then - item:add_wear(mobs_mc.misc.shears_wear) + item:add_wear(mobs_mc.shears_wear) clicker:get_inventory():set_stack("main", clicker:get_wield_index(), item) end -- Use bucket to milk - elseif item:get_name() == mobs_mc.items.bucket and clicker:get_inventory() then + elseif item:get_name() == "mcl_buckets:bucket_empty" and clicker:get_inventory() then local inv = clicker:get_inventory() - inv:remove_item("main", mobs_mc.items.bucket) + inv:remove_item("main", "mcl_buckets:bucket_empty") minetest.sound_play("mobs_mc_cow_milk", {pos=self.object:get_pos(), gain=0.6}) -- If room, add milk to inventory, otherwise drop as item - if inv:room_for_item("main", {name=mobs_mc.items.milk}) then - clicker:get_inventory():add_item("main", mobs_mc.items.milk) + if inv:room_for_item("main", {name="mcl_mobitems:milk_bucket"}) then + clicker:get_inventory():add_item("main", "mcl_mobitems:milk_bucket") else local pos = self.object:get_pos() pos.y = pos.y + 0.5 - minetest.add_item(pos, {name = mobs_mc.items.milk}) + minetest.add_item(pos, {name = "mcl_mobitems:milk_bucket"}) end -- Use bowl to get mushroom stew - elseif item:get_name() == mobs_mc.items.bowl and clicker:get_inventory() then + elseif item:get_name() == "mcl_core:bowl" and clicker:get_inventory() then local inv = clicker:get_inventory() - inv:remove_item("main", mobs_mc.items.bowl) + inv:remove_item("main", "mcl_core:bowl") minetest.sound_play("mobs_mc_cow_mushroom_stew", {pos=self.object:get_pos(), gain=0.6}) -- If room, add mushroom stew to inventory, otherwise drop as item - if inv:room_for_item("main", {name=mobs_mc.items.mushroom_stew}) then - clicker:get_inventory():add_item("main", mobs_mc.items.mushroom_stew) + if inv:room_for_item("main", {name="mcl_mushrooms:mushroom_stew"}) then + clicker:get_inventory():add_item("main", "mcl_mushrooms:mushroom_stew") else local pos = self.object:get_pos() pos.y = pos.y + 0.5 - minetest.add_item(pos, {name = mobs_mc.items.mushroom_stew}) + minetest.add_item(pos, {name = "mcl_mushrooms:mushroom_stew"}) end end + mcl_mobs:capture_mob(self, clicker, 0, 5, 60, false, nil) end -mobs:register_mob("mobs_mc:mooshroom", mooshroom_def) +mcl_mobs:register_mob("mobs_mc:mooshroom", mooshroom_def) -- Spawning -mobs:spawn_specific( +mcl_mobs:spawn_specific( "mobs_mc:cow", "overworld", "ground", { - "FlowerForest_beach", - "Forest_beach", - "StoneBeach", - "ColdTaiga_beach_water", - "Taiga_beach", - "Savanna_beach", - "Plains_beach", - "ExtremeHills_beach", - "ColdTaiga_beach", - "Swampland_shore", - "JungleM_shore", - "Jungle_shore", - "MesaPlateauFM_sandlevel", - "MesaPlateauF_sandlevel", - "MesaBryce_sandlevel", - "Mesa_sandlevel", - "Mesa", - "FlowerForest", - "Swampland", - "Taiga", - "ExtremeHills", - "Jungle", - "Savanna", - "BirchForest", - "MegaSpruceTaiga", - "MegaTaiga", - "ExtremeHills+", - "Forest", - "Plains", - "Desert", - "ColdTaiga", + "flat", "IcePlainsSpikes", - "SunflowerPlains", - "IcePlains", - "RoofedForest", - "ExtremeHills+_snowtop", - "MesaPlateauFM_grasstop", - "JungleEdgeM", + "ColdTaiga", + "ColdTaiga_beach", + "ColdTaiga_beach_water", + "MegaTaiga", + "MegaSpruceTaiga", + "ExtremeHills", + "ExtremeHills_beach", "ExtremeHillsM", - "JungleM", + "ExtremeHills+", + "ExtremeHills+_snowtop", + "StoneBeach", + "Plains", + "Plains_beach", + "SunflowerPlains", + "Taiga", + "Taiga_beach", + "Forest", + "Forest_beach", + "FlowerForest", + "FlowerForest_beach", + "BirchForest", "BirchForestM", - "MesaPlateauF", - "MesaPlateauFM", - "MesaPlateauF_grasstop", - "MesaBryce", - "JungleEdge", + "RoofedForest", + "Savanna", + "Savanna_beach", "SavannaM", + "Jungle", + "Jungle_shore", + "JungleM", + "JungleM_shore", + "JungleEdge", + "JungleEdgeM", + "Swampland", + "Swampland_shore" }, 9, minetest.LIGHT_MAX+1, 30, 17000, 10, -mobs_mc.spawn_height.water, -mobs_mc.spawn_height.overworld_max) +mobs_mc.water_level, +mcl_vars.mg_overworld_max) -mobs:spawn_specific( +mcl_mobs:spawn_specific( "mobs_mc:mooshroom", "overworld", "ground", @@ -250,9 +210,9 @@ minetest.LIGHT_MAX+1, 30, 17000, 5, -mobs_mc.spawn_height.overworld_min, -mobs_mc.spawn_height.overworld_max) +mcl_vars.mg_overworld_min, +mcl_vars.mg_overworld_max) -- spawn egg -mobs:register_egg("mobs_mc:cow", S("Cow"), "mobs_mc_spawn_icon_cow.png", 0) -mobs:register_egg("mobs_mc:mooshroom", S("Mooshroom"), "mobs_mc_spawn_icon_mooshroom.png", 0) +mcl_mobs:register_egg("mobs_mc:cow", S("Cow"), "mobs_mc_spawn_icon_cow.png", 0) +mcl_mobs:register_egg("mobs_mc:mooshroom", S("Mooshroom"), "mobs_mc_spawn_icon_mooshroom.png", 0) diff --git a/mods/ENTITIES/mobs_mc/creeper.lua b/mods/ENTITIES/mobs_mc/creeper.lua index a7e33d1bd..8d50c6755 100644 --- a/mods/ENTITIES/mobs_mc/creeper.lua +++ b/mods/ENTITIES/mobs_mc/creeper.lua @@ -1,6 +1,6 @@ --License for code WTFPL and otherwise stated in readmes -local S = minetest.get_translator(minetest.get_current_modname()) +local S = minetest.get_translator("mobs_mc") --################### --################### CREEPER @@ -9,11 +9,9 @@ local S = minetest.get_translator(minetest.get_current_modname()) -mobs:register_mob("mobs_mc:creeper", { +mcl_mobs:register_mob("mobs_mc:creeper", { type = "monster", spawn_class = "hostile", - hostile = true, - rotate = 270, hp_min = 20, hp_max = 20, xp_min = 5, @@ -35,48 +33,32 @@ mobs:register_mob("mobs_mc:creeper", { explode = "tnt_explode", distance = 16, }, - makes_footstep_sound = false, + makes_footstep_sound = true, walk_velocity = 1.05, run_velocity = 2.1, runaway_from = { "mobs_mc:ocelot", "mobs_mc:cat" }, attack_type = "explode", - eye_height = 1.25, + --hssssssssssss explosion_strength = 3, - --explosion_radius = 3, - --explosion_damage_radius = 6, - --explosiontimer_reset_radius = 6, + explosion_radius = 3.5, + explosion_damage_radius = 3.5, + explosiontimer_reset_radius = 6, reach = 3, - defuse_reach = 5.2, - explosion_timer = 0.3, + explosion_timer = 1.5, allow_fuse_reset = true, stop_to_explode = true, - --head code - has_head = true, - head_bone = "head", - - swap_y_with_x = true, - reverse_head_yaw = true, - - head_bone_pos_y = 2.4, - head_bone_pos_z = 0, - - head_height_offset = 1.1, - head_direction_offset = 0, - head_pitch_modifier = 0, - --end head code - -- 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 then + 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 item:get_name() == "mcl_fire:flint_and_steel" then if not minetest.is_creative_enabled(clicker:get_player_name()) then -- Wear tool local wdef = item:get_definition() @@ -92,11 +74,10 @@ mobs:register_mob("mobs_mc:creeper", { end end, do_custom = function(self, dtime) - if self._forced_explosion_countdown_timer then + 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 - local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false - mcl_explosions.explode(mcl_util.get_object_center(self.object), self.explosion_strength, { griefing = mobs_griefing, drop_chance = 1.0}, self.object) + mcl_mobs:boom(self, mcl_util.get_object_center(self.object), self.explosion_strength) end end end, @@ -107,14 +88,14 @@ mobs:register_mob("mobs_mc:creeper", { 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)]) + minetest.add_item({x=pos.x, y=pos.y+1, z=pos.z}, "mcl_jukebox:record_" .. math.random(9)) end end end end, maxdrops = 2, drops = { - {name = mobs_mc.items.gunpowder, + {name = "mcl_mobitems:gunpowder", chance = 1, min = 0, max = 2, @@ -122,7 +103,7 @@ mobs:register_mob("mobs_mc:creeper", { -- Head -- TODO: Only drop if killed by charged creeper - {name = mobs_mc.items.head_creeper, + {name = "mcl_heads:creeper", chance = 200, -- 0.5% min = 1, max = 1,}, @@ -148,11 +129,10 @@ mobs:register_mob("mobs_mc:creeper", { view_range = 16, }) -mobs:register_mob("mobs_mc:creeper_charged", { - description = S("Charged Creeper"), +mcl_mobs:register_mob("mobs_mc:creeper_charged", { + description = S("Creeper"), type = "monster", spawn_class = "hostile", - hostile = true, hp_min = 20, hp_max = 20, xp_min = 5, @@ -169,7 +149,6 @@ mobs:register_mob("mobs_mc:creeper_charged", { "mobs_mc_creeper_charge.png"}, }, visual_size = {x=3, y=3}, - rotate = 270, sounds = { attack = "tnt_ignite", death = "mobs_mc_creeper_death", @@ -178,19 +157,18 @@ mobs:register_mob("mobs_mc:creeper_charged", { explode = "tnt_explode", distance = 16, }, - makes_footstep_sound = false, + makes_footstep_sound = true, 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, + explosion_radius = 8, + explosion_damage_radius = 8, + explosiontimer_reset_radius = 6, reach = 3, - defuse_reach = 5.2, - explosion_timer = 0.3, + explosion_timer = 1.5, allow_fuse_reset = true, stop_to_explode = true, @@ -198,11 +176,11 @@ mobs:register_mob("mobs_mc:creeper_charged", { -- 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 then + 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 item:get_name() == "mcl_fire:flint_and_steel" then if not minetest.is_creative_enabled(clicker:get_player_name()) then -- Wear tool local wdef = item:get_definition() @@ -218,11 +196,10 @@ mobs:register_mob("mobs_mc:creeper_charged", { end end, do_custom = function(self, dtime) - if self._forced_explosion_countdown_timer then + 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 - local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false - mcl_explosions.explode(mcl_util.get_object_center(self.object), self.explosion_strength, { griefing = mobs_griefing, drop_chance = 1.0}, self.object) + mcl_mobs:boom(self, mcl_util.get_object_center(self.object), self.explosion_strength) end end end, @@ -233,14 +210,14 @@ mobs:register_mob("mobs_mc:creeper_charged", { 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)]) + minetest.add_item({x=pos.x, y=pos.y+1, z=pos.z}, "mcl_jukebox:record_" .. math.random(9)) end end end end, maxdrops = 2, drops = { - {name = mobs_mc.items.gunpowder, + {name = "mcl_mobitems:gunpowder", chance = 1, min = 0, max = 2, @@ -248,7 +225,7 @@ mobs:register_mob("mobs_mc:creeper_charged", { -- Head -- TODO: Only drop if killed by charged creeper - {name = mobs_mc.items.head_creeper, + {name = "mcl_heads:creeper", chance = 200, -- 0.5% min = 1, max = 1,}, @@ -277,7 +254,7 @@ mobs:register_mob("mobs_mc:creeper_charged", { glow = 3, }) -mobs:spawn_specific( +mcl_mobs:spawn_specific( "mobs_mc:creeper", "overworld", "ground", @@ -427,8 +404,8 @@ mobs:spawn_specific( 20, 16500, 2, -mobs_mc.spawn_height.overworld_min, -mobs_mc.spawn_height.overworld_max) +mcl_vars.mg_overworld_min, +mcl_vars.mg_overworld_max) -- spawn eggs -mobs:register_egg("mobs_mc:creeper", S("Creeper"), "mobs_mc_spawn_icon_creeper.png", 0) +mcl_mobs:register_egg("mobs_mc:creeper", S("Creeper"), "mobs_mc_spawn_icon_creeper.png", 0) diff --git a/mods/ENTITIES/mobs_mc/ender_dragon.lua b/mods/ENTITIES/mobs_mc/ender_dragon.lua index 3634e20f4..e7a233fc5 100644 --- a/mods/ENTITIES/mobs_mc/ender_dragon.lua +++ b/mods/ENTITIES/mobs_mc/ender_dragon.lua @@ -2,28 +2,21 @@ --################### ENDERDRAGON --################### -local S = minetest.get_translator(minetest.get_current_modname()) +local S = minetest.get_translator("mobs_mc") -mobs:register_mob("mobs_mc:enderdragon", { +mcl_mobs:register_mob("mobs_mc:enderdragon", { description = S("Ender Dragon"), type = "monster", spawn_class = "hostile", + pathfinding = 1, attacks_animals = true, walk_chance = 100, - rotate = 270, - tilt_fly = true, - hostile = true, - shoot_arrow = function(self, pos, dir) - -- 2-4 damage per arrow - local dmg = math.random(2,4) - mobs.shoot_projectile_handling("mobs_mc:dragon_fireball", pos, dir, self.object:get_yaw(), self.object, nil, dmg) - end, hp_max = 200, hp_min = 200, xp_min = 500, xp_max = 500, - collisionbox = {-2, 0, -2, 2, 2, 2}, - eye_height = 1, + collisionbox = {-2, 3, -2, 2, 5, 2}, + physical = false, visual = "mesh", mesh = "mobs_mc_dragon.b3d", textures = { @@ -31,7 +24,6 @@ mobs:register_mob("mobs_mc:enderdragon", { }, visual_size = {x=3, y=3}, view_range = 35, - reach = 20, walk_velocity = 6, run_velocity = 6, can_despawn = false, @@ -43,6 +35,7 @@ mobs:register_mob("mobs_mc:enderdragon", { }, physical = true, damage = 10, + knock_back = false, jump = true, jump_height = 14, fly = true, @@ -55,10 +48,12 @@ mobs:register_mob("mobs_mc:enderdragon", { lava_damage = 0, fire_damage = 0, on_rightclick = nil, - attack_type = "projectile", + attack_type = "dogshoot", arrow = "mobs_mc:dragon_fireball", shoot_interval = 0.5, shoot_offset = -1.0, + xp_min = 500, + xp_max = 500, animation = { fly_speed = 8, stand_speed = 8, stand_start = 0, stand_end = 20, @@ -104,18 +99,18 @@ mobs:register_mob("mobs_mc:enderdragon", { mcl_structures.call_struct(self._portal_pos, "end_exit_portal_open") if self._initial then mcl_experience.throw_xp(pos, 11500) -- 500 + 11500 = 12000 - minetest.set_node(vector.add(self._portal_pos, vector.new(3, 5, 3)), {name = mobs_mc.items.dragon_egg}) + minetest.set_node(vector.add(self._portal_pos, vector.new(3, 5, 3)), {name = "mcl_end:dragon_egg"}) end end end, fire_resistant = true, }) ---TODO: replace this setting by a proper gamerules system -local mobs_griefing = minetest.settings:get_bool("mobs_griefing", true) + +local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false -- dragon fireball (projectile) -mobs:register_arrow("mobs_mc:dragon_fireball", { +mcl_mobs:register_arrow("mobs_mc:dragon_fireball", { visual = "sprite", visual_size = {x = 1.25, y = 1.25}, textures = {"mobs_mc_dragon_fireball.png"}, @@ -139,13 +134,10 @@ mobs:register_arrow("mobs_mc:dragon_fireball", { -- node hit, explode hit_node = function(self, pos, node) - --mobs:boom(self, pos, 2) - if mobs_griefing then - mcl_explosions.explode(self.object:get_pos(), 2, { drop_chance = 1.0 }) - end + mcl_mobs:boom(self, pos, 2) end }) -mobs:register_egg("mobs_mc:enderdragon", S("Ender Dragon"), "mobs_mc_spawn_icon_dragon.png", 0, true) +mcl_mobs:register_egg("mobs_mc:enderdragon", S("Ender Dragon"), "mobs_mc_spawn_icon_dragon.png", 0, true) ---mcl_wip.register_wip_item("mobs_mc:enderdragon") +mcl_wip.register_wip_item("mobs_mc:enderdragon") diff --git a/mods/ENTITIES/mobs_mc/enderman.lua b/mods/ENTITIES/mobs_mc/enderman.lua index a821bd769..4dcd6693c 100644 --- a/mods/ENTITIES/mobs_mc/enderman.lua +++ b/mods/ENTITIES/mobs_mc/enderman.lua @@ -24,11 +24,9 @@ -- added rain damage. -- fixed the grass_with_dirt issue. -local S = minetest.get_translator(minetest.get_current_modname()) +local S = minetest.get_translator("mobs_mc") -local vector = vector - -local function telesound(pos, is_source) +local telesound = function(pos, is_source) local snd if is_source then snd = "mobs_mc_enderman_teleport_src" @@ -50,6 +48,37 @@ local take_frequency_max = 245 local place_frequency_min = 235 local place_frequency_max = 245 + +-- Texuture overrides for enderman block. Required for cactus because it's original is a nodebox +-- and the textures have tranparent pixels. +local block_texture_overrides +do + local cbackground = "mobs_mc_enderman_cactus_background.png" + local ctiles = minetest.registered_nodes["mcl_core:cactus"].tiles + + local ctable = {} + local last + for i=1, 6 do + if ctiles[i] then + last = ctiles[i] + end + table.insert(ctable, cbackground .. "^" .. last) + end + + block_texture_overrides = { + ["mcl_core:cactus"] = ctable, + -- FIXME: replace colorize colors with colors from palette + ["mcl_core:dirt_with_grass"] = + { + "mcl_core_grass_block_top.png^[colorize:green:90", + "default_dirt.png", + "default_dirt.png^(mcl_core_grass_block_side_overlay.png^[colorize:green:90)", + "default_dirt.png^(mcl_core_grass_block_side_overlay.png^[colorize:green:90)", + "default_dirt.png^(mcl_core_grass_block_side_overlay.png^[colorize:green:90)", + "default_dirt.png^(mcl_core_grass_block_side_overlay.png^[colorize:green:90)"} + } +end + -- Create the textures table for the enderman, depending on which kind of block -- the enderman holds (if any). local create_enderman_textures = function(block_type, itemstring) @@ -71,9 +100,9 @@ local create_enderman_textures = function(block_type, itemstring) local tiles = minetest.registered_nodes[itemstring].tiles local textures = {} local last - if mobs_mc.enderman_block_texture_overrides[itemstring] then + if block_texture_overrides[itemstring] then -- Texture override available? Use these instead! - textures = mobs_mc.enderman_block_texture_overrides[itemstring] + textures = block_texture_overrides[itemstring] else -- Extract the texture names for i = 1, 6 do @@ -191,23 +220,22 @@ end local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false -mobs:register_mob("mobs_mc:enderman", { +mcl_mobs:register_mob("mobs_mc:enderman", { description = S("Enderman"), type = "monster", spawn_class = "passive", - neutral = true, + passive = true, + pathfinding = 1, hp_min = 40, hp_max = 40, xp_min = 5, xp_max = 5, - rotate = 270, collisionbox = {-0.3, -0.01, -0.3, 0.3, 2.89, 0.3}, visual = "mesh", mesh = "mobs_mc_enderman.b3d", textures = create_enderman_textures(), visual_size = {x=3, y=3}, makes_footstep_sound = true, - eye_height = 2.5, sounds = { -- TODO: Custom war cry sound war_cry = "mobs_sandmonster", @@ -216,33 +244,17 @@ mobs:register_mob("mobs_mc:enderman", { random = {name="mobs_mc_enderman_random", gain=0.5}, distance = 16, }, - walk_velocity = 1, - run_velocity = 4, + walk_velocity = 0.2, + run_velocity = 3.4, damage = 7, reach = 2, drops = { - {name = mobs_mc.items.ender_pearl, + {name = "mcl_throwing:ender_pearl", chance = 1, min = 0, max = 1, looting = "common"}, }, - - --head code - has_head = false, - head_bone = "head.low", - - swap_y_with_x = false, - reverse_head_yaw = false, - - head_bone_pos_y = 2.4, - head_bone_pos_z = 0, - - head_height_offset = 1.1, - head_direction_offset = 0, - head_pitch_modifier = 0, - --end head code - animation = select_enderman_animation("normal"), _taken_node = "", do_custom = function(self, dtime) @@ -301,10 +313,10 @@ mobs:register_mob("mobs_mc:enderman", { --self:teleport(nil) --self.state = "" --else - if self.attacking then - local target = self.attacking + if self.attack then + local target = self.attack local pos = target:get_pos() - if pos then + if pos ~= nil then if vector.distance(self.object:get_pos(), target:get_pos()) > 10 then self:teleport(target) end @@ -320,12 +332,12 @@ mobs:register_mob("mobs_mc:enderman", { for n = 1, #objs do local obj = objs[n] if obj then - --if minetest.is_player(obj) then + if minetest.is_player(obj) then -- Warp from players during day. --if (minetest.get_timeofday() * 24000) > 5001 and (minetest.get_timeofday() * 24000) < 19000 then -- self:teleport(nil) --end - if not obj:is_player() then + else local lua = obj:get_luaentity() if lua then if lua.name == "mcl_bows:arrow_entity" or lua.name == "mcl_throwing:snowball_entity" then @@ -343,8 +355,8 @@ mobs:register_mob("mobs_mc:enderman", { -- self:teleport(nil) -- self.state = "" --else - if self.attack and not minetest.settings:get_bool("creative_mode") then - self.state = "attack" + if self.attack ~= nil and not minetest.settings:get_bool("creative_mode") then + self.state = 'attack' end --end end @@ -379,16 +391,11 @@ mobs:register_mob("mobs_mc:enderman", { --if looking in general head position, turn hostile if minetest.line_of_sight(ender_eye_pos, look_pos_base) and vector.distance(look_pos, ender_eye_pos) <= 0.4 then self.provoked = "staring" - self.state = "stand" - self.hostile = false + self.attack = minetest.get_player_by_name(obj:get_player_name()) break - --begin attacking the player - else + else -- I'm not sure what this part does, but I don't want to break anything - jordan4ibanez if self.provoked == "staring" then self.provoked = "broke_contact" - self.hostile = true - self.state = "attack" - self.attacking = obj end end @@ -412,20 +419,17 @@ mobs:register_mob("mobs_mc:enderman", { self._take_place_timer = 0 self._next_take_place_time = math.random(place_frequency_min, place_frequency_max) local pos = self.object:get_pos() - local takable_nodes = minetest.find_nodes_in_area_under_air({x=pos.x-2, y=pos.y-1, z=pos.z-2}, {x=pos.x+2, y=pos.y+1, z=pos.z+2}, mobs_mc.enderman_takable) + local takable_nodes = minetest.find_nodes_in_area_under_air({x=pos.x-2, y=pos.y-1, z=pos.z-2}, {x=pos.x+2, y=pos.y+1, z=pos.z+2}, "group:enderman_takable") if #takable_nodes >= 1 then local r = pr:next(1, #takable_nodes) local take_pos = takable_nodes[r] local node = minetest.get_node(take_pos) -- Don't destroy protected stuff. if not minetest.is_protected(take_pos, "") then - local dug = minetest.dig_node(take_pos) - if dug then - if mobs_mc.enderman_replace_on_take[node.name] then - self._taken_node = mobs_mc.enderman_replace_on_take[node.name] - else - self._taken_node = node.name - end + minetest.remove_node(take_pos) + local dug = minetest.get_node_or_nil(take_pos) + if dug and dug.name == "air" then + self._taken_node = node.name local def = minetest.registered_nodes[self._taken_node] -- Update animation and texture accordingly (adds visibly carried block) local block_type @@ -454,14 +458,14 @@ mobs:register_mob("mobs_mc:enderman", { self.base_texture = create_enderman_textures(block_type, self._taken_node) self.object:set_properties({ textures = self.base_texture }) self.animation = select_enderman_animation("block") - mobs.set_mob_animation(self, self.animation.current) + mcl_mobs:set_animation(self, self.animation.current) if def.sounds and def.sounds.dug then minetest.sound_play(def.sounds.dug, {pos = take_pos, max_hear_distance = 16}, true) end end end end - elseif self._taken_node and self._taken_node ~= "" and self._take_place_timer >= self._next_take_place_time then + elseif self._taken_node ~= nil and self._taken_node ~= "" and self._take_place_timer >= self._next_take_place_time then -- Place taken node self._take_place_timer = 0 self._next_take_place_time = math.random(take_frequency_min, take_frequency_max) @@ -477,7 +481,7 @@ mobs:register_mob("mobs_mc:enderman", { local def = minetest.registered_nodes[self._taken_node] -- Update animation accordingly (removes visible block) self.animation = select_enderman_animation("normal") - mobs.set_mob_animation(self, self.animation.current) + mcl_mobs:set_animation(self, self.animation.current) if def.sounds and def.sounds.place then minetest.sound_play(def.sounds.place, {pos = place_pos, max_hear_distance = 16}, true) end @@ -487,12 +491,12 @@ mobs:register_mob("mobs_mc:enderman", { end end, do_teleport = function(self, target) - if target then + if target ~= nil then local target_pos = target:get_pos() -- Find all solid nodes below air in a 10×10×10 cuboid centered on the target local nodes = minetest.find_nodes_in_area_under_air(vector.subtract(target_pos, 5), vector.add(target_pos, 5), {"group:solid", "group:cracky", "group:crumbly"}) local telepos - if nodes then + if nodes ~= nil then if #nodes > 0 then -- Up to 64 attempts to teleport for n=1, math.min(64, #nodes) do @@ -502,7 +506,8 @@ mobs:register_mob("mobs_mc:enderman", { -- Selected node needs to have 3 nodes of free space above for u=1, 3 do local node = minetest.get_node({x=nodepos.x, y=nodepos.y+u, z=nodepos.z}) - if minetest.registered_nodes[node.name].walkable then + local ndef = minetest.registered_nodes[node.name] + if ndef and ndef.walkable then node_ok = false break end @@ -527,7 +532,7 @@ mobs:register_mob("mobs_mc:enderman", { -- We need to add (or subtract) different random numbers to each vector component, so it couldn't be done with a nice single vector.add() or .subtract(): local randomCube = vector.new( pos.x + 8*(pr:next(0,16)-8), pos.y + 8*(pr:next(0,16)-8), pos.z + 8*(pr:next(0,16)-8) ) local nodes = minetest.find_nodes_in_area_under_air(vector.subtract(randomCube, 4), vector.add(randomCube, 4), {"group:solid", "group:cracky", "group:crumbly"}) - if nodes then + if nodes ~= nil then if #nodes > 0 then -- Up to 8 low-level (in total up to 8*8 = 64) attempts to teleport for n=1, math.min(8, #nodes) do @@ -536,7 +541,8 @@ mobs:register_mob("mobs_mc:enderman", { node_ok = true for u=1, 3 do local node = minetest.get_node({x=nodepos.x, y=nodepos.y+u, z=nodepos.z}) - if minetest.registered_nodes[node.name].walkable then + local ndef = minetest.registered_nodes[node.name] + if ndef and ndef.walkable then node_ok = false break end @@ -559,13 +565,13 @@ mobs:register_mob("mobs_mc:enderman", { end, on_die = function(self, pos) -- Drop carried node on death - if self._taken_node and self._taken_node ~= "" then + if self._taken_node ~= nil and self._taken_node ~= "" then minetest.add_item(pos, self._taken_node) end end, do_punch = function(self, hitter, tflp, tool_caps, dir) -- damage from rain caused by itself so we don't want it to attack itself. - if hitter ~= self.object and hitter then + if hitter ~= self.object and hitter ~= nil then --if (minetest.get_timeofday() * 24000) > 5001 and (minetest.get_timeofday() * 24000) < 19000 then -- self:teleport(nil) --else @@ -581,12 +587,12 @@ mobs:register_mob("mobs_mc:enderman", { water_damage = 8, view_range = 64, fear_height = 4, - attack_type = "punch", + attack_type = "dogfight", }) -- End spawn -mobs:spawn_specific( +mcl_mobs:spawn_specific( "mobs_mc:enderman", "end", "ground", @@ -598,10 +604,10 @@ minetest.LIGHT_MAX+1, 30, 3000, 12, -mobs_mc.spawn_height.end_min, -mobs_mc.spawn_height.end_max) +mcl_vars.mg_end_min, +mcl_vars.mg_end_max) -- Overworld spawn -mobs:spawn_specific( +mcl_mobs:spawn_specific( "mobs_mc:enderman", "overworld", "ground", @@ -751,24 +757,41 @@ mobs:spawn_specific( 30, 19000, 2, -mobs_mc.spawn_height.overworld_min, -mobs_mc.spawn_height.overworld_max) +mcl_vars.mg_overworld_min, +mcl_vars.mg_overworld_max) -- Nether spawn (rare) -mobs:spawn_specific( +mcl_mobs:spawn_specific( "mobs_mc:enderman", "nether", "ground", { -"Nether" +"Nether", +"SoulsandValley", }, 0, -7, +minetest.LIGHT_MAX+1, 30, 27500, 4, -mobs_mc.spawn_height.nether_min, -mobs_mc.spawn_height.nether_max) +mcl_vars.mg_nether_min, +mcl_vars.mg_nether_max) + +-- Warped Forest spawn (common) +mcl_mobs:spawn_specific( +"mobs_mc:enderman", +"nether", +"ground", +{ +"WarpedForest" +}, +0, +minetest.LIGHT_MAX+1, +30, +5000, +4, +mcl_vars.mg_nether_min, +mcl_vars.mg_nether_max) -- spawn eggs -mobs:register_egg("mobs_mc:enderman", S("Enderman"), "mobs_mc_spawn_icon_enderman.png", 0) +mcl_mobs:register_egg("mobs_mc:enderman", S("Enderman"), "mobs_mc_spawn_icon_enderman.png", 0) diff --git a/mods/ENTITIES/mobs_mc/endermite.lua b/mods/ENTITIES/mobs_mc/endermite.lua index 29a887c06..53200da70 100644 --- a/mods/ENTITIES/mobs_mc/endermite.lua +++ b/mods/ENTITIES/mobs_mc/endermite.lua @@ -2,22 +2,19 @@ --################### ENDERMITE --################### -local S = minetest.get_translator(minetest.get_current_modname()) +local S = minetest.get_translator("mobs_mc") -mobs:register_mob("mobs_mc:endermite", { +mcl_mobs:register_mob("mobs_mc:endermite", { description = S("Endermite"), type = "monster", spawn_class = "hostile", passive = false, - rotate = 270, - hostile = true, hp_min = 8, hp_max = 8, xp_min = 3, xp_max = 3, armor = {fleshy = 100, arthropod = 100}, group_attack = true, - attack_type = "punch", collisionbox = {-0.2, -0.01, -0.2, 0.2, 0.29, 0.2}, visual = "mesh", mesh = "mobs_mc_endermite.b3d", @@ -41,4 +38,4 @@ mobs:register_mob("mobs_mc:endermite", { reach = 1, }) -mobs:register_egg("mobs_mc:endermite", S("Endermite"), "mobs_mc_spawn_icon_endermite.png", 0) +mcl_mobs:register_egg("mobs_mc:endermite", S("Endermite"), "mobs_mc_spawn_icon_endermite.png", 0) diff --git a/mods/ENTITIES/mobs_mc/gameconfig.md b/mods/ENTITIES/mobs_mc/gameconfig.md deleted file mode 100644 index 8394a053c..000000000 --- a/mods/ENTITIES/mobs_mc/gameconfig.md +++ /dev/null @@ -1,59 +0,0 @@ -# Game integration help - -This mod has been designed to make game integration rather easy. Ideally, it should be possible to include this mod verbatim in your game, with modifications only done by an external mod. - -To integrate this mod in a game, you have to do 2 things: Adding the mod, and adding another mod which tells `mobs_mc` which items to use. The idea is that `mobs_mc` should work with any items. Specifically, these are the steps you need to follow: - -* Add the `mobs_mc` mod and its dependencies -* Add a mod with name “`mobs_mc_gameconfig`” -* In this mod, do this: - * Do *not* depend on `mobs_mc` - * Create the table `mobs_mc` - * Create the table `mobs_mc.override` - * In `mobs_mc.override`, create subtables (`items`, `spawn`, etc.) like in `0_gameconfig.lua`, defining the na - * Read `0_gameconfig.lua` to see which items you can override (and more explanations) -* In `on_construct` of a pumpkin or jack'o lantern node, call: - * `mobs_mc.tools.check_iron_golem_summon(pos)` - * `mobs_mc.tools.check_snow_golem_summon(pos)` - * For more information, see `snowman.lua` and `iron_golem.lua` - -Some things to note: - -* Every override is optional, but explicitly setting all the item overrides is strongly recommended -* `mobs_mc` ships many (but not all) items on its own. If not item name override is set, the `mobs_mc` item is used - * You decide whether your game defines its own items, outside of `mobs_mc` or if you let `mobs_mc` do the work. -* Make sure to avoid duplicate items! -* After finishing this, throughly test this -* Without `mobs_mc_gameconfig`, the mod assumes Minetest Game items -* `mobs_mc` optionally depends on `mobs_mc_gameconfig` - -## Example `init.lua` in `mobs_mc_gameconfig` -``` -mobs_mc = {} - -mobs_mc.override = {} - --- Set the item names here -mobs_mc.override.items = { - blaze_rod = "mcl_mobitems:blaze_rod", - blaze_powder = "mcl_mobitems:blaze_powder", - chicken_raw = "mcl_mobitems:chicken", - -- And so on ... -} - --- Set the “follow” field of mobs (used for attracting mob, feeding and breeding) -mobs_mc.override.follow = { - chicken = { "mcl_farming:wheat_seeds", "mcl_farming:melon_seeds", "mcl_farming:pumpkin_seeds", "mcl_farming:beetroot_seeds", }, - horse = { "mcl_core:apple", mobs_mc.override.items.wheat }, -- TODO - pig = { "mcl_farming:potato", mobs_mc.override.items.carrot, mobs_mc.override.items.carrot_on_a_stick}, - -- And so on ... -} - --- Custom spawn nodes -mobs_mc.override.spawn = { - snow = { "example:snow", "example:snow2" }, - -- And so on ... -} - --- Take a look at the other possible tables, see 0_gameconfig.lua -``` diff --git a/mods/ENTITIES/mobs_mc/ghast.lua b/mods/ENTITIES/mobs_mc/ghast.lua index dc47411fd..d08b0055c 100644 --- a/mods/ENTITIES/mobs_mc/ghast.lua +++ b/mods/ENTITIES/mobs_mc/ghast.lua @@ -3,28 +3,24 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes -local S = minetest.get_translator(minetest.get_current_modname()) +local S = minetest.get_translator("mobs_mc") --################### --################### GHAST --################### -mobs:register_mob("mobs_mc:ghast", { +mcl_mobs:register_mob("mobs_mc:ghast", { description = S("Ghast"), type = "monster", spawn_class = "hostile", + pathfinding = 1, group_attack = true, - hostile = true, - fly_random_while_attack = true, hp_min = 10, hp_max = 10, - rotate = 270, xp_min = 5, xp_max = 5, - reach = 20, - eye_height = 2.5, - collisionbox = {-2, 0, -2, 2, 4, 2}, + collisionbox = {-2, 5, -2, 2, 9, 2}, visual = "mesh", mesh = "mobs_mc_ghast.b3d", textures = { @@ -40,13 +36,11 @@ mobs:register_mob("mobs_mc:ghast", { -- TODO: damage -- TODO: better death }, - walk_velocity = 1.6, run_velocity = 3.2, - drops = { - {name = mobs_mc.items.gunpowder, chance = 1, min = 0, max = 2, looting = "common"}, - {name = mobs_mc.items.ghast_tear, chance = 10/6, min = 0, max = 1, looting = "common", looting_ignore_chance = true}, + {name = "mcl_mobitems:gunpowder", chance = 1, min = 0, max = 2, looting = "common"}, + {name = "mcl_mobitems:ghast_tear", chance = 10/6, min = 0, max = 1, looting = "common", looting_ignore_chance = true}, }, animation = { stand_speed = 50, walk_speed = 50, run_speed = 50, @@ -54,23 +48,22 @@ mobs:register_mob("mobs_mc:ghast", { walk_start = 0, walk_end = 40, run_start = 0, run_end = 40, }, - fall_damage = 0, - view_range = 28, - attack_type = "projectile", - arrow = "mobs_mc:ghast_fireball", + view_range = 100, + attack_type = "dogshoot", + arrow = "mobs_mc:fireball", + shoot_interval = 3.5, + shoot_offset = -5, + dogshoot_switch = 1, + dogshoot_count_max =1, + passive = false, + jump = true, + jump_height = 4, floats=1, fly = true, makes_footstep_sound = false, + instant_death = true, fire_resistant = true, - projectile_cooldown_min = 5, - projectile_cooldown_max = 7, - shoot_arrow = function(self, pos, dir) - -- 2-4 damage per arrow - local dmg = math.random(2,4) - mobs.shoot_projectile_handling("mobs_mc:ghast_fireball", pos, dir, self.object:get_yaw(), self.object, 11, dmg,nil,nil,nil,-0.6) - end, - --[[ do_custom = function(self) if self.firing == true then self.base_texture = {"mobs_mc_ghast_firing.png"} @@ -80,60 +73,58 @@ mobs:register_mob("mobs_mc:ghast", { self.object:set_properties({textures=self.base_texture}) end end, - ]]-- }) -mobs:spawn_specific( +mcl_mobs:spawn_specific( "mobs_mc:ghast", "nether", "ground", { -"Nether" +"Nether", +"SoulsandValley", +"BasaltDelta", }, 0, -minetest.LIGHT_MAX+1, +7, 30, -18000, +72000, 2, -mobs_mc.spawn_height.nether_min, -mobs_mc.spawn_height.nether_max) +mcl_vars.mg_nether_min, +mcl_vars.mg_nether_max) -- fireball (projectile) -mobs:register_arrow("mobs_mc:ghast_fireball", { +mcl_mobs:register_arrow("mobs_mc:fireball", { visual = "sprite", visual_size = {x = 1, y = 1}, textures = {"mcl_fire_fire_charge.png"}, velocity = 15, collisionbox = {-.5, -.5, -.5, .5, .5, .5}, - tail = 1, - tail_texture = "mobs_mc_spit.png^[colorize:black:255", --repurpose spit texture - tail_size = 5, _is_fireball = true, hit_player = function(self, player) - --[[ player:punch(self.object, 1.0, { full_punch_interval = 1.0, damage_groups = {fleshy = 6}, }, nil) - ]]-- - --mobs:boom(self, self.object:get_pos(), 1, true) - mcl_explosions.explode(self.object:get_pos(), 3,{ drop_chance = 1.0 }) + local p = self.object:get_pos() + if p then + mcl_mobs:boom(self, p, 1, true) + else + mcl_mobs:boom(self, player:get_pos(), 1, true) + end end, hit_mob = function(self, mob) mob:punch(self.object, 1.0, { full_punch_interval = 1.0, - damage_groups = {fleshy = self._damage}, + damage_groups = {fleshy = 6}, }, nil) - --mobs:boom(self, self.object:get_pos(), 1, true) - mcl_explosions.explode(self.object:get_pos(), 3,{ drop_chance = 1.0 }) + mcl_mobs:boom(self, self.object:get_pos(), 1, true) end, hit_node = function(self, pos, node) - --mobs:boom(self, pos, 1, true) - mcl_explosions.explode(self.object:get_pos(), 3,{ drop_chance = 1.0 }) + mcl_mobs:boom(self, pos, 1, true) end }) @@ -141,4 +132,4 @@ mobs:register_arrow("mobs_mc:ghast_fireball", { -- spawn eggs -mobs:register_egg("mobs_mc:ghast", S("Ghast"), "mobs_mc_spawn_icon_ghast.png", 0) +mcl_mobs:register_egg("mobs_mc:ghast", S("Ghast"), "mobs_mc_spawn_icon_ghast.png", 0) diff --git a/mods/ENTITIES/mobs_mc/guardian.lua b/mods/ENTITIES/mobs_mc/guardian.lua index 3e1a4f853..53e93f472 100644 --- a/mods/ENTITIES/mobs_mc/guardian.lua +++ b/mods/ENTITIES/mobs_mc/guardian.lua @@ -2,9 +2,9 @@ --################### GUARDIAN --################### -local S = minetest.get_translator(minetest.get_current_modname()) +local S = minetest.get_translator("mobs_mc") -mobs:register_mob("mobs_mc:guardian", { +mcl_mobs:register_mob("mobs_mc:guardian", { description = S("Guardian"), type = "monster", spawn_class = "hostile", @@ -13,8 +13,8 @@ mobs:register_mob("mobs_mc:guardian", { xp_min = 10, xp_max = 10, breath_max = -1, - passive = false, - attack_type = "punch", + passive = false, + attack_type = "dogfight", pathfinding = 1, view_range = 16, walk_velocity = 2, @@ -44,7 +44,7 @@ mobs:register_mob("mobs_mc:guardian", { }, drops = { -- Greatly increased amounts of prismarine - {name = mobs_mc.items.prismarine_shard, + {name = "mcl_ocean:prismarine_shard", chance = 1, min = 0, max = 32, @@ -53,37 +53,37 @@ mobs:register_mob("mobs_mc:guardian", { -- The following drops are approximations -- Fish / prismarine crystal - {name = mobs_mc.items.fish_raw, + {name = "mcl_fishing:fish_raw", chance = 4, min = 1, max = 1, looting = "common",}, - {name = mobs_mc.items.prismarine_crystals, + {name = "mcl_ocean:prismarine_crystals", chance = 4, min = 1, max = 2, looting = "common",}, -- Rare drop: fish - {name = mobs_mc.items.fish_raw, + {name = "mcl_fishing:fish_raw", chance = 160, -- 2.5% / 4 min = 1, max = 1, looting = "rare", looting_factor = 0.0025,}, - {name = mobs_mc.items.salmon_raw, + {name = "mcl_fishing:salmon_raw", chance = 160, min = 1, max = 1, looting = "rare", looting_factor = 0.0025,}, - {name = mobs_mc.items.clownfish_raw, + {name = "mcl_fishing:clownfish_raw", chance = 160, min = 1, max = 1, looting = "rare", looting_factor = 0.0025,}, - {name = mobs_mc.items.pufferfish_raw, + {name = "mcl_fishing:pufferfish_raw", chance = 160, min = 1, max = 1, @@ -92,13 +92,14 @@ mobs:register_mob("mobs_mc:guardian", { }, fly = true, makes_footstep_sound = false, - fly_in = { mobs_mc.items.water_source, mobs_mc.items.river_water_source }, + fly_in = { "mcl_core:water_source", "mclx_core:river_water_source" }, jump = false, + view_range = 16, }) -- Spawning disabled due to size issues -- TODO: Re-enable spawning ---mobs:spawn_specific("mobs_mc:guardian", mobs_mc.spawn.water, mobs_mc.spawn_water, 0, minetest.LIGHT_MAX+1, 30, 25000, 2, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.water - 10) +--mcl_mobs:spawn_specific("mobs_mc:guardian", { "mcl_core:water_source", "mclx_core:river_water_source" }, { "mcl_core:water_source", "mclx_core:river_water_source" }, 0, minetest.LIGHT_MAX+1, 30, 25000, 2, mcl_vars.mg_overworld_min, mobs_mc.water_level - 10) -- spawn eggs -mobs:register_egg("mobs_mc:guardian", S("Guardian"), "mobs_mc_spawn_icon_guardian.png", 0) +mcl_mobs:register_egg("mobs_mc:guardian", S("Guardian"), "mobs_mc_spawn_icon_guardian.png", 0) diff --git a/mods/ENTITIES/mobs_mc/guardian_elder.lua b/mods/ENTITIES/mobs_mc/guardian_elder.lua index 2bb0e984a..f33576fb9 100644 --- a/mods/ENTITIES/mobs_mc/guardian_elder.lua +++ b/mods/ENTITIES/mobs_mc/guardian_elder.lua @@ -4,9 +4,9 @@ --################### GUARDIAN --################### -local S = minetest.get_translator(minetest.get_current_modname()) +local S = minetest.get_translator("mobs_mc") -mobs:register_mob("mobs_mc:guardian_elder", { +mcl_mobs:register_mob("mobs_mc:guardian_elder", { description = S("Elder Guardian"), type = "monster", spawn_class = "hostile", @@ -15,8 +15,8 @@ mobs:register_mob("mobs_mc:guardian_elder", { xp_min = 10, xp_max = 10, breath_max = -1, - passive = false, - attack_type = "punch", + passive = false, + attack_type = "dogfight", pathfinding = 1, view_range = 16, walk_velocity = 2, @@ -49,51 +49,51 @@ mobs:register_mob("mobs_mc:guardian_elder", { -- TODO: Reduce # of drops when ocean monument is ready. -- Greatly increased amounts of prismarine - {name = mobs_mc.items.prismarine_shard, + {name = "mcl_ocean:prismarine_shard", chance = 1, min = 1, max = 64, looting = "common",}, -- TODO: Only drop if killed by player - {name = mobs_mc.items.wet_sponge, + {name = "mcl_sponges:sponge_wet", chance = 1, min = 1, max = 1,}, -- The following drops are approximations -- Fish / prismarine crystal - {name = mobs_mc.items.fish_raw, + {name = "mcl_fishing:fish_raw", chance = 4, min = 1, max = 1, looting = "common",}, - {name = mobs_mc.items.prismarine_crystals, + {name = "mcl_ocean:prismarine_crystals", chance = 1, min = 1, max = 10, looting = "common",}, -- Rare drop: fish - {name = mobs_mc.items.fish_raw, + {name = "mcl_fishing:fish_raw", chance = 160, -- 2.5% / 4 min = 1, max = 1, looting = "rare", looting_factor = 0.01 / 4,}, - {name = mobs_mc.items.salmon_raw, + {name = "mcl_fishing:salmon_raw", chance = 160, min = 1, max = 1, looting = "rare", looting_factor = 0.01 / 4,}, - {name = mobs_mc.items.clownfish_raw, + {name = "mcl_fishing:clownfish_raw", chance = 160, min = 1, max = 1, looting = "rare", looting_factor = 0.01 / 4,}, - {name = mobs_mc.items.pufferfish_raw, + {name = "mcl_fishing:pufferfish_raw", chance = 160, min = 1, max = 1, @@ -102,14 +102,15 @@ mobs:register_mob("mobs_mc:guardian_elder", { }, fly = true, makes_footstep_sound = false, - fly_in = { mobs_mc.items.water_source, mobs_mc.items.river_water_source }, + fly_in = { "mcl_core:water_source", "mclx_core:river_water_source" }, jump = false, + view_range = 16, }) -- Spawning disabled due to size issues <- what do you mean? -j4i -- TODO: Re-enable spawning --- mobs:spawn_specific("mobs_mc:guardian_elder", mobs_mc.spawn.water, mobs_mc.spawn_water, 0, minetest.LIGHT_MAX+1, 30, 40000, 2, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.water-18) +-- mcl_mobs:spawn_specific("mobs_mc:guardian_elder", { "mcl_core:water_source", "mclx_core:river_water_source" }, { "mcl_core:water_source", "mclx_core:river_water_source" }, 0, minetest.LIGHT_MAX+1, 30, 40000, 2, mcl_vars.mg_overworld_min, mobs_mc.water_level-18) -- spawn eggs -mobs:register_egg("mobs_mc:guardian_elder", S("Elder Guardian"), "mobs_mc_spawn_icon_guardian_elder.png", 0) +mcl_mobs:register_egg("mobs_mc:guardian_elder", S("Elder Guardian"), "mobs_mc_spawn_icon_guardian_elder.png", 0) diff --git a/mods/ENTITIES/mobs_mc/horse.lua b/mods/ENTITIES/mobs_mc/horse.lua index 4b33515d5..20ff8b718 100644 --- a/mods/ENTITIES/mobs_mc/horse.lua +++ b/mods/ENTITIES/mobs_mc/horse.lua @@ -3,7 +3,7 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes -local S = minetest.get_translator(minetest.get_current_modname()) +local S = minetest.get_translator("mobs_mc") --################### --################### HORSE @@ -38,9 +38,9 @@ end local can_equip_horse_armor = function(entity_id) return entity_id == "mobs_mc:horse" or entity_id == "mobs_mc:skeleton_horse" or entity_id == "mobs_mc:zombie_horse" end ---[[local can_equip_chest = function(entity_id) +local can_equip_chest = function(entity_id) return entity_id == "mobs_mc:mule" or entity_id == "mobs_mc:donkey" -end]] +end local can_breed = function(entity_id) return entity_id == "mobs_mc:horse" or "mobs_mc:mule" or entity_id == "mobs_mc:donkey" end @@ -81,6 +81,20 @@ for b=1, #horse_base do end end +-- in e7898352d890c2414af653eba624939df9c0b8b4 (0.76-dev) all items from mobs_mc were moved to mcl_mobitems +-- this results in existing horses wearing armor would still have the old texture filename in their +-- properties this function updates them. It should be removed some time in the future when we can be +-- reasonably sure all horses that want it get the new nexture. +local function update_textures(self) + local old = "mobs_mc_horse_armor_" + local txt = self.object:get_properties().textures + if txt[2]:find(old) then + txt[2] = txt[2]:gsub(old,"mcl_mobitems_horse_armor_") + self.object:set_properties({textures=txt}) + return + end +end + -- Horse local horse = { description = S("Horse"), @@ -88,10 +102,6 @@ local horse = { spawn_class = "passive", visual = "mesh", mesh = "mobs_mc_horse.b3d", - rotate = 270, - walk_velocity = 1, - run_velocity = 8, - skittish = true, visual_size = {x=3.0, y=3.0}, collisionbox = {-0.69825, -0.01, -0.69825, 0.69825, 1.59, 0.69825}, animation = { @@ -101,7 +111,7 @@ local horse = { walk_speed = 25, walk_start = 0, walk_end = 40, - run_speed = 120, + run_speed = 60, run_start = 0, run_end = 40, }, @@ -118,8 +128,14 @@ local horse = { fly = false, walk_chance = 60, view_range = 16, - follow = "mcl_farming:wheat_item", - follow_distance = 3, + follow = { + "mcl_core:apple", + "mcl_core:sugar", + "mcl_farming:wheat_item", + "mcl_farming:hay_block", + "mcl_core:apple_gold", + "mcl_farming:carrot_item_gold", + }, passive = true, hp_min = 15, hp_max = 30, @@ -130,13 +146,13 @@ local horse = { jump = true, jump_height = 5.75, -- can clear 2.5 blocks drops = { - {name = mobs_mc.items.leather, + {name = "mcl_mobitems:leather", chance = 1, min = 0, max = 2, looting = "common",}, }, - + on_spawn = update_textures, do_custom = function(self, dtime) -- set needed values if not already present @@ -166,7 +182,7 @@ local horse = { -- Some weird human is riding. Buck them off? if self.driver and not self.tamed and self.buck_off_time <= 0 then if math.random() < 0.2 then - mobs.detach(self.driver, {x = 1, y = 0, z = 1}) + mcl_mobs.detach(self.driver, {x = 1, y = 0, z = 1}) -- TODO bucking animation else -- Nah, can't be bothered. Think about it again in one second @@ -187,7 +203,7 @@ local horse = { -- if driver present and horse has a saddle allow control of horse if self.driver and self._saddle then - mobs.drive(self, "run", "stand", false, dtime) + mcl_mobs.drive(self, "walk", "stand", false, dtime) return false -- skip rest of mob functions end @@ -199,11 +215,11 @@ local horse = { -- drop saddle when horse is killed while riding if self._saddle then - minetest.add_item(pos, mobs_mc.items.saddle) + minetest.add_item(pos, "mcl_mobitems:saddle") end -- also detach from horse properly if self.driver then - mobs.detach(self.driver, {x = 1, y = 0, z = 1}) + mcl_mobs.detach(self.driver, {x = 1, y = 0, z = 1}) end end, @@ -219,21 +235,6 @@ local horse = { local iname = item:get_name() local heal = 0 - --sneak click to breed the horse/feed it - if self.owner and self.owner == clicker:get_player_name() then - --attempt to enter breed state - if mobs.enter_breed_state(self,clicker) then - return - end - end - - --don't do any other logic with the baby - --make baby grow faster - if self.baby then - mobs.make_baby_grow_faster(self,clicker) - return - end - -- Taming self.temper = self.temper or (math.random(1,100)) @@ -242,24 +243,23 @@ local horse = { -- Feeding, intentionally not using mobs:feed_tame because horse taming is -- different and more complicated - if (iname == mobs_mc.items.sugar) then + if (iname == "mcl_core:sugar") then temper_increase = 3 - elseif (iname == mobs_mc.items.wheat) then + elseif (iname == "mcl_farming:wheat_item") then temper_increase = 3 - elseif (iname == mobs_mc.items.apple) then + elseif (iname == "mcl_core:apple") then temper_increase = 3 - elseif (iname == mobs_mc.items.golden_carrot) then + elseif (iname == "mcl_farming:carrot_item_gold") then temper_increase = 5 - elseif (iname == mobs_mc.items.golden_apple) then + elseif (iname == "mcl_core:apple_gold") then temper_increase = 10 -- Trying to ride elseif not self.driver then self.object:set_properties({stepheight = 1.1}) - mobs.attach(self, clicker) + mcl_mobs.attach(self, clicker) self.buck_off_time = 40 -- TODO how long does it take in minecraft? if self.temper > 100 then self.tamed = true -- NOTE taming can only be finished by riding the horse - mobs.tamed_effect(self) if not self.owner or self.owner == "" then self.owner = clicker:get_player_name() end @@ -268,62 +268,58 @@ local horse = { -- Clicking on the horse while riding ==> unmount elseif self.driver and self.driver == clicker then - mobs.detach(clicker, {x = 1, y = 0, z = 1}) + mcl_mobs.detach(clicker, {x = 1, y = 0, z = 1}) end -- If nothing happened temper_increase = 0 and addition does nothing self.temper = self.temper + temper_increase - --give the player some kind of idea - --of what's happening with the horse's temper - if self.temper <= 100 then - mobs.feed_effect(self) - else - mobs.tamed_effect(self) - end - return end if can_breed(self.name) then -- Breed horse with golden apple or golden carrot - if (iname == mobs_mc.items.golden_apple) then + if (iname == "mcl_core:apple_gold") then heal = 10 - elseif (iname == mobs_mc.items.golden_carrot) then + elseif (iname == "mcl_farming:carrot_item_gold") then heal = 4 end - if heal > 0 and mobs:feed_tame(self, clicker, heal, true, false) then + if heal > 0 and mcl_mobs:feed_tame(self, clicker, heal, true, false) then return end end -- Feed with anything else -- TODO heal amounts don't work - if (iname == mobs_mc.items.sugar) then + if (iname == "mcl_core:sugar") then heal = 1 - elseif (iname == mobs_mc.items.wheat) then + elseif (iname == "mcl_farming:wheat_item") then heal = 2 - elseif (iname == mobs_mc.items.apple) then + elseif (iname == "mcl_core:apple") then heal = 3 - elseif (iname == mobs_mc.items.hay_bale) then + elseif (iname == "mcl_farming:hay_block") then heal = 20 end - if heal > 0 and mobs:feed_tame(self, clicker, heal, false, false) then + if heal > 0 and mcl_mobs:feed_tame(self, clicker, heal, false, false) then + return + end + + if mcl_mobs:protect(self, clicker) then return end -- Make sure tamed horse is mature and being clicked by owner only if self.tamed and not self.child and self.owner == clicker:get_player_name() then - --local inv = clicker:get_inventory() + local inv = clicker:get_inventory() -- detatch player already riding horse if self.driver and clicker == self.driver then - mobs.detach(clicker, {x = 1, y = 0, z = 1}) + mcl_mobs.detach(clicker, {x = 1, y = 0, z = 1}) -- Put on saddle if tamed elseif not self.driver and not self._saddle - and iname == mobs_mc.items.saddle then + and iname == "mcl_mobitems:saddle" then -- Put on saddle and take saddle from player's inventory local w = clicker:get_wielded_item() @@ -380,15 +376,18 @@ local horse = { elseif not self.driver and self._saddle then self.object:set_properties({stepheight = 1.1}) - mobs.attach(self, clicker) + mcl_mobs.attach(self, clicker) + -- Used to capture horse + elseif not self.driver and iname ~= "" then + mcl_mobs:capture_mob(self, clicker, 0, 5, 60, false, nil) end end end, on_breed = function(parent1, parent2) local pos = parent1.object:get_pos() - local child = mobs:spawn_child(pos, parent1.name) + local child = mcl_mobs:spawn_child(pos, parent1.name) if child then local ent_c = child:get_luaentity() local p = math.random(1, 2) @@ -437,7 +436,7 @@ local horse = { end, } -mobs:register_mob("mobs_mc:horse", horse) +mcl_mobs:register_mob("mobs_mc:horse", horse) -- Skeleton horse local skeleton_horse = table.copy(horse) @@ -446,7 +445,7 @@ skeleton_horse.breath_max = -1 skeleton_horse.armor = {undead = 100, fleshy = 100} skeleton_horse.textures = {{"blank.png", "mobs_mc_horse_skeleton.png", "blank.png"}} skeleton_horse.drops = { - {name = mobs_mc.items.bone, + {name = "mcl_mobitems:bone", chance = 1, min = 0, max = 2,}, @@ -460,7 +459,7 @@ skeleton_horse.sounds = { distance = 16, } skeleton_horse.harmed_by_heal = true -mobs:register_mob("mobs_mc:skeleton_horse", skeleton_horse) +mcl_mobs:register_mob("mobs_mc:skeleton_horse", skeleton_horse) -- Zombie horse local zombie_horse = table.copy(horse) @@ -469,7 +468,7 @@ zombie_horse.breath_max = -1 zombie_horse.armor = {undead = 100, fleshy = 100} zombie_horse.textures = {{"blank.png", "mobs_mc_horse_zombie.png", "blank.png"}} zombie_horse.drops = { - {name = mobs_mc.items.rotten_flesh, + {name = "mcl_mobitems:rotten_flesh", chance = 1, min = 0, max = 2,}, @@ -484,7 +483,7 @@ zombie_horse.sounds = { distance = 16, } zombie_horse.harmed_by_heal = true -mobs:register_mob("mobs_mc:zombie_horse", zombie_horse) +mcl_mobs:register_mob("mobs_mc:zombie_horse", zombie_horse) -- Donkey local d = 0.86 -- donkey scale @@ -515,7 +514,7 @@ donkey.collisionbox = { donkey.jump = true donkey.jump_height = 3.75 -- can clear 1 block height -mobs:register_mob("mobs_mc:donkey", donkey) +mcl_mobs:register_mob("mobs_mc:donkey", donkey) -- Mule local m = 0.94 @@ -533,95 +532,59 @@ mule.collisionbox = { horse.collisionbox[5] * m, horse.collisionbox[6] * m, } -mobs:register_mob("mobs_mc:mule", mule) +mcl_mobs:register_mob("mobs_mc:mule", mule) --=========================== --Spawn Function -mobs:spawn_specific( +mcl_mobs:spawn_specific( "mobs_mc:horse", "overworld", "ground", { - "FlowerForest_beach", - "Forest_beach", - "StoneBeach", - "ColdTaiga_beach_water", - "Taiga_beach", + "flat", + "Plains", + "Plains_beach", + "SunflowerPlains", + "Savanna", + "Savanna_beach", + "SavannaM", "Savanna_beach", "Plains_beach", - "ExtremeHills_beach", - "ColdTaiga_beach", - "Swampland_shore", - "JungleM_shore", - "Jungle_shore", - "MesaPlateauFM_sandlevel", - "MesaPlateauF_sandlevel", - "MesaBryce_sandlevel", - "Mesa_sandlevel", - "Mesa", - "FlowerForest", - "Swampland", - "Taiga", - "ExtremeHills", - "Jungle", - "Savanna", - "BirchForest", - "MegaSpruceTaiga", - "MegaTaiga", - "ExtremeHills+", - "Forest", - "Plains", - "Desert", - "ColdTaiga", - "IcePlainsSpikes", - "SunflowerPlains", - "IcePlains", - "RoofedForest", - "ExtremeHills+_snowtop", - "MesaPlateauFM_grasstop", - "JungleEdgeM", - "ExtremeHillsM", - "JungleM", - "BirchForestM", - "MesaPlateauF", - "MesaPlateauFM", - "MesaPlateauF_grasstop", - "MesaBryce", - "JungleEdge", - "SavannaM", }, 0, minetest.LIGHT_MAX+1, 30, 15000, 4, -mobs_mc.spawn_height.water+3, -mobs_mc.spawn_height.overworld_max) +mobs_mc.water_level+3, +mcl_vars.mg_overworld_max) - -mobs:spawn_specific( +mcl_mobs:spawn_specific( "mobs_mc:donkey", "overworld", "ground", { -"Mesa", -"MesaPlateauFM_grasstop", -"MesaPlateauF", -"MesaPlateauFM", -"MesaPlateauF_grasstop", -"MesaBryce", + "flat", + "Plains", + "Plains_beach", + "SunflowerPlains", + "Savanna", + "Savanna_beach", + "SavannaM", + "Savanna_beach", + "Plains_beach", }, 0, minetest.LIGHT_MAX+1, 30, 15000, 4, -mobs_mc.spawn_height.water+3, -mobs_mc.spawn_height.overworld_max) +mobs_mc.water_level+3, +mcl_vars.mg_overworld_max) -- spawn eggs -mobs:register_egg("mobs_mc:horse", S("Horse"), "mobs_mc_spawn_icon_horse.png", 0) -mobs:register_egg("mobs_mc:skeleton_horse", S("Skeleton Horse"), "mobs_mc_spawn_icon_horse_skeleton.png", 0) +mcl_mobs:register_egg("mobs_mc:horse", S("Horse"), "mobs_mc_spawn_icon_horse.png", 0) +mcl_mobs:register_egg("mobs_mc:skeleton_horse", S("Skeleton Horse"), "mobs_mc_spawn_icon_horse_skeleton.png", 0) --mobs:register_egg("mobs_mc:zombie_horse", S("Zombie Horse"), "mobs_mc_spawn_icon_horse_zombie.png", 0) -mobs:register_egg("mobs_mc:donkey", S("Donkey"), "mobs_mc_spawn_icon_donkey.png", 0) -mobs:register_egg("mobs_mc:mule", S("Mule"), "mobs_mc_spawn_icon_mule.png", 0) +mcl_mobs:register_egg("mobs_mc:donkey", S("Donkey"), "mobs_mc_spawn_icon_donkey.png", 0) +mcl_mobs:register_egg("mobs_mc:mule", S("Mule"), "mobs_mc_spawn_icon_mule.png", 0) diff --git a/mods/ENTITIES/mobs_mc/init.lua b/mods/ENTITIES/mobs_mc/init.lua index 1e3481b93..5406dd86f 100644 --- a/mods/ENTITIES/mobs_mc/init.lua +++ b/mods/ENTITIES/mobs_mc/init.lua @@ -2,45 +2,100 @@ --maikerumine --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes +mobs_mc = {} -local path = minetest.get_modpath(minetest.get_current_modname()) +local pr = PseudoRandom(os.time()*5) -if not minetest.get_modpath("mobs_mc_gameconfig") then - mobs_mc = {} +local offsets = {} +for x=-2, 2 do + for z=-2, 2 do + table.insert(offsets, {x=x, y=0, z=z}) + end end --- For utility functions -mobs_mc.tools = {} +--[[ Periodically check and teleport mob to owner if not sitting (order ~= "sit") and +the owner is too far away. To be used with do_custom. Note: Optimized for mobs smaller than 1×1×1. +Larger mobs might have space problems after teleportation. --- 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 +* dist: Minimum required distance from owner to teleport. Default: 12 +* 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 + if not self.owner or self.order == "sit" then + return + end + if not teleport_check_interval then + teleport_check_interval = 4 + end + if not dist then + dist = 12 + end + if self._teleport_timer == nil then + self._teleport_timer = teleport_check_interval + return + end + self._teleport_timer = self._teleport_timer - dtime + if self._teleport_timer <= 0 then + self._teleport_timer = teleport_check_interval + local mob_pos = self.object:get_pos() + local owner = minetest.get_player_by_name(self.owner) + if not owner then + -- No owner found, no teleportation + return + end + local owner_pos = owner:get_pos() + local dist_from_owner = vector.distance(owner_pos, mob_pos) + if dist_from_owner > dist then + -- Check for nodes below air in a 5×1×5 area around the owner position + local check_offsets = table.copy(offsets) + -- Attempt to place mob near player. Must be placed on walkable node below a non-walkable one. Place inside that air node. + while #check_offsets > 0 do + local r = pr:next(1, #check_offsets) + local telepos = vector.add(owner_pos, check_offsets[r]) + local telepos_below = {x=telepos.x, y=telepos.y-1, z=telepos.z} + table.remove(check_offsets, r) + -- Long story short, spawn on a platform + local trynode = minetest.registered_nodes[minetest.get_node(telepos).name] + local trybelownode = minetest.registered_nodes[minetest.get_node(telepos_below).name] + if trynode and not trynode.walkable and + trybelownode and trybelownode.walkable then + -- Correct position found! Let's teleport. + self.object:set_pos(telepos) + return + end + end + end + end end -else - -- No items are overwritten, so always return true - mobs_mc.is_item_variable_overridden = function(id) +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 mcl_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 ---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") +mobs_mc.shears_wear = 276 +mobs_mc.water_level = tonumber(minetest.settings:get("water_level")) or 0 -- Animals +local path = minetest.get_modpath("mobs_mc") dofile(path .. "/bat.lua") -- Mesh and animation by toby109tt / https://github.com/22i dofile(path .. "/rabbit.lua") -- Mesh and animation byExeterDad dofile(path .. "/chicken.lua") -- Mesh and animation by Pavel_S @@ -57,8 +112,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 .. "/pillager.lua") -- Mesh by KrupnoPavel and MrRar, animation by MrRar @@ -90,12 +143,3 @@ dofile(path .. "/slime+magma_cube.lua") -- Wuzzy dofile(path .. "/spider.lua") -- Spider by AspireMint (fishyWET (CC-BY-SA 3.0 license for texture) dofile(path .. "/vex.lua") -- KrupnoPavel dofile(path .. "/wither.lua") -- Mesh and animation by toby109tt / https://github.com/22i ---NOTES: --- ---[[ -COLISIONBOX in minetest press f5 to see where you are looking at then put these wool collor nodes on the ground in direction of north/east/west... to make colisionbox editing easier -#1west-pink/#2down/#3south-blue/#4east-red/#5up/#6north-yelow -{-1, -0.5, -1, 1, 3, 1}, Right, Bottom, Back, Left, Top, Front ---]] --- --- diff --git a/mods/ENTITIES/mobs_mc/llama.lua b/mods/ENTITIES/mobs_mc/llama.lua index 9c3f681b1..a211b117a 100644 --- a/mods/ENTITIES/mobs_mc/llama.lua +++ b/mods/ENTITIES/mobs_mc/llama.lua @@ -1,4 +1,4 @@ -local S = minetest.get_translator(minetest.get_current_modname()) +local S = minetest.get_translator("mobs_mc") --################### --################### LLAMA @@ -24,19 +24,10 @@ local carpets = { unicolor_light_blue = { "mcl_wool:light_blue_carpet", "light_blue" }, } -mobs:register_mob("mobs_mc:llama", { +mcl_mobs:register_mob("mobs_mc:llama", { description = S("Llama"), type = "animal", spawn_class = "passive", - rotate = 270, - neutral = true, - group_attack = true, - attack_type = "projectile", - 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) - end, hp_min = 15, hp_max = 30, xp_min = 1, @@ -51,7 +42,6 @@ mobs:register_mob("mobs_mc:llama", { {"blank.png", "blank.png", "mobs_mc_llama_gray.png"}, {"blank.png", "blank.png", "mobs_mc_llama_white.png"}, {"blank.png", "blank.png", "mobs_mc_llama.png"}, - -- TODO: Add llama carpet textures (Pixel Perfection seems to use verbatim copy from Minecraft :-( ) }, visual_size = {x=3, y=3}, makes_footstep_sound = true, @@ -59,13 +49,9 @@ mobs:register_mob("mobs_mc:llama", { walk_velocity = 1, run_velocity = 4.4, follow_velocity = 4.4, - breed_distance = 1.5, - baby_size = 0.5, - follow_distance = 2, floats = 1, - reach = 6, drops = { - {name = mobs_mc.items.leather, + {name = "mcl_mobitems:leather", chance = 1, min = 0, max = 2, @@ -96,7 +82,7 @@ mobs:register_mob("mobs_mc:llama", { look_start = 78, look_end = 108, }, - follow = mobs_mc.items.hay_bale, + follow = { "mcl_farming:wheat_item", "mcl_farming:hay_block" }, view_range = 16, do_custom = function(self, dtime) @@ -115,7 +101,7 @@ mobs:register_mob("mobs_mc:llama", { -- if driver present allow control of llama if self.driver then - mobs.drive(self, "walk", "stand", false, dtime) + mcl_mobs.drive(self, "walk", "stand", false, dtime) return false -- skip rest of mob functions end @@ -127,7 +113,7 @@ mobs:register_mob("mobs_mc:llama", { -- detach from llama properly if self.driver then - mobs.detach(self.driver, {x = 1, y = 0, z = 1}) + mcl_mobs.detach(self.driver, {x = 1, y = 0, z = 1}) end end, @@ -139,111 +125,68 @@ mobs:register_mob("mobs_mc:llama", { return end - --owner is broken for this - --we'll make the owner this guy - --attempt to enter breed state - if mobs.enter_breed_state(self,clicker) then - self.tamed = true - self.owner = clicker:get_player_name() - return + local item = clicker:get_wielded_item() + if item:get_name() == "mcl_farming:hay_block" then + -- Breed with hay bale + if mcl_mobs:feed_tame(self, clicker, 1, true, false) then return end + else + -- Feed with anything else + if mcl_mobs:feed_tame(self, clicker, 1, false, true) then return end end - - --ignore other logic - --make baby grow faster - if self.baby then - mobs.make_baby_grow_faster(self,clicker) - return - end - + if mcl_mobs:protect(self, clicker) then return end -- Make sure tamed llama is mature and being clicked by owner only if self.tamed and not self.child and self.owner == clicker:get_player_name() then - local item = clicker:get_wielded_item() - --safety catch - if not item then - return - end - - - - --put chest on carpeted llama - if self.carpet and not self.chest and item:get_name() == "mcl_chests:chest" then - if not minetest.is_creative_enabled(clicker:get_player_name()) then - item:take_item() - clicker:set_wielded_item(item) - end - - self.base_texture = table.copy(self.base_texture) - self.base_texture[1] = "mobs_mc_llama_chest.png" - self.object:set_properties({ - textures = self.base_texture, - }) - self.chest = true - - return --don't attempt to ride - end - - - -- Place carpet - --TODO: Re-enable this code when carpet textures arrived. - if minetest.get_item_group(item:get_name(), "carpet") == 1 then - - for group, carpetdata in pairs(carpets) do - if minetest.get_item_group(item:get_name(), group) == 1 then - if not minetest.is_creative_enabled(clicker:get_player_name()) then - item:take_item() - clicker:set_wielded_item(item) - - --shoot off old carpet - if self.carpet then - minetest.add_item(self.object:get_pos(), self.carpet) - end - end - - local substr = carpetdata[2] - local tex_carpet = "mobs_mc_llama_decor_"..substr..".png" - - self.base_texture = table.copy(self.base_texture) - self.base_texture[2] = tex_carpet - self.object:set_properties({ - textures = self.base_texture, - }) - self.carpet = item:get_name() - self.drops = { - {name = mobs_mc.items.leather, - chance = 1, - min = 0, - max = 2,}, - {name = item:get_name(), - chance = 1, - min = 1, - max = 1,}, - } - return + -- Place carpet + if minetest.get_item_group(item:get_name(), "carpet") == 1 and not self.carpet then + for group, carpetdata in pairs(carpets) do + if minetest.get_item_group(item:get_name(), group) == 1 then + if not minetest.is_creative_enabled(clicker:get_player_name()) then + item:take_item() + clicker:set_wielded_item(item) end + local substr = carpetdata[2] + local tex_carpet = "mobs_mc_llama_decor_"..substr..".png" + self.base_texture = table.copy(self.base_texture) + self.base_texture[2] = tex_carpet + self.object:set_properties({ + textures = self.base_texture, + }) + self.carpet = item:get_name() + self.drops = { + {name = "mcl_mobitems:leather", + chance = 1, + min = 0, + max = 2,}, + {name = item:get_name(), + chance = 1, + min = 1, + max = 1,}, + } + return end end + end - if self.carpet then - -- detatch player already riding llama - if self.driver and clicker == self.driver then + -- detatch player already riding llama + if self.driver and clicker == self.driver then - mobs.detach(clicker, {x = 1, y = 0, z = 1}) + mcl_mobs.detach(clicker, {x = 1, y = 0, z = 1}) - -- attach player to llama - elseif not self.driver then + -- attach player to llama + elseif not self.driver then - self.object:set_properties({stepheight = 1.1}) - mobs.attach(self, clicker) - end - end + self.object:set_properties({stepheight = 1.1}) + mcl_mobs.attach(self, clicker) + end + -- Used to capture llama + elseif not self.driver and clicker:get_wielded_item():get_name() ~= "" then + mcl_mobs:capture_mob(self, clicker, 0, 5, 60, false, nil) end end, - --[[ - TODO: Enable this code when carpet textures arrived. on_breed = function(parent1, parent2) -- When breeding, make sure the child has no carpet local pos = parent1.object:get_pos() @@ -253,7 +196,7 @@ mobs:register_mob("mobs_mc:llama", { else parent = parent2 end - child = mobs:spawn_child(pos, parent.name) + child = mcl_mobs:spawn_child(pos, parent.name) if child then local ent_c = child:get_luaentity() ent_c.base_texture = table.copy(ent_c.base_texture) @@ -265,65 +208,35 @@ mobs:register_mob("mobs_mc:llama", { return false end end, - ]] }) --spawn -mobs:spawn_specific( +mcl_mobs:spawn_specific( "mobs_mc:llama", "overworld", "ground", { -"Mesa", -"MesaPlateauFM_grasstop", -"MesaPlateauF", -"MesaPlateauFM", -"MesaPlateauF_grasstop", -"MesaBryce", + "Mesa", + "MesaPlateauFM_grasstop", + "MesaPlateauF", + "MesaPlateauFM", + "MesaPlateauF_grasstop", + "MesaBryce", + "Jungle", + "Jungle_shore", + "JungleM", + "JungleM_shore", + "JungleEdge", + "JungleEdgeM", }, 0, minetest.LIGHT_MAX+1, 30, 15000, 5, -mobs_mc.spawn_height.water+15, -mobs_mc.spawn_height.overworld_max) +mobs_mc.water_level+15, +mcl_vars.mg_overworld_max) -- spawn eggs -mobs:register_egg("mobs_mc:llama", S("Llama"), "mobs_mc_spawn_icon_llama.png", 0) - - --- llama spit -mobs:register_arrow("mobs_mc:spit", { - visual = "sprite", - visual_size = {x = 0.3, y = 0.3}, - textures = {"mobs_mc_spit.png"}, - velocity = 1, - speed = 1, - tail = 1, - tail_texture = "mobs_mc_spit.png", - tail_size = 2, - tail_distance_divider = 4, - - hit_player = function(self, player) - --[[if rawget(_G, "armor") and armor.last_damage_types then - armor.last_damage_types[player:get_player_name()] = "spit" - end]] - player:punch(self.object, 1.0, { - full_punch_interval = 1.0, - damage_groups = {fleshy = self._damage}, - }, nil) - end, - - hit_mob = function(self, mob) - mob:punch(self.object, 1.0, { - full_punch_interval = 1.0, - damage_groups = {fleshy = self._damage}, - }, nil) - end, - - hit_node = function(self, pos, node) - --does nothing - end -}) \ No newline at end of file +mcl_mobs:register_egg("mobs_mc:llama", S("Llama"), "mobs_mc_spawn_icon_llama.png", 0) diff --git a/mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr b/mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr index 6598cd481..676415d69 100644 --- a/mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr +++ b/mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr @@ -1,7 +1,4 @@ # 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 @@ -28,7 +25,6 @@ Pig=Schwein Polar Bear=Eisbär Rabbit=Kaninchen Killer Bunny=Killerkaninchen -The Killer Bunny=Das Killerkaninchen Sheep=Schaf Shulker=Shulker Silverfish=Silberfischchen @@ -53,13 +49,6 @@ 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 @@ -73,4 +62,3 @@ 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 index c61c09943..7f89bb664 100644 --- a/mods/ENTITIES/mobs_mc/locale/mobs_mc.es.tr +++ b/mods/ENTITIES/mobs_mc/locale/mobs_mc.es.tr @@ -1,7 +1,4 @@ # 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 @@ -28,7 +25,6 @@ Pig=Cerdo Polar Bear=Oso polar Rabbit=Conejo Killer Bunny=Conejo asesino -The Killer Bunny=El Conejo asesino Sheep=Oveja Shulker=Shulker Silverfish=Lepisma @@ -53,13 +49,6 @@ 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 diff --git a/mods/ENTITIES/mobs_mc/locale/mobs_mc.pl.tr b/mods/ENTITIES/mobs_mc/locale/mobs_mc.pl.tr deleted file mode 100644 index 06eaa457a..000000000 --- a/mods/ENTITIES/mobs_mc/locale/mobs_mc.pl.tr +++ /dev/null @@ -1,75 +0,0 @@ -# textdomain: mobs_mc -Totem of Undying=Token nieśmiertelności -A totem of undying is a rare artifact which may safe you from certain death.=Totem nieśmiertelności to rzadki artefakt, który może uchronić cię przed pewną śmiercią. -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.=Totem działa tylko kiedy trzymasz go w dłoni. Jeśli otrzymasz obrażenia od upadku zostaniesz oszczędzony i pozostanie ci 1 HP, jednak totem zostanie wtedy zniszczony. -Agent=Agent -Bat=Nietoperz -Blaze=Płomyk -Chicken=Kurczak -Cow=Krowa -Mooshroom=Muuuchomor -Creeper=Creeper -Ender Dragon=Smok kresu -Enderman=Enderman -Endermite=Endermit -Ghast=Ghast -Elder Guardian=Prastrażnik -Guardian=Strażnik -Horse=Koń -Skeleton Horse=Koń szkielet -Zombie Horse=Koń zombie -Donkey=Osioł -Mule=Muł -Iron Golem=Żelazny golem -Llama=Lama -Ocelot=Ocelot -Parrot=Papuga -Pig=Świnia -Polar Bear=Niedźwiedź polarny -Rabbit=Królik -Killer Bunny=Królik zabójca -Sheep=Owca -Shulker=Shulker -Silverfish=Rybik cukrowy -Skeleton=Szkielet -Stray=Tułacz -Wither Skeleton=Witherowy szkielet -Magma Cube=Kostka magmy -Slime=Szlam -Snow Golem=Śnieżny golem -Spider=Pająk -Cave Spider=Pająk jaskiniowy -Squid=Kałamarnica -Vex=Dręczyciel -Evoker=Przywoływacz -Illusioner=Iluzjonista -Villager=Osadnik -Vindicator=Obrońca -Zombie Villager=Osadnik zombie -Witch=Wiedźma -Wither=Wither -Wolf=Wilk -Husk=Posuch -Zombie=Zombie -Zombie Pigman=Świniak zombie -Iron Horse Armor=Żelazna zbroja dla konia -Iron horse armor can be worn by horses to increase their protection from harm a bit.=Żelazna zbroja dla konia może być noszona przez konie aby nieco zwiększyć ich odporność na obrażenia. -Golden Horse Armor=Złota zbroja dla konia -Golden horse armor can be worn by horses to increase their protection from harm.=Złota zbroja dla konia może być noszona przez konie aby zwiększyć ich odporność na obrażenia. -Diamond Horse Armor=Diamentowa zbroja dla konia -Diamond horse armor can be worn by horses to greatly increase their protection from harm.=Diamentowa zbroja dla konia może być noszona przez konie aby istotnie zwiększyć ich odporność na obrażenia. -Place it on a horse to put on the horse armor. Donkeys and mules can't wear horse armor.=Połóż ją na koniu aby założyć zbroję dla konia. Osły i muły nie mogą nosić zbroi dla konia. -Farmer=Rolnik -Fisherman=Rybak -Fletcher=Łuczarz -Shepherd=Pasterz -Librarian=Bibliotekarz -Cartographer=Kartograf -Armorer=Płatnerz -Leatherworker=Rymarz -Butcher=Rzeźnik -Weapon Smith=Zbrojmistrz -Tool Smith=Narzędziarz -Cleric=Kapłan -Nitwit=Głupiec -Protects you from death while wielding it=Chroni przed śmiercią gdy go trzymasz diff --git a/mods/ENTITIES/mobs_mc/mod.conf b/mods/ENTITIES/mobs_mc/mod.conf index 98f48b388..3d6a6928d 100644 --- a/mods/ENTITIES/mobs_mc/mod.conf +++ b/mods/ENTITIES/mobs_mc/mod.conf @@ -1,6 +1,6 @@ name = mobs_mc author = maikerumine description = Adds Minecraft-like monsters and animals. -depends = mcl_init, mcl_particles, mcl_mobs, mcl_wip +depends = mcl_init, mcl_particles, mcl_mobs, mcl_wip, mcl_core 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/attributes.txt b/mods/ENTITIES/mobs_mc/models/attributes.txt deleted file mode 100644 index ec59e0f70..000000000 --- a/mods/ENTITIES/mobs_mc/models/attributes.txt +++ /dev/null @@ -1 +0,0 @@ -Ghast fixed by epCode - Thanks! \ No newline at end of file diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_ghast.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_ghast.b3d index ab34f334f8321e30f05ae4b53a946b4095587ef0..cebc037c05efdcf2343c4232099b12fffc4c5c89 100644 GIT binary patch literal 75657 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 V09X&5s-C+ER1az5QHx%`0RZsDdanQg delta 18141 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 KUl*Z12>%DJKTiJu diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_villager.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_villager.b3d index 1b92adfa5924f05da75ec910d2dcbd9f1611f9b8..a941ca8efffe8ffdd3a7d389bd876e6e931f7450 100644 GIT binary patch literal 67116 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 literal 213725 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 0 or minetest.get_item_group(n2,"lava") > 0 then + o:set_detach() + self.detach_timer = 0 + return + end + end + end + end + elseif not self.detach_timer then + for _,p in pairs(minetest.get_connected_players()) do + if vector.distance(self.object:get_pos(),p:get_pos()) < 0.5 then + perch(self,p) + return + end + end + elseif self.detach_timer then + if self.detach_timer > 1 then + self.detach_timer = nil + else + self.detach_timer = self.detach_timer + dtime + end + end +end + +mcl_mobs:register_mob("mobs_mc:parrot", { description = S("Parrot"), type = "npc", spawn_class = "passive", @@ -20,14 +86,11 @@ mobs:register_mob("mobs_mc:parrot", { hp_max = 6, xp_min = 1, xp_max = 3, - tilt_fly = true, - collisionbox = {-0.25, 0, -0.25, 0.25, 0.9, 0.25}, - eye_height = 0.45, + collisionbox = {-0.25, -0.01, -0.25, 0.25, 0.89, 0.25}, visual = "mesh", mesh = "mobs_mc_parrot.b3d", textures = {{"mobs_mc_parrot_blue.png"},{"mobs_mc_parrot_green.png"},{"mobs_mc_parrot_grey.png"},{"mobs_mc_parrot_red_blue.png"},{"mobs_mc_parrot_yellow_blue.png"}}, visual_size = {x=3, y=3}, - rotate = 270, walk_velocity = 3, run_velocity = 5, sounds = { @@ -38,22 +101,22 @@ mobs:register_mob("mobs_mc:parrot", { distance = 16, }, drops = { - {name = mobs_mc.items.feather, + {name = "mcl_mobitems:feather", chance = 1, min = 1, max = 2, looting = "common",}, }, - animation = { + animation = { stand_speed = 50, walk_speed = 50, fly_speed = 50, - stand_start = 30, - stand_end = 45, + stand_start = 0, + stand_end = 0, fly_start = 30, fly_end = 45, - walk_start = 30, - walk_end = 45, + walk_start = 0, + walk_end = 20, -- TODO: actual walk animation --walk_start = 0, --walk_end = 20, @@ -69,12 +132,17 @@ mobs:register_mob("mobs_mc:parrot", { makes_footstep_sound = false, fear_height = 0, view_range = 16, - follow = mobs_mc.follow.parrot, + follow = { + "mcl_farming:wheat_seeds", + "mcl_farming:melon_seeds", + "mcl_farming:pumpkin_seeds", + "mcl_farming:beetroot_seeds", + }, on_rightclick = function(self, clicker) if self._doomed then return end local item = clicker:get_wielded_item() -- Kill parrot if fed with cookie - if item:get_name() == mobs_mc.items.cookie then + if item:get_name() == "mcl_farming:cookie" then minetest.sound_play("mobs_mc_animal_eat_generic", {object = self.object, max_hear_distance=16}, true) self.health = 0 -- Doomed to die @@ -85,15 +153,22 @@ mobs:register_mob("mobs_mc:parrot", { end return end - -- Feed to tame, but not breed - if mobs:feed_tame(self, clicker, 1, false, true) then return end + if mcl_mobs:feed_tame(self, clicker, 1, false, true) then return end + perch(self,clicker) + end, + do_custom = function(self,dtime) + check_perch(self,dtime) + end, + do_punch = function(self,puncher) --do_punch is the mcl_mobs_redo variant - it gets called by on_punch later.... + if self.object:get_attach() == puncher then + return false --return false explicitly here. mcl_mobs checks for that + end end, - }) -- Parrots spawn rarely in jungles. TODO: Also check for jungle *biome* <- I'll get to this eventually -j4i -mobs:spawn_specific( +mcl_mobs:spawn_specific( "mobs_mc:parrot", "overworld", "ground", @@ -108,8 +183,8 @@ minetest.LIGHT_MAX+1, 7, 30000, 1, -mobs_mc.spawn_height.water+7, -mobs_mc.spawn_height.overworld_max) +mobs_mc.water_level+7, +mcl_vars.mg_overworld_max) -- spawn eggs -mobs:register_egg("mobs_mc:parrot", S("Parrot"), "mobs_mc_spawn_icon_parrot.png", 0) +mcl_mobs:register_egg("mobs_mc:parrot", S("Parrot"), "mobs_mc_spawn_icon_parrot.png", 0) diff --git a/mods/ENTITIES/mobs_mc/pig.lua b/mods/ENTITIES/mobs_mc/pig.lua index 84ff996f2..3cf88b915 100644 --- a/mods/ENTITIES/mobs_mc/pig.lua +++ b/mods/ENTITIES/mobs_mc/pig.lua @@ -1,13 +1,12 @@ --License for code WTFPL and otherwise stated in readmes -local S = minetest.get_translator(minetest.get_current_modname()) +local S = minetest.get_translator("mobs_mc") -mobs:register_mob("mobs_mc:pig", { +mcl_mobs:register_mob("mobs_mc:pig", { description = S("Pig"), type = "animal", spawn_class = "passive", - skittish = true, - rotate = 270, + runaway = true, hp_min = 10, hp_max = 10, xp_min = 1, @@ -20,32 +19,13 @@ mobs:register_mob("mobs_mc:pig", { "mobs_mc_pig.png", -- base "blank.png", -- saddle }}, - - --head code - has_head = true, - head_bone = "head", - - swap_y_with_x = false, - reverse_head_yaw = false, - - head_bone_pos_y = 2.4, - head_bone_pos_z = 0, - - head_height_offset = 1.1, - head_direction_offset = 0, - head_pitch_modifier = 0, - --end head code - visual_size = {x=2.5, y=2.5}, makes_footstep_sound = true, walk_velocity = 1, run_velocity = 3, follow_velocity = 3.4, - breed_distance = 1.5, - baby_size = 0.5, - follow_distance = 2, drops = { - {name = mobs_mc.items.porkchop_raw, + {name = "mcl_mobitems:porkchop", chance = 1, min = 1, max = 3, @@ -70,7 +50,12 @@ mobs:register_mob("mobs_mc:pig", { run_start = 0, run_end = 40, }, - follow = "mcl_farming:carrot_item", + follow = { + "mcl_farming:potato_item", + "mcl_farming:carrot_item", + "mcl_farming:beetroot_item", + "mcl_mobitems:carrot_on_a_stick" + }, view_range = 8, do_custom = function(self, dtime) @@ -89,7 +74,7 @@ mobs:register_mob("mobs_mc:pig", { -- if driver present allow control of horse if self.driver then - mobs.drive(self, "walk", "stand", false, dtime) + mcl_mobs.drive(self, "walk", "stand", false, dtime) return false -- skip rest of mob functions end @@ -102,7 +87,7 @@ mobs:register_mob("mobs_mc:pig", { -- drop saddle when horse is killed while riding -- also detach from horse properly if self.driver then - mobs.detach(self.driver, {x = 1, y = 0, z = 1}) + mcl_mobs.detach(self.driver, {x = 1, y = 0, z = 1}) end end, @@ -111,17 +96,12 @@ mobs:register_mob("mobs_mc:pig", { return end - --attempt to enter breed state - if mobs.enter_breed_state(self,clicker) then - return - end - - --ignore other logic - --make baby grow faster - if self.baby then - mobs.make_baby_grow_faster(self,clicker) - return + local wielditem = clicker:get_wielded_item() + -- Feed pig + if wielditem:get_name() ~= "mcl_mobitems:carrot_on_a_stick" then + if mcl_mobs:feed_tame(self, clicker, 1, true, true) then return end end + if mcl_mobs:protect(self, clicker) then return end if self.child then return @@ -129,9 +109,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 + if item:get_name() == "mcl_mobitems:saddle" and self.saddle ~= "yes" then self.base_texture = { "blank.png", -- baby "mobs_mc_pig.png", -- base @@ -143,11 +121,11 @@ mobs:register_mob("mobs_mc:pig", { self.saddle = "yes" self.tamed = true self.drops = { - {name = mobs_mc.items.porkchop_raw, + {name = "mcl_mobitems:porkchop", chance = 1, min = 1, max = 3,}, - {name = mobs_mc.items.saddle, + {name = "mcl_mobitems:saddle", chance = 1, min = 1, max = 1,}, @@ -163,16 +141,16 @@ mobs:register_mob("mobs_mc:pig", { end -- Mount or detach player - --local name = clicker:get_player_name() + local name = clicker:get_player_name() if self.driver and clicker == self.driver then -- Detach if already attached - mobs.detach(clicker, {x=1, y=0, z=0}) + mcl_mobs.detach(clicker, {x=1, y=0, z=0}) return - elseif not self.driver and self.saddle == "yes" and wielditem:get_name() == mobs_mc.items.carrot_on_a_stick then + elseif not self.driver and self.saddle == "yes" and wielditem:get_name() == "mcl_mobitems:carrot_on_a_stick" then -- Ride pig if it has a saddle and player uses a carrot on a stick - mobs.attach(self, clicker) + mcl_mobs.attach(self, clicker) if not minetest.is_creative_enabled(clicker:get_player_name()) then @@ -184,19 +162,23 @@ mobs:register_mob("mobs_mc:pig", { if def.sounds and def.sounds.breaks then minetest.sound_play(def.sounds.breaks, {pos = clicker:get_pos(), max_hear_distance = 8, gain = 0.5}, true) end - wielditem = {name = mobs_mc.items.fishing_rod, count = 1} + wielditem = {name = "mcl_fishing:fishing_rod", count = 1} else wielditem:add_wear(2521) end inv:set_stack("main",self.driver:get_wield_index(), wielditem) end return + + -- Capture pig + elseif not self.driver and clicker:get_wielded_item():get_name() ~= "" then + mcl_mobs:capture_mob(self, clicker, 0, 5, 60, false, nil) end end, on_breed = function(parent1, parent2) local pos = parent1.object:get_pos() - local child = mobs:spawn_child(pos, parent1.name) + local child = mcl_mobs:spawn_child(pos, parent1.name) if child then local ent_c = child:get_luaentity() ent_c.tamed = true @@ -206,66 +188,55 @@ mobs:register_mob("mobs_mc:pig", { end, }) -mobs:spawn_specific( +mcl_mobs:spawn_specific( "mobs_mc:pig", "overworld", "ground", { - "FlowerForest_beach", - "Forest_beach", - "StoneBeach", - "ColdTaiga_beach_water", - "Taiga_beach", - "Savanna_beach", - "Plains_beach", - "ExtremeHills_beach", - "ColdTaiga_beach", - "Swampland_shore", - "JungleM_shore", - "Jungle_shore", - "MesaPlateauFM_sandlevel", - "MesaPlateauF_sandlevel", - "MesaBryce_sandlevel", - "Mesa_sandlevel", - "Mesa", - "FlowerForest", - "Swampland", - "Taiga", - "ExtremeHills", - "Jungle", - "Savanna", - "BirchForest", - "MegaSpruceTaiga", - "MegaTaiga", - "ExtremeHills+", - "Forest", - "Plains", - "Desert", - "ColdTaiga", + "flat", "IcePlainsSpikes", - "SunflowerPlains", - "IcePlains", - "RoofedForest", - "ExtremeHills+_snowtop", - "MesaPlateauFM_grasstop", - "JungleEdgeM", + "ColdTaiga", + "ColdTaiga_beach", + "ColdTaiga_beach_water", + "MegaTaiga", + "MegaSpruceTaiga", + "ExtremeHills", + "ExtremeHills_beach", "ExtremeHillsM", - "JungleM", + "ExtremeHills+", + "ExtremeHills+_snowtop", + "StoneBeach", + "Plains", + "Plains_beach", + "SunflowerPlains", + "Taiga", + "Taiga_beach", + "Forest", + "Forest_beach", + "FlowerForest", + "FlowerForest_beach", + "BirchForest", "BirchForestM", - "MesaPlateauF", - "MesaPlateauFM", - "MesaPlateauF_grasstop", - "MesaBryce", - "JungleEdge", + "RoofedForest", + "Savanna", + "Savanna_beach", "SavannaM", + "Jungle", + "Jungle_shore", + "JungleM", + "JungleM_shore", + "JungleEdge", + "JungleEdgeM", + "Swampland", + "Swampland_shore" }, 9, minetest.LIGHT_MAX+1, 30, 15000, 8, -mobs_mc.spawn_height.overworld_min, -mobs_mc.spawn_height.overworld_max) +mcl_vars.mg_overworld_min, +mcl_vars.mg_overworld_max) -- spawn eggs -mobs:register_egg("mobs_mc:pig", S("Pig"), "mobs_mc_spawn_icon_pig.png", 0) +mcl_mobs:register_egg("mobs_mc:pig", S("Pig"), "mobs_mc_spawn_icon_pig.png", 0) diff --git a/mods/ENTITIES/mobs_mc/polar_bear.lua b/mods/ENTITIES/mobs_mc/polar_bear.lua index 0f5296d35..3fd2d0a0c 100644 --- a/mods/ENTITIES/mobs_mc/polar_bear.lua +++ b/mods/ENTITIES/mobs_mc/polar_bear.lua @@ -1,13 +1,13 @@ --License for code WTFPL and otherwise stated in readmes -local S = minetest.get_translator(minetest.get_current_modname()) +local S = minetest.get_translator("mobs_mc") --################### --################### POLARBEAR --################### -mobs:register_mob("mobs_mc:polar_bear", { +mcl_mobs:register_mob("mobs_mc:polar_bear", { description = S("Polar Bear"), type = "animal", spawn_class = "passive", @@ -31,16 +31,16 @@ mobs:register_mob("mobs_mc:polar_bear", { walk_velocity = 1.2, run_velocity = 2.4, group_attack = true, - attack_type = "punch", + attack_type = "dogfight", drops = { -- 3/4 chance to drop raw fish (poor approximation) - {name = mobs_mc.items.fish_raw, + {name = "mcl_fishing:fish_raw", chance = 2, min = 0, max = 2, looting = "common",}, -- 1/4 to drop raw salmon - {name = mobs_mc.items.salmon_raw, + {name = "mcl_fishing:salmon_raw", chance = 4, min = 0, max = 2, @@ -68,7 +68,7 @@ mobs:register_mob("mobs_mc:polar_bear", { }) -mobs:spawn_specific( +mcl_mobs:spawn_specific( "mobs_mc:polar_bear", "overworld", "ground", @@ -83,8 +83,8 @@ minetest.LIGHT_MAX+1, 30, 7000, 3, -mobs_mc.spawn_height.overworld_min, -mobs_mc.spawn_height.overworld_max) +mcl_vars.mg_overworld_min, +mcl_vars.mg_overworld_max) -- spawn egg -mobs:register_egg("mobs_mc:polar_bear", S("Polar Bear"), "mobs_mc_spawn_icon_polarbear.png", 0) +mcl_mobs:register_egg("mobs_mc:polar_bear", S("Polar Bear"), "mobs_mc_spawn_icon_polarbear.png", 0) diff --git a/mods/ENTITIES/mobs_mc/sheep.lua b/mods/ENTITIES/mobs_mc/sheep.lua index 76f933a6b..d2d09be50 100644 --- a/mods/ENTITIES/mobs_mc/sheep.lua +++ b/mods/ENTITIES/mobs_mc/sheep.lua @@ -1,6 +1,6 @@ --License for code WTFPL and otherwise stated in readmes -local S = minetest.get_translator(minetest.get_current_modname()) +local S = minetest.get_translator("mobs_mc") --################### --################### SHEEP @@ -8,21 +8,22 @@ local S = minetest.get_translator(minetest.get_current_modname()) local colors = { -- group = { wool, textures } - unicolor_white = { mobs_mc.items.wool_white, "#FFFFFF00" }, - unicolor_dark_orange = { mobs_mc.items.wool_brown, "#502A00D0" }, - unicolor_grey = { mobs_mc.items.wool_light_grey, "#5B5B5BD0" }, - unicolor_darkgrey = { mobs_mc.items.wool_grey, "#303030D0" }, - unicolor_blue = { mobs_mc.items.wool_blue, "#0000CCD0" }, - unicolor_dark_green = { mobs_mc.items.wool_green, "#005000D0" }, - unicolor_green = { mobs_mc.items.wool_lime, "#50CC00D0" }, - unicolor_violet = { mobs_mc.items.wool_purple , "#5000CCD0" }, - unicolor_light_red = { mobs_mc.items.wool_pink, "#FF5050D0" }, - unicolor_yellow = { mobs_mc.items.wool_yellow, "#CCCC00D0" }, - unicolor_orange = { mobs_mc.items.wool_orange, "#CC5000D0" }, - unicolor_red = { mobs_mc.items.wool_red, "#CC0000D0" }, - 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_white = { "mcl_wool:white", "#FFFFFF00" }, + unicolor_dark_orange = { "mcl_wool:brown", "#502A00D0" }, + unicolor_grey = { "mcl_wool:silver", "#5B5B5BD0" }, + unicolor_darkgrey = { "mcl_wool:grey", "#303030D0" }, + unicolor_blue = { "mcl_wool:blue", "#0000CCD0" }, + unicolor_dark_green = { "mcl_wool:green", "#005000D0" }, + unicolor_green = { "mcl_wool:lime", "#50CC00D0" }, + unicolor_violet = { "mcl_wool:purple" , "#5000CCD0" }, + unicolor_light_red = { "mcl_wool:pink", "#FF5050D0" }, + unicolor_yellow = { "mcl_wool:yellow", "#CCCC00D0" }, + unicolor_orange = { "mcl_wool:orange", "#CC5000D0" }, + unicolor_red = { "mcl_wool:red", "#CC0000D0" }, + unicolor_cyan = { "mcl_wool:cyan", "#00CCCCD0" }, + unicolor_red_violet = { "mcl_wool:magenta", "#CC0050D0" }, + unicolor_black = { "mcl_wool:black", "#000000D0" }, + unicolor_light_blue = { "mcl_wool:light_blue", "#5050FFD0" }, } local rainbow_colors = { @@ -38,10 +39,6 @@ local rainbow_colors = { "unicolor_red_violet" } -if minetest.get_modpath("mcl_wool") then - colors["unicolor_light_blue"] = { mobs_mc.items.wool_light_blue, "#5050FFD0" } -end - local sheep_texture = function(color_group) if not color_group then color_group = "unicolor_white" @@ -55,7 +52,7 @@ end local gotten_texture = { "blank.png", "mobs_mc_sheep.png" } --mcsheep -mobs:register_mob("mobs_mc:sheep", { +mcl_mobs:register_mob("mobs_mc:sheep", { description = S("Sheep"), type = "animal", spawn_class = "passive", @@ -63,13 +60,8 @@ mobs:register_mob("mobs_mc:sheep", { hp_max = 8, xp_min = 1, xp_max = 3, - skittish = true, - breed_distance = 1.5, - baby_size = 0.5, - follow_distance = 2, - follow = mobs_mc.items.wheat, collisionbox = {-0.45, -0.01, -0.45, 0.45, 1.29, 0.45}, - rotate = 270, + visual = "mesh", visual_size = {x=3, y=3}, mesh = "mobs_mc_sheepfur.b3d", @@ -78,25 +70,8 @@ mobs:register_mob("mobs_mc:sheep", { color = "unicolor_white", 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, - - head_bone_pos_y = 3.6, - head_bone_pos_z = -0.6, - - head_height_offset = 1.0525, - head_direction_offset = 0.5, - head_pitch_modifier = 0, - --end head code - drops = { - {name = mobs_mc.items.mutton_raw, + {name = "mcl_mobitems:mutton", chance = 1, min = 1, max = 2, @@ -121,11 +96,15 @@ mobs:register_mob("mobs_mc:sheep", { walk_start = 0, walk_end = 40, run_start = 0, run_end = 40, }, + follow = { "mcl_farming:wheat_item" }, view_range = 12, -- Eat grass replace_rate = 20, - replace_what = mobs_mc.replace.sheep, + replace_what = { + { "mcl_core:dirt_with_grass", "mcl_core:dirt", -1 }, + { "mcl_flowers:tallgrass", "air", 0 }, + }, -- Properly regrow wool after eating grass on_replace = function(self, pos, oldnode, newnode) if not self.color or not colors[self.color] then @@ -135,7 +114,7 @@ mobs:register_mob("mobs_mc:sheep", { self.base_texture = sheep_texture(self.color) self.object:set_properties({ textures = self.base_texture }) self.drops = { - {name = mobs_mc.items.mutton_raw, + {name = "mcl_mobitems:mutton", chance = 1, min = 1, max = 2,}, @@ -150,6 +129,7 @@ mobs:register_mob("mobs_mc:sheep", { do_custom = function(self, dtime) if not self.initial_color_set then local r = math.random(0,100000) + local textures if r <= 81836 then -- 81.836% self.color = "unicolor_white" @@ -172,7 +152,7 @@ mobs:register_mob("mobs_mc:sheep", { self.base_texture = sheep_texture(self.color) self.object:set_properties({ textures = self.base_texture }) self.drops = { - {name = mobs_mc.items.mutton_raw, + {name = "mcl_mobitems:mutton", chance = 1, min = 1, max = 2,}, @@ -215,18 +195,10 @@ mobs:register_mob("mobs_mc:sheep", { on_rightclick = function(self, clicker) local item = clicker:get_wielded_item() - --attempt to enter breed state - if mobs.enter_breed_state(self,clicker) then - return - end + if mcl_mobs:feed_tame(self, clicker, 1, true, true) then return end + if mcl_mobs:protect(self, clicker) then return end - --make baby grow faster - if self.baby then - mobs.make_baby_grow_faster(self,clicker) - return - end - - if item:get_name() == mobs_mc.items.shears and not self.gotten and not self.child then + if item:get_name() == "mcl_tools:shears" and not self.gotten and not self.child then self.gotten = true local pos = self.object:get_pos() minetest.sound_play("mcl_tools_shears_cut", {pos = pos}, true) @@ -240,11 +212,11 @@ mobs:register_mob("mobs_mc:sheep", { textures = self.base_texture, }) if not minetest.is_creative_enabled(clicker:get_player_name()) then - item:add_wear(mobs_mc.misc.shears_wear) + item:add_wear(mobs_mc.shears_wear) clicker:get_inventory():set_stack("main", clicker:get_wield_index(), item) end self.drops = { - {name = mobs_mc.items.mutton_raw, + {name = "mcl_mobitems:mutton", chance = 1, min = 1, max = 2,}, @@ -266,7 +238,7 @@ mobs:register_mob("mobs_mc:sheep", { }) self.color = group self.drops = { - {name = mobs_mc.items.mutton_raw, + {name = "mcl_mobitems:mutton", chance = 1, min = 1, max = 2,}, @@ -280,11 +252,12 @@ mobs:register_mob("mobs_mc:sheep", { end return end + if mcl_mobs:capture_mob(self, clicker, 0, 5, 70, false, nil) then return end end, on_breed = function(parent1, parent2) -- Breed sheep and choose a fur color for the child. local pos = parent1.object:get_pos() - local child = mobs:spawn_child(pos, parent1.name) + local child = mcl_mobs:spawn_child(pos, parent1.name) if child then local ent_c = child:get_luaentity() local color1 = parent1.color @@ -331,67 +304,55 @@ mobs:register_mob("mobs_mc:sheep", { end end, }) -mobs:spawn_specific( +mcl_mobs:spawn_specific( "mobs_mc:sheep", "overworld", "ground", { - "FlowerForest_beach", - "Forest_beach", - "StoneBeach", - "ColdTaiga_beach_water", - "Taiga_beach", - "Savanna_beach", - "Plains_beach", - "ExtremeHills_beach", - "ColdTaiga_beach", - "Swampland_shore", - "JungleM_shore", - "Jungle_shore", - "MesaPlateauFM_sandlevel", - "MesaPlateauF_sandlevel", - "MesaBryce_sandlevel", - "Mesa_sandlevel", - "Mesa", - "FlowerForest", - "Swampland", - "Taiga", - "ExtremeHills", - "Jungle", - "Savanna", - "BirchForest", - "MegaSpruceTaiga", - "MegaTaiga", - "ExtremeHills+", - "Forest", - "Plains", - "Desert", - "ColdTaiga", + "flat", "IcePlainsSpikes", - "SunflowerPlains", - "IcePlains", - "RoofedForest", - "ExtremeHills+_snowtop", - "MesaPlateauFM_grasstop", - "JungleEdgeM", + "ColdTaiga", + "ColdTaiga_beach", + "ColdTaiga_beach_water", + "MegaTaiga", + "MegaSpruceTaiga", + "ExtremeHills", + "ExtremeHills_beach", "ExtremeHillsM", - "JungleM", + "ExtremeHills+", + "ExtremeHills+_snowtop", + "StoneBeach", + "Plains", + "Plains_beach", + "SunflowerPlains", + "Taiga", + "Taiga_beach", + "Forest", + "Forest_beach", + "FlowerForest", + "FlowerForest_beach", + "BirchForest", "BirchForestM", - "MesaPlateauF", - "MesaPlateauFM", - "MesaPlateauF_grasstop", - "MesaBryce", - "JungleEdge", + "RoofedForest", + "Savanna", + "Savanna_beach", "SavannaM", + "Jungle", + "Jungle_shore", + "JungleM", + "JungleM_shore", + "JungleEdge", + "JungleEdgeM", + "Swampland", + "Swampland_shore" }, 0, minetest.LIGHT_MAX+1, 30, 15000, 3, -mobs_mc.spawn_height.overworld_min, -mobs_mc.spawn_height.overworld_max) +mcl_vars.mg_overworld_min, +mcl_vars.mg_overworld_max) -- spawn eggs -mobs:register_egg("mobs_mc:sheep", S("Sheep"), "mobs_mc_spawn_icon_sheep.png", 0) - +mcl_mobs:register_egg("mobs_mc:sheep", S("Sheep"), "mobs_mc_spawn_icon_sheep.png", 0) diff --git a/mods/ENTITIES/mobs_mc/shulker.lua b/mods/ENTITIES/mobs_mc/shulker.lua index 1a5c4ec84..77273db2f 100644 --- a/mods/ENTITIES/mobs_mc/shulker.lua +++ b/mods/ENTITIES/mobs_mc/shulker.lua @@ -3,7 +3,7 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes -local S = minetest.get_translator(minetest.get_current_modname()) +local S = minetest.get_translator("mobs_mc") --################### --################### SHULKER @@ -11,11 +11,11 @@ local S = minetest.get_translator(minetest.get_current_modname()) -- animation 45-80 is transition between passive and attack stance -mobs:register_mob("mobs_mc:shulker", { +mcl_mobs:register_mob("mobs_mc:shulker", { description = S("Shulker"), type = "monster", spawn_class = "hostile", - attack_type = "projectile", + attack_type = "shoot", shoot_interval = 0.5, arrow = "mobs_mc:shulkerbullet", shoot_offset = 0.5, @@ -33,9 +33,10 @@ mobs:register_mob("mobs_mc:shulker", { -- TODO: Make shulker dye-able visual_size = {x=3, y=3}, walk_chance = 0, + knock_back = false, jump = false, drops = { - {name = mobs_mc.items.shulker_shell, + {name = "mcl_mobitems:shulker_shell", chance = 2, min = 1, max = 1, @@ -55,7 +56,7 @@ mobs:register_mob("mobs_mc:shulker", { }) -- bullet arrow (weapon) -mobs:register_arrow("mobs_mc:shulkerbullet", { +mcl_mobs:register_arrow("mobs_mc:shulkerbullet", { visual = "sprite", visual_size = {x = 0.25, y = 0.25}, textures = {"mobs_mc_shulkerbullet.png"}, @@ -80,9 +81,9 @@ mobs:register_arrow("mobs_mc:shulkerbullet", { }) -mobs:register_egg("mobs_mc:shulker", S("Shulker"), "mobs_mc_spawn_icon_shulker.png", 0) +mcl_mobs:register_egg("mobs_mc:shulker", S("Shulker"), "mobs_mc_spawn_icon_shulker.png", 0) -mobs:spawn_specific( +mcl_mobs:spawn_specific( "mobs_mc:shulker", "end", "ground", @@ -94,5 +95,5 @@ minetest.LIGHT_MAX+1, 30, 5000, 2, -mobs_mc.spawn_height.end_min, -mobs_mc.spawn_height.end_max) +mcl_vars.mg_end_min, +mcl_vars.mg_end_max) diff --git a/mods/ENTITIES/mobs_mc/skeleton+stray.lua b/mods/ENTITIES/mobs_mc/skeleton+stray.lua index f0e728e08..005bed66d 100644 --- a/mods/ENTITIES/mobs_mc/skeleton+stray.lua +++ b/mods/ENTITIES/mobs_mc/skeleton+stray.lua @@ -3,8 +3,8 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes -local S = minetest.get_translator(minetest.get_current_modname()) -local mod_bows = minetest.get_modpath("mcl_bows") +local S = minetest.get_translator("mobs_mc") +local mod_bows = minetest.get_modpath("mcl_bows") ~= nil --################### --################### SKELETON @@ -16,37 +16,21 @@ local skeleton = { description = S("Skeleton"), type = "monster", spawn_class = "hostile", - hostile = true, - rotate = 270, hp_min = 20, hp_max = 20, xp_min = 6, xp_max = 6, breath_max = -1, - eye_height = 1.5, - projectile_cooldown = 1.5, armor = {undead = 100, fleshy = 100}, collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.98, 0.3}, pathfinding = 1, group_attack = true, visual = "mesh", mesh = "mobs_mc_skeleton.b3d", - - --head code - has_head = false, - head_bone = "head", - - swap_y_with_x = true, - reverse_head_yaw = true, - - head_bone_pos_y = 2.4, - head_bone_pos_z = 0, - - head_height_offset = 1.1, - head_direction_offset = 0, - head_pitch_modifier = 0, - --end head code - + textures = { { + "mcl_bows_bow_0.png", -- bow + "mobs_mc_skeleton.png", -- skeleton + } }, visual_size = {x=1, y=1}, makes_footstep_sound = true, textures = { @@ -59,19 +43,19 @@ local skeleton = { walk_velocity = 1.2, run_velocity = 2.4, damage = 2, - reach = 3, + reach = 2, drops = { - {name = mobs_mc.items.arrow, + {name = "mcl_bows:arrow", chance = 1, min = 0, max = 2, looting = "common",}, - {name = mobs_mc.items.bow, + {name = "mcl_bows:bow", chance = 100 / 8.5, min = 1, max = 1, looting = "rare",}, - {name = mobs_mc.items.bone, + {name = "mcl_mobitems:bone", chance = 1, min = 0, max = 2, @@ -79,7 +63,7 @@ local skeleton = { -- Head -- TODO: Only drop if killed by charged creeper - {name = mobs_mc.items.head_skeleton, + {name = "mcl_heads:skeleton", chance = 200, -- 0.5% chance min = 1, max = 1,}, @@ -91,8 +75,6 @@ local skeleton = { walk_speed = 15, walk_start = 40, walk_end = 60, - run_start = 40, - run_end = 60, run_speed = 30, shoot_start = 70, shoot_end = 90, @@ -104,13 +86,13 @@ local skeleton = { ignited_by_sunlight = true, view_range = 16, fear_height = 4, - attack_type = "projectile", + attack_type = "dogshoot", arrow = "mcl_bows:arrow_entity", shoot_arrow = function(self, pos, dir) if mod_bows then -- 2-4 damage per arrow - local dmg = math.random(2,4) - mobs.shoot_projectile_handling("mcl_bows:arrow", pos, dir, self.object:get_yaw(), self.object, nil, dmg) + local dmg = math.max(4, math.random(2, 8)) + mcl_bows.shoot_arrow("mcl_bows:arrow", pos, dir, self.object:get_yaw(), self.object, nil, dmg) end end, shoot_interval = 2, @@ -120,7 +102,7 @@ local skeleton = { harmed_by_heal = true, } -mobs:register_mob("mobs_mc:skeleton", skeleton) +mcl_mobs:register_mob("mobs_mc:skeleton", skeleton) --################### @@ -157,10 +139,10 @@ table.insert(stray.drops, { end, }) -mobs:register_mob("mobs_mc:stray", stray) +mcl_mobs:register_mob("mobs_mc:stray", stray) -- Overworld spawn -mobs:spawn_specific( +mcl_mobs:spawn_specific( "mobs_mc:skeleton", "overworld", "ground", @@ -310,29 +292,29 @@ mobs:spawn_specific( 20, 17000, 2, -mobs_mc.spawn_height.overworld_min, -mobs_mc.spawn_height.overworld_max) +mcl_vars.mg_overworld_min, +mcl_vars.mg_overworld_max) -- Nether spawn -mobs:spawn_specific( +mcl_mobs:spawn_specific( "mobs_mc:skeleton", "nether", "ground", { -"Nether" +"SoulsandValley", }, 0, -7, +minetest.LIGHT_MAX+1, 30, 10000, 3, -mobs_mc.spawn_height.nether_min, -mobs_mc.spawn_height.nether_max) +mcl_vars.mg_nether_min, +mcl_vars.mg_nether_max) -- Stray spawn -- TODO: Spawn directly under the sky -mobs:spawn_specific( +mcl_mobs:spawn_specific( "mobs_mc:stray", "overworld", "ground", @@ -347,10 +329,10 @@ mobs:spawn_specific( 20, 19000, 2, -mobs_mc.spawn_height.water, -mobs_mc.spawn_height.overworld_max) +mobs_mc.water_level, +mcl_vars.mg_overworld_max) -- spawn eggs -mobs:register_egg("mobs_mc:skeleton", S("Skeleton"), "mobs_mc_spawn_icon_skeleton.png", 0) -mobs:register_egg("mobs_mc:stray", S("Stray"), "mobs_mc_spawn_icon_stray.png", 0) +mcl_mobs:register_egg("mobs_mc:skeleton", S("Skeleton"), "mobs_mc_spawn_icon_skeleton.png", 0) +mcl_mobs:register_egg("mobs_mc:stray", S("Stray"), "mobs_mc_spawn_icon_stray.png", 0) diff --git a/mods/ENTITIES/mobs_mc/skeleton_wither.lua b/mods/ENTITIES/mobs_mc/skeleton_wither.lua index a6b48d428..5e31453fa 100644 --- a/mods/ENTITIES/mobs_mc/skeleton_wither.lua +++ b/mods/ENTITIES/mobs_mc/skeleton_wither.lua @@ -3,13 +3,13 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes -local S = minetest.get_translator(minetest.get_current_modname()) +local S = minetest.get_translator("mobs_mc") --################### --################### WITHER SKELETON --################### -mobs:register_mob("mobs_mc:witherskeleton", { +mcl_mobs:register_mob("mobs_mc:witherskeleton", { description = S("Wither Skeleton"), type = "monster", spawn_class = "hostile", @@ -44,19 +44,19 @@ mobs:register_mob("mobs_mc:witherskeleton", { damage = 7, reach = 2, drops = { - {name = mobs_mc.items.coal, + {name = "mcl_core:coal_lump", chance = 1, min = 0, max = 1, looting = "common",}, - {name = mobs_mc.items.bone, + {name = "mcl_mobitems:bone", chance = 1, min = 0, max = 2, looting = "common",}, -- Head - {name = mobs_mc.items.head_wither_skeleton, + {name = "mcl_heads:wither_skeleton", chance = 40, -- 2.5% chance min = 1, max = 1, @@ -87,7 +87,7 @@ mobs:register_mob("mobs_mc:witherskeleton", { fire_damage = 0, light_damage = 0, view_range = 16, - attack_type = "punch", + attack_type = "dogfight", dogshoot_switch = 1, dogshoot_count_max =0.5, fear_height = 4, @@ -96,7 +96,7 @@ mobs:register_mob("mobs_mc:witherskeleton", { }) --spawn -mobs:spawn_specific( +mcl_mobs:spawn_specific( "mobs_mc:witherskeleton", "nether", "ground", @@ -108,8 +108,8 @@ mobs:spawn_specific( 30, 5000, 5, -mobs_mc.spawn_height.nether_min, -mobs_mc.spawn_height.nether_max) +mcl_vars.mg_nether_min, +mcl_vars.mg_nether_max) -- spawn eggs -mobs:register_egg("mobs_mc:witherskeleton", S("Wither Skeleton"), "mobs_mc_spawn_icon_witherskeleton.png", 0) +mcl_mobs:register_egg("mobs_mc:witherskeleton", S("Wither Skeleton"), "mobs_mc_spawn_icon_witherskeleton.png", 0) diff --git a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua index 9236b255e..911ae15e8 100644 --- a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua +++ b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua @@ -1,6 +1,6 @@ --License for code WTFPL and otherwise stated in readmes -local S = minetest.get_translator(minetest.get_current_modname()) +local S = minetest.get_translator("mobs_mc") -- Returns a function that spawns children in a circle around pos. -- To be used as on_die callback. @@ -16,7 +16,8 @@ local spawn_children_on_die = function(child_mob, children_count, spawn_distance if not eject_speed then eject_speed = 1 end - local mother_stuck = minetest.registered_nodes[minetest.get_node(pos).name].walkable + local mndef = minetest.registered_nodes[minetest.get_node(pos).name] + local mother_stuck = mndef and mndef.walkable angle = math.random(0, math.pi*2) local children = {} for i=1,children_count do @@ -26,27 +27,26 @@ local spawn_children_on_die = function(child_mob, children_count, spawn_distance -- If child would end up in a wall, use position of the "mother", unless -- the "mother" was stuck as well local speed_penalty = 1 - if (not mother_stuck) and minetest.registered_nodes[minetest.get_node(newpos).name].walkable then + local cndef = minetest.registered_nodes[minetest.get_node(newpos).name] + if (not mother_stuck) and cndef and cndef.walkable then newpos = pos speed_penalty = 0.5 end local mob = minetest.add_entity(newpos, child_mob) - if mob then - if (not mother_stuck) then - mob:set_velocity(vector.multiply(dir, eject_speed * speed_penalty)) - end - mob:set_yaw(angle - math.pi/2) - table.insert(children, mob) - angle = angle + (math.pi*2)/children_count + if (not mother_stuck) then + mob:set_velocity(vector.multiply(dir, eject_speed * speed_penalty)) end + mob:set_yaw(angle - math.pi/2) + table.insert(children, mob) + angle = angle + (math.pi*2)/children_count end -- If mother was murdered, children attack the killer after 1 second if self.state == "attack" then minetest.after(1.0, function(children, enemy) - for c = 1, #children do + for c=1, #children do local child = children[c] local le = child:get_luaentity() - if le then + if le ~= nil then le.state = "attack" le.attack = enemy end @@ -66,7 +66,6 @@ local slime_big = { hp_max = 16, xp_min = 4, xp_max = 4, - rotate = 270, collisionbox = {-1.02, -0.01, -1.02, 1.02, 2.03, 1.02}, visual_size = {x=12.5, y=12.5}, textures = {{"mobs_mc_slime.png", "mobs_mc_slime.png"}}, @@ -98,9 +97,8 @@ local slime_big = { }, fall_damage = 0, view_range = 16, - attack_type = "jump_punch", + attack_type = "dogfight", passive = false, - jump_only = true, jump = true, walk_velocity = 2.5, run_velocity = 2.5, @@ -111,7 +109,7 @@ local slime_big = { on_die = spawn_children_on_die("mobs_mc:slime_small", 4, 1.0, 1.5), use_texture_alpha = true, } -mobs:register_mob("mobs_mc:slime_big", slime_big) +mcl_mobs:register_mob("mobs_mc:slime_big", slime_big) local slime_small = table.copy(slime_big) slime_small.sounds.base_pitch = 1.15 @@ -128,7 +126,7 @@ slime_small.run_velocity = 1.3 slime_small.jump_height = 4.3 slime_small.spawn_small_alternative = "mobs_mc:slime_tiny" slime_small.on_die = spawn_children_on_die("mobs_mc:slime_tiny", 4, 0.6, 1.0) -mobs:register_mob("mobs_mc:slime_small", slime_small) +mcl_mobs:register_mob("mobs_mc:slime_small", slime_small) local slime_tiny = table.copy(slime_big) slime_tiny.sounds.base_pitch = 1.3 @@ -142,7 +140,7 @@ slime_tiny.damage = 0 slime_tiny.reach = 2.5 slime_tiny.drops = { -- slimeball - {name = mobs_mc.items.slimeball, + {name = "mcl_mobitems:slimeball", chance = 1, min = 0, max = 2,}, @@ -153,12 +151,12 @@ slime_tiny.jump_height = 3 slime_tiny.spawn_small_alternative = nil slime_tiny.on_die = nil -mobs:register_mob("mobs_mc:slime_tiny", slime_tiny) +mcl_mobs:register_mob("mobs_mc:slime_tiny", slime_tiny) -local smin = mobs_mc.spawn_height.overworld_min -local smax = mobs_mc.spawn_height.water - 23 +local smin = mcl_vars.mg_overworld_min +local smax = mobs_mc.water_level - 23 -mobs:spawn_specific( +mcl_mobs:spawn_specific( "mobs_mc:slime_tiny", "overworld", "ground", @@ -202,7 +200,7 @@ minetest.LIGHT_MAX+1, smin, smax) -mobs:spawn_specific( +mcl_mobs:spawn_specific( "mobs_mc:slime_small", "overworld", "ground", @@ -246,7 +244,7 @@ minetest.LIGHT_MAX+1, smin, smax) -mobs:spawn_specific( +mcl_mobs:spawn_specific( "mobs_mc:slime_big", "overworld", "ground", @@ -313,12 +311,11 @@ local magma_cube_big = { }, walk_velocity = 4, run_velocity = 4, - rotate = 270, damage = 6, reach = 3, armor = 53, drops = { - {name = mobs_mc.items.magma_cream, + {name = "mcl_mobitems:magma_cream", chance = 4, min = 1, max = 1,}, @@ -337,13 +334,12 @@ local magma_cube_big = { }, water_damage = 0, lava_damage = 0, - fire_damage = 0, + fire_damage = 0, light_damage = 0, fall_damage = 0, view_range = 16, - attack_type = "jump_punch", + attack_type = "dogfight", passive = false, - jump_only = true, jump = true, jump_height = 8, walk_chance = 0, @@ -352,7 +348,7 @@ local magma_cube_big = { on_die = spawn_children_on_die("mobs_mc:magma_cube_small", 3, 0.8, 1.5), fire_resistant = true, } -mobs:register_mob("mobs_mc:magma_cube_big", magma_cube_big) +mcl_mobs:register_mob("mobs_mc:magma_cube_big", magma_cube_big) local magma_cube_small = table.copy(magma_cube_big) magma_cube_small.sounds.jump = "mobs_mc_magma_cube_small" @@ -373,7 +369,7 @@ magma_cube_small.reach = 2.75 magma_cube_small.armor = 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) +mcl_mobs:register_mob("mobs_mc:magma_cube_small", magma_cube_small) local magma_cube_tiny = table.copy(magma_cube_big) magma_cube_tiny.sounds.jump = "mobs_mc_magma_cube_small" @@ -395,18 +391,19 @@ magma_cube_tiny.drops = {} magma_cube_tiny.spawn_small_alternative = nil magma_cube_tiny.on_die = nil -mobs:register_mob("mobs_mc:magma_cube_tiny", magma_cube_tiny) +mcl_mobs:register_mob("mobs_mc:magma_cube_tiny", magma_cube_tiny) -local mmin = mobs_mc.spawn_height.nether_min -local mmax = mobs_mc.spawn_height.nether_max +local mmin = mcl_vars.mg_nether_min +local mmax = mcl_vars.mg_nether_max -mobs:spawn_specific( +mcl_mobs:spawn_specific( "mobs_mc:magma_cube_tiny", "nether", "ground", { -"Nether" +"Nether", +"BasaltDelta", }, 0, minetest.LIGHT_MAX+1, @@ -417,12 +414,13 @@ mmin, mmax) -mobs:spawn_specific( +mcl_mobs:spawn_specific( "mobs_mc:magma_cube_small", "nether", "ground", { -"Nether" +"Nether", +"BasaltDelta", }, 0, minetest.LIGHT_MAX+1, @@ -432,12 +430,13 @@ minetest.LIGHT_MAX+1, mmin, mmax) -mobs:spawn_specific( +mcl_mobs:spawn_specific( "mobs_mc:magma_cube_big", "nether", "ground", { -"Nether" +"Nether", +"BasaltDelta", }, 0, minetest.LIGHT_MAX+1, @@ -447,11 +446,11 @@ minetest.LIGHT_MAX+1, mmin, mmax) ---mobs:spawn_specific("mobs_mc:magma_cube_tiny", mobs_mc.spawn.nether_fortress, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 11000, 4, mmin, mmax) ---mobs:spawn_specific("mobs_mc:magma_cube_small", mobs_mc.spawn.nether_fortress, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 11100, 4, mmin, mmax) ---mobs:spawn_specific("mobs_mc:magma_cube_big", mobs_mc.spawn.nether_fortress, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 11200, 4, mmin, mmax) +--mcl_mobs:spawn_specific("mobs_mc:magma_cube_tiny", { "mcl_nether:nether_brick", "mcl_nether:netherrack" }, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 11000, 4, mmin, mmax) +--mcl_mobs:spawn_specific("mobs_mc:magma_cube_small", { "mcl_nether:nether_brick", "mcl_nether:netherrack" }, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 11100, 4, mmin, mmax) +--mcl_mobs:spawn_specific("mobs_mc:magma_cube_big", { "mcl_nether:nether_brick", "mcl_nether:netherrack" }, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 11200, 4, mmin, mmax) -- spawn eggs -mobs:register_egg("mobs_mc:magma_cube_big", S("Magma Cube"), "mobs_mc_spawn_icon_magmacube.png") -mobs:register_egg("mobs_mc:slime_big", S("Slime"), "mobs_mc_spawn_icon_slime.png") +mcl_mobs:register_egg("mobs_mc:magma_cube_big", S("Magma Cube"), "mobs_mc_spawn_icon_magmacube.png") +mcl_mobs:register_egg("mobs_mc:slime_big", S("Slime"), "mobs_mc_spawn_icon_slime.png") diff --git a/mods/ENTITIES/mobs_mc/snowman.lua b/mods/ENTITIES/mobs_mc/snowman.lua index e2e17e30e..a706d99e4 100644 --- a/mods/ENTITIES/mobs_mc/snowman.lua +++ b/mods/ENTITIES/mobs_mc/snowman.lua @@ -3,12 +3,12 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes -local S = minetest.get_translator(minetest.get_current_modname()) +local S = minetest.get_translator("mobs_mc") local snow_trail_frequency = 0.5 -- Time in seconds for checking to add a new snow trail local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false -local mod_throwing = minetest.get_modpath("mcl_throwing") +local mod_throwing = minetest.get_modpath("mcl_throwing") ~= nil local gotten_texture = { "mobs_mc_snowman.png", @@ -20,7 +20,7 @@ local gotten_texture = { "blank.png", } -mobs:register_mob("mobs_mc:snowman", { +mcl_mobs:register_mob("mobs_mc:snowman", { description = S("Snow Golem"), type = "npc", spawn_class = "passive", @@ -54,7 +54,7 @@ mobs:register_mob("mobs_mc:snowman", { "farming_pumpkin_top.png", --left }, gotten_texture = gotten_texture, - drops = {{ name = mobs_mc.items.snowball, chance = 1, min = 0, max = 15 }}, + drops = {{ name = "mcl_throwing:snowball", chance = 1, min = 0, max = 15 }}, visual_size = {x=3, y=3}, walk_velocity = 0.6, run_velocity = 2, @@ -108,7 +108,7 @@ mobs:register_mob("mobs_mc:snowman", { local belowdef = minetest.registered_nodes[minetest.get_node(below).name] if belowdef and belowdef.walkable and (belowdef.node_box == nil or belowdef.node_box.type == "regular") then -- Place top snow - minetest.set_node(pos, {name = mobs_mc.items.top_snow}) + minetest.set_node(pos, {name = "mcl_core:snow"}) end end end @@ -116,7 +116,7 @@ mobs:register_mob("mobs_mc:snowman", { -- Remove pumpkin if using shears on_rightclick = function(self, clicker) local item = clicker:get_wielded_item() - if self.gotten ~= true and item:get_name() == mobs_mc.items.shears then + if self.gotten ~= true and item:get_name() == "mcl_tools:shears" then -- Remove pumpkin self.gotten = true self.object:set_properties({ @@ -126,9 +126,13 @@ mobs:register_mob("mobs_mc:snowman", { local pos = self.object:get_pos() minetest.sound_play("mcl_tools_shears_cut", {pos = pos}, true) + if minetest.registered_items["mcl_farming:pumpkin_face"] then + minetest.add_item({x=pos.x, y=pos.y+1.4, z=pos.z}, "mcl_farming:pumpkin_face") + end + -- Wear out if not minetest.is_creative_enabled(clicker:get_player_name()) then - item:add_wear(mobs_mc.misc.shears_wear) + item:add_wear(mobs_mc.shears_wear) clicker:get_inventory():set_stack("main", clicker:get_wield_index(), item) end end @@ -158,7 +162,7 @@ end -- This is to be called when a pumpkin or jack'o lantern has been placed. Recommended: In the on_construct function -- of the node. -- This summons a snow golen when pos is next to a row of two snow blocks. -mobs_mc.tools.check_snow_golem_summon = function(pos) +function mobs_mc.check_snow_golem_summon(pos) local checks = { -- These are the possible placement patterns -- { snow block pos. 1, snow block pos. 2, snow golem spawn position } @@ -176,14 +180,14 @@ mobs_mc.tools.check_snow_golem_summon = function(pos) local place = checks[c][3] local b1n = minetest.get_node(b1) local b2n = minetest.get_node(b2) - if b1n.name == mobs_mc.items.snow_block and b2n.name == mobs_mc.items.snow_block then + if b1n.name == "mcl_core:snowblock" and b2n.name == "mcl_core:snowblock" then -- Remove the pumpkin and both snow blocks and summon the snow golem minetest.remove_node(pos) minetest.remove_node(b1) minetest.remove_node(b2) - minetest.check_for_falling(pos) - minetest.check_for_falling(b1) - minetest.check_for_falling(b2) + core.check_for_falling(pos) + core.check_for_falling(b1) + core.check_for_falling(b2) local obj = minetest.add_entity(place, "mobs_mc:snowman") if obj then summon_particles(obj) @@ -194,4 +198,4 @@ mobs_mc.tools.check_snow_golem_summon = function(pos) end -- Spawn egg -mobs:register_egg("mobs_mc:snowman", S("Snow Golem"), "mobs_mc_spawn_icon_snowman.png", 0) +mcl_mobs:register_egg("mobs_mc:snowman", S("Snow Golem"), "mobs_mc_spawn_icon_snowman.png", 0) diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.4.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.4.ogg index acb236445e2b530640a1c98a54c81d20a9a3672a..5c9ee492ba4d2315ab820b8149dcb5b73cfc62f6 100644 GIT binary patch delta 6045 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 delta 10470 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 JyN#OB{~zmA!c71G diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.5.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.5.ogg index 1ef7a522744a727da6082e2a3a1f2bf36fc77604..acb236445e2b530640a1c98a54c81d20a9a3672a 100644 GIT binary patch delta 10469 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 Y^}12-boZEETz}BiBjV(bf8T@u3+ffPY5)KL diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.6.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.6.ogg index c2743fbcc640651eedc1529bbed4e3c209552fc1..1ef7a522744a727da6082e2a3a1f2bf36fc77604 100644 GIT binary patch delta 6898 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 ZS+5)QPIr&##q|eGJt9v2`1d{dzW@w?xjp~@ delta 6778 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 J^-U+>{{WCWcXR*% diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.7.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.7.ogg new file mode 100644 index 0000000000000000000000000000000000000000..c2743fbcc640651eedc1529bbed4e3c209552fc1 GIT binary patch literal 11068 zcmeHtcT|%}+xLVTstF_^AYkYr1|>jPKy*V1hAIgJLjWbANVOrX-B1kyEP#j<7eWyt zQ6dBtcNLHzh#*K2u`D($h-=wZS=)OD+X=Do%5XUzjw|s%v^KLT=!gM<~IXt zHf#t23gBBhA9tB1uO>}S&%lgfX`8lk<5T1W1P4u6zgqWS6q$XQCdus*JQT2rNy~2Y*ap}=g$J? z5RC>v3Gnc02WqCh69%0(V66^pt#XbJa5{lg70{=g)w+JSjM`Y=TA#Ra(Aom76{-v^ z98hQ`*(ip*;POp!uu!qzaBHv0iHfc2godgNb-P|%rk~xj+M)oLXALz6T%O}whuk%6 zT5tIHk;X!zPW`MBu{&kZ`ANmMLT!E>IOtp4RrI3~?r{0^eCztstX#S}44bccL!|4HhwZ6B!TwArrADkxi@BMWdNXZLXlZuXxjmuhvco2_Bi?6o zusPrIhdsZ%m*@GV<6xl5%(>*Dwb0Z+_`q4Hn3dC{0HWn8!KoFRS{K%M*T*KDiZ5@A zJK2`pe}>q9MsuD8z#tZRs){eG|G#oaaS+;Yx}tlvi)_>?`&g_|0$8pGJ_I9RLc+P`1Ue57Gw1W@IaQZOY1< zDgHMhRme5+Kd1D0e}NWaQW;y4z=PW#;>@ds2ThBuhI?o(NP-yn)sJvxLuGFVoVCjy zS2d!_M>=zZ%dO5gmX^<3FlkW#A!JMItH)$j$A-#M2E8@Q>K1A{bjnr5jW-~g{*wyr z9(@kP7k{Hnwec1U8XG!PHr;R@1=Vtk%dMp6gBRxe<`#|XDh4~9??WSUC(9Ght3^Py zx#)_Q18Q>GKi!7{*^M)S?WxSb?Kz;rMVZu_6d7+js9jV=>b0≦!)j)0i2^(6_4F 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⪼8)D-TJ`->@>Uw(8fCdv}Jn*&O4Gn>9R&mbhvv@|5CwbLtc zT+Cv#3`9_)uRYtkD#uzl*1!*`QQ&9q{K3jO=+~DCVyXK5Nwr6Jz1JP#%{V^kRk?WK zk1wAdXUG%)Uo=b*VVkj(it<5m*jbmmFMI|soRp3ewj4R&hvv_;U7I_@W6{w}I&?nG zLNkqDeRBQBOBYUs;7Egg+2OG#H{KP6UGYwtXixpBZ+GjCdh_|;wK^{TaqIK$WBy*> T_m77=o*i6O^uzS|W#GR6*1vMu literal 0 HcmV?d00001 diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_accept.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_accept.1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..b72b8b83f3bdba5f48c3d688d16a5f073680ff74 GIT binary patch literal 9793 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 D``GLo literal 0 HcmV?d00001 diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_hurt.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_hurt.1.ogg index 5c9ee492ba4d2315ab820b8149dcb5b73cfc62f6..6c96f57b8916cd991ea753c560d33eda64623bda 100644 GIT binary patch delta 5543 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 F{0E)bG4}uf diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_hurt.2.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_hurt.2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..a7568a3d681f5bc1ebf931cc712b870be6cbe57c GIT binary patch literal 6749 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 literal 0 HcmV?d00001 diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_trade.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_trade.1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..f177713674e2aa51487789d25a0348173470fe3a GIT binary patch literal 6518 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 SMmQiuS{RcQ-1=@Cy#E8#FB_Wx literal 0 HcmV?d00001 diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_trade.3.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_trade.3.ogg new file mode 100644 index 0000000000000000000000000000000000000000..e012ed349d5e73c0429ad282da521cc03f652f1b GIT binary patch literal 8553 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 DqCV#+ literal 0 HcmV?d00001 diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_trade.4.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_trade.4.ogg new file mode 100644 index 0000000000000000000000000000000000000000..51d808f52e365b3ec1bda9d24a098bc85e8dd155 GIT binary patch literal 7427 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 literal 0 HcmV?d00001 diff --git a/mods/ENTITIES/mobs_mc/squid.lua b/mods/ENTITIES/mobs_mc/squid.lua index ccd73296a..86b80976e 100644 --- a/mods/ENTITIES/mobs_mc/squid.lua +++ b/mods/ENTITIES/mobs_mc/squid.lua @@ -4,9 +4,9 @@ --################### SQUID --################### -local S = minetest.get_translator(minetest.get_current_modname()) +local S = minetest.get_translator("mobs_mc") -mobs:register_mob("mobs_mc:squid", { +mcl_mobs:register_mob("mobs_mc:squid", { description = S("Squid"), type = "animal", spawn_class = "water", @@ -17,8 +17,6 @@ mobs:register_mob("mobs_mc:squid", { xp_min = 1, xp_max = 3, armor = 100, - rotate = 270, - tilt_swim = true, -- FIXME: If the squid is near the floor, it turns black collisionbox = {-0.4, 0.0, -0.4, 0.4, 0.9, 0.4}, visual = "mesh", @@ -42,7 +40,7 @@ mobs:register_mob("mobs_mc:squid", { run_end = 60, }, drops = { - {name = mobs_mc.items.black_dye, + {name = "mcl_dye:black", chance = 1, min = 1, max = 3, @@ -50,7 +48,8 @@ mobs:register_mob("mobs_mc:squid", { }, visual_size = {x=3, y=3}, makes_footstep_sound = false, - swim = true, + fly = true, + fly_in = { "mcl_core:water_source", "mclx_core:river_water_source" }, breathes_in_water = true, jump = false, view_range = 16, @@ -62,9 +61,9 @@ mobs:register_mob("mobs_mc:squid", { -- Spawn near the water surface -local water = mobs_mc.spawn_height.water +local water = mobs_mc.water_level --name, nodes, neighbours, minlight, maxlight, interval, chance, active_object_count, min_height, max_height -mobs:spawn_specific( +mcl_mobs:spawn_specific( "mobs_mc:squid", "overworld", "water", @@ -218,4 +217,4 @@ water-16, water+1) -- spawn eggs -mobs:register_egg("mobs_mc:squid", S("Squid"), "mobs_mc_spawn_icon_squid.png", 0) +mcl_mobs:register_egg("mobs_mc:squid", S("Squid"), "mobs_mc_spawn_icon_squid.png", 0) diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_cat_black.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_cat_black.png index d6e54c7a15637a4925a492b852e27071896479d3..8d1322565a7745bab53b111a7a35657f898cb923 100644 GIT binary patch delta 370 zcmV-&0ge9N1c3vP7=Hu<0000`vtzda000tDOjJbxZ)_SH87wXug&n<2Vh1k;Cq_B-uwJS@N|fl!OKCddpbk}Z90HXD~BC$xm|8^G0;5T z!GZN<@R|o^4QsCJ4%+yv!5l4a@H!b}1F(K!FOeD4o5K-s;NAdapSuisgBH1nOeq~; zS;(loG~17m^~H2V;C>1)oBR*Jef!3bK)$x}Hw`T8^h5(+gP#JAUpnamKcuHM_2NCv Qn*aa+07*qoM6N<$g5mI^yZ`_I delta 593 zcmV-X0^yvTp|7~JQ?a{6I>Dwz63h9hm=DK=&ZDQ~A?EnA($MGIq0000JbW%=J0RR90 z|NsC0{{a90|Nj600002Xr|eb$00F^CL_t(|0i=|HuA49nMSrocxp+?Aw(kEwc6I`L zQz>2ddaR&E!ABPvx(q}VuwwaS1=d=}9^8CczTL44LU|H^02_JiiEXTkdx_^Sr1`SxpEV9>gof9wx2D4mDfHYKp3c8z>bw%Pm>rsNb)va)Ajf11V z3?M25d~z08dZ(Zw+5l)~&G!?6`4pE4>LpnA>%lr=`C$ZEg2_X{_heotsQyflWeJtU z9ODClSeMA^_Nl<11Y-^wO3agoukz8>ee?NC(cnH4uz#(h0)0W?ecR?QQK%jXAR?i1 zEs#9RW!BBJhCm|J<`fW;#I-JWWvaojC=xKp3qf#S!Dg4TO)ZwP)4Zns}MxBq0hK2qUo f-um`?gWLcBf)6=#*sJXE00000NkvXXu0mjfJB%7p diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_enderman_cactus_background.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_enderman_cactus_background.png new file mode 100644 index 0000000000000000000000000000000000000000..e2f7ad9a2d802988b0fc470c2b74300238ef260f GIT binary patch literal 99 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 literal 4602 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 diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_cyan.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_cyan.png index 83f7a8faa17d54d5e7402e7d6e94e18f50e27401..b66df4571553c4c6d728d55b91fd668be43cb807 100644 GIT binary patch delta 1477 zcma*Vc{tMz0KoAP^JLyajv1L;F>@B%u*s51y^d(fea$Gh*KPYzDV3F66>@|X9-fEP zm^+%gaztjNcdpT#c`@Pb|M#Ew`~5VVjX^Th0MQp0tt_46*!(g` z6y~5y>lA03GPjebl>%a!yfb9YW~$oY@$GQcIYF4|-px7MgMgT<<2KXC)r-}Iyx;RH z6Rvu+czE3Pf&Q2NAEoj&Wqh(e{l$X*LLHY=el}va6X3A6a&_I9%%-L&A!onNr zbu{vpGB*rM!96A@wEeVX$IRo6<;O>51S~zz!PM=YV})FWmhp9A-tuxk1Y=;}@Ro0$ zU_?7<@!}mESJ}Su?gY)f zfexr7Yq@KmD}emm-oC~)LZyz_CYO2 zFF%1KQZ2vjk-k&Il-Z;Y|nc^8Sv%fiDquk?%dMmvmb+ctoZC;RE%Jfvoy zq*{b-!cV^Wr4%Ws8Y1ToAgz0C_5MFxo0~`&Q!UT@(qhOT8*+hQpZ0-Xi64CKDtU;0 zSu)Fvl1_2wt$Zm$zGzrGP= zChDOBPCnWtY@P4x@2|cWN}3&gwAKy(c>2Xo5P%dE?eB&XGmOybD;=YU7QNuH-Ee-@ zvfXr_Inb-M?$Wq2FdcYeRD;;(Wa-!n-08tt9O$bcY^HWwhFB`-e002tSdd7#KoM$r zN=R7LxiqSTpsTP`fW`G~`3g0%yNda}$W*=k>e`jRT+J$ZWkiUK72V7jK=KmylkAn`wV a!VbU=Oz|A6TE#-p?=D`jv#P;+-})Drxy=Cp literal 7612 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 diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_green.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_green.png index c3297ce9424cbcc9d6f40928e2c1f6ad9e6f13a2..e956a30238af4fe1a1529a2c35bb8976a5f9a109 100644 GIT binary patch delta 915 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 diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_light_blue.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_light_blue.png index 71eabea5365dd02619695bfe447b7a327758b534..6c3b2a7953ed37379fa1904189254795a10b3477 100644 GIT binary patch delta 1584 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 diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_light_gray.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_light_gray.png index 929a6095072b637a445ab8dc122209208b262619..33b9376dd373106eea91b3143b26e6dfa7967b70 100644 GIT binary patch literal 5020 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 DvSSw9 diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_lime.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_lime.png index 1507d6d7956e15fe5190684a3a34df54e1db2444..f201bc4fabfcb56a3d61a9b6b1fe843826734035 100644 GIT binary patch delta 1788 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 Lid3zHX~_QoDQo#C diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_magenta.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_magenta.png index 809e645fb6a872106d5ffdd1a731c564bc79756a..d05057fbb59d586b55a9c80c1ffde3a9a51fe9e9 100644 GIT binary patch delta 1931 zcmV;62Xy$jIhYTSBYy{9Nkl6`x6vx^32V)`;1u6tvu|O#;OXHJ&0uod} zAmF}lkM8@v?+d6rfPl)sWz%x}&)-*e8~U$<@!hr{7;I2;a#!{Kl^91e%W;cz${4u6Lu$LQX@d#HQ%>{-0- z)vH&rtt+5^j~+eRjg>Xe%VY1CSH?XcFPwjmyfft~dA<5!Sy20!(Eeu4qhiO=x_9s1 zVa$O82Nu_s^;;N^@n5ZaFw}2MctoBbeYdz3jPiS=iwH*Ss%# zuUamP>Yf(*_wV072$FTAkkxL%8e6aZKn`BNGW?E1H>{G~S1c86KXBcO@O#>BTpbF( zmvtPuxuMv9+w4U_DRZp=2r6aG3IxJE0->fqHSNk6v422R&|1e9i{-Q7&y?R$v_9@p z29!<5x6pOy{LHEI+P*wfD^^xv4r&BWVIJy*6CV$3pzG0lSm?R)?kciFt`&d{iv@%Q zvbnb1TC=i*-FT(y6l_1aX#MScY0f$`4zCacvpEx(haT z*X8fZ_m{2@8~pQ}O<}_k5_73=QIi>btApZvd-2-PpMR2T1&FCO_Uoz~TC8x{cpI>(^`@v_ z=b^^ZzM0+_HXbEVD@6D<2vuv271qw7bK0PhXHYr9+c|%UY@h#0yScW_`#7|Jby0n= z{4KLSlpXUHhc!{7Bq+l#b6di?a-RjfJ^9IEfQQ8+r16ucNY%v2Qd4((hcSeK

`hXTeEBkp~gOh=j|UVsMC=p68Fk zHL4I_Ib2+bZi@BZ&uB7M{0mX(iuadCGjmh~w53mUIO07g-PH{ng>rG)o)gD54rcc0 zk>glOT=PqAxt%SacX^6TdVd2ao&SD76-dD={RHfQUCUjyV;mNF*Nq0lyki0IR)ccXa^@gY50RVLjZ`~W2S*pfOfVO_dmQ(JD>+z?>>@< zC)u-Hj95x@Ym5AwDPs6Vz^6GU3#XQJ`~wuLrFK5DD6NMrhAj^oP(D9O&vC)9gG!j* z{hHiiS{&Xf2WN$8(^1-|6s35h(A_oi>MgRp@YEBgi0dopI&LhzVHS zC+E}qwq8uveJ&N29h19@A>8JK0QgE+KMc*19C_cVbvPDoo`8uQUgdOWieTK623+|b zntL5WQgxK=GApq$fU14lh(VgtAgS0olXep={~-3P&RE){+P#c{I;j9a&;LnPkEZiJ z%b4os8}vuqmHV#ESc>-RpkaJ^tv_P8cbkhGF2co)^J+rgzvi3akEtrXn}gdv>@%2T z6}{OmnW7Tpy;U9evz8(1&o=YG-@B>m1p-xKF6L1GS+`cI1v3}?E(+nW)|kJitB+{Z z-91$NwF1#h?a@9zex~}_3DiRPxEVu(?omV787m*#1645|+V$jj7=nn<*7DeYl4*Wr zS5Ew$qzot!|KPsmyotzuGt%FT^`||UWYzMxENsAX%?9Yzu);d^Sh_Z`iY~iqxnte> z-58U40FF2s4d*NWJkG$Dzrab#A_IDj9-9E<4!U_7);#BnBjVtjJ zL8~dQBym`(q^eCa7lV?LCzF0gIarB@|CMG+kD34W<&Q%|kMa|TJGHG3YDXs>tg05O|0M$;-h+j;d zer4^x*aK#mP@r|%F>gdd7j-gNDjdSB%-AcRq@RV4$+R5rbB+xQiZa1~DVyyYNFsl* zTEKom?QCthtWn}%B1UcbOa`|^I#@^kz&H3H?wvV+z8Q>Cd7a#;jcOyVRMk*Fgge!V zWn$9AYmME!3hdGN?l@ApTgZ9V-_Fc2^^r+0}WD2ODFnbf|% zwI+7j{_J10w1K^&?mkCOvBmiY%P1Bq3bKIL|6RH5#ffhUx~rn02LOPH_rC!Iq-PSp ziKw1RYI3N1NW?^h6a;a7W&i*vLrGRj*LV5U#L0zr&@BiGZMC&Y5$z2LeJYcc%+x>+ z?|b+Nw0NZLGR+^ty)3(=s%3TevH4eVnb(q0;9k5#{?{=w9Rbut=AJTodIW_Renp#% zJiS>sl9QBGEXTG)stgJ79!%rqd%+pi#v*6U5rEx`3V4ITJDXLWU0iZ zw1R_dh9?);RsET6NSoQMI1T!oCx}QPY;UgXc5jo7>24t$-1)#J7c`tq8FqpV)2jRahaaOI79e1QKI<%RP@_ap0GnX^ z@=F{IFdH|x!-O*;WRt9sc&p#?mI6kIh6&ZrEJl}Yr(Hp1qXst|xuy5`cfz!pWr<{ntzi{z_+VzlG*EV@}yQE zAi=?^iZDq%EoE{_UsnntqSXo(WhTbGXP;Fv(QqW#ZsQJ5B$~&$tD{R+8kky>Q8(1+ zqF@#NpIde@!vf^WOq}p_i2%HSL4}g=Yh4>(=lEuV%lY+&QXD9n)-G+w*cU=?6t?>2lirH5%>KPkT;a3bE zA-d`jFcSEyg8}bFQ%U@l4R&7U89p3+WSzBoZo1jk{=uX=*6b)^;{s4W$XhfCdi>>` zguMt7C^$<{mS;v5xN=lVWw}k-T-5EN^G&jErir9%&y*bcgY(*=5SggoK%I<}o-2pg zT>E~05b*u>a~rF=b$F zWE2k+PzP)@;i{xfQ=pAzr#FzR-@o39 zQ2uMLZ@hfIi5Bu*Rb?pnFF~c>E8cZ1mVgnepQK$4FLtE!jmYqmuS6ajct`JI)cfXE z9DIGM$S?Qg96~S5!CN;zriZH|?#%SmTwJMWT*coHLa!W83!&0^y%C(#3JTQjD;3f| zma7#%;sW2jOpdv-E^7D8_2r7uAtpEQ&YPdn?TapttMJFJt{4P7ZO4z8;j@)AfM|w( zb~1%5h(RK&kz67(h+$S^R3R@HE{9Ge3bK(x0(uj9`ow`WJ=|*ZS5aCH{ni`bF&F*C z!tx3fg?dF0qmmVGpHq3z!tpH=p`ow_0jH=xQor$RCmph7CJ10QW9u*UgB-@3Umbqq zabxI{f-kAhw-b~0k zcy?HI9zQ#2SCh^)C{%oDrjgMda99L!oNrgZb)^S3xO#Xz4*4!aCH4!{kb_ISKPNiPP`#Qx===1vvk<6|vqtKF9j4Le%AbO9L|Y#=knK zg$B9`=jJWDOK2o#_fAl2PYl(?CcfP9;&7>zuNzjw%HM{(_h>>4$Ifqr-NgO=M~CpQ4Xwk z>EWwbG!~mL8?Q29K42X7$LLvJ8aTq!{(=?VvZhZdN>>a1X@9&Hha1F%l6H?B_3jXi zdMA5yYIf72u*<`JwB%amyx~Y8%&MfNZry7Mr^k)R<>~UEP#S^a)5dn%Msu)E<{N zLK$PazPepop>LFUV{85aL3u+BqyIDjf`fhN1ENR_{^{v7Sj=^=W$(vbcUN6TQfNR> zeQOyYVao!C&HiaD5hB6?3S9kQldr3-o9@>>_4>Pj#bw(joTVAf?=vlq$#E%_s47v4 zkimaN5O68bTmC*0vzQjy zrRu{LT@O{7VwYqI@pQDAe7%IlbYzNb9*eY!qR=W0`=s^%Q-cy@0)U|pc+taG}VMVJv}FrfUyvCcQ*5*+#18uhU?c4 zKKkbGFB|<|f-b?;lczaFQw6KuU$)6LbQ#%K!nPN>e?xnsdaXAo?2zT*Esr0|*h(Cd zD_~K)Hn**G$3tI(h<>*?n?lpQ)P8)Louc>(v*Co$B!;O-fgyrC(dt*>6?u>gd27nsxMWyK0CwW*g=J?HCRKZ|j3kCd3bO;XUbr-_*0p;kzE! z5k8|mclDnhq1ce6c1N58_X^ANt=hBZG~1;7MbqGlz-8}{K7P)c0i=`ZfKa>cZKsoe zEee@%JA>YKINWFug24IM*g(#pKM*Fs>fTv_LpUbB>D>O#%!G@QQqTOQ z4E0jl)bt5q3V95r%Y7W`%Qytv;UlPXT5B}_S*vosbxAU+6iq(Vk!$L+?HmwW=a zpMBAIhL4W&FvzEb8vY|m+hf=0I2CSLC{BQRzOC?jhL(jU6P?vIj&?g;BZS0Kxb3zi zpsI$T4g>!}q7rFd8Yi{u5Z^k*<8RPEd5jC(*lHg<^n~zYkVp&aAL`JDpqZ<<88nlZ zPOgJA=P?ppFU&e`ffID9mXP8MnZQg{gJr7sq?ev-OzR~~NFM9bXs5)6QfR;lnCBIyLbxt9WYk2wi1boP^J z7ZmMAp~)hpjP|qc|9%SoN^a&1O=lh>A}+~Vw!AxVY>!p)!Zhf^Z&RO69fy$j;Hd1J zIUhW}fkHh439fnIGoNyFv)D$ie#5RkqiI@A@Pz{DBRh%us+(m*d^9jKwDvN=x*R_T~gdn0_mhj4C4HVl`c?J#`OGjX!Y7$^7#CgDPC0uy)R! z?D%C7eM+T{6H9G%%HMCh7p|=}2bCO2=7jARm7F@QGH8rjjblha8Phrb2dE$)ZR{YZ@wJ~1)ZnFy>-z35-6d5 zrR!QG^b6@sed2)E7|t~f+;eqtt2hU+U&mu2^Ah+3weLTnTnqdps!31OYN^|3&WKVe zWAf0@QjJ~FhA}1EiZe;5RLhX-<$bQ-o8N!%_WTm-Ri9Q;2up2$ukBgiEAVt}9*h3W6r|mdccp4l znF%%TH>TJZY_&Jb$JzaV239B(N|BbBn3(GGv-ib1U8N-@n0h?9lty=OwH)+v4tw5m z*M>baVN)Z){yOd zGtmZ>{s(v(>Eg?!AO=x^)kjW65Jn~jco|)3tNd@nDeuRkX>fpW)q*yh1?^N`^RhmxKJDU;i+){!>sBSaot*` zdMeLZp0}~pD-)Qka2RtnA6IfESnO1orf9|<`@-10-vtYZrYH#Rl~ z+qL&ybRj1wX^_oLRX6AYPDay^6FV9+tb1E#2qGzSb=+U4vFFM zmtZhX^S#})f)CZE3xHG9?J0&FujTYRwpWaLaQliDzpHCT$0v15Y`eKb+G;ZNB+7gT z*WRMLsGNe1=4`exxV)DN{OIcu4rZDUO}62{$Mig--o)#AX*M&$JRM`yEeEedra`uY z(;2_Bx9C1%YxRTkUCcskDeK2@$$d7`qRz^6qd!kp#I@YxfX7fI!b4`U5H?? zclSrKv@yco4f0U}u;g@`46{^kBvAJ&mKYKPyz#8yDB`|r*(wC0VBMCp8+(pgKGOF$ zfeaj$LL&2G{h<1$C^Iy{iCbiN>Qx~&t_}%q2h{~;C9SE-p$}z8{?Ps)-2opvo|&!* zzTS_%U%7yko?qYk<}_1XMUPi5c|PcAhI=v4RHu~i^-DYoe8T#fxfVod@vW07;A6(X z8)|0{>w181Xs(^TYU#@3)V_pvKu?g|Y790pA}rJk#Kw_GO(|o~W8G{Y>)vDu@E|bMyS!#^ zF%!&T&mJM|ch0#mlR((Mu8+g;jv553mB~f>IIi zyWr#WhWXaR65=CH1cx1wC+`5eH&F$t{SX88>JES|MyJ0Dp5(OoNC8UHU{{Ak$ z`|r%WGjry4=A3y3s;jMvkMjZt007{tt10XM%TfO%kA?9sF2N%s0RSAuP(u@cecK?g zx38Czi@PJ(Kg8P+>=^9g1ONnY>}8w#a&r-=JX5I#^fP=|;g^!H)RH@C`X(I2tX8)?2QHbR!@tsnn%Fyn=7tt@UD z8yJVTBS&_h5Pa=Y*9Xi`GU13xd_I?*YSJ}Z*_iv_o>DEzK#8jT*|Ug ze=IHZi$9%Uz>NM0`lB@RI znUs~p>JCBnr0h=`B zNm1v+LbaNc!hgN$7H2EuYHO@YS-6q`^4cL{1k&WUtJ9JUL(JZ5p~(dTa!pQ~o8{#- zph>9$m4^1t&8pUULAl>v+e1Y{#Wv80SiY_d#%H6{<>NlMd>JV*)t{=!Ff%(Uc`xWz z^Ci>Ft(MofwIb8prM(@#>D*db7-)!ZsqasEXBv7C{S$>RL^uRXjPe3$CADHoNHgnA+MTxI=TKL*CGRo}bfg~N z3(4t)mEA926Y8dmxn3~t!P<3J4)Nq5G% zhKvyM3DzocJNaxaJBdHgEwSAvtWMo~`W^CTf-l<(k9;Y(^0z{s1M*syr#C7mWO1j< zY@mqu=0yyFh5Q~=rk8bO0T)mg4Sxf#UJjH4&PhrP zr{w5Mz4OAfC;a$c%5-Z@WyWc z4T1;`U9agW{55$@O$N{Mwahq}92tQr{&jNr8rlqm8t~l`PE*ZxT<1vcQO^J*vLkNr3?!WJ7F>ZP|4}yGbO37R~|Tw-wHeY z&Vk5ny1qYIuD`A|zsnT~!jy&cS>ZTBoqnr+3-=LUWP!}A`GBeEEM3eR1wo9)ImBTC z9ffTrV!=;D?tO1v?3oFrOhqUxWq2I>x{BZ_14#s1+tt6lK-#&lT(Pu$nvbYCnbiEy z(HNTz%v;OG?LU=r)`G%65z0WbA$$Facw@ueZHd+X8Vqv*2oSs9d5>`L(t^T`Rj8Mb zD6<`}BI@po(-GQ7tyuKNQj27=JZkj?!yYH{I;r7(vGPR0OY`kJ5jW2STAkW*L~lrO^f_}rohf^ z;#>){A3ocN!~W!PU~1>AuT?I^71KO``C>(-kk#Hrm}wqVYC)2&@XCRr#La5MG#|MV>`su@6~90A_R-MjMqZwrGqLmG<@ zakoQiHol+x&C`xyy)t@fZz_7*hJkbJB5OkXZ!(@(>~#>vh%C$o4R(=K@L-hqi#4o7 z*&{`d!z-UL#?auaRX@?2$gQO7t@sm#BO!~RR=zQl8MF0aymD=g7coYw<5`o&IbjXM zrzL2P>PN97XBT$vL%AAivVf!*ij2h>Y{S}l{%W+z{CH{)BIuMTgDi4CEB)dVT&Ym* zLvOne$=J(bHS^QG@9Mq3*%NU69)bJfAi0dsDqQEpcTq{$=rE&1pXm}`rN1?olIANY z6?$F{flN1xPAqn*GjEnQ!h~ZxL8UDLzwtPbAOZsylp47<^p9dHOkpYJ&vhL#Tg1&) zC_K~3qFk95CYOI4IODie%kt?F((uXBq%zF$bPM)z#gGj(NH!z&gj+u2<7fe9GbOc( z>085EI?kq}F4F`oHJZ{|YtV)bBAQ8NQZL8|4#bsQNo=B?!^7iir%e#oru%(!g;2AdVaozg087?|Nke%G1x-f9$FI&%ne@9>lhtvQugV#e9v$^K&l> z-+J9%_F@oq92Nn=B_KQHaQ%m)x$W#l!CeJzi?DGPjGaS~k-h{K-*?a*$Nbv_FVyk) zfUH}KE&H?#M5wh@0Pz%AK-aCq*a24hVR70oGGU~L_gE_{eQUNcQE;<OmH{ka*rj)IsJvN}5cWVTf>$~U-O#gt#GLa!%9Q-_}6suF+yqzW^l3CA@MaRqawZ~IkaEnsJUMHwnHxRN4#9b`2_i`0wAW` zSpTUeLu7GTsuJvvivJ-e<+yUL0NNsGfdH%tM;zt=1{76x7hq|v7t%?Nz0N=VODe0;!Dg7T!{$t4eh*TN15qX+1>*XXy zGR$|RK9jly+*M>gE1aYyidAH00sLRCaC3#3Ie3#}+=hlej@87zYi%HChyniv{@mX$ zKV)Qi;^Sybyx#7jKRcB<{SH*@n-%8bCvfie_)P30kZwuVV-1q0jLnwUbjlQ9Q&;z= zvA#XOxaOU1l`KN~T~$lG1InfbXHtFE>Q#{LbD_?^g(}st*Nz^H+Ot}w{7pShn()fU z<;9g2a`oCf97Iw@7?4wTp@**ae$PdUM*x;qjQ(JVi=#nsGy1;oY{?+{9>YGb{~-LO?Ylxt zx5NJr@-ggQswxAX|Fh!0%JhF7Y;QGFKL7xibk%r=&~N_Sy)@R7k22#jBtroLGR)3zM$Caxt9({r)#y&~?R6&Z z(LKMiZU?aXhphU7_oQ{MaSUQd^xWcll$48W*eeQJ;Wz*ymw~dIIgx>$d%$rFPf>bg9@RGDl0fx3Nxky)hxu0b z?KWkg3!uu`fyT?C8l4d(;n)7%2QSBwSE5y}-<-+fYJTorW}Th}-(GCR3O1~uM5Fz5 z53ny+DX!m4ay0Wc_q26I$hAvJKT8d~w)3U}dHVpqc_Q{}I5l{5^|D{otYRgv?+5yQ z{RzQE!;xvZiXJca3#tnkD0$y{y^CnZj# zk@-08F1Vb)kjCO|G)cj*HY3!m?im$GHwe_k|6Je6);!(*Bmj~JgU}d>zYX^t0n@cC ze>9eE1rW2WX%nD{EB!ZaDJZ!R>&S85t=H~W0&KIh==rX-w*7r~NZ>DbWXoD<&0>ed z!_Y7;G%v9j4ngbO&`7P`X)EBj{oNvWi~O!lgOWDFR0RQ?00;9%JCbrYgC&9#oW45~9gP7G}tNCSvNLd>I%_C#h=GQ@1}S=TXVd5fdn#q~AKH73rfjV;Mp!o1I6<9T5x_(keHyP`s3ksMnLUS0SbU*b}Y%%1`wJ7PexK{5o{l#u#XJ3^B$X3@D<4BsiT& z#NRS0$_RzknxoyA!LhLVMFlLR@E4Gw=YGUr@r_mpveCQW_rosg=Ehz+T)gUtMbk+0 zC8^6YYx=~~P3Vh(p~&&?fW@m{PljVyRI|(*x!$=ClA6UJKT-h>lt_Q0+yx}c^eh;- zLJN_{^$8H{$(MBNI}%t&XoY-U%mT%f`RQ8x&0VqzN_a*eY<{_=!u$AxyF(_vGo;i# zrC=@K>y65WS-RmTII90m%Y#(%cA$-tWU8N^PWSf`u%>9si4(GCmV$GTlsy^5^<3%< zQ>=0@w>wv^aD1BWul@BS_cM|q*2kA;kqD|xy_XBKnM@q(@a5sE zG3H)g`t*V%7HVm@^aKZ{FiF4OkLdWs)8Y@8@Vs%6+Nx*7k(8j2=l80K&N1}eVY&o$ zmTYSzHB@fXWX>x zH6OB?Nisbs)A|;IhA9?Ome8Kd!h#_g^I718yFd*vwAg)Af=_fBQg8z3vgSW}JJ%V= zJ=NKmYheM1e|*;@h^$F`Qw+-vG#`gVwIL%CTW3q!+aaYpU5^?H@b{g$#} zd2H$Ja9wPeUc&F6?n3bH_)DRO*9wQfHwX1Kvf^$DqUWdOQ~16%%$d);m?-H=i(~9? zac`f*o;M$m?&q&@HP{Peq(UB@t6a>ynlwZ3WZm*3tfUjT5KKB`v zuXNW3#3}Y@{#@ayg)&E<+`-UkmLa{t_}sY4AL}%d=r)JHyp!Nev#GB?X}ZRRiq%6e z!XJ7Sd#Y^+PHOQ0!)?%ZYNrnieH-+cGgO0dP<`AcF3;9Ek2hx?82sy`F&eA=74{&X zKWo`VECRwJb(=4~IkZ$SGyGLslb#!*`eT@?kiF9zI>u};*<-%mq>1~c=dm97SUI!2 ztz`TWz)<5&-1*v0<%36lZ~UAdXV^_uYIUZ52E&ElZT2ZJ_?$#>gwBtWnI{k4B1#ny z#3%%>O-N+Kmt$b;+VX5(Tl(PacQ%Jjzqf94613Lc;Pc&Mv#G&Ntsii{JC(juJwX~{ z@|-gz;Hzam5CVs7e908aS0?@{Q{IfJ!2LR$;moaGyg>V(XCF}M6v=+5jL34NvI?CA zOol~}#wuFHMT&xElC~TSD%S)?j?RCwjDG4x4fdQ_GVF3R9c*wgCD$~Fe6anfhf+15 z)V;`yR#g!=j8jq=(XqZ*dC>nHu3J_*#M3WKX|^ho?BewI>WIX(9`%WSeRtn<6IQm6 zR&+PRs3Glcij)CrG=B*?Ad%h)mwWT{k3d2mf3_cFz85?b_$2->>here9xZnfI(+AE}SXQTT|bpN*DA@D8#C+L?FWbSqpeq3aah<0G|Mz|1=0 zqZON{3NrgAr^z9?u>cI~HF{3l^WD0+%Yf*&l<9iRu*=I03gZ?vIx@-pXLhU<4Df-@ z`tDZ`&*@zr%hV2Usu-AT_*5yOZJrvag&R{m00Egg(O6SBH%rRWeTa{k0Dy%L3c>|% zXE$=TE`@_O+W}2*kwUclh{s3DvO>i5o@mO}Xr14x%kEe*xClv~nQQx_8SQ}z*0I^NCL@0dXIK^Hu<gnlo z?tQ0fYG!VF!byF?^UTJ^$FEaQJ$2)xlTO-5uTxGrW#jbIPan^3*|KHh)eMDQ;c<@ZNQ}s2?fu8q%Y2Wqv zI=^^hOx26mXkYX>{Lb<7TE7Ql!nJG**JD1;I_s?5cM@11#zwkH!9@Ec>b?3x2iOLl z$ar|aSd=mY7?eN)WpS?m15~pKON|g2m_om6`v5GL9 z3oz~yW@F!U{+x;MTaTe_9jEpsF+mcPbUn4E9-E%sJtRqY^>X#ZN!O0zI|#zY{n^kc zTeohVB`lt&>M~8HnvtXda4)ZCTh5S_T)j>;1+OPlxeE6&RN98-3ZG;E)tG!HRk)i| z*DyLKdQ8WcwBg!?Y($Ak>38CJXOt*D!8#BOQtfLcS!@#oO@!7q+|FVgPW-u-_d~Ve zk{3*s6S&eYWN4iOy%yhfOi4IY!*r(9X}h9MD|=UQO|s+q+c~|OWHNysqqa~9>uhj( zfzi@+ib0lYH!`1(w^GGqL`uDmN3T&_MDUi(aS}AwwjJFPjmPVgimy0KxjCUwb_mxH ziM!OWJr1@)u`Y$K;#~b#j0%;ij8vJa#Jox3slrJp;sU+bRjry4Mdm8C7&ESOT&43= z;Q~CZDq?yjj?SIL=^LQaq~R05XNM0`F!t2P`1DACzpj-z@;hkpnd zRpLm@Zfr~2>C8b=>vP^h!Ye**fA$)ea1yJ|xg_B?BwaB<<XMJ0u47+_^ob!TW$I)5xKuSSbsf{I!z}Jq zb)K68^T>sYA~~seCNci+@?assA__Oa(a)GL}hcnMgpM1iqupgrrojo=F@O@pZT%AaPa=El-aV|2;mVM&1;5q+ ztlM~(lH`){(>csL;8NHP!ZCpYP7PwrJ&%23zg^q7ba)@nJ@?!av2&~-P({?_db-JU zTtjA~8B^v{6QQw#C2@eH1=j}W4^fq`z-I|)p}Rx^Vn8~f4{yI<_};Gl!}s?d8b7~# z!M@?!J9bUSDro@`D-ESC+N0<19iBdTba-Qb@dxj_W9Uj|wZ1;ij`Oh7>X!`!G ztviRu_Z*zs#vAwH6W2U@`1sJ_oHQ4nC#eX&Bmy}{NHUdUCJ&7(o?Cei9^kIr zgkb{l8x#A@E!zfHdmOa8PPFCP=$kj)J$!KIgTwDHzixQ%_WQ^0|GekR!&3(?9NfLs zfh2QMxqKk%TQ}b`{OO7threBO>+t6*ZyH{|;m+}m_HhpFzIyF#!y7l=HT>?g*N%O8 z?fN^0zg~UIc-_0V-8UXnwVbq%tMJ4m$`FiqsEO3rzpH!oB52Aqx~KspCwK~~tqCrr zlu<2>&sRW$DoF`T_l(yurRsR$om;;!5&@GB;{4^Rn@2+77^JU~uH+fGZ;tjr{P*v8 zV0inMdq;xe4T9nri2nEMZXXHDet;Qp4Da85=9-aNaQwr&zchZ%+3rN_E~QVUuYBU<)CcAP}SrZ-3ynZQE8P}M7{F!qR)GC^|b}l7Cn23NxkyCK9hGo_EyX`_} z*VN3%oyRkvYBBMcTo3^h4I+Wjs%)7uC!eiu4b2bQK)=CAAS~Je!6E(BIA|Ar_|=Ik zranLefbckv{@_0J35>c~iLdOxn}sTupxP2+QHiezt{7r2#lPlu0pQ^c;HN|&kU(ym z#8*%Tw2g`O`_zUJByHcmeQFb`7n2N$1NZ^}goOU@fv=BRhlv=fUP`*w6KL?s2ad6T zurM8$lo#09qpfERDfCI``773iWID)7?Qb zd5UxBeJG%r(irF-mPjkrTGl&7^l zYuI@UE-+o8j^|vcHCb@V`PT%SKW~M`FI=#H_}P(*2aN})&rP+)iQvPY+qrkZn`%tU zms0&7?!_cS?SlZ2P!J!Jt^klOXq8J>FF-k7;{cRwsCO{eM-P5u)HDQvI1jUcH@*Wf z;(GK&V+3k$wA{K2ig^Ku7t?gP11EG9iJU8lSyC`Nz21HP69eA7`HhE<4{twm$v|mi z=iYhr(&6=ojtzYH8&4e{HHQw=IolH%P|tY7!+_d<=FqY66UXrBs+7;7?RUQx*RWh1 zlLbb?8$l~P50OV;3m%7yh)+feaSbDYhz#Nw`oidBrD-%E<59jUKhl+Z&DAgXGqn#X zKBC%KnL@$y^yNqUFC1<81k@foF@V^PEM*^@}!C zC5-Bp9m0gEd7W1C`hA{$_EItp+q&1He!5C@TDzBmP~M)7 z)dN?F5Pm+H8TXoeK~2?0D*C9(<|bML5CJS{$`lA1p9rbqJ6tnd1F!~w#569`t~gEr zr|0k;*P{)7r|Q;;QX;0O0GpHD)$Z|Ws!#1N|5RdQ7lHGt%kqb^UXWYV;$ORV-$$1+!V*}XJ|k<2aI zqt{ba47*86nxP91kI!QC4g&%RBoIU=K6vR_$7o+Uhu_LNc*2Z}@ zu(GRKli(FkYrzlG6wEL>K{Tp4x7=+Bf=^LQHCa_@9r4Xv41spP0<-1n<_}-KY}5c$ zdkFGS1K{^-PaGY8bC9n-eq;;-d;FQ8Qr$*fzNCQ(H4k2bUWGnss}=D1fK%~>yQ&_o zV;_^sR|eKlx2t4lG+!RB+Rz0? zGe~Tr+J#!c!?ttl{!{H?w?3eY1B~Z%P_XgP0vrUST`|D>FP<2Gb7G(YfB{J0l%1o! z(j308lp*K(Gd$FpeC*_AYUVLbT(#J;DmK;6q*gWgl0x5}otyJ0wC!r4O;ronWh1FE zSK3s!0ij@^eBS(vqnC~n&W7>*>Fv8FhJZ$Z#&94*?$)4ELgXHR@p^t;<)h(F1%kXr z1467&;u?LN)Ajle!ZaSB;F6|B)wnMUt0p}yrLWdiq^zkkP6eXLP-*p$Y6r(AEA1~) z8QMWrotRkt?KVycOJcbhNC3v z3-eam%<~vkNLn@8n#oKq2_IM$fGSayfS%Lua@)QXdx=loZSUe~Wvou+vaedwWLy7J7I%xzATvgFQ-H@s>7n~mj*s48~#;UgUiE5$> zA684P-9PT^p(c9bYL&no3J|&2q^ir;oItlDSfxSS)Vao~f;X<_6RxR(P;=G7KJQhs zt*Rd=!@zTOY_1}!#iVJ`p@t~EAR(C%FSS;eNzF{fSl%a7~KmexI z$5j?E1zQwj5PKx^L}9A-Me^vM#w{o)sZ2eZ<0R=x^3v95j!bpIhMNsl%iKT6OT}E$ z((>%NRCVI~xy2F+_S9?f3G`=brE|(>DC4@xVsx{@S02Gk?jRX~OX<=)B-eLs9vEC9 z*DG>O`vIsrPKYxFC$vPV+F~|oA!Z60CrI@K$+o4nc24ZB$YNiF8;s>uG z@W72rkuDocU@pZY=E|_r^&Va8DutAY?)|ucs2Qjhr&P57DfUoez7$NTK!a8aRj#DF zTnUI(;8O`htkCVu-AQP2`_lTjE}WX$)}q(6?2`guT>wfE zy5op$zLlXgG~K<@UXM{25-36=X)--**`Zg>ThC>rbPqk9U|(V6Dq1I#+&`zjJ8(xZ z?53%c(9RBP{z2z7X~o2la{zRX5p-@7y;k-IAQ!qj;SA#7#Z5-yP%qu;{)-^3Vyyr&BYc8)bIF)p-!Y1 zExFp5UksY?f$s`3x4y4q>MCB67<%0+@CPBwm#su>b-AkkJ8Eaimoiwjw{S8UooAG!)hna;|41ph z=BeK~?9~<1B!P~!sX~tGKKM56-Z`j4uTS$yWyyGljH{(iUFuo)+I7vNl}f3A)Z+?s zOq;gZucCiRQ~6x0SK%pm|JO60hopg$Cxz?doBs`M|Q{+BeaEjqU`Wh7H+*k%a8MYbs~QI*(rtB6}#674H(IQcPdy~zw8fo)s}5tu9O9aPy~4+5pa4qd8V*5)@aXJjp_ z>;BY3Y2bKeMcb>ofqRyKOb1$g^99}F)Qcm!y>UHh(v^YD{ehF`Aky`Ut}9=hz|gn8 zt?K$KCU7%R{V^5kfPU=Wy?f2nX^EXza(U5C^+(lggIe0`;%1Fm^wi5M@@^6m$3qSbwZD&L?ezLM zJ%*2kc2sK%UX?HBs6$u1?r!Atzcq(-X~&6%A6)wS>nC1F7SHfpQ|TP_CXyG(#=t+9 z*QMbmx@`DT_q>u9x=05Ex=AYZy(nK<25uzXyO_{Z(oz)`l|Y?(>FnvL8Y96@Vyxrt1(*X^3}e)sMix$jkm zy&M?gHe|eJcDGMvp>%(s-zmfdCxB_{BbA*C0B9|o&3R~pgScpwnFk!=$PvF(1D3!Y zhogXC8hn!2IN=ifyisx|=lprs%Xoa%=0#fqDJ53rfrwnh>RjX(+gjIh)ns-$dELqs z#-8Hj*i`N2%yAF(Y`x}k`=6yfrP)jQZftGyAH`-H$2_*Xbs$@Xif5YHc3$Pm&HS z-)H@ly1WPUe0qZe!r)r^B|iyY#90zL*WHmtN+IBxl43ss{IW-rINm9Jj#*GSWXjlE0Xc ziLKDIqF(X(&8ZI;8YFW%D6O+>Ay0QcjIB_j&c@#-2%X;d{AkrRA@OCA=O4>f4cYB3 zoW(zg|3A`dh&r5%5(F#ovEVGCJi->`eLb_WO5wK5Rktw`oeaG>=v}_;oGgC{Q<6&< zzp8e;`}t|j5(f0Mo``0+?Z%mC;K{8u!l^| ztSAxP99mhj&jM;{bch8-AhzbsP7Y#waPP+2>3;&VhCzV_X_I22HA42k+4x-0a!zWr zapo9_1U=`#wjjs)hbUtIYtx)TvASs~TNGjIxPog3Ckv{? zsaRC$V5-ipH7LR>Jd;~Jg-z6m^r1rqcB}c>)VRi5)?ZX*vbf^6D(?EZ}7=%%3sw2p-VjV-RFj6UH`YR&qti8Ea9oIwL6=uw_? zjCYB~H{uFy$@paA7E0QN_l62K4GaxE#1671tILT351r_^g)5{!6?oB92s%lwS&B#0 zzMK^NzSw*~|2Q&_NIz*2)X7qhm;m&nZ@KSL#P1yJ;bI~~6& zAJfDFW9Cui)(KdP57)>Cj*i?v82i~Y)l6?EusM-Y0GPwsiEkIxv=*jcsOZhn;-}^0 z16B!eu1tIwJnl*;zr>BH*npANdGXD<`AB-ql#| z1p-L0OA*>I@h6^7aGbcI_xPvFoR$<-wmW*N?wUJ<_{fh_slR|%APL#F6{ zUe+KS7V8(f2PE}3x;kFGVEQ9=YpOQY=rM(KmwT6b;VH`=aO@*HZIYtU{Y{Pw?w$VK z=J}~D4STcll*{$~iH}5!H*%%6iwHAE!V@iViXn+8UHCxQfNO(roiu_tr$GrCn+1_A zikTu!^n7|xfSFpwIUG%`q+5`m!uq6zp7CtjlMn{wPhv$+*JZAxAm9F4t92=&jm2-A zCWrZfPk64=wgorN^sp}@H$j^ zGNvbv@E5_CO#diRIz2Lcv$+*NPgq*C#z}p&JcvT=mBEL7$UaJPa1|0EJFgpCTwaR& zFXD#qYweV&u{0F`SdtgPVf5Yt+}@NH8!ms9fIaYu*K6=w6Hxz<$XI*K&4Z=1*?QQrFU)9E}d=n2c9Tntr&UzzyMMxwH6)J_cc@ zaXLK!X%GkfA@B{xGsr=uccf>hg%`r)GAA?1wUcHyUd)=gCpI$(Jrw*miaZJl)1nST zcwNiXq0y;j*#hGfooYi{W#Zi4{N!0NXJ_FYmjV-LjR(a)f43nar6UDT6L0~xR-6W` zLnkQVQOIY-TfBOKoHi0L<|MNtt@DETXY6-2>)w;6;|3WYz))A1IolVidqvpuxcK-nGz#?qh=dd@W8U6c+z zb>k_)9RT9pHwCpSLCi6^A6|6hPs)+Pif>B#U}S!`h>7Mp4Pu9|7FLLcWG6=Ba$9~N z>0F-D1}))WEn+$-u2ziZNSIlez=K$aMeNk9$of|)zNTr{C3+rviA(w3f_QE7z(-7aWB&MNSmf+d_PmJ# zR(s!xRF}E%qv-~rs=6_))l|7ZAGI=l=EslNOrp~%mhlNAJ7L_yEh%9`x_}8LJ@$IG zgM{#h72XQ>R*(_nu|mUz=vTGJ7FS;;>V)_{zc>i!skJrO+uZr0EMxzROEXF9>G$z#p|1YDOi?0DG-T4gLN1UJ}0~Pqx{U@Fy7Fe)5u6b4-1<2-yKrsMWk>d zWTk9TiD^@$(RYq1ZXjU1v&%oXI`EIU#Do~4Kb_&xIA$}APS)Cit$zGexxS17qJjC? zae{o4Qvy%Ahr~p}7!GMGy>7U}<5e@Ofg=13jcQSCCD%A9qg`qYNcLB!DC`P9Al$|RAkTYU85RHu?H$x2~B~~;AFo)jF3b00?G#nUC~BV`Wiolz&fZ@k9M8-dNq+R3sIh3?(_bTNjG2sM`Q%Qz^Hy`1RF5-VYmOgWLE2Y1I`jBNf7 zES#_qhk=2Fk;>56rdsUU5Sn|0Uq?s9Cv*%iTrAB|H@ofBmvC|THiAsg6h9j`wr!_V zDgGCp6ceH@Q#>is&`c>cNIDObvNDvy^zQ1v8_vllk%C9}zZJr<2og!&>13tq-O^$` zcJFiVqGhX@tA>w`3a29=+8EfO zVs>C4g-mX>g7bpf*VXc;L79t%6t(j+#jz#Q$u=^%z}POL?oHyDEX*0RRkw z|8)dFb}s2#5f!SeE{}SML`s5*&gk0Z_tr~MmXp@?UjJ>pmb{^WKXryO;Gh7DUyXXk ziv9ljiumIJ=5Ii~a0Lj4ucJa_7$O+rt>SxBJ>;1qLW`7eJ*@QggCm$$?b@!x$)+$Z zYYd8!7I*AN9*zsJ0Hu+r)b=AHHe%@^kGWb~Nv3@t{lfF8sl*Vt0V$#nsk?wtL!J)$ zEb}aUSczF4UxcAKpwVQzmT&0bWx(Mq^W90`pKj-g&N49;6X8HN#a}zn1_WbHdlhDQ z`z#rg$eDwad4y#R2zPv70y9ez!E9RUd>RCZgB!3J+}|6VqmG>w2-RJ30*E2yQ$ok# zqCaCCQBYl1e?NhM*d=C33w}i;Q*(>X$0?%l?e2fy;!=iu^>Zz2;+jNBQ(ZsB#39s9a$`Yg13_x*S6KmPsN%`NiE+-%^MwfSh{E9QA%V;j+t9Jl~?S14F0 z0bWVw*~@E2#tkq1k}$o>hxvX20$*=ST2<_@0X_LV_aY)7*Ilv5$?H>tJVq27vE>}` z-=S^5D~a!^(}VX6fu4}|*TIDsUD4$jEVkHPn`$B^s>>|{#b z4OgaVG2u1Ya0~nA;bWH+;`=O(s>3rXrEK&?)|8~;sX;$0kA*YlMw$WMbi`bzNY;8& zT@)PY&bXVMiOYxTlSz znT+oQL=!uur^##3@?G0PL+}<)yXDC2hZ#C-8Y&v~-3CG{5%GpIKN5=m@oGIcK1!|3 zuhcaF=y*2kRxr3s?c$_dr{@0H;y>vLN?A$M`xgPLmcoNJJD-H#?Nfkl?bJ?7m$z#s zH6@5583T&;2H zP5*pZrN4NDBOP)KOo=g3G_*`8ixv9pIx>jda!JZ{iZitB9fw6)cRZ}n?cc_joeNs5 zHQE521FZ8@$f$V3#k!{C+8EsoAouh>U!$rT=wOdcx#M6uDTXXp!~Lr*(p|gdzpHif z&&rj=ghD|ak%}`xS2S+w)vRm*rACn=L~Q3>QX&ML?oq3q#9q1ojFG=lox3y14Al%t-La%o z8;P2nbmbmnFh<~b;?RZNptsXEW{s1*?Q{}$B?52>s4oIhbu&CwLRN(8JKpflnifch z7SSJ*@uBmFra&dqLy$vvyQ%@Kfk|>EuiIt(HtGz%cTDA~gBzALq-d0BRvI6;!=t}< z0$a)+wK*NBE>X2Y3N2YORzC16%Vr{8Q-d4Q{px~KM#16-zP>bFJ0<{Q94!sUqFr8RAT^Dl7vT!+(y@0(Tk2;sYzO3^mN0|1SDbcs3+y*FJ|Yon>!|X6+~r zxoV{-wc}AZmDdYV!)>+f@3Vf;Iql@lrR?0{BPb%Hpu<)x#y{ygZbLjgM}>}wG%C(? zjDeG*?(e&n+GxFrcblYa6AgqP0KPLMt;Xg?DCQ~@R^FrFu~#HiQcqE?q7g&hl=M2& z4H=|F$+o>a)4-?swq&2^rp{fI-Tw|%FV{3LRR<#K5(Hfw&4gEgpO(!cb7kA#dm;1_ ze<5oPMUux4`yl)Fz?;nQ4WukEeJdl@y*Ew!Pq?oRf?(*}i3o*I3%zno%pG4)n?#Cp z)n9?D!C@L9^Wt2+oZS(s3{ZkWyMcaTt8E&h#4Nv3pR#~JAjgT45Gc~3-4QF#K2LFN zhFx+cW=z}Fb1b%27F~lxa&=P#X}DrFDGbiibD3ZBnRn=;BgQkYdQ-q<@J$(;@Ta=@ z1|Yk3Hp8x3E}Rr}p6W_-8O4WsyicI&fpuB7LUCfnG@}S>oFMZ$K>dXnPBdm<;_Ppg z`jD7rv9H-6!QeRL)1J=r`M@u0nI{wpBLUi4-_5IoQ!>T(MDU~2=h-q7wOVJ;e`Wf> zUHRDlKPZ_eA%j!Z=3SA)j8(AcsST+QJGQFh;9$9#W+wmBUCZT-nHC4pSP; z@kQZ)1(rz=I#7Fr1{A@vS$;CnIQz~Qy(p|k{+(HOlgrX90LJJ0#22axBBjBo{QP`_uYad(gtG1bK`%x_~7}2fVgNkS@JZ0+Qb7Kg5h;8wL=dRm0hz&cq z$*+Es{1%9l+N6g^vM1*95x@x3$bcSD<_TSRZks3<8D^{4n}P zUcYQ^7`?WN(iup<>Zsxv2*8qEmTuQlR%e+Ob<6H>kXlsTvs_m7x?Gbi7{}mG5WHOu zv}(~;TSW32vu_!+Xy_M$F_-WkOL~zcPRxuvjw}gO)k(M21ykO!m`_ioa}0`rKMrLD z7ZuHn!D&w(U+6||#Z_3COA0T2p(c?&`-V?DpAq`2fAT7(x<}UktYW1Rf1Y~J8=q#W z9vN%r0QwHw15GM2g~MTAD6|~pXUK$YF7AAn42_Vz;Q*nziFe_|EjpBx!txURH1n3| zd}Xd}PC)!>@BaRnB0v@um9aDg0IU04+(sfN@fu$z4aA^LXS2s1ERQ_DD!^> z&?isL9l=__q;B6r58DXw>C^hue7ZC3(24~k8jfL&$|t%x9w>PhWiYXn8|gCpIL}3l zE_Ss{?2^oG4oZ-U`{-jw*Xkqg?P-gS*Nz8?e;xw`;Fd6US$IF=ORgx;?$7maqav&& z5^<-&>FjKL!^DvN3~e;~Y=2p_dr`RWVh?h59|kYb`gH2p_Jxa7q^-{LYd-Mm(*_+w zcU~#@OKL=&3w-VmWOJ4pjp$ebv9AaFt(o5$2g>%elgp_($)f+cDey9gGL8h|>9G0v9ze&h5$w07l$JLsk#oLb^pe(N;S1V%{ F@;?IJlnnp? diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_white.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_white.png index c6ae669dd830fe5a581a46f6dc7d3f07494b9748..b70b554190d24fda520d6bc0508948bc2db4640f 100644 GIT binary patch literal 4405 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 literal 6866 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 x#<<0c0CfxOfJ(VdIP5a0Sb-{{j9sLxTVS diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_yellow.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_yellow.png index 6318e163d74b28c3aa5247821c0ebffa5cdbf140..50962e99d755170d347cfe832f75045b65383da5 100644 GIT binary patch literal 5354 zcmVyQjP0>adIy5jIOk0I)dr*U{0@YO~p_*6a1kUpmfnj*pM$-}+uJ9{2yw zoH;YMtM|#t$$YHNt?%sD+xP!#j5RL(t~P6osV%jkcin@o;dwPi-kXk{J$rV0Uo{55 zXSG}7sB7ySzN(+}zu%ks^m|VCRoD2ZzizteroFk=IQ`hpfU6NsloLX|>V~;EYP=@Q zC&;f!1Frskahpp5szUVcUx~}@HV_fKJo5ak1bq|Rs z)ULPfjK<>~anu+)CfVb9r&3?c#3AXpx8Mek&z(EBN4+l66DPZP z^##*)nozabiL7eBL{;K)znP?RM&gq9Oroarp&H>F`FTFMHGZn6#3)=`Ur5dq)l^5o zelI?TR#o~U7Y9&mq#GHDSPs-hrV~j`SP_QnC|_iKFOE!DArWHTPZ4txk9z4pmli(x z35z6r!G$eCOJjAhUH7O@zorPN)Qzhezh{>|-cK91#lwsb7{G_rQrSDaKjBz z9D6@hJ+5k!N@TwYOE||DAoY3kb2*>I6fV{G<|2uy4iqN6Il>Uss|hpE9OLA0(MM)a z603z3Y7&xet%S7>ExbGs-60-`5<9&eh9p)jlw~`PA+*mCQjo{ z5-i%WZmx~QYvK;4O#eUG*N!O?lBIYqaqN>c@^TfCCDoQhxzB-%?gaD_L8rO!u_ou4 zOD#v|obLpNJB*cHKF1Ccx7^*id;LOk$;dC@x|6!w`*hvr<8Z6Mt%sUazpf)r=L(vE zba~TtOEgbHaYRm4)tP`r#0luRl+`)q5u|(E35xiQOw{44Xq&p{FPRwx79DVNfRiM{ zNYx~jQpd{yVy@{)#l-)5JKETHUjPC_a)2 zMsb_WHU}1Tsk*~OugC7&Oiw&;JU#T2)uita-@Te1y>~TTyl^ysC#7?tlV{S!{lyFG zxt+)EJDU5^=Yw~x=41L)pO4>vH210RkKVhPkN@UJ%Uj1Dxo7!QTSb7KiP*&&e5}qu zG<6-B*ZdLmb*Ayi)t%1S!w)>!CsC89iPA(Y6SbZvM3d9GVQC&Fkn_QdtLej6R?{bM z9AEuBy82#EfBF5Hc_G}COrVH5w+l*%xZZzZHC=jXHGTBz`s({={;j^QytbJ%2E9Li z{b)W%{r~k3XRn^K{HJR!y|kXkN&7o3e)3j!dYRS;P0vwymvfn@IIh6pZkQWv&O&K(i17Fq3m^2W)$p!)sfPfzA! z>g)2$I(9UFe(>UYUhpD{%P(){g%@Gyw__ISTvr!Vb16vUs`j*z&@RR>imp0V>Dq|? z0E!Y9f1Mwkl<%R;BpS8g;z)^PEsTDP`y^cwvhM;^X@cvRB-Y!{ES#(bl|)cq*CoQq zOl-gX@uC(Uxku-$=kuQZ<@uRdL>xL-?THawRF_&CVV87_?(`zAg#2mhCBFlijZP!3 zjjNy?BI9H}{qwW)WJv6bqcla_sMU8Zkcc2r zG;MMRU5sR^O>w&V`Sb5i<}s^%9n<^0=NA znO~fnKQ)GBd<#Ay*m3|i3W9YmX?L*EdP>Gjd8n|V=0bXpkoEkGtrz!a!13{B$lKJ{A*_}=sD>CLB>_J8$* z)itg@-dY3tl=v6HJbd?hwn8)}sXE=4q{UlLuO{bsCdMWU$elMMk?zvfon(9Z`C8ka z56O5#!Ury4S_fEN_|JE~IsN^uuTLY7TB5xFeDJO5U+>;JG1}+$ucu0>KcR4mWk~{Y zT#089gBF1PY`;l@CyGm{2Q6T=C$TOGw_pqrt0cf?M+Ln9!g^~N2#o4Ked@Q~?tx74 z_hjvivUSRfIC>FyAM($5o5TuEEY3_jQca>x6LKi><|a{Hr-gK}*tsTaB9}>DI8zfZ z&Xo9o*mJklMSfm*mqPWzjf+D9%swi8%p>JZ2sp zEQ@I5u+kh*%$6zZ$UV8d9l&+wV+s&aeK5F1^K_@dJHLC!bo(8*O`~+E@6TbMBuTEdM<;zoNwxsMEo%^{j-7!F@u%K zArAPMsoVk9v^edAARbTA+GPv5$25s~rqp>*W+y%m)h06<#=JmxUY#aYiip|U^x8ZYp`-+hj%gD38wGsm z#iLqdIGMSENjkdZ-C>ZjedPzgcwuqs6lkhX0Vjc>iVQB!lg$=1RoGPLS14A9Uhd=t z=pAqW>%>_q)+}A>TIl(qBCb*lCX}U%kb$!uEYq*j!*7h7HV{=DiK#os`Y+~ zaU38su(uNu)~h^Ubxh`xOr@G!0Y3l#(?6Zx21`;gLzhF45;jtPoY%G`%U~4U8ij6C zJwgY@d|{Z0MBwG1lEtFL97)o8TKOobG>R0CJcf=rw(}~gs0QTF`S<&`ZOt%!pDurU z3k>BflBrlX`stfrn{;eMiOjJ}d3&9H<$`u1nMJHj-=fce@%Rp`str$Z_r)b3O#qXg zzC)(oDB*=}cvc=K+|dQq61JId^qpsy;7lEpyHp|7>n7i3D*@D51xuWhS(S2{6ecY! zgGyc##|qt!!$%%V_Q^#mv6{-_=-2PEs0i3ns&~qmI)v`s7n7W0owDA)5N@Wa%p(s3!1mmHZEiecqM zL>iMeUFe7`aYSm^}qfT*B6ILB1|9NF;O&eK|3ADn6{TTQMdEO>|-u? zSJUUdheI`yEE4I&`^eLoz#P-z-NK=lFcqP=C6fw9Q`%WcgealvVqt&^?5J_+c;)Za zKoqlAaHOuQyt~8+T}>W+04a6b)kBgl6opCLI=FQ)>Wg3h%Y&ARCs|WBa!;q)dk2u6 zYM>PG4LB00BX~{VZj?Ff71#5ax`L1{1v+KvcrpS#aw&_5oWYtm+QQvlI!S-Kzux2G z)T1mmP39BDbGJbj;{qurPvUcK>?G2mimXoR(Bam(!{@er5j?-HGbvJXBP(lZ=B1nH zcIhhh!q764LyOBPP8|oZ?$MEPI;ZpM@tQ-f@{V|Y4BY7?C2)|@2#&q1o#%Rj4sldl ztpL`G{v zX`8T7>aR;)iE6-W)7+2Tm63OY9C-&F4JRZ{Ck(}>FRtHooV%@m2G zx+3NpMQQiiNEN0OH@^9UdzCt!>?Pi5XN+!OezROazpgTG$OYZ5CqD5E2~&SESK+kI ztkITwj6=9t#zYf_f)h?~EY^8j(^$7s*h{bdX5F{kQFijjyZ#<|_2`dx{pX1gUD9Ni z;lrIr7&k*u+(ytED6rx`=B6*vVJ0{hrF5-DB0E$&sX>$>afzkuFU;V0x%Eam=C3B5B4Y zH*!Mvg?Cbl7KwM{S*-u6!noUNCz*Z(g`UURfk98YO=H^`XDZ(C8)UL!+NLzsv2pX` zZc8(#@>E)tCWqrosZtD-r2580kX`|l@*O>-oHoF4qA!!wnJC3Fy8J*Uu`sjRB}dxm zl6jIY1-E@MS3Zf5l%>lB^4L5Vj{br&6)8;;I7+~!bT&=SQAUirm`5SkkwYed!&Lj1 zL_X(=Sxtv(CAytVN5L|`XZPm}V+qwQvy z>BBMbVGPM(Q~;I|!(;wbpDAcm62YGZF!FbFsqjf%bWD_TCZiM}$CF#Sz3&Nj9HAy) zm9l#%c3I2D+=5YgR#FiRuXgTf#yH#)H+pD9a`1E!Qs3MnRWgy$y4^*Xs(+}$sciq9 z_UJ#S3zB=^cEyMEt|d`6GH+Z=ClT6hABrZxB+D-O!J1q;Nc$Q3CXL-Ty6#&U6}AxQjRI}mHvEYRI&a_(bEFBO*f~w{WOA|A_1Zrul`y5< zE<2FJ1x@~jR8!cAO%|3=UD1^CHkfLa<{`Pfy9gyy+^N2Nrw`Us65B9{Mn6uM0^f3o zQ*?(uQ>ASRc#NJKFv`+RTe)@~uu&kZd(Z`I2}oc?SY^L=z_WA7c8t{J7Sbx~aL>pO z>e_INx~H8e(qm9ZPvA<=0~jTLF!92lg~M~Gsz#~UF2+3^Ucsc~*FUu3V|uJ@mvQBe zp!7Ib))0*H5=PlVXyo+#TZ zT^K}450x5iozm(0($miQ=|Ko|Jy&0>@=2zeCuVl$WZG0Jm9qP$3p}6ZVi9B7(k(q; zs`@Bk>cOm(K33|B*-;El?*UvQWu{|S!?lp9(k4Z|x(y!~MCroPPNj)Rxt}mi(~=5& zJPnDu%P2~I2ohd;%={?EpCY5li|QFlT_sj}U_}?^?qUZ215sxfN*&G~w*UYD07*qo IM6N<$f~l~Xr~m)} literal 7571 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 literal 14050 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 diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_white.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_white.png index 85c291d7ebb37ca1840d2c2f115bbb806eb1c329..6306f3252797b540066e5763bdb090d2a3178f3f 100644 GIT binary patch literal 10936 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%0DXrvO)lfqxMND8{Rpk`FKyx}q{|9tJTS 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 diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spit.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spit.png deleted file mode 100644 index 6cdb3e0b3cb7127f61d4aaf9f4cf422111d8b8f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 677 zcmV;W0$TlvP)EX>4Tx04R}tkv&MmKpe$i(@I4uA{G>J$WX<>f~bh2R-p(LLaorMgUO{|(4-+r zad8w}3l4rPRvlcNb#-tR1i=pwH#a9m7b)?7Nufoo2gm(*ckglc4iIW3rdfe;K+|nA z8IOtS%&HiCMF9Qi#VC9-vy3@ON}%odx`&UicTt|z{@kCVTg_Sw@QK8;%rI@@4dUrd z+u*!U9A*VsB|aw}GwFiFk6c$ge&d{XS>TyrGnJet4ik&{7FJrA6-D&>*{h@IUz7t(BXc@RC9?pyS1HK8AtdE>N#J&iAq7)K38aGjOFh{pA`k^GSNO zsYQ-}o^9abx~VC9z~v4w@MOrQ>`H!`LM{iqpV2pEfWBLxYt8Gev5(USAVpmzZh(VB zU?fl3>uuiM+1lH`XBz$e06}GPlbdAG@Bjb+24YJ`L;(K){{a7>y{D4^000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2jv785h)`{*3PK_000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}0001dNkll4QwuwQqcV2oV@5h6uc#qK6(aNpT}0RTWj8iUD{M z)G8^Zi)i+tZnfu0wCzUgdi(dB@Rm%}6Ot4F0!wg~R*u55y8Af}EGd6QY{v_m00000 LNkvXXu0mjfiR>Ik diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_armorer.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_armorer.png new file mode 100644 index 0000000000000000000000000000000000000000..6d0eb39b16ced3523c9dd5f71d3a0b9ebdc8143e GIT binary patch literal 971 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 delta 705 zcmV;y0zUo22+#(QBn5j=OjJdYFMEI2P@CHT0004WQchC$Z5%piJ6Qk!Q|B-uO?x3-k1s;z;Uolx1`^4XFpgoyaTqR@p__Ct228vz zU}DZWF|ZStM!z68LBziWd_#~DO-dcF(0hn4f<*J{Gxh?}2<4#lc0UyefINR?no5~+ zQLV=%phvJrrQ}>4a%u6L3)+Im4koqrdj&cu#R@z0hf@LNkhp&ATx$_!XkmvyRLnE6 z-0qLZ{q_mYb5!Y6Av<;;SfF*=S!Dqz&GD0tGavw2@U?kX$+cR;@$~&j64vLkZOe0o z_6GII<@A-c;&HM~$x&H~*;93HfQi!Ck_C>a_B%U&+`(G&r$4dR; zx&Xa{Qp?Owg16i4?frg#UkQL+0RyfCH|Or05&-l%A#e@_#}OE?21gO57nfB6&XhF` zAUHL&>GzGG)-?Et?J=`2c-xSILYA$7J&3vWKMEd{_((zEf}Y^uj#+=egB!R(n%>XN zxhN=7%rtl-GQ!~v0!l0!+Csp_BSHLweF4^j=f}r$S%gCZQcQqJx5xAI^SLZC1eAza zjs<0(RfPIAP6^`R`5AMI(R~k>Bapf+90p++=m_gbmg7)>I>-y?DX_;Y0w@H~WkE!M zA_80OsW9QIfquE?L z5uj}ZHitG+;%KpP9GsEe2}0n_Bx@~oGj>kE)~0Hbx7fm9JSmuHZIs5=7}&&VfyL>h zIH#q7Ck5uvB7(&hToc$7!Cn$LiwJ?)R96HU;l(4aBXHUrvvV&S&MaDeqB19hHaREXqSO!oQ7_pk$*QgH-vCndu&^^wY9jF z37&mfl!9(@WK@E3U|UZ^g>+$0TPZ$9AWc{(KSm%+RzyfuKT~2#UTaf8Mj$~;BSTFi zKS?1}VJk*aB{Di1NKz(cc35wJW96%h0RR910d!JMQvg8b*k%9#14~InK~z}7&6nYJ zqA(DJIp!c)6fC7mDNAXHCZ4|k1MZzkup%na{@IHV5;I?BCJ{*#c}ZD9QZAPXv|LgP z6a`C`AmFl01e81ja2~Kd2y##;p!5U)lH@6X*KYy82*KHxKS_L0-u`SFAB=q}^1m!+ z0la|x40tExU`~WtKs7H}Ip&XRJPv(PRgn;>pmVieuU6|n>(o{0#BC~+YMMq~2u+Pr z%37tO)N2KEVx$+E4Ixf(#IeY7Rz?*xK{0><0CY|^n^?RQuVwjKyoq?TNeH?o#c_ZK zsQ@6|?pWIt0D;C$;*NO_(wH&^K()hX%Sj|^BIqX}W&whOPQ~{9Ww(2I--1OA!mVgA z@4^47`h!(BUQYo2LIBjPIY9gQ+1iC&i~veq1@vAcz$XNI8wAk0r*i_BcyJ?xs{jgN z?7@fEG>MZCy05S9{B%POvoO{kBWoI7>pdMe08KLx*n6rSSl0pVg$6+F$3F-3h5&Ri zvw%ZyZGWgwI96{A07ozw(BI2JeX#cMW6BOZ2B@t)&mY;>96pC|o&&4!lvMPH^dWe6 z5yHhJ_#`?&kAnfq$+|+S8y-xi@f=_mkOwJz>DHRHuB7X=^*@M=t%s1<1{VrJ`^sH_ zrGE$M|0R@KTnpjukJ{S7dAcJjPWWjWUCkADo(OVOc=DuIe>_@!JW@1Pk3$Lr=mvo1 zsI?)0(a!+1bpUOj0U!izT?ha?7y=n-mxEzu@yj?t0svSMrfHCa#%LD&L1Q#}nHydp z+z4_4s2gqTOF+Nh_b}m3a;RMaxDY4@;}GN?Qqs`UHBwPcDszO4ibBLDO6>_iCD#lq z5I|0op|xb{YCYNap#TT~W33?o*IbN`0elEk!1){EEx=pb<`e>z4+C2C#F%9)h@g&HV%&AK*6;<2ZJs?^S7?#(K5bh`lz?(IU+@V9pN0~_!r~b15sQAvi zMP8D5QJ~0hQw^{B0RUO$UDpvHD`Z&|QUVbU;Ovpe0|^ggL1BagDv8na{2RU_@~VI& z-TdU>{xs5dr08<8D#-zfhAeZNl%R!#jSC2Th1dZ~0Pk~x0d8kR_H1`*i9&R5w-sXl Y4?JegOLfWt2LJ#707*qoM6N<$f(l`|bpQYW literal 0 HcmV?d00001 diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_fletcher.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_fletcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d9875ec10c0313c2ddad9fbeb49c468d00d923e1 GIT binary patch literal 950 zcmV;n14;aeP)&S&MaDeqB19hHaREXqSO!oQ7_pk$*QgH-vCndu&^^wY9jF z37&mfl!9(@WK@E3U|UZ^g>+$0TPZ$9AWc{(KSm%+RzyfuKT~2#UTaf8Mj$~;BSTFi zKS?1}VJk*aB{Di1NKz(cc35wJV`_R{IYl#$7%FK10004WQchCq-FSrYxPDn3a? z>GcHQHwXX)X$o*WosM5s_0<7LISNo-9l!}xfo1`;R=7_C?pPQF3@vIG?u^H=^&fQo`MI`tih%=K(7y8!@TaFS3lAUaA%F_rOrz_$(}QmW)j9d!yy2+2 zwz{s-jn!RC^8mU8Kv`>T5McB(0Bs#W+h+h^L0e}501GW(kajf)GYd~f1DOGU6=BK} zYET+Yf_&g&)LA2{s{x=WwJipK^EnL0v+IojoCT~w*8)UfjKQUAROr+==5N7S!wOn?X-%J2G7e-jq_J8;3y9W@$suuuCaAEuL^8lQ?!Q5KoTU>|* zZ~D^zTOfI!`(_RRk@4~Ou$bK1yIVz%6_NP?Kg>nuQstRt5x^o58)cC8HN4=Pn}9 YUxwY_%9BYYT>t<807*qoM6N<$g02CKNB{r; literal 0 HcmV?d00001 diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_leatherworker.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_leatherworker.png new file mode 100644 index 0000000000000000000000000000000000000000..ea491713ebb1f1754e013573df0fa5f7fad2e98b GIT binary patch literal 933 zcmV;W16urvP)&S&MaDeqB19hHaREXqSO!oQ7_pk$*QgH-vCndu&^^wY9jF z37&mfl!9(@WK@E3U|UZ^g>+$0TPZ$9AWc{(KSm%+RzyfuKT~2#UTaf8Mj$~;BSTFi zKS?1}VJk*aB{Di1NKz(cc35wJV`_R{IYl#$7%FK10004WQchCu2qsT1f)*jer_%3>wW^I9K*$mU!(#Xa0|o%7yy9I@oL4{dh=A4Pn+M2uU0Waa}?(R z7NiUS=~j}qDF7JUT*dYXhykY++sZ!@K3fVRQe%c&f`ug#^xrqGn&PV zpQ`GGRPCG|0Q?03pd#G^><@?i>+$&711L2L&`v$T0dxcf0qR;~xexfng;BuJg%_t` z5C<;cz;3Zq`c>%b1T)t-eO;gM_yn-qc>-CFtutvHu)mQ9RBrw*KsN}$s<{g|Yh(1e zYH=jpGyu2&g8+Ie2G!Y^^T$v!U>=|{rW-#TUy=Ld!ek7bx!^)Ix(XJc;g|&6STI<| z7I1xgyLJnFX>-jOd&YV!|Glp7@7HdjF;JlkwQEcQ{@rNIg~?4l1W>@+Wwb4Ons_1z zp+LR231bGmpo37hE2-OCDE!_80_Y@q0BWdj1c=!HWrOq)19$y(fK3q_f1zB)kc~=@ z07_L30H>4Ig#>~qq-_yF=@CF#iUHsRQnJ7~WudU8b#nnVI_NjZ0)PtwxC4*^0cbSZ zh61~-3ou;iP=Ixr#GRNNf7I0Jf72enh!;Z;ZF#t)C_1u)Ec_Z z5M8H~W!mRDS{wH0na%)V4gy&yV+}tW#7Lc$V8y0nZIa+iCl=KL&KX3%#IFMDDje#&QCIYMUvDP>pDP@{sMG;-`$7d{s};T zu-*VYYC!!TKo@|z1<9&ItN_8753Z0aAnE-icB$}b0*o+YBy2vNFlf}O0Ca_f5#b1g z%{4{>`ax)=0e=J)P;J2GSH@aRgfX=t0Pu_eMF9P421Kw{l|n$6UC?*MK~@06O+-M7 zP*MB@&<7c?pIXoyVoV_dv^oNC6I4Nebn>;ejMF?%`7lvfL8;~+X?i@Se4GY+7ut)= zR$=7Jhk&is)-oRK2)tkCySBB}Ti~1oXAA&H98d$E*`wF126zPc;J*qm4y1Pw3D*EF z^>7M6(^3Wws0r37fbkwP@X<@P+@6~#_hnh6we!3z>0v70;NdX?Pc7gL)pC1(nsw!u z5g=!=TH6F{bA}Ayr`R%9VHk#i=-jD$FPlLY7@7S4*Y!?HX`w^4RfI$_==m(kPCku* zF-SOKZ!lhOhNVf4XnlhUKo#2n<2F1`*ur4rH35$?f&eNfKwf}eFun%n|zDYO<~mEnp zbrGxukXFlO@a99EC`6XD1(-@=CQ{v}!#mWB5TV%zvuy8p8^w6Dk^XKKPc*UMXQ39I QR{#J207*qoM6N<$f{`(=`~Uy| delta 738 zcmV<80v-Lz2!IEWBn664OjJdYGKznylo;m#0004WQchC$Z5%piJ6Qk!Q|B-uO?x3-k1s;z;Uolx1`^4XFpgoyaTqR@p__Ct228vz zU}DZWF|ZStM!z68LBziWd_#~DO-h}w&~b>bf<*J{Gxh?}2<4#lc0UyefINR?no5~+ zQLV=%phvJrrQ}>4a%u6L3)+Im4koqrdj&cu#R@z0hf@LNkhp&ATx$_!XkmvyRLnE6 z-0qLZ{q_mYb5!Y6Av<;;SfF*=S!Dqz&GD0tGavw2@U?kX$+cR;@$~&j64vLkZOe0o z_6GEvrB zx-LK@kp(FRgD8a{-KjyudkXUtuagCd?+Bc@K}7m|tBtR3Z?ENtjNM>ObB)*c_t)av zF8EkMnW77)m?{O#bfb;UZ9a=B=(=W&^nEKmAR?_8%@U0bV~Gc7x*?e9 zy#`WZ0>ENehrtFcI|4*ln+ifOO(w9BK$8goFxLtQPz#-g!3I@N2vCc!6sWp@hk>UF zTChprDG*8lY6Xs`02dHw5ujG!C(kJ?p#Zj};33h4tiv_|0ZURBG((_TK^*2O=otW9 zEdY5Vh9M5#d;@|SF39zZal@ae&S&MaDeqB19hHaREXqSO!oQ7_pk$*QgH-vCndu&^^wY9jF z37&mfl!9(@WK@E3U|UZ^g>+$0TPZ$9AWc{(KSm%+RzyfuKT~2#UTaf8Mj$~;BSTFi zKS?1}VJk*aB{Di1NKz(cc35wJV`_R{IYl!IeIAkk0004WQchCFI2AN&!G%@DSPJkppUW>~#KhhM$v3B2puQSAzH*B$$7Cc{-n;UQWO=2gsgi z5(WRO%2%VZa(V#p8w7yTXbtej*jwE+^#s8AB0xAz01VWCyZ}-Ptm}YpLRbXMLwI$X zCvg@68jh=7vfqWN-eF~l%S-u=Jb7mxJ=6)aA?6IIs;+DmBg@+LtDL6T;mbICmk0a&Z?dKtQ<*xba}N zjRWBN@o^nj_@zB-O4$~lOXt7W_4D&OuEqu)7=m=2y8wNor4a63>N&t9eAq_Yv(241 zf}S)+O3h}8u2Zt>Fd8MNA+bsG9Y9t9s5&WI1hn!IfK(PB)gu51K`I*p05*nzM$+b> z-&wdB1B9(65l=*0RgiJ*32CSgg{*g z0dp`7!I{*xQcc~TrW)VTwf6c34JIQ1tBu$e07F0@fhDjl9xw~|%7ICyC%|T`2Uy5> zYt{f}?f`JxXypmu@HahU$77y91n4^6%0IswNN<}9;*Th4k!>; z+&76}!B}2EAhBjPkp*re+mHk9l32vJ|11V;?}JpE|BUQO1hb;Zt>n^G)>KxZh%fe-6OzQYe6UixIYNFoe}8ooHM2d&~>W-Hw@1H3Sg)P ze{8tmsK0q3h;vQGxvC(3r*Q$;O5?sD${r_h!xjOS(r5XKAf`{TGut8{4?X^5{6yEA zOBF6S3Li}a&LcO;1;_WB{h77jvQ0^Ck5}6Y`N5LZz%8gf91eY71mNNBcx=T<>GN5u zLA1wXN6-VQZ7W953jq4dm38R>5V(2lf8wh=g1*Jf>j4$TlAVz!t)y!-GFpI`B z<`E_ntaR@H!XbyQjx##Eg_xr+)xxdh;K zzudYv0cp@K1gb=HD;7|70K-lXAq;t)--^gOK#W)hM96(=N&tTL2Ke4?eav42tjFMC z9{kxL&RsCEJa)En9;BHW0X$#LY7MXnaNg771R#qR&X2+S;lAK_B5S?pKNA4Z9}2YS z^Z{U~1ZeLyddLtY`cMl1>AkE3XzjnWmfDBlVe}Wbz93y!9r`Q)mij-6;-B4bxR|eh RixU6<002ovPDHLkV1o4lXmbDn delta 633 zcmV-<0*3vW2Y?2UBn5I%OjJdYFLHm-E6$q$0004WQchC$Z5%piJ6Qk!Q|B-uO?x3-k1s;z;Uolx1`^4XFpgoyaTqR@p__Ct228vz zU}DZWF|ZStM!z68LBziWd_#~DO-h}w&~b>bf<*J{Gxh?}2<4#lc0UyefINR?no5~+ zQLV=%phvJrrQ}>4a%u6L3)+Im4koqrdj&cu#R@z0hf@LNkhp&ATx$_!XkmvyRLnE6 z-0qLZ{q_mYb5!Y6Av<;;SfF*=S!Dqz&GD0tGavw2@U?kX$+cR;@$~&j64vLkZOe0o z_6G7zm;C^QcJ09um;g>xwQBE)GG-t4h;jZ^!l@GC zjpKq)`6T!{pT92G>t#d$hzG&hxjI7v5+HxG;JL!-MilQVl*Riui23Bq;gN*|QG!c( zUI=2W2JLHFE8Bt}9ZeACIrIV~f;G}d!3s01O(0y5KxB7R0bU5iYF2;t+vJQ3gqhA} z@Bmfe!yO2iA#^Nv0{Aod4|)OL3qS{+W;#6^Q_rRV62J`9@Luqi^ZEpntr0#%3B_)q>0m&4j zF~-CSat1j`)&!3{2|{V4g(tzXz-jxM#6|^LUjd8b1LoPIP1#A929Ur5W}Zz@7!#;M z*)#LdBm+hTYM#uJmK!?-s&H5URlsopN(JCQs<7`f3Nv(kCqZ%~(9b`6iGQD8D3r2s Tj6^Dx00000NkvXXu0mjfvUVDl diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_sheperd.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_sheperd.png new file mode 100644 index 0000000000000000000000000000000000000000..db322696972145cff4f32bd59fc74d28476c0bb7 GIT binary patch literal 983 zcmV;|11S87P)&S&MaDeqB19hHaREXqSO!oQ7_pk$*QgH-vCndu&^^wY9jF z37&mfl!9(@WK@E3U|UZ^g>+$0TPZ$9AWc{(KSm%+RzyfuKT~2#UTaf8Mj$~;BSTFi zKS?1}VJk*aB{Di1NKz(cc35wJV`_R{IYl#$7%FK10004WQchC>xLKY)KCFX5*!- zviMPPoS@=(vyr6DYFR6ll-9p}oieU=WT^mXZP(VsPO>2f9h-@30n$C+S9eLas$BC6Bmp)Gf#y?g7w|pUyfeJW zDa(~@M;d?%MC+e#YpI=^{ z^PeKx?Gl1+Nl~;2z{vyx(qhjlQUnMb+$HW>UO^h+&Px&SYmc7-d4d2U5%fxkMS$R- zQ&AkA_WP$pfh-yjZbyq`^IcWGvdYTq0l;q*0!r2r;O%&Pdq17tdjO?I0otnvIHFFd zRRCi&wPnCW2%~^u2(MnlBo0C#$8K{|hAQ-R#+eOGZ_Jsl2|!f^0UH~qwD=*+aKnc*zANiLYK8G-y1HW7h zp&YG(18BTv0XHicl(7L^KR&MAhJSQ>4Zz*0AKU*y*U!&ux3Ld)6oT=_Ea1%K%dV#4`mG2 z2*8CvIp~Lg9?l2A`F9Ab{s(;>K#Ohx!MX=PY60H*w*Wky0ksYwV?dTS7JsJvtv|{_ z2asg|*fkbw%HN+Br6mGSng@Wh=tw&aP&OP!`6yl#MI6W5Z5(yG!0M=VEZBT0Q38xO`>E##x?f@@m2r;002ovPDHLk FV1hM?nRfsH literal 0 HcmV?d00001 diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_smith.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_smith.png index 53a0e3888bbd84d504faa36b6eb3b8e6411a5d0d..8afdc6b29f4025f4ccbbbee2817d339e46051dfc 100644 GIT binary patch delta 796 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 wanted:get_count() end if check_input(input1, wanted1, group) then @@ -580,7 +855,7 @@ local update_offer = function(inv, player, sound) end -- Apply above function to all items which we consider special. -- This function succeeds if ANY item check succeeds. - local check_specials = function(wanted1, wanted2, input1, input2) + local function check_specials(wanted1, wanted2, input1, input2) return check_special(COMPASS, "compass", wanted1, wanted2, input1, input2) end -- END OF SPECIAL HANDLING OF COMPASS @@ -634,7 +909,7 @@ local function return_item(itemstack, dropper, pos, inv_p) return itemstack end -local return_fields = function(player) +local function return_fields(player) local name = player:get_player_name() local inv_t = minetest.get_inventory({type="detached", name = "mobs_mc:trade_"..name}) local inv_p = player:get_inventory() @@ -700,7 +975,7 @@ minetest.register_on_leaveplayer(function(player) end) -- Return true if player is trading with villager, and the villager entity exists -local trader_exists = function(playername) +local function trader_exists(playername) local trader = player_trading_with[playername] return trader ~= nil and trader.object:get_luaentity() ~= nil end @@ -732,7 +1007,7 @@ local trade_inventory = { wanted1:set_count(wanted1:get_count()*2) wanted2:set_count(wanted2:get_count()*2) -- BEGIN OF SPECIAL HANDLING FOR COMPASS - local special_checks = function(wanted1, input1, input2) + local function special_checks(wanted1, input1, input2) if wanted1:get_name() == COMPASS then local compasses = 0 if (minetest.get_item_group(input1:get_name(), "compass") ~= 0) then @@ -849,6 +1124,10 @@ local trade_inventory = { -- First-time trade unlock all trades and unlock next trade tier if trade.tier + 1 > trader._max_trade_tier then trader._max_trade_tier = trader._max_trade_tier + 1 + if trader._max_trade_tier > 5 then + trader._max_trade_tier = 5 + end + set_textures(trader) update_max_tradenum(trader) update_formspec = true end @@ -931,7 +1210,9 @@ end) --[=======[ MOB REGISTRATION AND SPAWNING ]=======] -mobs:register_mob("mobs_mc:villager", { +local pick_up = { "mcl_farming:bread", "mcl_farming:carrot_item", "mcl_farming:beetroot_item" , "mcl_farming:potato_item" } + +mcl_mobs:register_mob("mobs_mc:villager", { description = S("Villager"), type = "npc", spawn_class = "passive", @@ -941,44 +1222,19 @@ mobs:register_mob("mobs_mc:villager", { visual = "mesh", mesh = "mobs_mc_villager.b3d", textures = { - { "mobs_mc_villager.png", "mobs_mc_villager.png", --hat }, - { - "mobs_mc_villager_farmer.png", - "mobs_mc_villager_farmer.png", --hat - }, - { - "mobs_mc_villager_priest.png", - "mobs_mc_villager_priest.png", --hat - }, - { - "mobs_mc_villager_librarian.png", - "mobs_mc_villager_librarian.png", --hat - }, - { - "mobs_mc_villager_butcher.png", - "mobs_mc_villager_butcher.png", --hat - }, - { - "mobs_mc_villager_smith.png", - "mobs_mc_villager_smith.png", --hat - }, - }, visual_size = {x=2.75, y=2.75}, - rotate = 270, - skittish = true, makes_footstep_sound = true, walk_velocity = 1.2, - run_velocity = 3, + run_velocity = 2.4, drops = {}, can_despawn = false, -- TODO: sounds sounds = { random = "mobs_mc_villager", damage = "mobs_mc_villager_hurt", - death = "mobs_mc_villager_hurt", distance = 10, }, animation = { @@ -991,21 +1247,53 @@ mobs:register_mob("mobs_mc:villager", { run_speed = 25, run_start = 0, run_end = 40, - die_speed = 15, - die_start = 210, - die_end = 220, - die_loop = false, + head_shake_start = 210, + head_shake_end = 220, + head_shake_loop = false, + head_nod_start = 210, + head_nod_end = 220, + head_nod_loop = false, }, + follow = pick_up, + nofollow = true, view_range = 16, fear_height = 4, jump = true, walk_chance = DEFAULT_WALK_CHANCE, + _bed = nil, + _id = nil, + _profession = "unemployed", + look_at_player = true, + pick_up = pick_up, + can_open_doors = true, + on_pick_up = function(self,itementity) + local clicker + for _,p in pairs(minetest.get_connected_players()) do + if vector.distance(p:get_pos(),self.object:get_pos()) < 10 then + clicker = p + end + end + if clicker then + mcl_mobs:feed_tame(self, clicker, 1, true, false) + return + end + return true --do not pick up + end, on_rightclick = function(self, clicker) + local trg=vector.new(0,9,0) + if self._jobsite then + mcl_mobs:gopath(self,self._jobsite,function() + --minetest.log("arrived at jobsite") + end) + end + if self.child or self._profession == "unemployed" then + return + end -- Initiate trading + init_trader_vars(self) local name = clicker:get_player_name() self._trading_players[name] = true - init_trader_vars(self) if self._trades == nil then init_trades(self) end @@ -1042,6 +1330,7 @@ mobs:register_mob("mobs_mc:villager", { if not self._player_scan_timer then self._player_scan_timer = 0 end + self._player_scan_timer = self._player_scan_timer + dtime -- Check infrequently to keep CPU load low if self._player_scan_timer > PLAYER_SCAN_INTERVAL then @@ -1063,20 +1352,39 @@ mobs:register_mob("mobs_mc:villager", { self.walk_chance = DEFAULT_WALK_CHANCE self.jump = true end + if self._bed and ( self.state ~= "go_home" and vector.distance(self.object:get_pos(),self._bed) > 50 ) then + go_home(self) + end + if self._profession == "unemployed" then + get_a_job(self) + end end end, on_spawn = function(self) - init_trader_vars(self) + if not self._profession then + self._profession = "unemployed" + if math.random(100) == 1 then + self._profession = "nitwit" + end + end + if self._id then + set_textures(self) + return + end + self._id=minetest.sha1(minetest.get_gametime()..minetest.pos_to_string(self.object:get_pos())..tostring(math.random())) + set_textures(self) end, on_die = function(self, pos) -- Close open trade formspecs and give input back to players local trading_players = self._trading_players - for name, _ in pairs(trading_players) do - minetest.close_formspec(name, "mobs_mc:trade_"..name) - local player = minetest.get_player_by_name(name) - if player then - return_fields(player) + if trading_players then + for name, _ in pairs(trading_players) do + minetest.close_formspec(name, "mobs_mc:trade_"..name) + local player = minetest.get_player_by_name(name) + if player then + return_fields(player) + end end end end, @@ -1084,7 +1392,7 @@ mobs:register_mob("mobs_mc:villager", { -mobs:spawn_specific( +mcl_mobs:spawn_specific( "mobs_mc:villager", "overworld", "ground", @@ -1111,8 +1419,8 @@ minetest.LIGHT_MAX+1, 30, 20, 4, -mobs_mc.spawn_height.water+1, -mobs_mc.spawn_height.overworld_max) +mobs_mc.water_level+1, +mcl_vars.mg_overworld_max) -- spawn eggs -mobs:register_egg("mobs_mc:villager", S("Villager"), "mobs_mc_spawn_icon_villager.png", 0) +mcl_mobs:register_egg("mobs_mc:villager", S("Villager"), "mobs_mc_spawn_icon_villager.png", 0) diff --git a/mods/ENTITIES/mobs_mc/villager_evoker.lua b/mods/ENTITIES/mobs_mc/villager_evoker.lua index 030da5470..6e62e00b6 100644 --- a/mods/ENTITIES/mobs_mc/villager_evoker.lua +++ b/mods/ENTITIES/mobs_mc/villager_evoker.lua @@ -3,7 +3,7 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes -local S = minetest.get_translator(minetest.get_current_modname()) +local S = minetest.get_translator("mobs_mc") --################### --################### EVOKER @@ -11,7 +11,7 @@ local S = minetest.get_translator(minetest.get_current_modname()) local pr = PseudoRandom(os.time()*666) -mobs:register_mob("mobs_mc:evoker", { +mcl_mobs:register_mob("mobs_mc:evoker", { description = S("Evoker"), type = "monster", spawn_class = "hostile", @@ -35,7 +35,7 @@ mobs:register_mob("mobs_mc:evoker", { walk_velocity = 0.2, run_velocity = 1.4, group_attack = true, - attack_type = "punch", + attack_type = "dogfight", -- Summon vexes custom_attack = function(self, to_attack) local r = pr:next(2,4) @@ -53,12 +53,12 @@ mobs:register_mob("mobs_mc:evoker", { shoot_interval = 15, passive = false, drops = { - {name = mobs_mc.items.emerald, + {name = "mcl_core:emerald", chance = 1, min = 0, max = 1, looting = "common",}, - {name = mobs_mc.items.totem, + {name = "mcl_totems:totem", chance = 1, min = 1, max = 1,}, @@ -84,4 +84,4 @@ mobs:register_mob("mobs_mc:evoker", { }) -- spawn eggs -mobs:register_egg("mobs_mc:evoker", S("Evoker"), "mobs_mc_spawn_icon_evoker.png", 0) +mcl_mobs:register_egg("mobs_mc:evoker", S("Evoker"), "mobs_mc_spawn_icon_evoker.png", 0) diff --git a/mods/ENTITIES/mobs_mc/villager_illusioner.lua b/mods/ENTITIES/mobs_mc/villager_illusioner.lua index bec5762e5..4af0c4024 100644 --- a/mods/ENTITIES/mobs_mc/villager_illusioner.lua +++ b/mods/ENTITIES/mobs_mc/villager_illusioner.lua @@ -3,14 +3,14 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes -local S = minetest.get_translator(minetest.get_current_modname()) -local mod_bows = minetest.get_modpath("mcl_bows") +local S = minetest.get_translator("mobs_mc") +local mod_bows = minetest.get_modpath("mcl_bows") ~= nil -mobs:register_mob("mobs_mc:illusioner", { +mcl_mobs:register_mob("mobs_mc:illusioner", { description = S("Illusioner"), type = "monster", spawn_class = "hostile", - attack_type = "projectile", + attack_type = "shoot", shoot_interval = 2.5, shoot_offset = 1.5, arrow = "mcl_bows:arrow_entity", @@ -18,7 +18,7 @@ mobs:register_mob("mobs_mc:illusioner", { if mod_bows then -- 1-4 damage per arrow local dmg = math.random(1, 4) - mobs.shoot_projectile_handling("mcl_bows:arrow", pos, dir, self.object:get_yaw(), self.object, nil, dmg) + mcl_bows.shoot_arrow("mcl_bows:arrow", pos, dir, self.object:get_yaw(), self.object, nil, dmg) end end, hp_min = 32, @@ -61,4 +61,4 @@ mobs:register_mob("mobs_mc:illusioner", { fear_height = 4, }) -mobs:register_egg("mobs_mc:illusioner", S("Illusioner"), "mobs_mc_spawn_icon_illusioner.png", 0) +mcl_mobs:register_egg("mobs_mc:illusioner", S("Illusioner"), "mobs_mc_spawn_icon_illusioner.png", 0) diff --git a/mods/ENTITIES/mobs_mc/villager_vindicator.lua b/mods/ENTITIES/mobs_mc/villager_vindicator.lua index 6a6999b96..0ed611899 100644 --- a/mods/ENTITIES/mobs_mc/villager_vindicator.lua +++ b/mods/ENTITIES/mobs_mc/villager_vindicator.lua @@ -3,14 +3,14 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes -local S = minetest.get_translator(minetest.get_current_modname()) +local S = minetest.get_translator("mobs_mc") --################### --################### VINDICATOR --################### -mobs:register_mob("mobs_mc:vindicator", { +mcl_mobs:register_mob("mobs_mc:vindicator", { description = S("Vindicator"), type = "monster", spawn_class = "hostile", @@ -37,14 +37,14 @@ mobs:register_mob("mobs_mc:vindicator", { reach = 2, walk_velocity = 1.2, run_velocity = 2.4, - attack_type = "punch", + attack_type = "dogfight", drops = { - {name = mobs_mc.items.emerald, + {name = "mcl_core:emerald", chance = 1, min = 0, max = 1, looting = "common",}, - {name = mobs_mc.items.iron_axe, + {name = "mcl_tools:axe_iron", chance = 100 / 8.5, min = 1, max = 1, @@ -72,4 +72,4 @@ mobs:register_mob("mobs_mc:vindicator", { }) -- spawn eggs -mobs:register_egg("mobs_mc:vindicator", S("Vindicator"), "mobs_mc_spawn_icon_vindicator.png", 0) +mcl_mobs:register_egg("mobs_mc:vindicator", S("Vindicator"), "mobs_mc_spawn_icon_vindicator.png", 0) diff --git a/mods/ENTITIES/mobs_mc/villager_zombie.lua b/mods/ENTITIES/mobs_mc/villager_zombie.lua index 088839b65..daeed9e9a 100644 --- a/mods/ENTITIES/mobs_mc/villager_zombie.lua +++ b/mods/ENTITIES/mobs_mc/villager_zombie.lua @@ -3,7 +3,7 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes -local S = minetest.get_translator(minetest.get_current_modname()) +local S = minetest.get_translator("mobs_mc") --################### --################### ZOMBIE VILLAGER @@ -25,13 +25,10 @@ local professions = { nitwit = "mobs_mc_villager.png", } -mobs:register_mob("mobs_mc:villager_zombie", { +mcl_mobs:register_mob("mobs_mc:villager_zombie", { description = S("Zombie Villager"), type = "monster", spawn_class = "hostile", - hostile = true, - rotate = 270, - eye_height = 1.65, hp_min = 20, hp_max = 20, xp_min = 5, @@ -54,28 +51,28 @@ mobs:register_mob("mobs_mc:villager_zombie", { damage = 3, reach = 2, walk_velocity = 1.2, - run_velocity = 3.5, - attack_type = "punch", + run_velocity = 2.4, + attack_type = "dogfight", group_attack = true, drops = { - {name = mobs_mc.items.rotten_flesh, + {name = "mcl_mobitems:rotten_flesh", chance = 1, min = 0, max = 2, looting = "common",}, - {name = mobs_mc.items.iron_ingot, + {name = "mcl_core:iron_ingot", chance = 120, -- 2.5% / 3 min = 1, max = 1, looting = "rare", looting_factor = 0.01 / 3,}, - {name = mobs_mc.items.carrot, + {name = "mcl_farming:carrot_item", chance = 120, -- 2.5% / 3 min = 1, max = 1, looting = "rare", looting_factor = 0.01 / 3,}, - {name = mobs_mc.items.potato, + {name = "mcl_farming:potato_item", chance = 120, -- 2.5% / 3 min = 1, max = 1, @@ -122,20 +119,7 @@ mobs:register_mob("mobs_mc:villager_zombie", { villager_obj:set_yaw(yaw) villager.target_yaw = yaw villager.nametag = self.nametag - local texture = self.base_texture[1]:gsub("zombie", "villager") - if texture == "mobs_mc_villager_villager.png" then - texture = "mobs_mc_villager.png" - end - local textures = {texture} - villager.base_texture = textures - villager_obj:set_properties({textures = textures}) - local matches = {} - for prof, tex in pairs(professions) do - if texture == tex then - table.insert(matches, prof) - end - end - villager._profession = matches[math.random(#matches)] + villager._profession = "unemployed" self._curing = nil mcl_burning.extinguish(obj) obj:remove() @@ -150,7 +134,7 @@ mobs:register_mob("mobs_mc:villager_zombie", { harmed_by_heal = true, }) -mobs:spawn_specific( +mcl_mobs:spawn_specific( "mobs_mc:villager_zombie", "overworld", "ground", @@ -240,9 +224,9 @@ mobs:spawn_specific( 30, 4090, 4, -mobs_mc.spawn_height.overworld_min, -mobs_mc.spawn_height.overworld_max) ---mobs:spawn_specific("mobs_mc:villager_zombie", "overworld", "ground", 0, 7, 30, 60000, 4, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) +mcl_vars.mg_overworld_min, +mcl_vars.mg_overworld_max) +--mcl_mobs:spawn_specific("mobs_mc:villager_zombie", "overworld", "ground", 0, 7, 30, 60000, 4, mcl_vars.mg_overworld_min, mcl_vars.mg_overworld_max) -- spawn eggs -mobs:register_egg("mobs_mc:villager_zombie", S("Zombie Villager"), "mobs_mc_spawn_icon_zombie_villager.png", 0) +mcl_mobs:register_egg("mobs_mc:villager_zombie", S("Zombie Villager"), "mobs_mc_spawn_icon_zombie_villager.png", 0) diff --git a/mods/ENTITIES/mobs_mc/witch.lua b/mods/ENTITIES/mobs_mc/witch.lua index 34492a1b7..f61fdb2d1 100644 --- a/mods/ENTITIES/mobs_mc/witch.lua +++ b/mods/ENTITIES/mobs_mc/witch.lua @@ -3,7 +3,7 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes -local S = minetest.get_translator(minetest.get_current_modname()) +local S = minetest.get_translator("mobs_mc") --################### --################### WITCH @@ -12,7 +12,7 @@ local S = minetest.get_translator(minetest.get_current_modname()) -mobs:register_mob("mobs_mc:witch", { +mcl_mobs:register_mob("mobs_mc:witch", { description = S("Witch"), type = "monster", spawn_class = "hostile", @@ -34,7 +34,7 @@ mobs:register_mob("mobs_mc:witch", { run_velocity = 2.4, pathfinding = 1, group_attack = true, - attack_type = "projectile", + attack_type = "dogshoot", arrow = "mobs_mc:potion_arrow", shoot_interval = 2.5, shoot_offset = 1, @@ -42,13 +42,13 @@ mobs:register_mob("mobs_mc:witch", { dogshoot_count_max =1.8, max_drops = 3, drops = { - {name = mobs_mc.items.glass_bottle, chance = 8, min = 0, max = 2, looting = "common",}, - {name = mobs_mc.items.glowstone_dust, chance = 8, min = 0, max = 2, looting = "common",}, - {name = mobs_mc.items.gunpowder, chance = 8, min = 0, max = 2, looting = "common",}, - {name = mobs_mc.items.redstone, chance = 8, min = 0, max = 2, looting = "common",}, - {name = mobs_mc.items.spider_eye, chance = 8, min = 0, max = 2, looting = "common",}, - {name = mobs_mc.items.sugar, chance = 8, min = 0, max = 2, looting = "common",}, - {name = mobs_mc.items.stick, chance = 4, min = 0, max = 2, looting = "common",}, + {name = "mcl_potions:glass_bottle", chance = 8, min = 0, max = 2, looting = "common",}, + {name = "mcl_nether:glowstone_dust", chance = 8, min = 0, max = 2, looting = "common",}, + {name = "mcl_mobitems:gunpowder", chance = 8, min = 0, max = 2, looting = "common",}, + {name = "mesecons:redstone", chance = 8, min = 0, max = 2, looting = "common",}, + {name = "mcl_mobitems:spider_eye", chance = 8, min = 0, max = 2, looting = "common",}, + {name = "mcl_core:sugar", chance = 8, min = 0, max = 2, looting = "common",}, + {name = "mcl_core:stick", chance = 4, min = 0, max = 2, looting = "common",}, }, -- TODO: sounds animation = { @@ -72,7 +72,7 @@ mobs:register_mob("mobs_mc:witch", { }) -- potion projectile (EXPERIMENTAL) -mobs:register_arrow("mobs_mc:potion_arrow", { +mcl_mobs:register_arrow("mobs_mc:potion_arrow", { visual = "sprite", visual_size = {x = 0.5, y = 0.5}, --textures = {"vessels_glass_bottle.png"}, --TODO fix to else if default @@ -101,9 +101,9 @@ mobs:register_arrow("mobs_mc:potion_arrow", { }) -- TODO: Spawn when witch works properly <- eventually -j4i ---mobs:spawn_specific("mobs_mc:witch", mobs_mc.spawn.jungle, {"air"}, 0, minetest.LIGHT_MAX-6, 12, 20000, 2, mobs_mc.spawn_height.water-6, mobs_mc.spawn_height.overworld_max) +--mcl_mobs:spawn_specific("mobs_mc:witch", { "mcl_core:jungletree", "mcl_core:jungleleaves", "mcl_flowers:fern", "mcl_core:vine" }, {"air"}, 0, minetest.LIGHT_MAX-6, 12, 20000, 2, mobs_mc.water_level-6, mcl_vars.mg_overworld_max) -- spawn eggs -mobs:register_egg("mobs_mc:witch", S("Witch"), "mobs_mc_spawn_icon_witch.png", 0, true) +mcl_mobs:register_egg("mobs_mc:witch", S("Witch"), "mobs_mc_spawn_icon_witch.png", 0, true) mcl_wip.register_wip_item("mobs_mc:witch") diff --git a/mods/ENTITIES/mobs_mc/wither.lua b/mods/ENTITIES/mobs_mc/wither.lua index 22e095d98..3b47d0752 100644 --- a/mods/ENTITIES/mobs_mc/wither.lua +++ b/mods/ENTITIES/mobs_mc/wither.lua @@ -3,13 +3,13 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes -local S = minetest.get_translator(minetest.get_current_modname()) +local S = minetest.get_translator("mobs_mc") --################### --################### WITHER --################### -mobs:register_mob("mobs_mc:wither", { +mcl_mobs:register_mob("mobs_mc:wither", { description = S("Wither"), type = "monster", spawn_class = "hostile", @@ -26,6 +26,7 @@ mobs:register_mob("mobs_mc:wither", { {"mobs_mc_wither.png"}, }, visual_size = {x=4, y=4}, + makes_footstep_sound = true, view_range = 16, fear_height = 4, walk_velocity = 2, @@ -45,14 +46,14 @@ mobs:register_mob("mobs_mc:wither", { attack_animals = true, can_despawn = false, drops = { - {name = mobs_mc.items.nether_star, + {name = "mcl_mobitems:nether_star", chance = 1, min = 1, max = 1}, }, lava_damage = 0, fire_damage = 0, - attack_type = "projectile", + attack_type = "dogshoot", explosion_strength = 8, dogshoot_stop = true, arrow = "mobs_mc:wither_skull", @@ -80,9 +81,9 @@ mobs:register_mob("mobs_mc:wither", { end, }) ---local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false +local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false -mobs:register_arrow("mobs_mc:wither_skull", { +mcl_mobs:register_arrow("mobs_mc:wither_skull", { visual = "sprite", visual_size = {x = 0.75, y = 0.75}, -- TODO: 3D projectile, replace tetxture @@ -95,7 +96,7 @@ mobs:register_arrow("mobs_mc:wither_skull", { full_punch_interval = 0.5, damage_groups = {fleshy = 8}, }, nil) - mobs:boom(self, self.object:get_pos(), 1) + mcl_mobs:boom(self, self.object:get_pos(), 1) end, hit_mob = function(self, mob) @@ -103,17 +104,17 @@ mobs:register_arrow("mobs_mc:wither_skull", { full_punch_interval = 0.5, damage_groups = {fleshy = 8}, }, nil) - mobs:boom(self, self.object:get_pos(), 1) + mcl_mobs:boom(self, self.object:get_pos(), 1) end, -- node hit, explode hit_node = function(self, pos, node) - mobs:boom(self, pos, 1) + mcl_mobs:boom(self, pos, 1) end }) -- TODO: Add blue wither skull --Spawn egg -mobs:register_egg("mobs_mc:wither", S("Wither"), "mobs_mc_spawn_icon_wither.png", 0, true) +mcl_mobs:register_egg("mobs_mc:wither", S("Wither"), "mobs_mc_spawn_icon_wither.png", 0, true) mcl_wip.register_wip_item("mobs_mc:wither") diff --git a/mods/ENTITIES/mobs_mc/wolf.lua b/mods/ENTITIES/mobs_mc/wolf.lua index 0b685d40f..d875bebf9 100644 --- a/mods/ENTITIES/mobs_mc/wolf.lua +++ b/mods/ENTITIES/mobs_mc/wolf.lua @@ -1,53 +1,24 @@ --License for code WTFPL and otherwise stated in readmes -local S = minetest.get_translator(minetest.get_current_modname()) +local S = minetest.get_translator("mobs_mc") local default_walk_chance = 50 local pr = PseudoRandom(os.time()*10) -local is_food = function(itemstring) - for f=1, #mobs_mc.follow.dog do - if itemstring == mobs_mc.follow.dog[f] then - return true - elseif string.sub(itemstring, 1, 6) == "group:" and minetest.get_item_group(itemstring, string.sub(itemstring, 7, -1)) ~= 0 then - return true - end - end - return false -end - -- Wolf local wolf = { description = S("Wolf"), type = "animal", spawn_class = "passive", can_despawn = true, - neutral = true, hp_min = 8, hp_max = 8, xp_min = 1, xp_max = 3, - rotate = 270, passive = false, group_attack = true, - - --head code - has_head = false, - head_bone = "head", - - swap_y_with_x = false, - reverse_head_yaw = false, - - head_bone_pos_y = 3.6, - head_bone_pos_z = -0.6, - - head_height_offset = 1.0525, - head_direction_offset = 0.5, - head_pitch_modifier = 0, - --end head code - - collisionbox = {-0.3, -0.00, -0.3, 0.3, 0.85, 0.3}, + collisionbox = {-0.3, -0.01, -0.3, 0.3, 0.84, 0.3}, visual = "mesh", mesh = "mobs_mc_wolf.b3d", textures = { @@ -71,15 +42,15 @@ local wolf = { run_velocity = 3, damage = 4, reach = 2, - attack_type = "punch", + attack_type = "dogfight", fear_height = 4, - follow = mobs_mc.follow.wolf, + follow = { "mcl_mobitems:bone" }, on_rightclick = function(self, clicker) - -- Try to tame wolf (intentionally does NOT use mobs:feed_tame) + -- Try to tame wolf (intentionally does NOT use mcl_mobs:feed_tame) local tool = clicker:get_wielded_item() local dog, ent - if tool:get_name() == mobs_mc.items.bone then + if tool:get_name() == "mcl_mobitems:bone" then minetest.sound_play("mobs_mc_wolf_take_bone", {object=self.object, max_hear_distance=16}, true) if not minetest.is_creative_enabled(clicker:get_player_name()) then @@ -93,7 +64,6 @@ local wolf = { dog:set_yaw(yaw) ent = dog:get_luaentity() ent.owner = clicker:get_player_name() - ent.tamed = true -- cornfirm taming minetest.sound_play("mobs_mc_wolf_bark", {object=dog, max_hear_distance=16}, true) -- Replace wolf @@ -113,7 +83,7 @@ local wolf = { specific_attack = { "player", "mobs_mc:sheep" }, } -mobs:register_mob("mobs_mc:wolf", wolf) +mcl_mobs:register_mob("mobs_mc:wolf", wolf) -- Tamed wolf @@ -161,37 +131,37 @@ dog.owner_loyal = true dog.follow_velocity = 3.2 -- Automatically teleport dog to owner dog.do_custom = mobs_mc.make_owner_teleport_function(12) +dog.follow = { + "mcl_mobitems:rabbit", "mcl_mobitems:cooked_rabbit", + "mcl_mobitems:mutton", "mcl_mobitems:cooked_mutton", + "mcl_mobitems:beef", "mcl_mobitems:cooked_beef", + "mcl_mobitems:chicken", "mcl_mobitems:cooked_chicken", + "mcl_mobitems:porkchop", "mcl_mobitems:cooked_porkchop", + "mcl_mobitems:rotten_flesh", +} dog.attack_animals = nil dog.specific_attack = nil -dog.breed_distance = 1.5 -dog.baby_size = 0.5 -dog.follow_distance = 2 -dog.follow = "mcl_mobitems:beef" + +local is_food = function(itemstring) + return table.indexof(dog.follow, itemstring) ~= -1 +end dog.on_rightclick = function(self, clicker) local item = clicker:get_wielded_item() - --owner is broken for this - --attempt to enter breed state - if mobs.enter_breed_state(self,clicker) then + if mcl_mobs:protect(self, clicker) then return - end - - --make baby grow faster - if self.baby then - mobs.make_baby_grow_faster(self,clicker) + elseif item:get_name() ~= "" and mcl_mobs:capture_mob(self, clicker, 0, 2, 80, false, nil) then return - end - - if is_food(item:get_name()) then + elseif is_food(item:get_name()) then -- Feed to increase health local hp = self.health - local hp_add + local hp_add = 0 -- Use eatable group to determine health boost local eatable = minetest.get_item_group(item, "eatable") if eatable > 0 then hp_add = eatable - elseif item:get_name() == mobs_mc.items.rotten_flesh then + elseif item:get_name() == "mcl_mobitems:rotten_flesh" then hp_add = 4 else hp_add = 4 @@ -261,37 +231,30 @@ dog.on_rightclick = function(self, clicker) end end -mobs:register_mob("mobs_mc:dog", dog) - +mcl_mobs:register_mob("mobs_mc:dog", dog) -- Spawn -mobs:spawn_specific( +mcl_mobs:spawn_specific( "mobs_mc:wolf", "overworld", "ground", { -"FlowerForest", -"Swampland", -"Taiga", -"ExtremeHills", -"BirchForest", -"MegaSpruceTaiga", -"MegaTaiga", -"ExtremeHills+", -"Forest", -"Plains", -"ColdTaiga", -"SunflowerPlains", -"RoofedForest", -"MesaPlateauFM_grasstop", -"ExtremeHillsM", -"BirchForestM", + "Taiga", + "MegaSpruceTaiga", + "MegaTaiga", + "Forest", + "ColdTaiga", + "FlowerForest_beach", + "Forest_beach", + "ColdTaiga_beach_water", + "Taiga_beach", + "ColdTaiga_beach", }, 0, minetest.LIGHT_MAX+1, 30, 9000, 7, -mobs_mc.spawn_height.water+3, -mobs_mc.spawn_height.overworld_max) +mobs_mc.water_level+3, +mcl_vars.mg_overworld_max) -mobs:register_egg("mobs_mc:wolf", S("Wolf"), "mobs_mc_spawn_icon_wolf.png", 0) +mcl_mobs:register_egg("mobs_mc:wolf", S("Wolf"), "mobs_mc_spawn_icon_wolf.png", 0) diff --git a/mods/ENTITIES/mobs_mc/zombiepig.lua b/mods/ENTITIES/mobs_mc/zombiepig.lua index b4088deef..b054734bc 100644 --- a/mods/ENTITIES/mobs_mc/zombiepig.lua +++ b/mods/ENTITIES/mobs_mc/zombiepig.lua @@ -3,7 +3,7 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes -local S = minetest.get_translator(minetest.get_current_modname()) +local S = minetest.get_translator("mobs_mc") --################### --################### ZOMBIE PIGMAN @@ -15,16 +15,13 @@ local pigman = { -- type="animal", passive=false: This combination is needed for a neutral mob which becomes hostile, if attacked type = "animal", passive = false, - neutral = true, - rotate = 270, spawn_class = "passive", - hostile_cooldown = 15, --seconds hp_min = 20, hp_max = 20, xp_min = 6, xp_max = 6, armor = {undead = 90, fleshy = 90}, - attack_type = "punch", + attack_type = "dogfight", group_attack = { "mobs_mc:pigman", "mobs_mc:baby_pigman" }, damage = 9, reach = 2, @@ -44,44 +41,28 @@ local pigman = { damage = "mobs_mc_zombiepig_hurt", distance = 16, }, - - --head code - has_head = false, - head_bone = "head", - - swap_y_with_x = true, - reverse_head_yaw = true, - - head_bone_pos_y = 2.4, - head_bone_pos_z = 0, - - head_height_offset = 1.1, - head_direction_offset = 0, - head_pitch_modifier = 0, - --end head code - jump = true, makes_footstep_sound = true, walk_velocity = .8, run_velocity = 2.6, pathfinding = 1, drops = { - {name = mobs_mc.items.rotten_flesh, + {name = "mcl_mobitems:rotten_flesh", chance = 1, min = 1, max = 1, looting = "common"}, - {name = mobs_mc.items.gold_nugget, + {name = "mcl_core:gold_nugget", chance = 1, min = 0, max = 1, looting = "common"}, - {name = mobs_mc.items.gold_ingot, + {name = "mcl_core:gold_ingot", chance = 40, -- 2.5% min = 1, max = 1, looting = "rare"}, - {name = mobs_mc.items.gold_sword, + {name = "mcl_tools:sword_gold", chance = 100 / 8.5, min = 1, max = 1, @@ -108,7 +89,7 @@ local pigman = { fire_damage_resistant = true, } -mobs:register_mob("mobs_mc:pigman", pigman) +mcl_mobs:register_mob("mobs_mc:pigman", pigman) -- Baby pigman. -- A smaller and more dangerous variant of the pigman @@ -129,25 +110,26 @@ baby_pigman.run_velocity = 2.4 baby_pigman.light_damage = 0 baby_pigman.child = 1 -mobs:register_mob("mobs_mc:baby_pigman", baby_pigman) +mcl_mobs:register_mob("mobs_mc:baby_pigman", baby_pigman) -- Regular spawning in the Nether -mobs:spawn_specific( +mcl_mobs:spawn_specific( "mobs_mc:pigman", "nether", "ground", { -"Nether" +"Nether", +"CrimsonForest", }, 0, minetest.LIGHT_MAX+1, 30, 6000, 3, -mobs_mc.spawn_height.nether_min, -mobs_mc.spawn_height.nether_max) +mcl_vars.mg_nether_min, +mcl_vars.mg_nether_max) -- Baby zombie is 20 times less likely than regular zombies -mobs:spawn_specific( +mcl_mobs:spawn_specific( "mobs_mc:baby_pigman", "nether", "ground", @@ -159,11 +141,11 @@ minetest.LIGHT_MAX+1, 30, 100000, 4, -mobs_mc.spawn_height.nether_min, -mobs_mc.spawn_height.nether_max) +mcl_vars.mg_nether_min, +mcl_vars.mg_nether_max) -- Spawning in Nether portals in the Overworld ---mobs:spawn_specific("mobs_mc:pigman", mobs_mc.spawn.nether_portal, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 500, 4, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) +--mobs:spawn_specific("mobs_mc:pigman", {"mcl_portals:portal"}, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 500, 4, mcl_vars.mg_overworld_min, mcl_vars.mg_overworld_max) -- spawn eggs -mobs:register_egg("mobs_mc:pigman", S("Zombie Pigman"), "mobs_mc_spawn_icon_zombie_pigman.png", 0) +mcl_mobs:register_egg("mobs_mc:pigman", S("Zombie Pigman"), "mobs_mc_spawn_icon_zombie_pigman.png", 0) diff --git a/mods/ENVIRONMENT/lightning/locale/lightning.zh_TW.tr b/mods/ENVIRONMENT/lightning/locale/lightning.zh_TW.tr new file mode 100644 index 000000000..0667e8dc8 --- /dev/null +++ b/mods/ENVIRONMENT/lightning/locale/lightning.zh_TW.tr @@ -0,0 +1,4 @@ +# textdomain: lightning +@1 was struck by lightning.=@1 被閃電擊斃。 +Let lightning strike at the specified position or yourself=讓閃電擊中指定位置或自己 +No position specified and unknown player=未指定位置且玩家未知 diff --git a/mods/ENVIRONMENT/mcl_void_damage/locale/mcl_void_damage.zh_TW.tr b/mods/ENVIRONMENT/mcl_void_damage/locale/mcl_void_damage.zh_TW.tr new file mode 100644 index 000000000..515e83fcc --- /dev/null +++ b/mods/ENVIRONMENT/mcl_void_damage/locale/mcl_void_damage.zh_TW.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_void_damage +The void is off-limits to you!=你不可以進入虛空! +@1 fell into the endless void.=@1 掉到世界外面了。 diff --git a/mods/ENVIRONMENT/mcl_weather/locale/mcl_weather.zh_TW.tr b/mods/ENVIRONMENT/mcl_weather/locale/mcl_weather.zh_TW.tr new file mode 100644 index 000000000..42be7481b --- /dev/null +++ b/mods/ENVIRONMENT/mcl_weather/locale/mcl_weather.zh_TW.tr @@ -0,0 +1,8 @@ +# textdomain: mcl_weather +Gives ability to control weather=賦予控制天氣的能力 +Changes the weather to the specified parameter.=將天氣改為指定的參數。 +Error: No weather specified.=錯誤:未指定天氣。 +Error: Invalid parameters.=錯誤:無效參數。 +Error: Duration can't be less than 1 second.=錯誤:延續時間不可以短於1秒。 +Error: Invalid weather specified. Use “clear”, “rain”, “snow” or “thunder”.=錯誤:不明天氣。請使用「clear」、「rain」、「snow」或「thunder」。 +Toggles between clear weather and weather with downfall (randomly rain, thunderstorm or snow)=在晴朗的天氣和降雨天氣之間切換(隨機選擇雨、雷暴或雪)。 diff --git a/mods/ENVIRONMENT/mcl_weather/nether_dust.lua b/mods/ENVIRONMENT/mcl_weather/nether_dust.lua index 49c726eb5..2a90b2215 100644 --- a/mods/ENVIRONMENT/mcl_weather/nether_dust.lua +++ b/mods/ENVIRONMENT/mcl_weather/nether_dust.lua @@ -1,8 +1,10 @@ mcl_weather.nether_dust = {} mcl_weather.nether_dust.particlespawners = {} +local PARTICLES_COUNT_NETHER_DUST = tonumber(minetest.settings:get("mcl_weather_rain_particles")) or 150 + local psdef= { - amount = 150, + amount = PARTICLES_COUNT_NETHER_DUST, time = 0, minpos = vector.new(-15,-15,-15), maxpos =vector.new(15,15,15), @@ -21,14 +23,14 @@ local psdef= { } local function check_player(player) - local name=player:get_player_name(player) + local name=player:get_player_name() if mcl_worlds.has_dust(player:get_pos()) and not mcl_weather.nether_dust.particlespawners[name] then return true - end + end end mcl_weather.nether_dust.add_particlespawners = function(player) - local name=player:get_player_name(player) + local name=player:get_player_name() mcl_weather.nether_dust.particlespawners[name]={} psdef.playername = name psdef.attached = player @@ -40,12 +42,12 @@ mcl_weather.nether_dust.add_particlespawners = function(player) end mcl_weather.nether_dust.delete_particlespawners = function(player) - local name=player:get_player_name(player) + local name=player:get_player_name() if mcl_weather.nether_dust.particlespawners[name] then for i=1,3 do minetest.delete_particlespawner(mcl_weather.nether_dust.particlespawners[name][i]) end - mcl_weather.nether_dust.particlespawners[name]=nil + mcl_weather.nether_dust.particlespawners[name]=nil end end @@ -63,4 +65,4 @@ minetest.register_on_joinplayer(function(player) end) minetest.register_on_leaveplayer(function(player) mcl_weather.nether_dust.delete_particlespawners(player) -end) \ No newline at end of file +end) diff --git a/mods/ENVIRONMENT/mcl_weather/rain.lua b/mods/ENVIRONMENT/mcl_weather/rain.lua index 0caef5c6f..717f2fd52 100644 --- a/mods/ENVIRONMENT/mcl_weather/rain.lua +++ b/mods/ENVIRONMENT/mcl_weather/rain.lua @@ -1,5 +1,5 @@ -local PARTICLES_COUNT_RAIN = 100 -local PARTICLES_COUNT_THUNDER = 300 +local PARTICLES_COUNT_RAIN = tonumber(minetest.settings:get("mcl_weather_rain_particles")) or 500 +local PARTICLES_COUNT_THUNDER = tonumber(minetest.settings:get("mcl_weather_thunder_particles")) or 900 local get_connected_players = minetest.get_connected_players @@ -20,44 +20,26 @@ mcl_weather.rain = { init_done = false, } local update_sound={} -local vel=math.random(0,3) -local falling_speed=math.random(10,15) -local size = math.random(1,3) + local psdef= { amount = mcl_weather.rain.particles_count, time=0, - minpos = vector.new(-6,3,-6), - maxpos = vector.new(6,15,6), - minvel = vector.new(-vel,-falling_speed,-vel), - maxvel = vector.new(vel,-falling_speed+vel,vel), + minpos = vector.new(-15,20,-15), + maxpos = vector.new(15,25,15), + minvel = vector.new(-2,-17,-2), + maxvel = vector.new(2,-8,2), minacc = vector.new(0,0,0), - maxacc = vector.new(0,-0.4,0), - minexptime = 0.5, - maxexptime = 2, - minsize = size, - maxsize= size*2, + maxacc = vector.new(0,-0.5,0), + minexptime = 1, + maxexptime = 4, + minsize = 4, + maxsize= 8, collisiondetection = true, collision_removal = true, vertical = true, } -local psdef_backsplash= { - amount = 10, - time=0, - minpos = vector.new(-3,-1,-3), - maxpos = vector.new(3,0,3), - minvel = vector.new(-vel,falling_speed*2,-vel), - maxvel = vector.new(vel,falling_speed*2+vel,vel), - minacc = vector.new(0,0,0), - maxacc = vector.new(0,0,0), - minexptime = 0.1, - maxexptime = 0.2, - minsize = size*0.1, - maxsize= size*0.5, - collisiondetection = true, - collision_removal = true, - vertical = true, -} -local textures = {"weather_pack_rain_raindrop_1.png", "weather_pack_rain_raindrop_2.png", "weather_pack_rain_raindrop_1.png"} + +local textures = {"weather_pack_rain_raindrop_1.png", "weather_pack_rain_raindrop_2.png"} function mcl_weather.rain.sound_handler(player) return minetest.sound_play("weather_rain", { @@ -86,12 +68,11 @@ end -- no no no NO NO f*.. no. no manual particle creatin' PLS!! this sends EVERY particle over the net. function mcl_weather.rain.add_rain_particles(player) mcl_weather.rain.last_rp_count = mcl_weather.rain.particles_count + local l = false for k,v in pairs(textures) do psdef.texture=v - mcl_weather.add_spawner_player(player,"rain"..k,psdef) + l = l or mcl_weather.add_spawner_player(player,"rain"..k,psdef) end - psdef_backsplash.texture=textures[math.random(1,#textures)] - local l=mcl_weather.add_spawner_player(player,"rainbacksplash",psdef_backsplash) if l then update_sound[player:get_player_name()]=true end @@ -165,7 +146,7 @@ function mcl_weather.rain.clear() mcl_weather.rain.remove_sound(player) mcl_weather.rain.remove_player(player) mcl_weather.remove_spawners_player(player) - end + end end minetest.register_globalstep(function(dtime) @@ -185,14 +166,14 @@ function mcl_weather.rain.make_weather() for _, player in pairs(get_connected_players()) do local pos=player:get_pos() - if mcl_weather.is_underwater(player) or not mcl_worlds.has_weather(pos) or not mcl_weather.is_outdoor(pos) then + if mcl_weather.is_underwater(player) or not mcl_worlds.has_weather(pos) then mcl_weather.rain.remove_sound(player) mcl_weather.remove_spawners_player(player) - return false + else + mcl_weather.rain.add_player(player) + mcl_weather.rain.add_rain_particles(player) + mcl_weather.rain.update_sound(player) end - mcl_weather.rain.add_player(player) - mcl_weather.rain.add_rain_particles(player) - mcl_weather.rain.update_sound(player) end end @@ -200,11 +181,9 @@ end function mcl_weather.rain.set_particles_mode(mode) if mode == "thunder" then psdef.amount=PARTICLES_COUNT_THUNDER - psdef_backsplash.amount=PARTICLES_COUNT_THUNDER mcl_weather.rain.particles_count = PARTICLES_COUNT_THUNDER else psdef.amount=PARTICLES_COUNT_RAIN - psdef_backsplash.amount=PARTICLES_COUNT_RAIN mcl_weather.rain.particles_count = PARTICLES_COUNT_RAIN end end diff --git a/mods/ENVIRONMENT/mcl_weather/skycolor.lua b/mods/ENVIRONMENT/mcl_weather/skycolor.lua index 93e92defc..47abbe16c 100644 --- a/mods/ENVIRONMENT/mcl_weather/skycolor.lua +++ b/mods/ENVIRONMENT/mcl_weather/skycolor.lua @@ -146,8 +146,25 @@ mcl_weather.skycolor = { player:set_stars({visible = false}) mcl_weather.skycolor.override_day_night_ratio(player, 0.5) elseif dim == "nether" then - player:set_sky({ type = "plain", - base_color = "#300808", + local nether_sky = { + Nether = "#300808", + BasaltDelta = "#685F70", + SoulsandValley = "#1B4745", + CrimsonForest = "#330303", + WarpedForest = "#1A051A" + } + local biometint = nether_sky[minetest.get_biome_name(minetest.get_biome_data(player:get_pos()).biome)] + + player:set_sky({ + type = "regular", + sky_color = { + day_sky = "#300808", + day_horizon = biometint, + dawn_sky = "#300808", + dawn_horizon = biometint, + night_sky = "#300808", + night_horizon = biometint, + }, clouds = false, }) player:set_sun({visible = false , sunrise_visible = false}) diff --git a/mods/ENVIRONMENT/mcl_weather/snow.lua b/mods/ENVIRONMENT/mcl_weather/snow.lua index b60283127..f169620dd 100644 --- a/mods/ENVIRONMENT/mcl_weather/snow.lua +++ b/mods/ENVIRONMENT/mcl_weather/snow.lua @@ -2,21 +2,21 @@ local get_connected_players = minetest.get_connected_players mcl_weather.snow = {} -mcl_weather.snow.particles_count = 15 +local PARTICLES_COUNT_SNOW = tonumber(minetest.settings:get("mcl_weather_snow_particles")) or 99 mcl_weather.snow.init_done = false local psdef= { - amount = 99, + amount = PARTICLES_COUNT_SNOW, time = 0, --stay on til we turn it off - minpos = vector.new(-15,-5,-15), - maxpos =vector.new(15,10,15), - minvel = vector.new(0,-1,0), - maxvel = vector.new(0,-4,0), + minpos = vector.new(-25,20,-25), + maxpos =vector.new(25,25,25), + minvel = vector.new(-0.2,-1,-0.2), + maxvel = vector.new(0.2,-4,0.2), minacc = vector.new(0,-1,0), maxacc = vector.new(0,-4,0), - minexptime = 1, - maxexptime = 1, - minsize = 0.5, + minexptime = 3, + maxexptime = 5, + minsize = 2, maxsize = 5, collisiondetection = true, collision_removal = true, @@ -70,13 +70,13 @@ minetest.register_globalstep(function(dtime) end for _, player in pairs(get_connected_players()) do - if (mcl_weather.is_underwater(player) or not mcl_worlds.has_weather(player:get_pos()) or not mcl_weather.is_outdoor(player:get_pos())) then + if mcl_weather.is_underwater(player) or not mcl_worlds.has_weather(player:get_pos()) then mcl_weather.remove_spawners_player(player) - return false - end - for i=1,2 do - psdef.texture="weather_pack_snow_snowflake"..i..".png" - mcl_weather.add_spawner_player(player,"snow"..i,psdef) + else + for i=1,2 do + psdef.texture="weather_pack_snow_snowflake"..i..".png" + mcl_weather.add_spawner_player(player,"snow"..i,psdef) + end end end end) diff --git a/mods/HELP/doc/doc_identifier/locale/doc_identifier.zh_TW.tr b/mods/HELP/doc/doc_identifier/locale/doc_identifier.zh_TW.tr new file mode 100644 index 000000000..727887db9 --- /dev/null +++ b/mods/HELP/doc/doc_identifier/locale/doc_identifier.zh_TW.tr @@ -0,0 +1,18 @@ +# textdomain:doc_identifier +Error: This node, item or object is undefined. This is always an error.=錯誤:該方塊、物品或實體未定義。這總是一個錯誤。 +This can happen for the following reasons:=發生這種情況的原因有機會是: +• The mod which is required for it is not enabled=• 未啟用所需的MOD +• The author of the game or a mod has made a mistake=• 遊戲或mod的作者犯了一個錯誤 +It appears to originate from the mod “@1”, which is enabled.=它似乎來自以啟用的mod「@1」。 +It appears to originate from the mod “@1”, which is not enabled!=它似乎來自沒啟用的mod「@1」! +Its identifier is “@1”.=其標識符為「@1」。 +Lookup Tool=幫助工具 +No help entry for this block could be found.=找不到此方塊的幫助條目。 +No help entry for this item could be found.=找不到此物品的幫助條目。 +No help entry for this object could be found.=找不到此實體的幫助條目。 +OK=OK +Punch any block, item or other thing about you wish to learn more about. This will open up the appropriate help entry. The tool comes in two modes which are changed by using. In liquid mode, this tool points to liquids as well while in solid mode this is not the case.=擊打任何你想了解更多的方塊、物品或其他事情。這將打開相應的幫助條目。該工具有兩種模式,可以通過使用來改變。在液體模式下,這個工具也會指向液體,而在固體模式下則不會這樣。 +This block cannot be identified because the world has not materialized at this point yet. Try again in a few seconds.=方塊所在的區塊未加載,請等一下在試一次。 +This is a player.=這是一個玩家。 +This useful little helper can be used to quickly learn more about about one's closer environment. It identifies and analyzes blocks, items and other things and it shows extensive information about the thing on which it is used.=這個有用的小幫手可以用來快速了解自己所處的近距離環境。它可以識別和分析區塊、物品和其他事物。當你對着一個方塊、物品或實體使用它時,可以顯示出那個事物的大量信息。 +Show help for pointed thing=顯示選中方塊的資訊 diff --git a/mods/HELP/mcl_craftguide/init.lua b/mods/HELP/mcl_craftguide/init.lua index f75ab07f7..2539a7cca 100644 --- a/mods/HELP/mcl_craftguide/init.lua +++ b/mods/HELP/mcl_craftguide/init.lua @@ -550,7 +550,7 @@ local function get_recipe_fs(data, iY) shapeless and "shapeless" or "furnace" if recipe.type == "cooking" then - icon = "default_furnace_front_active.png" + icon = "craftguide_furnace.png" elseif not custom_recipe then icon = fmt("craftguide_%s.png", icon) end diff --git a/mods/HELP/mcl_craftguide/textures/craftguide_furnace.png b/mods/HELP/mcl_craftguide/textures/craftguide_furnace.png new file mode 100644 index 0000000000000000000000000000000000000000..c425604d25adc2174f3521ddc220a1393d5e678f GIT binary patch literal 300 zcmV+{0n`48P)P)t-shk$&# ztEHuvkZWOKO+h+YPDg%pag&LIaBOD5fl0%jQ%*ZHSw}#xXh}07B3=*)geVTO83@Rv zS=K=t9~Bt?YB2x6I{!s5pjbdXsW%Y-005jxL_t(|0VPibqC+tZVk4nGmv{e@ett(A zcL1l2vmefW{wG*901Gf8GBR_^Ae3aL0L8yz$x@W1))J*uJ3z3oR4GbD3Sw2u)_aR4 z5I~}Fj5+7vs?=^eF4ybrdYM)Mc-pXizg~wY3!d;8wx74_Xi5P@o3D+z$n9A3_IiI_ yx4C|MNOnBGcChZTWUiz4V}+E0JY^rY5&8q%QU=+d%RWB<0000] ]=[[<玩家名字>] <經驗值>] +Gives a player some XP=給予玩家經驗值 +Error: Too many parameters!=錯誤:太多參數! +Error: Incorrect value of XP=錯誤:經驗值數值不當! +Error: Player not found=錯誤:找不到玩家! +Added @1 XP to @2, total: @3, experience level: @4=已給予 @2 @1 點經驗值,共有 @3 點,經驗等級:@4 diff --git a/mods/HUD/mcl_hbarmor/locale/mcl_hbarmor.zh_TW.tr b/mods/HUD/mcl_hbarmor/locale/mcl_hbarmor.zh_TW.tr new file mode 100644 index 000000000..a0dc8174e --- /dev/null +++ b/mods/HUD/mcl_hbarmor/locale/mcl_hbarmor.zh_TW.tr @@ -0,0 +1,2 @@ +# textdomain:hbarmor +Armor=防禦點數 diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index f2bd8076a..3bfb26ab0 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -339,14 +339,6 @@ function mcl_inventory.set_creative_formspec(player, start_i, pagenum, inv_size, if name == "inv" then inv_bg = "crafting_inventory_creative_survival.png" - -- Show armor and player image - local player_preview - if minetest.settings:get_bool("3d_player_preview", true) then - player_preview = mcl_player.get_player_formspec_model(player, 3.9, 1.4, 1.2333, 2.4666, "") - else - player_preview = "image[3.9,1.4;1.2333,2.4666;"..mcl_player.player_get_preview(player).."]" - end - -- Background images for armor slots (hide if occupied) local armor_slot_imgs = "" local inv = player:get_inventory() @@ -367,8 +359,12 @@ function mcl_inventory.set_creative_formspec(player, start_i, pagenum, inv_size, armor_slot_imgs = armor_slot_imgs .. "image[1.5,2.025;1,1;mcl_inventory_empty_armor_slot_shield.png]" end + if inv:get_stack("offhand", 1):is_empty() then + armor_slot_imgs = armor_slot_imgs .. "image[1.5,2.025;1,1;mcl_inventory_empty_armor_slot_shield.png]" + end + local stack_size = get_stack_size(player) - + -- Survival inventory slots main_list = "list[current_player;main;0,3.75;9,3;9]".. mcl_formspec.get_itemslot_bg(0,3.75,9,3).. @@ -386,7 +382,8 @@ function mcl_inventory.set_creative_formspec(player, start_i, pagenum, inv_size, armor_slot_imgs.. -- player preview - player_preview.. + -- player_preview.. + mcl_player.get_player_formspec_model(player, 3.9, 1.4, 1.2333, 2.4666, "").. -- crafting guide button "image_button[9,1;1,1;craftguide_book.png;__mcl_craftguide;]".. @@ -404,7 +401,7 @@ function mcl_inventory.set_creative_formspec(player, start_i, pagenum, inv_size, -- switch stack size button "image_button[9,5;1,1;default_apple.png;__switch_stack;]".. "label[9.4,5.4;".. F(C("#FFFFFF", stack_size ~= 1 and stack_size or "")) .."]".. - "tooltip[__switch_stack;"..F(S("Switch stack size")).."]" + "tooltip[__switch_stack;"..F(S("Switch stack size")).."]" -- For shortcuts listrings = listrings .. diff --git a/mods/HUD/mcl_inventory/locale/mcl_inventory.zh_TW.tr b/mods/HUD/mcl_inventory/locale/mcl_inventory.zh_TW.tr new file mode 100644 index 000000000..880d224f2 --- /dev/null +++ b/mods/HUD/mcl_inventory/locale/mcl_inventory.zh_TW.tr @@ -0,0 +1,21 @@ +# textdomain: mcl_inventory +Recipe book=合成教學 +Help=幫助 +Select player skin=選擇玩家皮膚 +Achievements=成就 +Building Blocks=建築方塊 +Decoration Blocks=裝飾性方塊 +Redstone=紅石 +Transportation=交通 +Brewing=釀造 +Miscellaneous=雜項 +Search Items=搜尋 +Foodstuffs=食物 +Tools=工具 +Combat=戰鬥 +Mobs=生物 +Materials=材料 +Survival Inventory=生存模式物品欄 +Crafting=合成 +Inventory=物品欄 +@1/@2= diff --git a/mods/HUD/mcl_offhand/init.lua b/mods/HUD/mcl_offhand/init.lua index af495b886..5f48eede9 100644 --- a/mods/HUD/mcl_offhand/init.lua +++ b/mods/HUD/mcl_offhand/init.lua @@ -55,12 +55,13 @@ local function update_wear_bar(player, itemstack) end minetest.register_globalstep(function(dtime) - for _, player in pairs(minetest.get_connected_players()) do if mcl_util and mcl_util.is_player(player:get_player_name()) then + for _, player in pairs(minetest.get_connected_players()) do local itemstack = mcl_offhand.get_offhand(player) local offhand_item = itemstack:get_name() local offhand_hud = mcl_offhand[player].hud - if offhand_item ~= "" then - local item_texture = minetest.registered_items[offhand_item].inventory_image .. "^[resize:" .. max_offhand_px .. "x" .. max_offhand_px + local item = minetest.registered_items[offhand_item] + if offhand_item ~= "" and item then + local item_texture = item.inventory_image .. "^[resize:" .. max_offhand_px .. "x" .. max_offhand_px local position = {x = 0.5, y = 1} local offset = {x = -320, y = -32} @@ -148,7 +149,7 @@ minetest.register_globalstep(function(dtime) remove_hud(player, index) end end - end end + end end) minetest.register_allow_player_inventory_action(function(player, action, inventory, inventory_info) diff --git a/mods/ITEMS/REDSTONE/mcl_comparators/init.lua b/mods/ITEMS/REDSTONE/mcl_comparators/init.lua index b596f26ff..b02413d7f 100644 --- a/mods/ITEMS/REDSTONE/mcl_comparators/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_comparators/init.lua @@ -52,7 +52,10 @@ end local function comparator_deactivate(pos, node) local def = minetest.registered_nodes[node.name] - minetest.swap_node(pos, { name = def.comparator_offstate, param2 = node.param2 }) + local offstate = def.comparator_offstate + if offstate then + minetest.swap_node(pos, { name = offstate, param2 = node.param2 }) + end minetest.after(0.1, comparator_turnoff, {pos = pos, node = node}) end diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua index 705466a38..66be4eb59 100644 --- a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua @@ -133,7 +133,7 @@ local dispenserdef = { if not stackdef then return end - + local iname = stack:get_name() local igroups = stackdef.groups @@ -185,7 +185,7 @@ local dispenserdef = { entity.base_texture = { "blank.png", "mobs_mc_sheep.png" } texture = entity.base_texture entity.drops = { - { name = mobs_mc.items.mutton_raw, chance = 1, min = 1, max = 2 }, + { name = "mcl_mobitems:mutton", chance = 1, min = 1, max = 2 }, } used = true elseif entname == "mobs_mc:snowman" then @@ -199,9 +199,9 @@ local dispenserdef = { elseif entname == "mobs_mc:mooshroom" then local droppos = vector.offset(pos, 0, 1.4, 0) if entity.base_texture[1] == "mobs_mc_mooshroom_brown.png" then - minetest.add_item(droppos, mobs_mc.items.mushroom_brown .. " 5") + minetest.add_item(droppos, "mcl_mushrooms:mushroom_brown 5") else - minetest.add_item(droppos, mobs_mc.items.mushroom_red .. " 5") + minetest.add_item(droppos, "mcl_mushrooms:mushroom_red 5") end obj = mcl_util.replace_mob(obj, "mobs_mc:cow") entity = obj:get_luaentity() diff --git a/mods/ITEMS/REDSTONE/mcl_droppers/init_new.lua b/mods/ITEMS/REDSTONE/mcl_droppers/init_new.lua deleted file mode 100644 index bd8c0a3c3..000000000 --- a/mods/ITEMS/REDSTONE/mcl_droppers/init_new.lua +++ /dev/null @@ -1,220 +0,0 @@ ---[[ This mod registers 3 nodes: -- One node for the horizontal-facing dropper (mcl_droppers:dropper) -- One node for the upwards-facing droppers (mcl_droppers:dropper_up) -- One node for the downwards-facing droppers (mcl_droppers:dropper_down) - -3 node definitions are needed because of the way the textures are defined. -All node definitions share a lot of code, so this is the reason why there -are so many weird tables below. -]] - -local S = minetest.get_translator(minetest.get_current_modname()) - --- For after_place_node -local function setup_dropper(pos) - -- Set formspec and inventory - local form = "size[9,8.75]".. - "background[-0.19,-0.25;9.41,9.49;crafting_inventory_9_slots.png]".. - "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. - "list[current_player;main;0,4.5;9,3;9]".. - "list[current_player;main;0,7.74;9,1;]".. - "label[3,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Dropper"))).."]".. - "list[context;main;3,0.5;3,3;]".. - "listring[context;main]".. - "listring[current_player;main]" - local meta = minetest.get_meta(pos) - meta:set_string("formspec", form) - local inv = meta:get_inventory() - inv:set_size("main", 9) -end - -local function orientate_dropper(pos, placer) - -- Not placed by player - if not placer then return end - - -- Pitch in degrees - local pitch = placer:get_look_vertical() * (180 / math.pi) - - if pitch > 55 then - minetest.swap_node(pos, {name="mcl_droppers:dropper_up"}) - elseif pitch < -55 then - minetest.swap_node(pos, {name="mcl_droppers:dropper_down"}) - end -end - -local on_rotate -if minetest.get_modpath("screwdriver") then - on_rotate = screwdriver.rotate_simple -end - --- Shared core definition table -local dropperdef = { - is_ground_content = false, - sounds = mcl_sounds.node_sound_stone_defaults(), - after_dig_node = function(pos, oldnode, oldmetadata, digger) - local meta = minetest.get_meta(pos) - local meta2 = meta:to_table() - meta:from_table(oldmetadata) - local inv = meta:get_inventory() - for i=1, inv:get_size("main") do - local stack = inv:get_stack("main", i) - if not stack:is_empty() then - local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} - minetest.add_item(p, stack) - end - end - meta:from_table(meta2) - end, - allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return 0 - else - return count - end - end, - allow_metadata_inventory_take = function(pos, listname, index, stack, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return 0 - else - return stack:get_count() - end - end, - allow_metadata_inventory_put = function(pos, listname, index, stack, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return 0 - else - return stack:get_count() - end - end, - _mcl_blast_resistance = 3.5, - _mcl_hardness = 3.5, - mesecons = {effector = { - -- Drop random item when triggered - action_on = function(pos, node) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - local droppos - if node.name == "mcl_droppers:dropper" then - droppos = vector.subtract(pos, minetest.facedir_to_dir(node.param2)) - elseif node.name == "mcl_droppers:dropper_up" then - droppos = {x=pos.x, y=pos.y+1, z=pos.z} - elseif node.name == "mcl_droppers:dropper_down" then - droppos = {x=pos.x, y=pos.y-1, z=pos.z} - end - local dropnode = minetest.get_node(droppos) - -- Do not drop into solid nodes, unless they are containers - local dropnodedef = minetest.registered_nodes[dropnode.name] - if dropnodedef.walkable and not dropnodedef.groups.container then - return - end - local stacks = {} - for i=1,inv:get_size("main") do - local stack = inv:get_stack("main", i) - if not stack:is_empty() then - table.insert(stacks, {stack = stack, stackpos = i}) - end - end - if #stacks >= 1 then - local r = math.random(1, #stacks) - local stack = stacks[r].stack - local dropitem = ItemStack(stack) - dropitem:set_count(1) - local stack_id = stacks[r].stackpos - - -- If it's a container, attempt to put it into the container - local dropped = mcl_util.move_item_container(pos, droppos, nil, stack_id) - -- No container? - if not dropped and not dropnodedef.groups.container then - -- Drop item normally - minetest.add_item(droppos, dropitem) - stack:take_item() - inv:set_stack("main", stack_id, stack) - end - end - end, - rules = mesecon.rules.alldirs, - }}, - on_rotate = on_rotate, -} - --- Horizontal dropper - -local horizontal_def = table.copy(dropperdef) -horizontal_def.description = S("Dropper") -horizontal_def._doc_items_longdesc = S("A dropper is a redstone component and a container with 9 inventory slots which, when supplied with redstone power, drops an item or puts it into a container in front of it.") -horizontal_def._doc_items_usagehelp = S("Droppers can be placed in 6 possible directions, items will be dropped out of the hole. Use the dropper to access its inventory. Supply it with redstone energy once to make the dropper drop or transfer a random item.") - -function horizontal_def.after_place_node(pos, placer, itemstack, pointed_thing) - setup_dropper(pos) - orientate_dropper(pos, placer) -end - -horizontal_def.tiles = { - "default_furnace_top.png", "default_furnace_bottom.png", - "default_furnace_side.png", "default_furnace_side.png", - "default_furnace_side.png", "mcl_droppers_dropper_front_horizontal.png", -} -horizontal_def.paramtype2 = "facedir" -horizontal_def.groups = {pickaxey=1, container=2, material_stone=1} - -minetest.register_node("mcl_droppers:dropper", horizontal_def) - --- Down dropper -local down_def = table.copy(dropperdef) -down_def.description = S("Downwards-Facing Dropper") -down_def.after_place_node = setup_dropper -down_def.tiles = { - "default_furnace_top.png", "mcl_droppers_dropper_front_vertical.png", - "default_furnace_side.png", "default_furnace_side.png", - "default_furnace_side.png", "default_furnace_side.png", -} -down_def.groups = {pickaxey=1, container=2,not_in_creative_inventory=1, material_stone=1} -down_def._doc_items_create_entry = false -down_def.drop = "mcl_droppers:dropper" -minetest.register_node("mcl_droppers:dropper_down", down_def) - --- Up dropper --- The up dropper is almost identical to the down dropper, it only differs in textures -local up_def = table.copy(down_def) -up_def.description = S("Upwards-Facing Dropper") -up_def.tiles = { - "mcl_droppers_dropper_front_vertical.png", "default_furnace_bottom.png", - "default_furnace_side.png", "default_furnace_side.png", - "default_furnace_side.png", "default_furnace_side.png", -} -minetest.register_node("mcl_droppers:dropper_up", up_def) - - - --- Ladies and gentlemen, I present to you: the crafting recipe! -minetest.register_craft({ - output = "mcl_droppers:dropper", - recipe = { - {"mcl_core:cobble", "mcl_core:cobble", "mcl_core:cobble",}, - {"mcl_core:cobble", "", "mcl_core:cobble",}, - {"mcl_core:cobble", "mesecons:redstone", "mcl_core:cobble",}, - } -}) - --- Add entry aliases for the Help -if minetest.get_modpath("doc") then - doc.add_entry_alias("nodes", "mcl_droppers:dropper", "nodes", "mcl_droppers:dropper_down") - doc.add_entry_alias("nodes", "mcl_droppers:dropper", "nodes", "mcl_droppers:dropper_up") -end - -minetest.register_lbm({ - label = "Update dropper formspecs (0.51.0)", - name = "mcl_droppers:update_formspecs_0_51_0", - nodenames = { "mcl_droppers:dropper", "mcl_droppers:dropper_down", "mcl_droppers:dropper_up" }, - action = function(pos, node) - minetest.registered_nodes[node.name].on_construct(pos) - minetest.log("action", "[mcl_droppers] Node formspec updated at "..minetest.pos_to_string(pos)) - end, -}) - diff --git a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua index c7c3151f7..fbfec38ad 100644 --- a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua @@ -28,8 +28,6 @@ end -- For nodes which ignore sticky sides. -- They can't be pulled by sticky pistons and don't interact with slime blocks. --- TODO: This has NOT any actual effect so far. The actual functionality --- still needs to be implemented. function mesecon.register_mvps_unsticky(nodename, get_unsticky) if get_unsticky == nil then get_unsticky = true @@ -47,9 +45,6 @@ function mesecon.is_mvps_unsticky(node, pulldir, stack, stackid) if type(get_unsticky) == "function" then get_unsticky = get_unsticky(node, pulldir, stack, stackid) end - if get_unsticky == nil then - get_unsticky = false - end return get_unsticky end @@ -192,7 +187,15 @@ function mesecon.mvps_push(pos, dir, maximum, player_name, piston_pos) end function mesecon.mvps_pull_single(pos, dir, maximum, player_name, piston_pos) - return mesecon.mvps_push_or_pull(pos, vector.multiply(dir, -1), dir, maximum, player_name, piston_pos) + local nodes = mesecon.mvps_get_stack(pos, dir, maximum, player_name, piston_pos) + + if not nodes then return end + -- ensure sticky pistons; even without slimeblocks attached adhere to the unpullable rule. + for id, n in ipairs(nodes) do + if not mesecon.is_mvps_unsticky(n.node, dir, nodes, id) then + return mesecon.mvps_push_or_pull(pos, vector.multiply(dir, -1), dir, maximum, player_name, piston_pos) + end + end end -- pos: pos of mvps; stackdir: direction of building the stack @@ -327,13 +330,14 @@ function mesecon.mvps_move_objects(pos, dir, nodestack) end end --- Unmovable by design +-- Unmovable by design: nodes mesecon.register_mvps_stopper("mcl_core:barrier") mesecon.register_mvps_stopper("mcl_core:realm_barrier") mesecon.register_mvps_stopper("mcl_core:void") mesecon.register_mvps_stopper("mcl_core:bedrock") mesecon.register_mvps_stopper("mcl_core:obsidian") mesecon.register_mvps_stopper("mcl_chests:ender_chest") +mesecon.register_mvps_stopper("mcl_chests:ender_chest_small") mesecon.register_mvps_stopper("mcl_mobspawners:spawner") mesecon.register_mvps_stopper("mesecons_commandblock:commandblock_off") mesecon.register_mvps_stopper("mesecons_commandblock:commandblock_on") @@ -341,9 +345,18 @@ mesecon.register_mvps_stopper("mcl_portals:portal") mesecon.register_mvps_stopper("mcl_portals:portal_end") mesecon.register_mvps_stopper("mcl_portals:end_portal_frame") mesecon.register_mvps_stopper("mcl_portals:end_portal_frame_eye") +mesecon.register_mvps_stopper("mcl_enchanting:table") +mesecon.register_mvps_stopper("mcl_jukebox:jukebox") +mesecon.register_mvps_stopper("mesecons_solarpanel:solar_panel_on") +mesecon.register_mvps_stopper("mesecons_solarpanel:solar_panel_off") +mesecon.register_mvps_stopper("mesecons_solarpanel:solar_panel_inverted_on") +mesecon.register_mvps_stopper("mesecons_solarpanel:solar_panel_inverted_off") +mesecon.register_mvps_stopper("mcl_banners:hanging_banner") +mesecon.register_mvps_stopper("mcl_banners:standing_banner") -- Unmovable by technical restrictions. -- Open formspec would screw up if node is destroyed (minor problem) +-- Would screw up on/off state of trapped chest (big problem) mesecon.register_mvps_stopper("mcl_furnaces:furnace") mesecon.register_mvps_stopper("mcl_furnaces:furnace_active") mesecon.register_mvps_stopper("mcl_hoppers:hopper") @@ -357,9 +370,39 @@ mesecon.register_mvps_stopper("mcl_dispensers:dispenser_down") mesecon.register_mvps_stopper("mcl_anvils:anvil") mesecon.register_mvps_stopper("mcl_anvils:anvil_damage_1") mesecon.register_mvps_stopper("mcl_anvils:anvil_damage_2") --- Would screw up on/off state of trapped chest (big problem) +mesecon.register_mvps_stopper("mcl_chests:chest") +mesecon.register_mvps_stopper("mcl_chests:chest_small") +mesecon.register_mvps_stopper("mcl_chests:chest_left") +mesecon.register_mvps_stopper("mcl_chests:chest_right") +mesecon.register_mvps_stopper("mcl_chests:trapped_chest") +mesecon.register_mvps_stopper("mcl_chests:trapped_chest_small") +mesecon.register_mvps_stopper("mcl_chests:trapped_chest_left") +mesecon.register_mvps_stopper("mcl_chests:trapped_chest_right") +mesecon.register_mvps_stopper("mcl_signs:wall_sign") +mesecon.register_mvps_stopper("mcl_signs:standing_sign") +mesecon.register_mvps_stopper("mcl_signs:standing_sign22_5") +mesecon.register_mvps_stopper("mcl_signs:standing_sign45") +mesecon.register_mvps_stopper("mcl_signs:standing_sign67_5") +mesecon.register_mvps_stopper("mcl_barrels:barrel_open") +mesecon.register_mvps_stopper("mcl_barrels:barrel_closed") --- Glazed terracotta: unpullable + +-- Unmovable by design: objects +mesecon.register_mvps_unmov("mcl_enchanting:book") +mesecon.register_mvps_unmov("mcl_chests:chest") +mesecon.register_mvps_unmov("mcl_banners:hanging_banner") +mesecon.register_mvps_unmov("mcl_banners:standing_banner") +mesecon.register_mvps_unmov("mcl_signs:text") +mesecon.register_mvps_unmov("mcl_mobspawners:doll") +mesecon.register_mvps_unmov("mcl_armor_stand:armor_entity") +mesecon.register_mvps_unmov("mcl_itemframes:item") +mesecon.register_mvps_unmov("mcl_itemframes:map") +mesecon.register_mvps_unmov("mcl_paintings:painting") +mesecon.register_mvps_unmov("mcl_end:crystal") + + +-- Unpullable by design: nodes +-- Glazed Terracotta mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_red") mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_orange") mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_yellow") @@ -376,6 +419,446 @@ mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_black") mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_brown") mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_light_blue") mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_pink") +-- Beds +mesecon.register_mvps_unsticky("mcl_beds:bed_black_top") +mesecon.register_mvps_unsticky("mcl_beds:bed_black_bottom") +mesecon.register_mvps_unsticky("mcl_beds:bed_blue_top") +mesecon.register_mvps_unsticky("mcl_beds:bed_blue_bottom") +mesecon.register_mvps_unsticky("mcl_beds:bed_brown_top") +mesecon.register_mvps_unsticky("mcl_beds:bed_brown_bottom") +mesecon.register_mvps_unsticky("mcl_beds:bed_cyan_top") +mesecon.register_mvps_unsticky("mcl_beds:bed_cyan_bottom") +mesecon.register_mvps_unsticky("mcl_beds:bed_green_top") +mesecon.register_mvps_unsticky("mcl_beds:bed_green_bottom") +mesecon.register_mvps_unsticky("mcl_beds:bed_grey_top") +mesecon.register_mvps_unsticky("mcl_beds:bed_grey_bottom") +mesecon.register_mvps_unsticky("mcl_beds:bed_light_blue_top") +mesecon.register_mvps_unsticky("mcl_beds:bed_light_blue_bottom") +mesecon.register_mvps_unsticky("mcl_beds:bed_lime_top") +mesecon.register_mvps_unsticky("mcl_beds:bed_lime_bottom") +mesecon.register_mvps_unsticky("mcl_beds:bed_magenta_top") +mesecon.register_mvps_unsticky("mcl_beds:bed_magenta_bottom") +mesecon.register_mvps_unsticky("mcl_beds:bed_orange_top") +mesecon.register_mvps_unsticky("mcl_beds:bed_orange_bottom") +mesecon.register_mvps_unsticky("mcl_beds:bed_pink_top") +mesecon.register_mvps_unsticky("mcl_beds:bed_pink_bottom") +mesecon.register_mvps_unsticky("mcl_beds:bed_purple_top") +mesecon.register_mvps_unsticky("mcl_beds:bed_purple_bottom") +mesecon.register_mvps_unsticky("mcl_beds:bed_red_top") +mesecon.register_mvps_unsticky("mcl_beds:bed_red_bottom") +mesecon.register_mvps_unsticky("mcl_beds:bed_silver_top") +mesecon.register_mvps_unsticky("mcl_beds:bed_silver_bottom") +mesecon.register_mvps_unsticky("mcl_beds:bed_white_top") +mesecon.register_mvps_unsticky("mcl_beds:bed_white_bottom") +mesecon.register_mvps_unsticky("mcl_beds:bed_yellow_top") +mesecon.register_mvps_unsticky("mcl_beds:bed_yellow_bottom") +-- Buttons +mesecon.register_mvps_unsticky("mesecons_button:button_stone_off") +mesecon.register_mvps_unsticky("mesecons_button:button_stone_on") +mesecon.register_mvps_unsticky("mesecons_button:button_wood_off") +mesecon.register_mvps_unsticky("mesecons_button:button_wood_on") +mesecon.register_mvps_unsticky("mesecons_button:button_acaciawood_off") +mesecon.register_mvps_unsticky("mesecons_button:button_acaciawood_on") +mesecon.register_mvps_unsticky("mesecons_button:button_birchwood_off") +mesecon.register_mvps_unsticky("mesecons_button:button_birchwood_on") +mesecon.register_mvps_unsticky("mesecons_button:button_darkwood_off") +mesecon.register_mvps_unsticky("mesecons_button:button_darkwood_on") +mesecon.register_mvps_unsticky("mesecons_button:button_sprucewood_off") +mesecon.register_mvps_unsticky("mesecons_button:button_sprucewood_on") +mesecon.register_mvps_unsticky("mesecons_button:button_junglewood_off") +mesecon.register_mvps_unsticky("mesecons_button:button_junglewood_on") +-- Cactus, Sugarcane & Vines +mesecon.register_mvps_unsticky("mcl_core:cactus") +mesecon.register_mvps_unsticky("mcl_core:reeds") +mesecon.register_mvps_unsticky("mcl_core:vine") +-- Cake +mesecon.register_mvps_unsticky("mcl_cake:cake_1") +mesecon.register_mvps_unsticky("mcl_cake:cake_2") +mesecon.register_mvps_unsticky("mcl_cake:cake_3") +mesecon.register_mvps_unsticky("mcl_cake:cake_4") +mesecon.register_mvps_unsticky("mcl_cake:cake_5") +mesecon.register_mvps_unsticky("mcl_cake:cake_6") +mesecon.register_mvps_unsticky("mcl_cake:cake") +-- Carpet +mesecon.register_mvps_unsticky("mcl_wool:black_carpet") +mesecon.register_mvps_unsticky("mcl_wool:blue_carpet") +mesecon.register_mvps_unsticky("mcl_wool:brown_carpet") +mesecon.register_mvps_unsticky("mcl_wool:cyan_carpet") +mesecon.register_mvps_unsticky("mcl_wool:green_carpet") +mesecon.register_mvps_unsticky("mcl_wool:grey_carpet") +mesecon.register_mvps_unsticky("mcl_wool:light_blue_carpet") +mesecon.register_mvps_unsticky("mcl_wool:lime_carpet") +mesecon.register_mvps_unsticky("mcl_wool:orange_carpet") +mesecon.register_mvps_unsticky("mcl_wool:magenta_carpet") +mesecon.register_mvps_unsticky("mcl_wool:pink_carpet") +mesecon.register_mvps_unsticky("mcl_wool:purple_carpet") +mesecon.register_mvps_unsticky("mcl_wool:red_carpet") +mesecon.register_mvps_unsticky("mcl_wool:silver_carpet") +mesecon.register_mvps_unsticky("mcl_wool:white_carpet") +mesecon.register_mvps_unsticky("mcl_wool:yellow_carpet") +-- Carved & Jack O'Lantern Pumpkins, Pumpkin & Melon +mesecon.register_mvps_unsticky("mcl_farming:pumpkin_face") +mesecon.register_mvps_unsticky("mcl_farming:pumpkin_face_light") +mesecon.register_mvps_unsticky("mcl_farming:pumpkin") +mesecon.register_mvps_unsticky("mcl_farming:melon") +-- Chorus Plant & Flower +mesecon.register_mvps_unsticky("mcl_end:chorus_plant") +mesecon.register_mvps_unsticky("mcl_end:chorus_flower") +-- Cobweb +mesecon.register_mvps_unsticky("mcl_core:cobweb") +-- Cocoa +mesecon.register_mvps_unsticky("mcl_cocoas:cocoa_1") +mesecon.register_mvps_unsticky("mcl_cocoas:cocoa_2") +mesecon.register_mvps_unsticky("mcl_cocoas:cocoa_3") +-- Doors +mesecon.register_mvps_unsticky("mcl_doors:wooden_door_t_1") +mesecon.register_mvps_unsticky("mcl_doors:wooden_door_b_1") +mesecon.register_mvps_unsticky("mcl_doors:wooden_door_t_2") +mesecon.register_mvps_unsticky("mcl_doors:wooden_door_b_2") +mesecon.register_mvps_unsticky("mcl_doors:iron_door_t_1") +mesecon.register_mvps_unsticky("mcl_doors:iron_door_b_1") +mesecon.register_mvps_unsticky("mcl_doors:iron_door_t_2") +mesecon.register_mvps_unsticky("mcl_doors:iron_door_b_2") +mesecon.register_mvps_unsticky("mcl_doors:acacia_door_t_1") +mesecon.register_mvps_unsticky("mcl_doors:acacia_door_b_1") +mesecon.register_mvps_unsticky("mcl_doors:acacia_door_t_2") +mesecon.register_mvps_unsticky("mcl_doors:acacia_door_b_2") +mesecon.register_mvps_unsticky("mcl_doors:birch_door_t_1") +mesecon.register_mvps_unsticky("mcl_doors:birch_door_b_1") +mesecon.register_mvps_unsticky("mcl_doors:birch_door_t_2") +mesecon.register_mvps_unsticky("mcl_doors:birch_door_b_2") +mesecon.register_mvps_unsticky("mcl_doors:dark_oak_door_t_1") +mesecon.register_mvps_unsticky("mcl_doors:dark_oak_door_b_1") +mesecon.register_mvps_unsticky("mcl_doors:dark_oak_door_t_2") +mesecon.register_mvps_unsticky("mcl_doors:dark_oak_door_b_2") +mesecon.register_mvps_unsticky("mcl_doors:spruce_door_t_1") +mesecon.register_mvps_unsticky("mcl_doors:spruce_door_b_1") +mesecon.register_mvps_unsticky("mcl_doors:spruce_door_t_2") +mesecon.register_mvps_unsticky("mcl_doors:spruce_door_b_2") +mesecon.register_mvps_unsticky("mcl_doors:jungle_door_t_1") +mesecon.register_mvps_unsticky("mcl_doors:jungle_door_b_1") +mesecon.register_mvps_unsticky("mcl_doors:jungle_door_t_2") +mesecon.register_mvps_unsticky("mcl_doors:jungle_door_b_2") +-- Dragon Egg +mesecon.register_mvps_unsticky("mcl_end:dragon_egg") +-- Fire +mesecon.register_mvps_unsticky("mcl_fire:fire") +mesecon.register_mvps_unsticky("mcl_fire:eternal_fire") +-- Flower Pots +mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot") +mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_allium") +mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_azure_bluet") +mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_blue_orchid") +mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_dandelion") +mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_fern") +mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_oxeye_daisy") +mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_poppy") +mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_tulip_orange") +mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_tulip_pink") +mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_tulip_red") +mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_tulip_white") +-- Flowers, Lilypad & Dead Bush +mesecon.register_mvps_unsticky("mcl_core:deadbush") +mesecon.register_mvps_unsticky("mcl_flowers:allium") +mesecon.register_mvps_unsticky("mcl_flowers:azure_bluet") +mesecon.register_mvps_unsticky("mcl_flowers:blue_orchid") +mesecon.register_mvps_unsticky("mcl_flowers:dandelion") +mesecon.register_mvps_unsticky("mcl_flowers:double_fern") +mesecon.register_mvps_unsticky("mcl_flowers:double_fern_top") +mesecon.register_mvps_unsticky("mcl_flowers:fern") +mesecon.register_mvps_unsticky("mcl_flowers:lilac") +mesecon.register_mvps_unsticky("mcl_flowers:lilac_top") +mesecon.register_mvps_unsticky("mcl_flowers:oxeye_daisy") +mesecon.register_mvps_unsticky("mcl_flowers:peony") +mesecon.register_mvps_unsticky("mcl_flowers:peony_top") +mesecon.register_mvps_unsticky("mcl_flowers:poppy") +mesecon.register_mvps_unsticky("mcl_flowers:rose_bush") +mesecon.register_mvps_unsticky("mcl_flowers:rose_bush_top") +mesecon.register_mvps_unsticky("mcl_flowers:sunflower") +mesecon.register_mvps_unsticky("mcl_flowers:sunflower_top") +mesecon.register_mvps_unsticky("mcl_flowers:tallgrass") +mesecon.register_mvps_unsticky("mcl_flowers:double_grass") +mesecon.register_mvps_unsticky("mcl_flowers:double_grass_top") +mesecon.register_mvps_unsticky("mcl_flowers:tulip_orange") +mesecon.register_mvps_unsticky("mcl_flowers:tulip_pink") +mesecon.register_mvps_unsticky("mcl_flowers:tulip_red") +mesecon.register_mvps_unsticky("mcl_flowers:tulip_white") +mesecon.register_mvps_unsticky("mcl_flowers:waterlily") +-- Heads +mesecon.register_mvps_unsticky("mcl_heads:creeper") +mesecon.register_mvps_unsticky("mcl_heads:skeleton") +mesecon.register_mvps_unsticky("mcl_heads:steve") +mesecon.register_mvps_unsticky("mcl_heads:wither_skeleton") +mesecon.register_mvps_unsticky("mcl_heads:zombie") +-- Item Frame +mesecon.register_mvps_unsticky("mcl_itemframes:item_frame") +-- Ladder +mesecon.register_mvps_unsticky("mcl_core:ladder") +-- Lava & Water +mesecon.register_mvps_unsticky("mcl_core:lava_source") +mesecon.register_mvps_unsticky("mcl_core:lava_flowing") +mesecon.register_mvps_unsticky("mcl_core:water_source") +mesecon.register_mvps_unsticky("mcl_core:water_flowing") +mesecon.register_mvps_unsticky("mclx_core:river_water_source") +mesecon.register_mvps_unsticky("mclx_core:river_water_flowing") +-- Leaves +mesecon.register_mvps_unsticky("mcl_core:leaves") +mesecon.register_mvps_unsticky("mcl_core:acacialeaves") +mesecon.register_mvps_unsticky("mcl_core:birchleaves") +mesecon.register_mvps_unsticky("mcl_core:darkleaves") +mesecon.register_mvps_unsticky("mcl_core:spruceleaves") +mesecon.register_mvps_unsticky("mcl_core:jungleleaves") +-- Lever +mesecon.register_mvps_unsticky("mesecons_walllever:wall_lever_off") +mesecon.register_mvps_unsticky("mesecons_walllever:wall_lever_on") +-- Mushrooms, Nether Wart & Amethyst +mesecon.register_mvps_unsticky("mcl_mushroom:mushroom_brown") +mesecon.register_mvps_unsticky("mcl_mushroom:mushroom_red") +mesecon.register_mvps_unsticky("mcl_nether:nether_wart_0") +mesecon.register_mvps_unsticky("mcl_nether:nether_wart_1") +mesecon.register_mvps_unsticky("mcl_nether:nether_wart_2") +mesecon.register_mvps_unsticky("mcl_nether:nether_wart") +mesecon.register_mvps_unsticky("mcl_amethyst:amethyst_cluster") +mesecon.register_mvps_unsticky("mcl_amethyst:budding_amethyst_block") +-- Pressure Plates +mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_wood_on") +mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_wood_off") +mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_stone_on") +mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_stone_off") +mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_acaciawood_on") +mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_acaciawoood_off") +mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_birchwood_on") +mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_birchwood_off") +mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_darkwood_on") +mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_darkwood_off") +mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_sprucekwood_on") +mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_sprucewood_off") +mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_junglewood_on") +mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_junglewood_off") +-- Redstone Comparators +mesecon.register_mvps_unsticky("mcl_comparators:comparator_on_sub") +mesecon.register_mvps_unsticky("mcl_comparators:comparator_off_sub") +mesecon.register_mvps_unsticky("mcl_comparators:comparator_on_comp") +mesecon.register_mvps_unsticky("mcl_comparators:comparator_off_comp") +-- Redstone Dust +mesecon.register_mvps_unsticky("mesecons:wire_00000000_on") +mesecon.register_mvps_unsticky("mesecons:wire_00000000_off") +mesecon.register_mvps_unsticky("mesecons:wire_10000000_on") +mesecon.register_mvps_unsticky("mesecons:wire_10000000_off") +mesecon.register_mvps_unsticky("mesecons:wire_01000000_on") +mesecon.register_mvps_unsticky("mesecons:wire_01000000_off") +mesecon.register_mvps_unsticky("mesecons:wire_11000000_on") +mesecon.register_mvps_unsticky("mesecons:wire_11000000_off") +mesecon.register_mvps_unsticky("mesecons:wire_00100000_on") +mesecon.register_mvps_unsticky("mesecons:wire_00100000_off") +mesecon.register_mvps_unsticky("mesecons:wire_10100000_on") +mesecon.register_mvps_unsticky("mesecons:wire_10100000_off") +mesecon.register_mvps_unsticky("mesecons:wire_01100000_on") +mesecon.register_mvps_unsticky("mesecons:wire_01100000_off") +mesecon.register_mvps_unsticky("mesecons:wire_11100000_on") +mesecon.register_mvps_unsticky("mesecons:wire_11100000_off") +mesecon.register_mvps_unsticky("mesecons:wire_00010000_on") +mesecon.register_mvps_unsticky("mesecons:wire_00010000_off") +mesecon.register_mvps_unsticky("mesecons:wire_10010000_on") +mesecon.register_mvps_unsticky("mesecons:wire_10010000_off") +mesecon.register_mvps_unsticky("mesecons:wire_01010000_on") +mesecon.register_mvps_unsticky("mesecons:wire_01010000_off") +mesecon.register_mvps_unsticky("mesecons:wire_11010000_on") +mesecon.register_mvps_unsticky("mesecons:wire_11010000_off") +mesecon.register_mvps_unsticky("mesecons:wire_00110000_on") +mesecon.register_mvps_unsticky("mesecons:wire_00110000_off") +mesecon.register_mvps_unsticky("mesecons:wire_10110000_on") +mesecon.register_mvps_unsticky("mesecons:wire_10110000_off") +mesecon.register_mvps_unsticky("mesecons:wire_01110000_on") +mesecon.register_mvps_unsticky("mesecons:wire_01110000_off") +mesecon.register_mvps_unsticky("mesecons:wire_11110000_on") +mesecon.register_mvps_unsticky("mesecons:wire_11110000_off") +mesecon.register_mvps_unsticky("mesecons:wire_10001000_on") +mesecon.register_mvps_unsticky("mesecons:wire_10001000_off") +mesecon.register_mvps_unsticky("mesecons:wire_11001000_on") +mesecon.register_mvps_unsticky("mesecons:wire_11001000_off") +mesecon.register_mvps_unsticky("mesecons:wire_10101000_on") +mesecon.register_mvps_unsticky("mesecons:wire_10101000_off") +mesecon.register_mvps_unsticky("mesecons:wire_11101000_on") +mesecon.register_mvps_unsticky("mesecons:wire_11101000_off") +mesecon.register_mvps_unsticky("mesecons:wire_10011000_on") +mesecon.register_mvps_unsticky("mesecons:wire_10011000_off") +mesecon.register_mvps_unsticky("mesecons:wire_11011000_on") +mesecon.register_mvps_unsticky("mesecons:wire_11011000_off") +mesecon.register_mvps_unsticky("mesecons:wire_10111000_on") +mesecon.register_mvps_unsticky("mesecons:wire_10111000_off") +mesecon.register_mvps_unsticky("mesecons:wire_11111000_on") +mesecon.register_mvps_unsticky("mesecons:wire_11111000_off") +mesecon.register_mvps_unsticky("mesecons:wire_01000100_on") +mesecon.register_mvps_unsticky("mesecons:wire_01000100_off") +mesecon.register_mvps_unsticky("mesecons:wire_11000100_on") +mesecon.register_mvps_unsticky("mesecons:wire_11000100_off") +mesecon.register_mvps_unsticky("mesecons:wire_01100100_on") +mesecon.register_mvps_unsticky("mesecons:wire_01100100_off") +mesecon.register_mvps_unsticky("mesecons:wire_11100100_on") +mesecon.register_mvps_unsticky("mesecons:wire_11100100_off") +mesecon.register_mvps_unsticky("mesecons:wire_01010100_on") +mesecon.register_mvps_unsticky("mesecons:wire_01010100_off") +mesecon.register_mvps_unsticky("mesecons:wire_11010100_on") +mesecon.register_mvps_unsticky("mesecons:wire_11010100_off") +mesecon.register_mvps_unsticky("mesecons:wire_01110100_on") +mesecon.register_mvps_unsticky("mesecons:wire_01110100_off") +mesecon.register_mvps_unsticky("mesecons:wire_11110100_on") +mesecon.register_mvps_unsticky("mesecons:wire_11110100_off") +mesecon.register_mvps_unsticky("mesecons:wire_11001100_on") +mesecon.register_mvps_unsticky("mesecons:wire_11001100_off") +mesecon.register_mvps_unsticky("mesecons:wire_11101100_on") +mesecon.register_mvps_unsticky("mesecons:wire_11101100_off") +mesecon.register_mvps_unsticky("mesecons:wire_11011100_on") +mesecon.register_mvps_unsticky("mesecons:wire_11011100_off") +mesecon.register_mvps_unsticky("mesecons:wire_11111100_on") +mesecon.register_mvps_unsticky("mesecons:wire_11111100_off") +mesecon.register_mvps_unsticky("mesecons:wire_00100010_on") +mesecon.register_mvps_unsticky("mesecons:wire_00100010_off") +mesecon.register_mvps_unsticky("mesecons:wire_10100010_on") +mesecon.register_mvps_unsticky("mesecons:wire_10100010_off") +mesecon.register_mvps_unsticky("mesecons:wire_01100010_on") +mesecon.register_mvps_unsticky("mesecons:wire_01100010_off") +mesecon.register_mvps_unsticky("mesecons:wire_11100010_on") +mesecon.register_mvps_unsticky("mesecons:wire_11100010_off") +mesecon.register_mvps_unsticky("mesecons:wire_00110010_on") +mesecon.register_mvps_unsticky("mesecons:wire_00110010_off") +mesecon.register_mvps_unsticky("mesecons:wire_10110010_on") +mesecon.register_mvps_unsticky("mesecons:wire_10110010_off") +mesecon.register_mvps_unsticky("mesecons:wire_01110010_on") +mesecon.register_mvps_unsticky("mesecons:wire_01110010_off") +mesecon.register_mvps_unsticky("mesecons:wire_11110010_on") +mesecon.register_mvps_unsticky("mesecons:wire_11110010_off") +mesecon.register_mvps_unsticky("mesecons:wire_10101010_on") +mesecon.register_mvps_unsticky("mesecons:wire_10101010_off") +mesecon.register_mvps_unsticky("mesecons:wire_11101010_on") +mesecon.register_mvps_unsticky("mesecons:wire_11101010_off") +mesecon.register_mvps_unsticky("mesecons:wire_10111010_on") +mesecon.register_mvps_unsticky("mesecons:wire_10111010_off") +mesecon.register_mvps_unsticky("mesecons:wire_11111010_on") +mesecon.register_mvps_unsticky("mesecons:wire_11111010_off") +mesecon.register_mvps_unsticky("mesecons:wire_01100110_on") +mesecon.register_mvps_unsticky("mesecons:wire_01100110_off") +mesecon.register_mvps_unsticky("mesecons:wire_11100110_on") +mesecon.register_mvps_unsticky("mesecons:wire_11100110_off") +mesecon.register_mvps_unsticky("mesecons:wire_01110110_on") +mesecon.register_mvps_unsticky("mesecons:wire_01110110_off") +mesecon.register_mvps_unsticky("mesecons:wire_11110110_on") +mesecon.register_mvps_unsticky("mesecons:wire_11110110_off") +mesecon.register_mvps_unsticky("mesecons:wire_11101110_on") +mesecon.register_mvps_unsticky("mesecons:wire_11101110_off") +mesecon.register_mvps_unsticky("mesecons:wire_11111110_on") +mesecon.register_mvps_unsticky("mesecons:wire_11111110_off") +mesecon.register_mvps_unsticky("mesecons:wire_00010001_on") +mesecon.register_mvps_unsticky("mesecons:wire_00010001_off") +mesecon.register_mvps_unsticky("mesecons:wire_10010001_on") +mesecon.register_mvps_unsticky("mesecons:wire_10010001_off") +mesecon.register_mvps_unsticky("mesecons:wire_01010001_on") +mesecon.register_mvps_unsticky("mesecons:wire_01010001_off") +mesecon.register_mvps_unsticky("mesecons:wire_11010001_on") +mesecon.register_mvps_unsticky("mesecons:wire_11010001_off") +mesecon.register_mvps_unsticky("mesecons:wire_00110001_on") +mesecon.register_mvps_unsticky("mesecons:wire_00110001_off") +mesecon.register_mvps_unsticky("mesecons:wire_10110001_on") +mesecon.register_mvps_unsticky("mesecons:wire_10110001_off") +mesecon.register_mvps_unsticky("mesecons:wire_01110001_on") +mesecon.register_mvps_unsticky("mesecons:wire_01110001_off") +mesecon.register_mvps_unsticky("mesecons:wire_11110001_on") +mesecon.register_mvps_unsticky("mesecons:wire_11110001_off") +mesecon.register_mvps_unsticky("mesecons:wire_10011001_on") +mesecon.register_mvps_unsticky("mesecons:wire_10011001_off") +mesecon.register_mvps_unsticky("mesecons:wire_11011001_on") +mesecon.register_mvps_unsticky("mesecons:wire_11011001_off") +mesecon.register_mvps_unsticky("mesecons:wire_10111001_on") +mesecon.register_mvps_unsticky("mesecons:wire_10111001_off") +mesecon.register_mvps_unsticky("mesecons:wire_11111001_on") +mesecon.register_mvps_unsticky("mesecons:wire_11111001_off") +mesecon.register_mvps_unsticky("mesecons:wire_01010101_on") +mesecon.register_mvps_unsticky("mesecons:wire_01010101_off") +mesecon.register_mvps_unsticky("mesecons:wire_11010101_on") +mesecon.register_mvps_unsticky("mesecons:wire_11010101_off") +mesecon.register_mvps_unsticky("mesecons:wire_01110101_on") +mesecon.register_mvps_unsticky("mesecons:wire_01110101_off") +mesecon.register_mvps_unsticky("mesecons:wire_11110101_on") +mesecon.register_mvps_unsticky("mesecons:wire_11110101_off") +mesecon.register_mvps_unsticky("mesecons:wire_11011101_on") +mesecon.register_mvps_unsticky("mesecons:wire_11011101_off") +mesecon.register_mvps_unsticky("mesecons:wire_11111101_on") +mesecon.register_mvps_unsticky("mesecons:wire_11111101_off") +mesecon.register_mvps_unsticky("mesecons:wire_00110011_on") +mesecon.register_mvps_unsticky("mesecons:wire_00110011_off") +mesecon.register_mvps_unsticky("mesecons:wire_10110011_on") +mesecon.register_mvps_unsticky("mesecons:wire_10110011_off") +mesecon.register_mvps_unsticky("mesecons:wire_01110011_on") +mesecon.register_mvps_unsticky("mesecons:wire_01110011_off") +mesecon.register_mvps_unsticky("mesecons:wire_11110011_on") +mesecon.register_mvps_unsticky("mesecons:wire_11110011_off") +mesecon.register_mvps_unsticky("mesecons:wire_10111011_on") +mesecon.register_mvps_unsticky("mesecons:wire_10111011_off") +mesecon.register_mvps_unsticky("mesecons:wire_11111011_on") +mesecon.register_mvps_unsticky("mesecons:wire_11111011_off") +mesecon.register_mvps_unsticky("mesecons:wire_01110111_on") +mesecon.register_mvps_unsticky("mesecons:wire_01110111_off") +mesecon.register_mvps_unsticky("mesecons:wire_11110111_on") +mesecon.register_mvps_unsticky("mesecons:wire_11110111_off") +mesecon.register_mvps_unsticky("mesecons:wire_11111111_on") +mesecon.register_mvps_unsticky("mesecons:wire_11111111_off") +-- Redstone Repeater +mesecon.register_mvps_unsticky("mesecons_delayer:delayer_off_1") +mesecon.register_mvps_unsticky("mesecons_delayer:delayer_off_2") +mesecon.register_mvps_unsticky("mesecons_delayer:delayer_off_3") +mesecon.register_mvps_unsticky("mesecons_delayer:delayer_off_4") +mesecon.register_mvps_unsticky("mesecons_delayer:delayer_on_1") +mesecon.register_mvps_unsticky("mesecons_delayer:delayer_on_2") +mesecon.register_mvps_unsticky("mesecons_delayer:delayer_on_3") +mesecon.register_mvps_unsticky("mesecons_delayer:delayer_on_4") +-- Redstone Torch +mesecon.register_mvps_unsticky("mesecons_torch:mesecon_torch_on") +mesecon.register_mvps_unsticky("mesecons_torch:mesecon_torch_off") +mesecon.register_mvps_unsticky("mesecons_torch:mesecon_torch_on_wall") +mesecon.register_mvps_unsticky("mesecons_torch:mesecon_torch_off_wall") +-- Sea Pickle +mesecon.register_mvps_unsticky("mcl_ocean:sea_pickle_1_dead_brain_coral_block") +mesecon.register_mvps_unsticky("mcl_ocean:sea_pickle_2_dead_brain_coral_block") +mesecon.register_mvps_unsticky("mcl_ocean:sea_pickle_3_dead_brain_coral_block") +mesecon.register_mvps_unsticky("mcl_ocean:sea_pickle_4_dead_brain_coral_block") +-- Shulker chests +mesecon.register_mvps_unsticky("mcl_chests:black_shulker_box_small") +mesecon.register_mvps_unsticky("mcl_chests:blue_shulker_box_small") +mesecon.register_mvps_unsticky("mcl_chests:brown_shulker_box_small") +mesecon.register_mvps_unsticky("mcl_chests:cyan_shulker_box_small") +mesecon.register_mvps_unsticky("mcl_chests:green_shulker_box_small") +mesecon.register_mvps_unsticky("mcl_chests:grey_shulker_box_small") +mesecon.register_mvps_unsticky("mcl_chests:light_blue_shulker_box_small") +mesecon.register_mvps_unsticky("mcl_chests:lime_shulker_box_small") +mesecon.register_mvps_unsticky("mcl_chests:orange_shulker_box_small") +mesecon.register_mvps_unsticky("mcl_chests:magenta_shulker_box_small") +mesecon.register_mvps_unsticky("mcl_chests:pink_shulker_box_small") +mesecon.register_mvps_unsticky("mcl_chests:purple_shulker_box_small") +mesecon.register_mvps_unsticky("mcl_chests:red_shulker_box_small") +mesecon.register_mvps_unsticky("mcl_chests:silver_shulker_box_small") +mesecon.register_mvps_unsticky("mcl_chests:white_shulker_box_small") +mesecon.register_mvps_unsticky("mcl_chests:yellow_shulker_box_small") +-- Snow +mesecon.register_mvps_unsticky("mcl_core:snow") +mesecon.register_mvps_unsticky("mcl_core:snow_2") +mesecon.register_mvps_unsticky("mcl_core:snow_3") +mesecon.register_mvps_unsticky("mcl_core:snow_4") +mesecon.register_mvps_unsticky("mcl_core:snow_5") +mesecon.register_mvps_unsticky("mcl_core:snow_6") +mesecon.register_mvps_unsticky("mcl_core:snow_7") +mesecon.register_mvps_unsticky("mcl_core:snow_8") +-- Torch +mesecon.register_mvps_unsticky("mcl_torches:torch") +mesecon.register_mvps_unsticky("mcl_torches:torch_wall") +-- Wheat +mesecon.register_mvps_unsticky("mcl_farming:wheat") +mesecon.register_mvps_unsticky("mcl_farming:wheat_2") +mesecon.register_mvps_unsticky("mcl_farming:wheat_3") +mesecon.register_mvps_unsticky("mcl_farming:wheat_4") +mesecon.register_mvps_unsticky("mcl_farming:wheat_5") +mesecon.register_mvps_unsticky("mcl_farming:wheat_6") +mesecon.register_mvps_unsticky("mcl_farming:wheat_7") -- Includes node heat when moving them mesecon.register_on_mvps_move(mesecon.move_hot_nodes) diff --git a/mods/ITEMS/REDSTONE/mesecons_pressureplates/init.lua b/mods/ITEMS/REDSTONE/mesecons_pressureplates/init.lua index b3d7a4de8..44d87027f 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/REDSTONE/mesecons_solarpanel/init.lua b/mods/ITEMS/REDSTONE/mesecons_solarpanel/init.lua index 05fed31a3..2309be4d3 100644 --- a/mods/ITEMS/REDSTONE/mesecons_solarpanel/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_solarpanel/init.lua @@ -1,5 +1,71 @@ local S = minetest.get_translator(minetest.get_current_modname()) +local function path_to_sunlight_exists(position, light_level) + local neighbours = { + { x = 0, y = 0, z =-1 }, + { x = 0, y = 0, z = 1 }, + { x = 0, y =-1, z = 0 }, + { x = 0, y = 1, z = 0 }, + { x =-1, y = 0, z = 0 }, + { x = 1, y = 0, z = 0 }, + } + for i=1, #neighbours do + local offset = neighbours[i] + local position_new = vector.add( + position, + offset + ) + local light_level_new = minetest.get_node_light( + position_new, + nil + ) + if 15 == light_level_new then + -- found the sunlight + return true + elseif light_level_new > light_level then + -- search where light is brighter + if path_to_sunlight_exists( + position_new, + light_level_new + ) then + return true + end + end + end +end + +local sunlight_visible +if nil ~= minetest.get_natural_light then + -- Minetest 5.4.0+ can measure the daylight level at a position + sunlight_visible = function(position) + light_level = minetest.get_natural_light( + position, + nil + ) + if light_level >= 12 then + return true + end + end +else + -- Minetest 5.3.0 or less can only measure the light level + sunlight_visible = function(position) + local time = minetest.get_timeofday() * 24000 + -- only check light level during day + if time > 6000 and time < 18000 then + light_level = minetest.get_node_light( + position, + nil + ) + if light_level >= 12 then + return path_to_sunlight_exists( + position, + 12 + ) + end + end + end +end + local boxes = { -8/16, -8/16, -8/16, 8/16, -2/16, 8/16 } -- Daylight Sensor @@ -95,10 +161,7 @@ minetest.register_abm({ interval = 1, chance = 1, action = function(pos, node, active_object_count, active_object_count_wider) - local light = minetest.get_node_light(pos, nil) - local time = minetest.get_us_time() - - if light >= 14 and time > 6000 then + if sunlight_visible(pos) then minetest.set_node(pos, {name="mesecons_solarpanel:solar_panel_on", param2=node.param2}) mesecon.receptor_on(pos, mesecon.rules.pplate) end @@ -111,10 +174,7 @@ minetest.register_abm({ interval = 1, chance = 1, action = function(pos, node, active_object_count, active_object_count_wider) - local light = minetest.get_node_light(pos, nil) - local time = minetest.get_us_time() - - if light < 14 and time > 18000 then + if not sunlight_visible(pos) then minetest.set_node(pos, {name="mesecons_solarpanel:solar_panel_off", param2=node.param2}) mesecon.receptor_off(pos, mesecon.rules.pplate) end @@ -204,10 +264,7 @@ minetest.register_abm({ interval = 1, chance = 1, action = function(pos, node, active_object_count, active_object_count_wider) - local light = minetest.get_node_light(pos, nil) - local time = minetest.get_us_time() - - if light < 14 and time > 18000 then + if not sunlight_visible(pos) then minetest.set_node(pos, {name="mesecons_solarpanel:solar_panel_inverted_on", param2=node.param2}) mesecon.receptor_on(pos, mesecon.rules.pplate) end @@ -220,10 +277,7 @@ minetest.register_abm({ interval = 1, chance = 1, action = function(pos, node, active_object_count, active_object_count_wider) - local light = minetest.get_node_light(pos, nil) - local time = minetest.get_us_time() - - if light >= 14 and time > 6000 then + if sunlight_visible(pos) then minetest.set_node(pos, {name="mesecons_solarpanel:solar_panel_inverted_off", param2=node.param2}) mesecon.receptor_off(pos, mesecon.rules.pplate) end diff --git a/mods/ITEMS/mcl_anvils/init.lua b/mods/ITEMS/mcl_anvils/init.lua index d3b32b844..a56299cd9 100644 --- a/mods/ITEMS/mcl_anvils/init.lua +++ b/mods/ITEMS/mcl_anvils/init.lua @@ -84,6 +84,19 @@ local function distinguish_tool_and_material(input1, input2) end end +-- Helper function to make sure update_anvil_slots NEVER overstacks the output slot +local function fix_stack_size(stack) + if not stack or stack == "" then return "" end + local count = stack:get_count() + local max_count = stack:get_stack_max() + + if count > max_count then + stack:set_count(max_count) + count = max_count + end + return count +end + -- Update the inventory slots of an anvil node. -- meta: Metadata of anvil node local function update_anvil_slots(meta) @@ -213,6 +226,7 @@ local function update_anvil_slots(meta) -- Set the new output slot if new_output then + fix_stack_size(new_output) inv:set_stack("output", 1, new_output) end end diff --git a/mods/ITEMS/mcl_anvils/locale/mcl_anvils.zh_TW.tr b/mods/ITEMS/mcl_anvils/locale/mcl_anvils.zh_TW.tr new file mode 100644 index 000000000..8ddf546a9 --- /dev/null +++ b/mods/ITEMS/mcl_anvils/locale/mcl_anvils.zh_TW.tr @@ -0,0 +1,16 @@ +# textdomain: mcl_anvils +Set Name=命名 +Repair and Name=修復與命名 +Inventory=物品欄 +Anvil=鐵砧 +The anvil allows you to repair tools and armor, and to give names to items. It has a limited durability, however. Don't let it fall on your head, it could be quite painful!=鐵砧允許你修理工具和盔甲,並為物品命名。然而,它的耐久性有限。不要讓它落在你的頭上,這可能是相當痛苦的! +To use an anvil, rightclick it. An anvil has 2 input slots (on the left) and one output slot.=要使用一個鐵砧,右擊它。一個鐵砧有兩個輸入槽(在左邊)和一個輸出槽。 +To rename items, put an item stack in one of the item slots while keeping the other input slot empty. Type in a name, hit enter or “Set Name”, then take the renamed item from the output slot.=要重新命名物品,在其中一個物品槽裡放一個物品,同時保持另一個輸入槽為空。鍵入名稱,點擊回車或「設置名稱」,然後從輸出槽中取出重命名後的物品。 +There are two possibilities to repair tools (and armor):=有兩種維修工具(和裝甲)的可能性: +• Tool + Tool: Place two tools of the same type in the input slots. The “health” of the repaired tool is the sum of the “health” of both input tools, plus a 12% bonus.=• 工具+工具。在輸入槽中放置兩個相同類型的工具。修復後的工具的耐久力是兩個輸入工具的耐久力之和,加上12%的獎勵。 +• Tool + Material: Some tools can also be repaired by combining them with an item that it's made of. For example, iron pickaxes can be repaired with iron ingots. This repairs the tool by 25%.=• 工具+材料。有些工具也可以通過與它所製成的物品結合起來進行修理。例如,鐵鎬可以用鐵錠修復。這可以使工具的修復率提高25%。 +Armor counts as a tool. It is possible to repair and rename a tool in a single step.=盔甲算作是一種工具。可以在一個步驟中修復和重命名一個工具。 +The anvil has limited durability and 3 damage levels: undamaged, slightly damaged and very damaged. Each time you repair or rename something, there is a 12% chance the anvil gets damaged. Anvils also have a chance of being damaged when they fall by more than 1 block. If a very damaged anvil is damaged again, it is destroyed.=鐵砧的耐用性有限,有3個損壞等級:未損壞、微損的和耗損的。每次你修復或重命名某物時,有12%的機會使鐵砧受損。當鐵砧跌落超過1塊時,也有機會被損壞。如果一個耗損的鐵砧再次受損,它就會被摧毀。 +Slightly Damaged Anvil=微損的鐵砧 +Very Damaged Anvil=耗損的鐵砧 +Repair and rename items=修復與命名物品 diff --git a/mods/ITEMS/mcl_armor/API.md b/mods/ITEMS/mcl_armor/API.md new file mode 100644 index 000000000..06292aab4 --- /dev/null +++ b/mods/ITEMS/mcl_armor/API.md @@ -0,0 +1,288 @@ +# mcl_armor + +This mod implements the ability of registering armors. + +## Registering an Armor Set + +The `mcl_armor.register_set()` function aims to simplify the process of registering a full set of armor. + +This function register four pieces of armor (head, torso, leggings, feets) based on a definition table: + +```lua +mcl_armor.register_set({ + --name of the armor material (used for generating itemstrings) + name = "dummy_armor", + + --description of the armor material + --do NOT translate this string, it will be concatenated will each piece of armor's description and result will be automatically fetched from your mod's translation files + description = "Dummy Armor", + + --overide description of each armor piece + --do NOT localize this string + descriptions = { + head = "Cap", --default: "Helmet" + torso = "Tunic", --default: "Chestplate" + legs = "Pants", --default: "Leggings" + feet = "Shoes", --default: "Boots" + }, + + --this is used to calculate each armor piece durability with the minecraft algorithm + --head durability = durability * 0.6857 + 1 + --torso durability = durability * 1.0 + 1 + --legs durability = durability * 0.9375 + 1 + --feet durability = durability * 0.8125 + 1 + durability = 80, + + --this is used then you need to specify the durability of each piece of armor + --this field have the priority over the durability one + --if the durability of some pieces of armor isn't specified in this field, the durability field will be used insteed + durabilities = { + head = 200, + torso = 500, + legs = 400, + feet = 300, + }, + + --this define how good enchants you will get then enchanting one piece of the armor in an enchanting table + --if set to zero or nil, the armor will not be enchantable + enchantability = 15, + + --this define how much each piece of armor protect the player + --these points will be shown in the HUD (chestplate bar above the health bar) + points = { + head = 1, + torso = 3, + legs = 2, + feet = 1, + }, + + --this attribute reduce strong damage even more + --See https://minecraft.fandom.com/wiki/Armor#Armor_toughness for more explanations + --default: 0 + toughness = 2, + + --this field is used to specify some items groups that will be added to each piece of armor + --please note that some groups do NOT need to be added by hand, because they are already handeled by the register function: + --(armor, combat_armor, armor_, combat_armor_, mcl_armor_points, mcl_armor_toughness, mcl_armor_uses, enchantability) + groups = {op_armor = 1}, + + --specify textures that will be overlayed on the entity wearing the armor + --these fields have default values and its recommanded to keep the code clean by just using the default name for your textures + textures = { + head = "dummy_texture.png", --default: "_helmet_.png" + torso = "dummy_texture.png", --default: "_chestplate_.png" + legs = "dummy_texture.png", --default: "_leggings_.png" + feet = "dummy_texture.png", --default: "_boots_.png" + }, + --you can also define these fields as functions, that will be called each time the API function mcl_armor.update(obj) is called (every time you equip/unequip some armor piece, take damage, and more) + --note that the enchanting overlay will not appear unless you implement it in the function + --this allow to make armors where the textures change whitout needing to register many other armors with different textures + textures = { + head = function(obj, itemstack) + if mcl_enchanting.is_enchanted(itemstack) then + return "dummy_texture.png^"..mcl_enchanting.overlay + else + return "dummy_texture.png" + end + end, + }, + + --inventory textures aren't definable using a table similar to textures or previews + --you are forced to use the default texture names which are: + --head: "_inv_helmet_.png + --torso: "_inv_chestplate_.png + --legs: "_inv_leggings_.png + --feet: "_inv_boots_.png + + --this callback table allow you to define functions that will be called each time an entity equip an armor piece or the mcl_armor.on_equip() function is called + --the functions accept two arguments: obj and itemstack + on_equip_callbacks = { + head = function(obj, itemstack) + --do stuff + end, + }, + + --this callback table allow you to define functions that will be called each time an entity unequip an armor piece or the mcl_armor.on_unequip() function is called + --the functions accept two arguments: obj and itemstack + on_unequip_callbacks = { + head = function(obj, itemstack) + --do stuff + end, + }, + + --this callback table allow you to define functions that will be called then an armor piece break + --the functions accept one arguments: obj + --the itemstack isn't sended due to how minetest handle items which have a zero durability + on_break_callbacks = { + head = function(obj) + --do stuff + end, + }, + + --this is used to generate automaticaly armor crafts based on each element type folowing the regular minecraft pattern + --if set to nil no craft will be added + craft_material = "mcl_mobitems:leather", + + --this is used to generate cooking crafts for each piece of armor + --if set to nil no craft will be added + cook_material = "mcl_core:gold_nugget", --cooking any piece of this armor will output a gold nugged + + --this is used for allowing each piece of the armor to be repaired by using an anvil with repair_material as aditionnal material + --it basicaly set the _repair_material item field of each piece of the armor + --if set to nil no repair material will be added + repair_material = "mcl_core:iron_ingot", +}) +``` + +## Creating an Armor Piece + +If you don't want to register a full set of armor, then you will need to manually register your own single item. + +```lua +minetest.register_tool("dummy_mod:random_armor", { + description = S("Random Armor"), + + --these two item fields are used for ingame documentation + --the mcl_armor.longdesc and mcl_armor.usage vars contains the basic usage and purpose of a piece of armor + --these vars may not be enough for that you want to do, so you may add some extra informations like that: + --_doc_items_longdesc = mcl_armor.longdesc.." "..S("Some extra informations.") + _doc_items_longdesc = mcl_armor.longdesc, + _doc_items_usagehelp = mcl_armor.usage, + + --this field is similar to any item definition in minetest + --it just set the image shown then the armor is dropped as an item or inside an inventory + inventory_image = "mcl_armor_inv_elytra.png", + + --this field is used by minetest internally and also by some helper functions + --in order for the tool to be shown is the right creative inventory tab, the right groups should be added + --"mcl_armor_uses" is required to give your armor a durability + --in that case, the armor can be worn by 10 points before breaking + --if you want the armor to be enchantable, you should also add the "enchantability" group, with the highest number the better enchants you can apply + groups = {armor = 1, non_combat_armor = 1, armor_torso = 1, non_combat_torso = 1, mcl_armor_uses = 10}, + + --this table is used by minetest for seraching item specific sounds + --the _mcl_armor_equip and _mcl_armor_unequip are used by the armor implementation to play sounds on equip and unequip + --note that you don't need to provide any file extention + sounds = { + _mcl_armor_equip = "mcl_armor_equip_leather", + _mcl_armor_unequip = "mcl_armor_unequip_leather", + }, + + --these fields should be initialised like that in most cases + --mcl_armor.equip_on_use is a function that try to equip the piece of armor you have in hand inside the right armor slot if the slot is empty + on_place = mcl_armor.equip_on_use, + on_secondary_use = mcl_armor.equip_on_use, + + --this field define that the tool is ACTUALLY an armor piece and in which armor slot you can put it + --it should be set to "head", "torso", "legs" or "feet" + _mcl_armor_element = "torso", + + + --this field is used to provide the texture that will be overlayed on the object (player or mob) skin + --this field can be a texture name or a function that will be called each time the mcl_armor.update(obj) function is called + --see the mcl_armor.register_set() documentation for more explanations + _mcl_armor_texture = "mcl_armor_elytra.png" + + --callbacks + --see the mcl_armor.register_set() documentation for more explanations + + _on_equip = function(obj, itemstack) + end, + _on_unequip = function(obj, itemstack) + end, + _on_break = function(obj) + end, +}) +``` + +## Interacting with Armor of an Entity + +Mods may want to interact with armor of an entity. + +Most global functions not described here may not be stable or may be for internal use only. + +You can equip a piece of armor on an entity inside a mod by using `mcl_armor.equip()`. + +```lua +--itemstack: an itemstack containing the armor piece to equip +--obj: the entity you want to equip the armor on +--swap: boolean, force equiping the armor piece, even if the entity already have one of the same type +mcl_armor.equip(itemstack, obj, swap) +``` + +You can update the entity apparence by using `mcl_armor.update()`. + +This function put the armor overlay on the object's base texture. +If the object is player it will update his displayed armor points count in HUD. + +This function will work both on players and mobs. + +```lua +--obj: the entity you want the apparence to be updated +mcl_armor.update(obj) +``` + +## Handling Enchantments + +Armors can be enchanted in most cases. + +The enchanting part of MineClone2 is separated from the armor part, but closely linked. + +Existing armor enchantments in Minecraft improve most of the time how the armor protect the entity from damage. + +The `mcl_armor.register_protection_enchantment()` function aims to simplificate the creation of such enchants. + +```lua +mcl_armor.register_protection_enchantment({ + --this field is the id that will be used for registering enchanted book and store the enchant inside armor metadata. + --(his internal name) + id = "magic_protection", + + --visible name of the enchant + --this field is used as the name of registered enchanted book and inside armor tooltip + --translation should be added + name = S("Magic Protection"), + + --this field is used to know that the enchant currently do + --translation should be added + description = S("Reduces magic damage."), + + --how many levels can the enchant have + --ex: 4 => I, II, III, IV + --default: 4 + max_level = 4, + + --which enchants this enchant will not be compatible with + --each of these values is a enchant id + incompatible = {blast_protection = true, fire_protection = true, projectile_protection = true}, + + --how much will the enchant consume from the enchantability group of the armor item + --default: 5 + weight = 5, + + --false => the enchant can be obtained in an enchanting table + --true => the enchant isn't obtainable in the enchanting table + --is true, you will probably need to implement some ways to obtain it + --even it the field is named "treasure", it will be no way to find it + --default: false + treasure = false, + + --how much will damage be reduced + --see Minecraft Wiki for more informations + --https://minecraft.gamepedia.com/Armor#Damage_protection + --https://minecraft.gamepedia.com/Armor#Enchantments + factor = 1, + + --restrict damage to one type + --allow the enchant to only protect of one type of damage + damage_type = "magic", + + --restrict damage to one category + --allow to protect from many type of damage at once + --this is much less specific than damage_type and also much more customisable + --the "is_magic" flag is used in the "magic", "dragon_breath", "wither_skull" and "thorns" damage types + --you can checkout the mcl_damage source code for a list of availlable damage types and associated flags + --but be warned that mods can register additionnal damage types + damage_flag = "is_magic", +}) +``` diff --git a/mods/ITEMS/mcl_armor/api.lua b/mods/ITEMS/mcl_armor/api.lua index 8e295827c..4b4906574 100644 --- a/mods/ITEMS/mcl_armor/api.lua +++ b/mods/ITEMS/mcl_armor/api.lua @@ -94,7 +94,6 @@ function mcl_armor.register_set(def) local on_unequip_callbacks = def.on_unequip_callbacks or {} local on_break_callbacks = def.on_break_callbacks or {} local textures = def.textures or {} - local previews = def.previews or {} local durabilities = def.durabilities or {} local element_groups = def.element_groups or {} @@ -115,6 +114,10 @@ function mcl_armor.register_set(def) for k, v in pairs(element_groups) do groups[k] = v end + local upgrade_item = nil + if def._mcl_upgradable and def._mcl_upgrade_item_material then + upgrade_item = itemstring:gsub("_[%l%d]*$",def._mcl_upgrade_item_material) + end minetest.register_tool(itemstring, { description = S(def.description .. " " .. (descriptions[name] or element.description)), @@ -135,7 +138,8 @@ function mcl_armor.register_set(def) _mcl_armor_element = name, _mcl_armor_texture = textures[name] or modname .. "_" .. itemname .. ".png", _mcl_armor_preview = previews[name] or modname .. "_" .. itemname .. "_preview.png", - _mcl_upgradable = def.upgradable, + _mcl_upgradable = def._mcl_upgradable, + _mcl_upgrade_item = upgrade_item }) if def.craft_material then @@ -222,17 +226,6 @@ function mcl_armor.update(obj) end end - local preview = def._mcl_armor_preview - - if obj:is_player() and preview then - if type(preview) == "function" then - preview = preview(obj, itemstack) - end - if preview then - info.preview = "(player.png^[opacity:0^" .. def._mcl_armor_preview .. ")" .. (info.preview and "^" .. info.preview or "" ) - end - end - info.points = info.points + minetest.get_item_group(itemname, "mcl_armor_points") local mob_range_mob = def._mcl_armor_mob_range_mob @@ -255,8 +248,6 @@ function mcl_armor.update(obj) info.texture = info.texture or "blank.png" if obj:is_player() then - info.preview = info.preview or "blank.png" - mcl_armor.update_player(obj, info) else local luaentity = obj:get_luaentity() diff --git a/mods/ITEMS/mcl_armor/locale/mcl_armor.zh_TW.tr b/mods/ITEMS/mcl_armor/locale/mcl_armor.zh_TW.tr new file mode 100644 index 000000000..1dca10757 --- /dev/null +++ b/mods/ITEMS/mcl_armor/locale/mcl_armor.zh_TW.tr @@ -0,0 +1,23 @@ +# textdomain: mcl_armor +This is a piece of equippable armor which reduces the amount of damage you receive.=這是一件可裝備的盔甲,可以減少你受到的傷害。 +To equip it, put it on the corresponding armor slot in your inventory menu.=要裝備它,就把它放在你的物品欄中相應的盔甲插槽上。 +Leather Cap=皮革帽子 +Iron Helmet=鐵製頭盔 +Golden Helmet=黃金頭盔 +Diamond Helmet=鑽石頭盔 +Chain Helmet=鎖鏈頭盔 +Leather Tunic=皮革上衣 +Iron Chestplate=鐵製胸甲 +Golden Chestplate=黃金胸甲 +Diamond Chestplate=鑽石胸甲 +Chain Chestplate=鎖鏈胸甲 +Leather Pants=皮革褲子 +Iron Leggings=鐵製護腿 +Golden Leggings=黃金護腿 +Diamond Leggings=鑽石護腿 +Chain Leggings=鎖鏈護腿 +Leather Boots=皮革靴子 +Iron Boots=鐵製靴子 +Golden Boots=黃金靴子 +Diamond Boots=鑽石靴子 +Chain Boots=鎖鏈靴子 diff --git a/mods/ITEMS/mcl_armor/player.lua b/mods/ITEMS/mcl_armor/player.lua index 48fdb381f..99e23efdd 100644 --- a/mods/ITEMS/mcl_armor/player.lua +++ b/mods/ITEMS/mcl_armor/player.lua @@ -63,7 +63,7 @@ mcl_player.player_register_model("mcl_armor_character_female.b3d", { }) function mcl_armor.update_player(player, info) - mcl_player.player_set_armor(player, info.texture, info.preview) + mcl_player.player_set_armor(player, info.texture) local meta = player:get_meta() meta:set_int("mcl_armor:armor_points", info.points) diff --git a/mods/ITEMS/mcl_armor/register.lua b/mods/ITEMS/mcl_armor/register.lua index 4e5c20ee6..6323383db 100644 --- a/mods/ITEMS/mcl_armor/register.lua +++ b/mods/ITEMS/mcl_armor/register.lua @@ -49,6 +49,8 @@ mcl_armor.register_set({ }, repair_material = "mcl_core:iron_ingot", cook_material = "mcl_core:iron_nugget", + sound_equip = "mcl_armor_equip_iron", + sound_unequip = "mcl_armor_unequip_iron", }) mcl_armor.register_set({ @@ -64,6 +66,8 @@ mcl_armor.register_set({ }, craft_material = "mcl_core:iron_ingot", cook_material = "mcl_core:iron_nugget", + sound_equip = "mcl_armor_equip_iron", + sound_unequip = "mcl_armor_unequip_iron", }) mcl_armor.register_set({ @@ -79,22 +83,28 @@ mcl_armor.register_set({ }, toughness = 2, craft_material = "mcl_core:diamond", - upgradable = true, + sound_equip = "mcl_armor_equip_diamond", + sound_unequip = "mcl_armor_unequip_diamond", + _mcl_upgradable = true, + _mcl_upgrade_item_material = "_netherite", }) mcl_armor.register_set({ name = "netherite", description = "Netherite", - durability = 592, - enchantability = 15, + durability = 555, + enchantability = 10, points = { head = 3, torso = 8, legs = 6, feet = 3, }, - toughness = 3, repair_material = "mcl_nether:netherite_ingot", + toughness = 2, + craft_material = "mcl_nether:netherite_ingot", + sound_equip = "mcl_armor_equip_diamond", + sound_unequip = "mcl_armor_unequip_diamond", }) mcl_armor.register_protection_enchantment({ diff --git a/mods/ITEMS/mcl_armor/textures/mcl_armor_boots_chain_preview.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_boots_chain_preview.png deleted file mode 100644 index bf028c2724094d9a9bbce2c2fdba51ac58ba1aa3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!VDx|E`RzTNT~$)gt!7}RW%(aS5F;1V+$+$ zmb&uEeI4u9EDeu}wY9Yk3G~lSj{9>hE)1xSu_VYZn8D%MjWi%f&C|s(q=GS7Vxq$d zmlG^!IJCX>nT=I^R1}o@92nBhMD45+XJ%$7VqmMgTe~DWM4f8GI^p diff --git a/mods/ITEMS/mcl_armor/textures/mcl_armor_boots_diamond_preview.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_boots_diamond_preview.png deleted file mode 100644 index 768d7bcdec0545c89d30f4d7421c7b32fd6be2c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!VDx|E`RzTNXZ5Ggt!7}TU%RCPfr~ko#5#Q z&e?};C0vgKo5t-V%0^WXFT+qR~ZJ)(>QqmXnP!|)(NNczkwPVJYD@<);T3K0RUFT BFckm* diff --git a/mods/ITEMS/mcl_armor/textures/mcl_armor_boots_gold_preview.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_boots_gold_preview.png deleted file mode 100644 index f384a602c498dd728595a537e78282be558b5fc5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!VDx|E`RzTNC^e_gt!9fB^63nmYcphn6#@$ zYg&p*-n}i~fuf8hL4Lsu4$p3+0XasVE{-7;jL8y=4S@}T3}*sFL`2w(eOOrM9^?@f tbXPYxe9_aDbP0l+XkK(4r=$ diff --git a/mods/ITEMS/mcl_armor/textures/mcl_armor_boots_leather_preview.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_boots_leather_preview.png deleted file mode 100644 index d0457ce9a7d955896fd0f8d0139c8f0a5b39e674..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!VDx|E`RzTNC^e_gt#W>=k&JZm1Kk^1i7@; zX3d&XuTXwG5h%-8666=m;PC858jvIJ>Eakt!I&&@(;>h!fb)z28||b{UMcMcRLbD#>gTe~DWM4fx;`Vu diff --git a/mods/ITEMS/mcl_armor/textures/mcl_armor_chestplate_chain_preview.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_chestplate_chain_preview.png deleted file mode 100644 index af9c982fe54dd7307e125c4adfbfac6db0443727..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3-pI!a4o{DVqSF5LX~Qxv%5o@q?;rI+2p{ zPOhFhdd3!3_Uji+Sifdzc5+;Vj= z^)r?P`2{mLJiCzw

_kIEGX(-aT`bky(MqH84i$#lPL(0`D&<+JAyEX`kBbnh%CY zr+Al%1!VIbOrP)lajTrdc^M~7rI~yIr_QWe+xf$TVNV*X!w3Eedj);=YR~_?l_~I9 zf}E(x1>s|Jvd>%IOL${?Z$Ssg{`U>bc@22WQ%mvv4FO#tnw BVJZLs diff --git a/mods/ITEMS/mcl_armor/textures/mcl_armor_chestplate_diamond_preview.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_chestplate_diamond_preview.png deleted file mode 100644 index d43b3cedec607d213131735e032d8f939a1f2eef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!VDx|E`RzTNXZ5Ggt!7}TU%RCPtO&P{=fbH zUq?r${M_&ObvJ^iA9SsqcOvAgHc$m)NswPKgTu2MX+Tbrr;B4q1!M98xrC4)AqL}? zSRbCoDH_hZ3X3eA6`Wh0(hG0$EGui{W4zdR&fyqe+f2q&=k(mx7)!b^t6aJy70KLq zO8N5TbuejKib}Sht-qOeTinbR?vqkLMT{jue!&b5&u*jvIpLlzjv*C{$qVEJSQG^W zgvvr#F0RSya`a?$U|SrJG-DA%hoV%R6i3nqtyQd?tPK*4iy9XxuvM>|6;Q!A;h>?d w$(BuwOXkl!dXO`JMRcqSU@h_q|yB_#x;FVJRSNO&l;szcFl0?;M~Pgg&e IbxsLQ0O!F)0RR91 diff --git a/mods/ITEMS/mcl_armor/textures/mcl_armor_chestplate_leather_preview.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_chestplate_leather_preview.png deleted file mode 100644 index 9d5a5a097e73aeeefc06feeb97a2694c873fcc3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!VDx|E`RzTNC^e_gt!9fw%V*&Q|e1H!j>)R z-?n|p@@m6gpeSQWkY6x^!?PP{K#q~8i(^OyWAXwy0U@&x7Gsw=Au@_R0^#l diff --git a/mods/ITEMS/mcl_armor/textures/mcl_armor_helmet_chain_preview.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_helmet_chain_preview.png deleted file mode 100644 index c76cd9d61b8ac128b633c531a2331afb4210f87f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!VDx|E`RzTNQnmcgt!9f?BuwXy7KjFmYzI* zaB^SA(N-&lL`2{mLJiCzwH1W!N6lgserXL2J@k3dO~UogXeIACOA z`p;zRaa0{BXYc9a7*fHQoRA=3#2J>t(D>w2k+FgD9;H1(X9^M`4=|?rBqTH#$Vf<7 u9PBy4)~D&v^?OYW!|TKL(h_Z&3=9oST)#Ima|Zy8V(@hJb6Mw<&;$V7qDCtK diff --git a/mods/ITEMS/mcl_armor/textures/mcl_armor_helmet_gold_preview.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_helmet_gold_preview.png deleted file mode 100644 index 4201916caa17a5d9d514feb328865cec352aff37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!VDx|E`RzTNT~$)gt!9fT|HXUQdE{yD7D4S z^tH*jvfT95!6cqM2EIB5o&pA*T!y*H3+sXEcuIo&f*Jlp03#C<(}wy32|#gMPZ!6K z3dZDw1OX$?uoMQy)Qb+v28Rvy`Usp6NDxn8Ha>EL=afPa=bO$1w#^K)874fMag-rs f)8@v+8B7cbMr_l|*Gc674Px+g^>bP0l+XkKt&==k diff --git a/mods/ITEMS/mcl_armor/textures/mcl_armor_helmet_iron_preview.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_helmet_iron_preview.png deleted file mode 100644 index 00584e8de1f73ca3749fd2553d24d7adbef73e81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!VDx|E`RzTNJ#|vgt!9f?Buw~eI4u9EIoPr zU`t(jNTC1ICl9K`FN*=?7)yfuf*Bm1-ADs+EIeHtLn;`P6A}cB47pf>9NIQ+)S98V zVvQP08pj5117`^xMxBH@{8E&Bif diff --git a/mods/ITEMS/mcl_armor/textures/mcl_armor_helmet_leather_preview.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_helmet_leather_preview.png deleted file mode 100644 index 9f27bacb5416e3004514f22e4a820b7b9e82b0c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!VDx|E`RzTNC^e_gt!9fgdmrajIg%atXWg) zmo4dEQ@&ptD9Tt8KgoNzh8a;AW}pCk>8DmX3X=fr=SCUHx3vIVCg!0PY_m8~^|S diff --git a/mods/ITEMS/mcl_armor/textures/mcl_armor_leggings_diamond_preview.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_leggings_diamond_preview.png deleted file mode 100644 index cbc9e032c4c76ec69e16c6f131284552e3ca4033..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3Qazq7jv*C{$qTF|OiW6gGC47k z>5`8Zmq3(PQ>$l0N2jODjF}S?k2C}taJe=1^_{Daj*d29+j#LO3opmKx)1e#c1b7j zBrX2PDa{ZZQ}^zBy-v;{wgV<>D!#}s<2=IFDVWZ%i_L_YQ~E)aHUAREmc&Gc=gm(t s3f9N5gDC+cTS| zJvzT?UT5X59<3|OOoaj3q&S!3+-1ZlnP@cAhSdAr*|t5=R_7E(S=PDJTsrWHP=J z6ytn==ex*vffZ7Ut_I3FuBIGkIQ#?sn>6?ey&JRIjd)rc*(R|uBztn6`la(>8qg#L MPgg&ebxsLQ02o3v!T5`8Zmq3(PQ>$l0N2jODjF}TNn%xd+NU$zmprZW7-p*$VWA4_-1fHbDA33ENf-JJV zY$cj+WYkzmFa+($@w5kW0_mdKI;Vst0FLlCT>t<8 diff --git a/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.zh_TW.tr b/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.zh_TW.tr new file mode 100644 index 000000000..d5d107e55 --- /dev/null +++ b/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.zh_TW.tr @@ -0,0 +1,5 @@ +# textdomain: mcl_armor_stand +Armor Stand=盔甲座 +An armor stand is a decorative object which can display different pieces of armor. Anything which players can wear as armor can also be put on an armor stand.=盔甲架是一種裝飾實體,可以展示不同的盔甲。玩家可以作為盔甲穿戴的任何東西也都可以放在盔甲架上。 +Just place an armor item on the armor stand. To take the top piece of armor from the armor stand, select your hand and use the place key on the armor stand.=只需将一件盔甲放在盔甲架上。要从盔甲架上取下最上面的一件盔甲,选择你的手并在盔甲架上使用放置键。 +Displays pieces of armor=展示盔甲 diff --git a/mods/ITEMS/mcl_barrels/init.lua b/mods/ITEMS/mcl_barrels/init.lua new file mode 100644 index 000000000..09b16eee3 --- /dev/null +++ b/mods/ITEMS/mcl_barrels/init.lua @@ -0,0 +1,204 @@ +local S = minetest.get_translator("mcl_barrels") +local F = minetest.formspec_escape +local C = minetest.colorize + +--TODO: fix barrel rotation placement + +local open_barrels = {} + +local drop_content = mcl_util.drop_items_from_meta_container("main") + +local function on_blast(pos) + local node = minetest.get_node(pos) + drop_content(pos, node) + minetest.remove_node(pos) +end + +-- Simple protection checking functions +local function protection_check_move(pos, from_list, from_index, to_list, to_index, count, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + else + return count + end +end + +local function protection_check_put_take(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + else + return stack:get_count() + end +end + +local function barrel_open(pos, node, clicker) + local name = minetest.get_meta(pos):get_string("name") + + if name == "" then + name = S("Barrel") + end + + local playername = clicker:get_player_name() + + minetest.show_formspec(playername, + "mcl_barrels:barrel_"..pos.x.."_"..pos.y.."_"..pos.z, + table.concat({ + "size[9,8.75]", + "label[0,0;"..F(C("#313131", name)).."]", + "list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,0.5;9,3;]", + mcl_formspec.get_itemslot_bg(0, 0.5, 9, 3), + "label[0,4.0;"..F(C("#313131", S("Inventory"))).."]", + "list[current_player;main;0,4.5;9,3;9]", + mcl_formspec.get_itemslot_bg(0, 4.5, 9, 3), + "list[current_player;main;0,7.74;9,1;]", + mcl_formspec.get_itemslot_bg(0, 7.74, 9, 1), + "listring[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main]", + "listring[current_player;main]", + }) + ) + + minetest.swap_node(pos, { name = "mcl_barrels:barrel_open", param2 = node.param2 }) + open_barrels[playername] = pos +end + +local function close_forms(pos) + local players = minetest.get_connected_players() + local formname = "mcl_barrels:barrel_"..pos.x.."_"..pos.y.."_"..pos.z + for p = 1, #players do + if vector.distance(players[p]:get_pos(), pos) <= 30 then + minetest.close_formspec(players[p]:get_player_name(), formname) + end + end +end + +local function update_after_close(pos) + local node = minetest.get_node_or_nil(pos) + if not node then return end + if node.name == "mcl_barrels:barrel_open" then + minetest.swap_node(pos, {name = "mcl_barrels:barrel_closed", param2 = node.param2}) + end +end + +local function close_barrel(player) + local name = player:get_player_name() + local open = open_barrels[name] + if open == nil then + return + end + + update_after_close(open) + + open_barrels[name] = nil +end + +minetest.register_node("mcl_barrels:barrel_closed", { + description = S("Barrel"), + _tt_help = S("27 inventory slots"), + _doc_items_longdesc = S("Barrels are containers which provide 27 inventory slots."), + _doc_items_usagehelp = S("To access its inventory, rightclick it. When broken, the items will drop out."), + tiles = {"mcl_barrels_barrel_top.png^[transformR270", "mcl_barrels_barrel_bottom.png", "mcl_barrels_barrel_side.png"}, + paramtype = "light", + paramtype2 = "facedir", + on_place = function(itemstack, placer, pointed_thing) + minetest.rotate_and_place(itemstack, placer, pointed_thing, minetest.is_creative_enabled(placer:get_player_name()), {}, false) + return itemstack + end, + stack_max = 64, + sounds = mcl_sounds.node_sound_wood_defaults(), + groups = {handy = 1, axey = 1, container = 2, material_wood = 1, flammable = -1, deco_block = 1}, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("main", 9*3) + end, + after_place_node = function(pos, placer, itemstack, pointed_thing) + minetest.get_meta(pos):set_string("name", itemstack:get_meta():get_string("name")) + end, + allow_metadata_inventory_move = protection_check_move, + allow_metadata_inventory_take = protection_check_put_take, + allow_metadata_inventory_put = protection_check_put_take, + on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + minetest.log("action", player:get_player_name().. + " moves stuff in barrel at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_put = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " moves stuff to barrel at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_take = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " takes stuff from barrel at "..minetest.pos_to_string(pos)) + end, + after_dig_node = drop_content, + on_blast = on_blast, + on_rightclick = barrel_open, + on_destruct = close_forms, + _mcl_blast_resistance = 2.5, + _mcl_hardness = 2.5, +}) + +minetest.register_node("mcl_barrels:barrel_open", { + description = S("Barrel Open"), + _tt_help = S("27 inventory slots"), + _doc_items_longdesc = S("Barrels are containers which provide 27 inventory slots."), + _doc_items_usagehelp = S("To access its inventory, rightclick it. When broken, the items will drop out."), + _doc_items_create_entry = false, + tiles = {"mcl_barrels_barrel_top_open.png", "mcl_barrels_barrel_bottom.png", "mcl_barrels_barrel_side.png"}, + paramtype = "light", + paramtype2 = "facedir", + drop = "mcl_barrels:barrel_closed", + stack_max = 64, + sounds = mcl_sounds.node_sound_wood_defaults(), + groups = {handy = 1, axey = 1, container = 2, material_wood = 1, flammable = -1, deco_block = 1, not_in_creative_inventory = 1}, + allow_metadata_inventory_move = protection_check_move, + allow_metadata_inventory_take = protection_check_put_take, + allow_metadata_inventory_put = protection_check_put_take, + on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + minetest.log("action", player:get_player_name().. + " moves stuff in barrel at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_put = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " moves stuff to barrel at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_take = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " takes stuff from barrel at "..minetest.pos_to_string(pos)) + end, + after_dig_node = drop_content, + on_blast = on_blast, + on_rightclick = barrel_open, + on_destruct = close_forms, + _mcl_blast_resistance = 2.5, + _mcl_hardness = 2.5, +}) + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname:find("mcl_barrels:") == 1 and fields.quit then + close_barrel(player) + end +end) + +minetest.register_on_leaveplayer(function(player) + close_barrel(player) +end) + +--Minecraft Java Edition craft +minetest.register_craft({ + output = "mcl_barrels:barrel_closed", + recipe = { + {"group:wood", "group:wood_slab", "group:wood"}, + {"group:wood", "", "group:wood"}, + {"group:wood", "group:wood_slab", "group:wood"}, + } +}) + +minetest.register_craft({ + type = "fuel", + recipe = "mcl_barrels:barrel_closed", + burntime = 15, +}) diff --git a/mods/ITEMS/mcl_barrels/locale/mcl_barrels.de.tr b/mods/ITEMS/mcl_barrels/locale/mcl_barrels.de.tr new file mode 100644 index 000000000..e1fa1b603 --- /dev/null +++ b/mods/ITEMS/mcl_barrels/locale/mcl_barrels.de.tr @@ -0,0 +1,5 @@ +# textdomain: mcl_barrels +Barrel= +Barrels are containers which provide 27 inventory slots.= +To access its inventory, rightclick it. When broken, the items will drop out.= +27 inventory slots= \ No newline at end of file diff --git a/mods/ITEMS/mcl_barrels/locale/mcl_barrels.es.tr b/mods/ITEMS/mcl_barrels/locale/mcl_barrels.es.tr new file mode 100644 index 000000000..e1fa1b603 --- /dev/null +++ b/mods/ITEMS/mcl_barrels/locale/mcl_barrels.es.tr @@ -0,0 +1,5 @@ +# textdomain: mcl_barrels +Barrel= +Barrels are containers which provide 27 inventory slots.= +To access its inventory, rightclick it. When broken, the items will drop out.= +27 inventory slots= \ No newline at end of file diff --git a/mods/ITEMS/mcl_barrels/locale/mcl_barrels.fr.tr b/mods/ITEMS/mcl_barrels/locale/mcl_barrels.fr.tr new file mode 100644 index 000000000..0e93d1ee5 --- /dev/null +++ b/mods/ITEMS/mcl_barrels/locale/mcl_barrels.fr.tr @@ -0,0 +1,5 @@ +# textdomain: mcl_barrels +Barrel=Tonneau +Barrels are containers which provide 27 inventory slots.=Les tonneaux sont des conteneurs qui offrent 27 emplacements d'inventaire. +To access its inventory, rightclick it. When broken, the items will drop out.=Pour accéder à son inventaire, faites un clic droit dessus. Une fois cassés, les articles tomberont. +27 inventory slots=27 emplacements d'inventaire \ No newline at end of file diff --git a/mods/ITEMS/mcl_barrels/locale/mcl_barrels.pl.tr b/mods/ITEMS/mcl_barrels/locale/mcl_barrels.pl.tr new file mode 100644 index 000000000..e1fa1b603 --- /dev/null +++ b/mods/ITEMS/mcl_barrels/locale/mcl_barrels.pl.tr @@ -0,0 +1,5 @@ +# textdomain: mcl_barrels +Barrel= +Barrels are containers which provide 27 inventory slots.= +To access its inventory, rightclick it. When broken, the items will drop out.= +27 inventory slots= \ No newline at end of file diff --git a/mods/ITEMS/mcl_barrels/locale/mcl_barrels.ru.tr b/mods/ITEMS/mcl_barrels/locale/mcl_barrels.ru.tr new file mode 100644 index 000000000..e1fa1b603 --- /dev/null +++ b/mods/ITEMS/mcl_barrels/locale/mcl_barrels.ru.tr @@ -0,0 +1,5 @@ +# textdomain: mcl_barrels +Barrel= +Barrels are containers which provide 27 inventory slots.= +To access its inventory, rightclick it. When broken, the items will drop out.= +27 inventory slots= \ No newline at end of file diff --git a/mods/ITEMS/mcl_barrels/locale/template.txt b/mods/ITEMS/mcl_barrels/locale/template.txt new file mode 100644 index 000000000..e1fa1b603 --- /dev/null +++ b/mods/ITEMS/mcl_barrels/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: mcl_barrels +Barrel= +Barrels are containers which provide 27 inventory slots.= +To access its inventory, rightclick it. When broken, the items will drop out.= +27 inventory slots= \ No newline at end of file diff --git a/mods/ITEMS/mcl_barrels/mod.conf b/mods/ITEMS/mcl_barrels/mod.conf new file mode 100644 index 000000000..2b0088b79 --- /dev/null +++ b/mods/ITEMS/mcl_barrels/mod.conf @@ -0,0 +1,3 @@ +name = mcl_barrels +depends = mcl_util, mcl_formspec, mcl_sounds +author = AFCMS \ No newline at end of file diff --git a/mods/ITEMS/mcl_barrels/textures/mcl_barrels_barrel_bottom.png b/mods/ITEMS/mcl_barrels/textures/mcl_barrels_barrel_bottom.png new file mode 100755 index 0000000000000000000000000000000000000000..9c5788061835706c6f4045a97ef519f3741ad999 GIT binary patch literal 542 zcmV+(0^$9MP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qRNAp5A0000XbVXQnLvm$dbZKvHAXI5>WdJfTF*7U;qFCU`a$lR5(v{l0Q$wFc8Jb#f@E&G&D_G3azNRFd#9o zFfg#NG4cIB07wX^}$@QE?LY4_>tYMrO< zbeKWYe)8t)=;{6jQPX@K?a;OxthGt-19h%PE=hWV8bYS?YQVv4Qs6+Bvl2QU4XTqA z0WvDfy6(~ticOu>WH?xkl%lgH#-TBxQKBIra|!-tyH!fl>HuVFg|W1j9w>;!YMnp< zVxd1Jnj=iFprG!nk65&UkmEn7tQ(p;Ce$~-HyH3|!EWexU*l0hbA$^3S~iSFa5prs z26*ATspgWm@B{~|5Xe|&LPvdpVoL>ALx_1R9#yk}%F8L|@@xtx!k gHG^YoB=$}F1C39vlPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2jUA5 z5Ge)$lJ5xs00DDJL_t(I%gvKZZxb;Tg}+W`JRad8G^0qV3SvV+ND(aA^#A_=wyOmKD+t)@o}OgsuFa@qbkAe>Yh*UW-MFH{Gw)~ z4XeA3iITXmr>QGCUsG43SQamx85eD|;a{=TK3gmnj{sHG zGfOD}P)d!9x()zqEda*!4f1%2XC!OemSdzj5&5M$=W6zvwKg<$h2K4(t>gXd4a-(@ zecABi_nK{I`Sy9vuhkt*U9r}N?e=f4f!{q)%MvBalMdQ?<`?x~ALnJyi4FiC!n68$ zPA$bjn}TJldp!=hBZ3sx?glb#Jue}1&LfJ9GCw~FrlUvF6N0i7!@F*@!G%3i7Q^W2 z$S&*=#dzrdU=OCnp2_6Zu;=lUeED$2MjNJw-T(gcmg~1ud$n#N$ pREwy?iHOIDzH}$bQVez~Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2jUA5 z5Go^KyJ(F700Fj1L_t(I%Y~E8Zqq;%g})|a&sgyg<4_7xMJ2YZV8fCPFTl(4AQ3y* zpte%l$ZnExH9t;M7LMIGb;a3?d}cgz&$;KGeE<6CQ7cKV6G~%=qY;I%T%2Z<#&*1M z9<3xTa-HyZx#HxxAX1>WEw?0B99=KN%N#+^@@9 zoU57X1W_6bfD~iGcFW?<@b0z7xIk$vVY}@vTI^RT#-Je7J476f@IDY{DY;I1FAr7G zK6qPfnhJ_NadlH-++V;xuEvzUTZb@0BalF|iN;9WT>yvzaQ^m1|6_ zoM$?nbmjk?Ujp#?Lq@7(PsX7fzkMLr2_jXJ>*a>UonZlF*(+A74V4X4Hgv|d)x^=L zlT#Y|)P-0Ga-EPmPx|(ZmryxRsCSL=(FkFj$NRw5P04Z<|2II-Oq}V2_4=NV=WlqQ zHT@sbecaCZpXQL70(Y)*K0-AbW|YuPggwCIK!T=@W7fo&!x$^>lFzu{b?9 z*w+8Bfk5rnr2CO)HA5Gj`^%W4)1&i;@!$U=F{)Zc6W&H-Nghz-Y;?L`_Wbv!z16dq zx9{#YSSZ$gu2N#{1*`tUb?xVVUVQJ=VxYKKtb6)n&e_k8|L*1%R8-M9xMu&)BALx? z1`AgleN^#^k-?B}^Mj>x9a99HoRq~}pa01!xZgfAcAAZLOlUOE%br6SrrvRCdVhCb zc>P*hYGc6L=PcV7l*+x@a6k6#J~PgVjRuZi6&J1A_W#|vHG$o&S~J5m_p}KJSv_C4 zOS)X(F~effDcprAiC$OzXB^vd&e=36Kh1H*g0_-*x*K&WOD8Rze`0~y@6uB)X=MTX zYuisSFjzge_nR51++t$)XR6y`(Jr0KZaQrxa;a8ZH_zF8WVv?@yV=xff0);(>;Q%# NgQu&X%Q~loCIAn3txf;{ literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index 820c3c4d0..e570bd8eb 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -107,7 +107,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 ~= "mobs_mc:pigman" and def.type == "monster" and not monster_exceptions[mobname]) or (mobname == "mobs_mc: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_beds/locale/mcl_beds.de.tr b/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr index eb6967941..7fe400b7f 100644 --- a/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr +++ b/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr @@ -40,3 +40,4 @@ You will fall asleep when all players are in bed.=Sie werden einschlafen, wenn a You will fall asleep when @1% of all players are in bed.=Sie werden einschlafen, wenn @1% der Spieler im Bett sind. You're in bed.=Sie sind im Bett. Allows you to sleep=Zum Einschafen +Respawn Anchor=Seelenanker \ No newline at end of file diff --git a/mods/ITEMS/mcl_beds/locale/mcl_beds.zh_TW.tr b/mods/ITEMS/mcl_beds/locale/mcl_beds.zh_TW.tr new file mode 100644 index 000000000..fd0a58629 --- /dev/null +++ b/mods/ITEMS/mcl_beds/locale/mcl_beds.zh_TW.tr @@ -0,0 +1,41 @@ +# textdomain: mcl_beds +Beds allow you to sleep at night and make the time pass faster.=床可以讓你在晚上睡覺,讓時間過得更快。 +To use a bed, stand close to it and right-click the bed to sleep in it. Sleeping only works when the sun sets, at night or during a thunderstorm. The bed must also be clear of any danger.=要使用床,站在靠近床的地方,右鍵點擊床,就可以在床上睡覺。只有在太陽落山、晚上或雷雨時才能睡覺。床也必須遠離任何危險。 +You have heard of other worlds in which a bed would set the start point for your next life. But this world is not one of them.=你聽說過其他的世界,在這個世界裡,一張床會成為你的重生點。但這個世界並不是其中之一。 +By using a bed, you set the starting point for your next life. If you die, you will start your next life at this bed, unless it is obstructed or destroyed.=通過使用一張床,你設定了重生點。如果你死了,你將在這張床上重生,除非它被阻礙或破壞。 +In this world, going to bed won't skip the night, but it will skip thunderstorms.=在這個世界上,上床睡覺不會跳過夜晚,但是會跳過雷暴。 +Sleeping allows you to skip the night. The night is skipped when all players in this world went to sleep. The night is skipped after sleeping for a few seconds. Thunderstorms can be skipped in the same manner.=睡覺可以跳過夜晚。當這個世界的所有玩家都進入睡眠狀態幾秒後,夜晚就會被跳過。雷雨也可以用同樣的方式跳過。 +Bed=床 +Red Bed=紅色床 +Blue Bed=藍色床 +Cyan Bed=青色床 +Grey Bed=灰色床 +Light Grey Bed=淺灰色床 +Black Bed=黑色床 +Yellow Bed=黃色床 +Green Bed=綠色床 +Magenta Bed=洋紅色床 +Orange Bed=橙色床 +Purple Bed=紫色床 +Brown Bed=棕色床 +Pink Bed=粉紅色床 +Lime Bed=淺綠色床 +Light Blue Bed=淺藍色床 +White Bed=白色床 +You can't sleep, the bed's too far away!=你無法休息,床離你太遠了! +This bed is already occupied!=這張床已被佔用! +You have to stop moving before going to bed!=在睡覺前,你必須停下! +You can't sleep now, monsters are nearby!=你無法休息,有怪物在附近遊蕩! +You can't sleep, the bed is obstructed!=你無法休息,床已被阻擋! +It's too dangerous to sleep here!=在這裏睡太危險了! +New respawn position set! But you can only sleep at night or during a thunderstorm.=你設定了重生點,但你只能在晚上或雷雨時才能睡覺。 +You can only sleep at night or during a thunderstorm.=你只能在晚上或雷雨時才能睡覺。 +New respawn position set!=你設定了重生點! +Leave bed=起來 +Abort sleep=醒來 +Players in bed: @1/@2=@2位玩家中的@1位在床上 +Note: Night skip is disabled.=注意:睡覺以跳過夜晚被停用 +You're sleeping.=你睡着了。 +You will fall asleep when all players are in bed.=你會在所有玩家在床上時睡着 +You're in bed.=你在床上。 +Allows you to sleep=允許你睡覺 diff --git a/mods/ITEMS/mcl_beds/mod.conf b/mods/ITEMS/mcl_beds/mod.conf index cc3f3ff18..de772ba43 100644 --- a/mods/ITEMS/mcl_beds/mod.conf +++ b/mods/ITEMS/mcl_beds/mod.conf @@ -1,5 +1,3 @@ name = mcl_beds -author = BlockMen -description = depends = playerphysics -optional_depends = mcl_sounds, mcl_worlds, mcl_wool, mcl_dye, mcl_explosions, mcl_weather, mcl_spawn, doc, mcl_nether \ No newline at end of file +optional_depends = mcl_sounds, mcl_worlds, mcl_wool, mcl_dye, mcl_explosions, mcl_weather, mcl_spawn, doc, mcl_nether diff --git a/mods/ITEMS/mcl_beds/respawn_anchor.lua b/mods/ITEMS/mcl_beds/respawn_anchor.lua index 19c2c67d9..321847cb9 100644 --- a/mods/ITEMS/mcl_beds/respawn_anchor.lua +++ b/mods/ITEMS/mcl_beds/respawn_anchor.lua @@ -1,177 +1,94 @@ ---TODO: Add sounds for the respawn anchor - ---Nether ends at y -29077 ---Nether roof at y -28933 local S = minetest.get_translator(minetest.get_current_modname()) ---local mod_doc = minetest.get_modpath("doc") -> maybe add documentation ? -minetest.register_node("mcl_beds:respawn_anchor",{ - description=S("Respawn Anchor"), - tiles = { - "respawn_anchor_top_off.png", - "respawn_anchor_bottom.png", - "respawn_anchor_side0.png" - }, - drawtype = "nodebox", - node_box= { --Reused the composter nodebox, since it is basicly the same - type = "fixed", - fixed = { - {-0.5, -0.5, -0.5, -0.375, 0.5, 0.5}, -- Left wall - { 0.375, -0.5, -0.5, 0.5, 0.5, 0.5}, -- Right wall - {-0.375, -0.5, 0.375, 0.375, 0.5, 0.5}, -- Back wall - {-0.375, -0.5, -0.5, 0.375, 0.5, -0.375}, -- Front wall - {-0.5, -0.5, -0.5, 0.5, -0.47, 0.5}, -- Bottom level, -0.47 because -0.5 is so low that you can see the texture of the block below through - } - }, - on_rightclick = function(pos, node, player, itemstack) - if itemstack.get_name(itemstack) == "mcl_nether:glowstone" then - minetest.set_node(pos, {name="mcl_beds:respawn_anchor_charged_1"}) +local nodebox_uncharged = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, -0.375, 0.5, 0.5}, -- Left wall + { 0.375, -0.5, -0.5, 0.5, 0.5, 0.5}, -- Right wall + {-0.375, -0.5, 0.375, 0.375, 0.5, 0.5}, -- Back wall + {-0.375, -0.5, -0.5, 0.375, 0.5, -0.375}, -- Front wall + {-0.5, -0.5, -0.5, 0.5, -0.47, 0.5}, -- Bottom level + } +} + +local nodebox_charged = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, -0.375, 0.5, 0.5}, -- Left wall + { 0.375, -0.5, -0.5, 0.5, 0.5, 0.5}, -- Right wall + {-0.375, -0.5, 0.375, 0.375, 0.5, 0.5}, -- Back wall + {-0.375, -0.5, -0.5, 0.375, 0.5, -0.375}, -- Front wall + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, -- Bottom level + } +} + +for i = 0, 4 do + local function rightclick(pos, node, player, itemstack) + if itemstack.get_name(itemstack) == "mcl_nether:glowstone" and i ~= 4 then + minetest.set_node(pos, {name="mcl_beds:respawn_anchor_charged_" .. i+1}) itemstack:take_item() - else - if pos.y < -29077 or pos.y > -28933 then + elseif mcl_worlds.pos_to_dimension(pos) ~= "nether" then + if node.name ~= "mcl_beds:respawn_anchor" then --only charged respawn anchors are exploding in the overworld & end in minecraft mcl_explosions.explode(pos, 5, {drop_chance = 0, fire = true}) end - end - end, - groups = {pickaxey=1, material_stone=1}, - _mcl_hardness = 22.5 -}) -minetest.register_node("mcl_beds:respawn_anchor_charged_1",{ - description=S("Respawn Anchor"), - tiles = { - "portal.png", - "respawn_anchor_bottom.png", - "respawn_anchor_side1.png" - }, - drawtype = "nodebox", - node_box= { --Reused the composter nodebox, since it is basicly the same - type = "fixed", - fixed = { - {-0.5, -0.5, -0.5, -0.375, 0.5, 0.5}, -- Left wall - { 0.375, -0.5, -0.5, 0.5, 0.5, 0.5}, -- Right wall - {-0.375, -0.5, 0.375, 0.375, 0.5, 0.5}, -- Back wall - {-0.375, -0.5, -0.5, 0.375, 0.5, -0.375}, -- Front wall - {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, -- Bottom level - } - }, - on_rightclick = function(pos, node, player, itemstack) - if itemstack.get_name(itemstack) == "mcl_nether:glowstone" then - minetest.set_node(pos, {name="mcl_beds:respawn_anchor_charged_2"}) - itemstack:take_item() - else - if pos.y < -29077 or pos.y > -28933 then - mcl_explosions.explode(pos, 5, {drop_chance = 0, fire = true}) - else - mcl_spawn.set_spawn_pos(player, pos, nil) - end - end - end, - groups = {pickaxey=1, material_stone=1, not_in_creative_inventory=1}, - _mcl_hardness = 22.5 -}) - -minetest.register_node("mcl_beds:respawn_anchor_charged_2",{ - description=S("Respawn Anchor"), - tiles = { - "portal.png", - "respawn_anchor_bottom.png", - "respawn_anchor_side2.png" - }, - drawtype = "nodebox", - node_box= { --Reused the composter nodebox, since it is basicly the same - type = "fixed", - fixed = { - {-0.5, -0.5, -0.5, -0.375, 0.5, 0.5}, -- Left wall - { 0.375, -0.5, -0.5, 0.5, 0.5, 0.5}, -- Right wall - {-0.375, -0.5, 0.375, 0.375, 0.5, 0.5}, -- Back wall - {-0.375, -0.5, -0.5, 0.375, 0.5, -0.375}, -- Front wall - {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, -- Bottom level - } - }, - on_rightclick = function(pos, node, player, itemstack) - if itemstack.get_name(itemstack) == "mcl_nether:glowstone" then - minetest.set_node(pos, {name="mcl_beds:respawn_anchor_charged_3"}) - itemstack:take_item() - else - if pos.y < -29077 or pos.y > -28933 then - mcl_explosions.explode(pos, 5, {drop_chance = 0, fire = true}) - else - mcl_spawn.set_spawn_pos(player, pos, nil) - end - end - end, - groups = {pickaxey=1, material_stone=1, not_in_creative_inventory=1}, - _mcl_hardness = 22.5 -}) - -minetest.register_node("mcl_beds:respawn_anchor_charged_3",{ - description=S("Respawn Anchor"), - tiles = { - "portal.png", - "respawn_anchor_bottom.png", - "respawn_anchor_side3.png" - }, - drawtype = "nodebox", - node_box= { --Reused the composter nodebox, since it is basicly the same - type = "fixed", - fixed = { - {-0.5, -0.5, -0.5, -0.375, 0.5, 0.5}, -- Left wall - { 0.375, -0.5, -0.5, 0.5, 0.5, 0.5}, -- Right wall - {-0.375, -0.5, 0.375, 0.375, 0.5, 0.5}, -- Back wall - {-0.375, -0.5, -0.5, 0.375, 0.5, -0.375}, -- Front wall - {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, -- Bottom level - } - }, - on_rightclick = function(pos, node, player, itemstack) - if itemstack.get_name(itemstack) == "mcl_nether:glowstone" then - minetest.set_node(pos, {name="mcl_beds:respawn_anchor_charged_4"}) - itemstack:take_item() - else - if pos.y < -29077 or pos.y > -28933 then - mcl_explosions.explode(pos, 5, {drop_chance = 0, fire = true}) - else - mcl_spawn.set_spawn_pos(player, pos, nil) - end - end - end, - groups = {pickaxey=1, material_stone=1, not_in_creative_inventory=1}, - _mcl_hardness = 22.5 -}) - -minetest.register_node("mcl_beds:respawn_anchor_charged_4",{ - description=S("Respawn Anchor"), - tiles = { - "portal.png", - "respawn_anchor_bottom.png", - "respawn_anchor_side4.png" - }, - drawtype = "nodebox", - node_box= { --Reused the composter nodebox, since it is basicly the same - type = "fixed", - fixed = { - {-0.5, -0.5, -0.5, -0.375, 0.5, 0.5}, -- Left wall - { 0.375, -0.5, -0.5, 0.5, 0.5, 0.5}, -- Right wall - {-0.375, -0.5, 0.375, 0.375, 0.5, 0.5}, -- Back wall - {-0.375, -0.5, -0.5, 0.375, 0.5, -0.375}, -- Front wall - {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, -- Bottom level - } - }, - on_rightclick = function(pos, node, player, itemstack) - if pos.y < -29077 or pos.y > -28933 then - mcl_explosions.explode(pos, 5, {drop_chance = 0, fire = true}) - else + elseif string.match(node.name, "mcl_beds:respawn_anchor_charged_") then + minetest.chat_send_player(player.get_player_name(player), S"New respawn position set!") mcl_spawn.set_spawn_pos(player, pos, nil) - awards.unlock(player:get_player_name(), "mcl:notQuiteNineLives") + if i == 4 then + awards.unlock(player:get_player_name(), "mcl:notQuiteNineLives") + end end - end, - groups = {pickaxey=1, material_stone=1, not_in_creative_inventory=1}, - _mcl_hardness = 22.5 -}) + end -minetest.register_craft({ output = "mcl_beds:respawn_anchor", - recipe = { + if i == 0 then + minetest.register_node("mcl_beds:respawn_anchor", { + description = S("Respawn Anchor"), + tiles = { + "respawn_anchor_top_off.png", + "respawn_anchor_bottom.png", + "respawn_anchor_side0.png" + }, + drawtype = "nodebox", + node_box = nodebox_uncharged, + on_rightclick = rightclick, + groups = {pickaxey=1, material_stone=1}, + _mcl_hardness = 22.5, + sounds= mcl_sounds.node_sound_stone_defaults(), + use_texture_alpha = "blend", + }) + mesecon.register_mvps_stopper("mcl_beds:respawn_anchor") + else + minetest.register_node("mcl_beds:respawn_anchor_charged_"..i, { + description = S("Respawn Anchor"), + tiles = { + "portal.png", + "respawn_anchor_bottom.png", + "respawn_anchor_side"..i ..".png" + }, + drawtype = "nodebox", + node_box = nodebox_charged, + on_rightclick = rightclick, + groups = {pickaxey=1, material_stone=1, not_in_creative_inventory=1}, + _mcl_hardness = 22.5, + sounds= mcl_sounds.node_sound_stone_defaults(), + drop = { + max_items = 1, + items = { + {items = {"mcl_beds:respawn_anchor"}}, + } + }, + light_source = math.min((4 * i) - 1, minetest.LIGHT_MAX), + use_texture_alpha = "blend", + }) + mesecon.register_mvps_stopper("mcl_beds:respawn_anchor_charged_"..i) + end +end + +minetest.register_craft({ + output = "mcl_beds:respawn_anchor", + recipe = { {"mcl_core:crying_obsidian", "mcl_core:crying_obsidian", "mcl_core:crying_obsidian"}, {"mcl_nether:glowstone", "mcl_nether:glowstone", "mcl_nether:glowstone"}, - {"mcl_core:crying_obsidian", "mcl_core:crying_obsidian", "mcl_core:crying_obsidian"} - } - }) + {"mcl_core:crying_obsidian", "mcl_core:crying_obsidian", "mcl_core:crying_obsidian"} + } + }) diff --git a/mods/ITEMS/mcl_bells/README.md b/mods/ITEMS/mcl_bells/README.md new file mode 100644 index 000000000..53cba890c --- /dev/null +++ b/mods/ITEMS/mcl_bells/README.md @@ -0,0 +1,16 @@ +mcl_bells +--------- +Village bells for MineClone2, originally imported from mcl5, heavily modified by cora. + +License of media files +---------------------- +* sounds/bell_stroke.ogg - cc0 http://creativecommons.org/publicdomain/zero/1.0/ + * created by edsward + * modified by sorcerykid + * obtained from https://freesound.org/people/edsward/sounds/341866/ + +* textures/mcl_bells_bell.png - cc4-by-sa https://creativecommons.org/licenses/by-sa/4.0/ + * from pixelperfection by XSSheep and NovaWostra ( https://www.planetminecraft.com/texture-pack/pixel-perfection-chorus-edit/ ) + +* textures/mcl_bells_bell_*.png - cc0 http://creativecommons.org/publicdomain/zero/1.0/ + * created by cora diff --git a/mods/ITEMS/mcl_bells/init.lua b/mods/ITEMS/mcl_bells/init.lua new file mode 100644 index 000000000..f1fce85e9 --- /dev/null +++ b/mods/ITEMS/mcl_bells/init.lua @@ -0,0 +1,50 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +mcl_bells = {} + +local has_mcl_wip = minetest.get_modpath("mcl_wip") + +function mcl_bells.ring_once(pos) + minetest.sound_play( "mcl_bells_bell_stroke", { pos = pos, gain = 1.5, max_hear_distance = 150,}) + local vv=minetest.get_objects_inside_radius(pos,150) + for _,o in pairs(vv) do + if o.type == "npc" then + mcl_mobs:gopath(o:get_luaentity(),pos,function() end) + end + end +end + +minetest.register_node("mcl_bells:bell", { + description = S("Bell"), + inventory_image = "mcl_bells_bell.png", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, + { -6/16, -6/16, -6/16, 6/16, 6/16, 6/16 }, + { -2/16, 6/16, -2/16, 2/16, 8/16, 2/16 }, + } + }, + --tiles = { "blank.png" }, + tiles = { + "mcl_bells_bell_top.png", + "mcl_bells_bell_bottom.png", + "mcl_bells_bell_side.png", + }, + is_ground_content = false, + groups = {pickaxey=2, deco_block=1 }, + sounds = mcl_sounds.node_sound_metal_defaults(), + _mcl_blast_resistance = 5, + _mcl_hardness = 5, + on_rightclick = mcl_bells.ring_once, + use_texture_alpha = "clip", + mesecons = {effector = { + action_on = mcl_bells.ring_once, + rules = mesecon.rules.flat, + }}, +}) + +if has_mcl_wip then + mcl_wip.register_wip_item("mcl_bells:bell") +end diff --git a/mods/ITEMS/mcl_bells/locale/mcl_bells.fr.tr b/mods/ITEMS/mcl_bells/locale/mcl_bells.fr.tr new file mode 100644 index 000000000..a1f7a075c --- /dev/null +++ b/mods/ITEMS/mcl_bells/locale/mcl_bells.fr.tr @@ -0,0 +1,2 @@ +# textdomain: mcl_observers +Bell=Cloche diff --git a/mods/ITEMS/mcl_bells/locale/template.txt b/mods/ITEMS/mcl_bells/locale/template.txt new file mode 100644 index 000000000..2f554c2a0 --- /dev/null +++ b/mods/ITEMS/mcl_bells/locale/template.txt @@ -0,0 +1,2 @@ +# textdomain: mcl_observers +Bell= diff --git a/mods/ITEMS/mcl_bells/mod.conf b/mods/ITEMS/mcl_bells/mod.conf new file mode 100644 index 000000000..e25b1fc5c --- /dev/null +++ b/mods/ITEMS/mcl_bells/mod.conf @@ -0,0 +1,3 @@ +name = mcl_bells +depends = mesecons +optional_depends = mcl_wip \ No newline at end of file diff --git a/mods/ITEMS/mcl_bells/sounds/mcl_bells_bell_stroke.ogg b/mods/ITEMS/mcl_bells/sounds/mcl_bells_bell_stroke.ogg new file mode 100755 index 0000000000000000000000000000000000000000..023d1f94627d2b767bd1437ac3beaa112e4a8cb7 GIT binary patch literal 61797 zcmagFbzD?W7cf3|gIH?m)}@#36lF>2ZbXoh6ci8)bwJkiqT!9{^wt=cSzBV=15G}r4vdN zJM5gDAaNKerD`IufPENV@4pX2O@E|TmrgM8je-Va!aI!}fkZ=1XFLL1BP6ouwHGGb z))8qRU+PM-js>F==w+e$(2@HCvg$X9AJA8>Jb)&id9Ya*t zI4glhcaSI1NEe}iMzftG@u_YNU!s&I-N8hHiVr8q0)SjjOfM(m@O&*eFbDviWW({~ zw7}3cfuUvr20A7eEV2%O4ryncUSXX1);L?#C0p!oUP-HydD`+fEB)VIqDlc+jEJWI^7WI=|aQ~Jhn$L|FO6|i=kF9$au|7sh;tl7r3a{Kp zO4x>g%tEtfq-5N2&i1C+J}i76)!)a)z`8&Y`~GW9SI706;{!;^>hbzg5&nNo{$=-(3iNylMS2?(YyK6vT6AK0r)^Co{$)4{km!Vx zIBbpo`|wH?O6EB;ELlyCHWGpP z5Mlp!B9f1J!bddMM04@~ohGuNAdKVaUwJcW5jA@*I{IA3>YIuc`(Yan!$}o~2~Kw# z^$;61-$_+>J2iI)#}KFMA#Saa3;Dha+cC@kS9YiUJ4H4Cw6aAcvxOzI-)Lltnvnbl zr2vU$UnA3B6EojvWQ&?)iv?t#Ja@h3M&bI65~;esO#pts$$m<&icYVMPOpj1TuaUN zzj3{$worPw>cfLO@BjZY!(Rax1t3E7=o!(YwxWi%NZ~JcVa9##3iK(88lI7P`dsDT zIZm)2Mi}Z8@vqVN&jJ9zIMl@PbV9&_O>Ej$*1=A8+SYK|&f)(rSxl-}up^A6-&fdi z*YJ^s{7l`o+xdgU3i7O_=1Rrv2r<5B6|d-B@WfV8pYic^-Nalh!ZZx9LG(&-P_bX& z%$UiBsNtBVlwjp!&7-xqrff``t6UG6R<_y)y(vOohl!Q0X7z%V_Ca;cNGCvx{4tb` zXK_L#4glg9ZE=!Gxn5(Et68?gnkxcc>6+C=-ea1?;@n|PiQ*hK$x7r^a^HfGvRBh}XEI2Ht?HydW zEF7+jStwgra5&hp8#-`0*j=}9xbOQ+C1l>-;U$;DbgQr1R*cj2$d}3%^ZTzzZ6xyQ z-Wu{U|9_|)X6+po)R0yaK2 z4lfLquHjYH(iTz3zo8}}&>^%vczv>QXb7mlK2DUeLevhC+d9MP2I4Y$>ktWC1Dz08x4r712JZfQy^tF$&XD@&ZwlWb11bq#Kq zE_A)Dn)uw6Sb5*t^m1(_pIeZsQHJhdQBJm|L}l*ZiV;nz;snHmB8JXYMsmPeQ$j2u z)09@IGTYQ#tdd7xsyQ#$3#piM4el5y2q#t!WSa(yRXV$wYqs))XYLO!@ptgb`?j`0 zdEvGQDqm((DFl_NsUkuZf{Izs6hUQYicsYxEjjIM8rY1WGE zk)}*HRdKaKg-&s$C^ubkl~7@;xFV2ftF%hU&9>by+2SfIvTcLPa&2t`8xXxm?dv_i ziWnCyqPAin3kN*I1fG7?wo!4IKPxlz&0shY8C;^YS(n`FoDPkLW!jP~; zp^TA(uZ0byBC<+%4RMiIa`*k@eyK8-?SHY^|B2H6pAr`ASZRPAojI~(vj(Y5NE(6> zq!gaYf-{U-^pdI>nlxp(xd^9DWGK>AR!q5?<%Q!-O=|DYdEG8bu(maA7~u0pWNOCs zcJoZ(Aw+Juf^KWh377`RK6VZt>)Ot;4N{zO4gcJgKjU>!#jjT>*i_K@Xh^T^0MOgV!|d8U>?iRTs@Gu*+Y8*fT#pCFo?gRd|R}bGn0mU zf3|e=fPnWx7Ptt}LuA@WYXQVL6UA)*!kG2w#C-k>tIW;#w;g?DZuWoLA#sG#DjDgE zz-&$b_NCh|t^W@uxgXj7t(6q}U#T(?Z%W*6hwv7!hdlnn<^RI6{|B?R{Vxnzs{gdh zwKYLPPyr1@RC#nIcpbP-+@j|`0RNR=5&#_ij&^Cqx+97wYlY|(YijjOC6g8PhY3}Z zb~vFVq40DeRM~)|*#P3$@fbjdut0%it$+rM%=ja;x)P+Ydq{Mv=aX!#B7;ex%>%58 zoIq5Z_!dP<8Zdk@fQ{g##>;)u!t3GV@%^s>&Y03eude+iSz?ijDK59A-QQ0DWc679 zc!I^VP6!w!Kc+dF@`TnHiH4Ch2q?6GB7`z9P)WH~*4#7k>I=k%1S$VX7!2lb36Vp9 z!Th_sq1^ema({QT5AWCPwo!%tP0SpEl9E!A(_LLH_d7c7b$2{$t*gD)`Jl72yS4TH zy{0?&J04M*n;UB?>niH%0gjoO27rr$NijYU=`U7|b>vOel64>PL$9}c^H#j+IFK`5)H#gWrbe}IWMujo1lWuLxWI$Qr(i5`f0nDw5kkX}xeeMj7r zUpaj4_JCZ{>GB24#rqKSVOZ$Ti@k|7i$W%lu{PQ_`^gW#y|`^$rc=T5HvfiEl*-1{ z%WpeVAoE%BrRs=r)HU%Wvh-h_S=oF`+ke#4Rwu+$A>X z&7I+TE*W7@bZT+s&r??)wmvvtp(pboaEm8atAA0wWhPVc7E0@TM^m{#u6t*%R3VzfJ@0Vn&NKSkRnelg1`uFcrYxLy3Xm@iHwy1B=>YPRH* z&x{kVa+>Vf*4al-ZiQd@QM8$vPFnU!4T}5cT+Gz?OrhoZKcC{64QHp0=&TjS4G}K3 zpE>)>$K(EV94^=b7TBUsJ=W1Jg^EDkeQ`m!4Hve)(L0!`cDCz^nm!i>EJ=>}W)ej} zn7w+e^d8)3@^#Yyd`LDXCyZyQ^1YZx*@Zm2YQ-Kq`YuyB_|u=s%Z6@(HztebX zg6AYB#F^$Btu~ulee|?9ljp3APKYekw#PB zm2uo?=S&cNP4_eW3-sxQma2Q3n$24`lG-w?js)MZRDZbb-Kk&T-2P~q`Kn^YVOQr>wF@U zj`X|UyL8F{h=V=NvH1n62oXG?{Zab*x3$x|G7*YWC>@D*KKFd8If>@-qSI>Asru!; z0r!9q9i@irgcBd_nQT}Gwv!aYT6k?qh8Hi*pW*1Fr+iv>p5l-il|2&@fA>n#HKTJc zgBo3bpD!0H_)sK65)Y_};ta@6{85P^c#VxRlTdFJv~LWlh+cG-ZPM>pmPKp7!AjS=fF9vq$iSfM;X;3Ta%d9p&P-$EC8{9l7O*ya&ffjo^-REfRgtcMbu*y%?dlmUtIq4)_`1Jb*_dzI41=Y0YwAHQWs#o)>O;GXuVQ2Yf<_5 zO*UVw(G8MIFN>k&9Hxv$}J1Xb5A0VOsAk3C*yVVo? zULR_Vd>mc^N4!lw9XNbLL2t%#~`aqNsH{4J+*W ziajm{7MyW?=;ckeP%)nQz&JR$+hF**!+NWLAn~Tm<%(5JfZe5`{U^Nk^tvHR~VgUftf)p}S7j;l9+G48~Sp71-Y4}g)<6REi3fZbr`w$X&@E=l z*3N}XnA?Htmhi(eYdZ3?mEPQ5fjuL;NT=C8;uMa1GbXh>wcds!Y{=sFOA)S|n9(NA z8y}^Nvc}WOh;XMV2G4G{bLo)a5bD(J#!Dff{BWEY+4v z1@PR-%%ymeq<&Pn`)n_~ru0`X>nB@($m!rrHGo!*@KZNk1|Tc;fm;kzgE!pwVj05L zpB5AZqrQ;kavaBNEuwC_8O$8=U&cuuneU1Lw({utKDwy%vB&Cj#>Pv_dVE(HofU&_ zt6r0-ERs;V$7a3A6ewyK!2YS*q~@Q#N%pzm2Qo2~x60Caq=llQ3VtQm2@e z!4A$9nz`A2!!Yh_PlK>=9MIUPeiu^;*Bj-wflz-0OIuIMNIX(?2zz zKT#fgR7)}5!m#hCcYUd4)bya3G>pX^Iq&$u*;BFQ;hg%Ac!& z+(0)_8}y!123dN-J_>|N^&3Jrc|MuzJd|nO8`iVQnIbvh?oi$I<0kb&iKM`u2hRc7 z`mSv+aiLn1Mz2L)2^<&x?T6Yc5UU++G8a*uh?o}0;gvCFo@mm^*1U$x%Dup7d^YxA z(}d-(WBm~y7=rJyN?n*Xd0B>&1uu8~&7YR)5^89|l<3eYHem?=ZK?UragMRH&3`!saN3W=wGkEM~*P-L{W~>v> zPows5v{gnnq=&A6V4!xfS7h*JLd2Jo{r?xhTvifgd+5CSRs3>((=}CWShn{aKgs#FXX>9G$7dCnB={&dzKL;JoZmzxSNpT2pg^Wobr*L8!d{&O<}CqOGGk|3Q|MuFs@0%0OV z>RmSxcrrBJ!6K zU?cDKPty9wo+-HSXqOJhUd?L8!hL~BbwQ`OPoX~g-Cf!&gm|cvG7*Q$N;0|Atfh4K zs5u0y)8(PkVe5qre5wOr%KYt}F^PRaP(HYBLyk^Z{*r#=8?;oPH@xX=-E+Etc@DM7 zJU-7I3@HAEek2T#=sYlM;2fCgH_o#>E<7Bc%8-c04}9i=YIGoMv=RL=d5R^z(U|WK zJ0)kF&Y3#9X6Ef>R8ti8@cGSZ%Tw7%2vFv-63&uICoz=+ae$7{c9FBh+J)1?APu5U z-d<4bnuR=94ugKt=uh@ytXE` z03IRU1!EY0T%1LWDhXV`3mO?NHGZJ*m9u)qow z9D>nDy29MoxaWKYh3>0M5^BczQNVhfZD1xj=dglw`N8+06-St9dU*`S#+a8nJX6pA zY8_Kx`Z|6OZ293r2S)S(^<$s#m9DX$T)~jZh8f@~z<7E|g~KL$tT|!4MCj4UAoGl! zRh2~TPYWoDnuHL&htKC67y1K%E6SxVg>P8~Lg+q!iCKDf5%qccHMNVz)a_s(g&hus z@U+1wKG5U>#6mxoT6z34FQ*Pnw`a83P!^u(nn8=tY%&n6WmdGjx^Jhc9R2R~Kdr4@_<8TCw@ z#9y*W(6h$uYk68^x)s{tx3|Fot(D$qGNE6qUw@?2I1svd+*0;jBbV|vJ%<(xQ#48; zAAUj;(bD7zk?Mo^2;Krf2B79P0a;f8C?p;)>#}Dm(Uz`X!bnHxnVye(k%~?dwr+9; zH7;N_!N%E?soh2$w}usw-L-~5p(Y}Bl!JhlaxgcZONJ{Q)qa7*@O(m=Cv{W5U@XBc zC3ZVYv13adB6=y3o&}YALEz(62poVQPew-il!b*L&@bkXFX1Yia3rlldz$-vmwKI~ zE`YchvCpJ~YAniBdP)i=_!K26nTwCjUl+|d3Q=ePS|b>R2Qcpk6bXQFKa6?Wv%YM8 z%oryZK_x8Ls|>%XBLz5P&g=2b|Vf?`#+VIEKZ+RaE%lbGY2plXg>|A&g(-vs6iaXx9>SL7lGnaBgElb0Zo%GYMcOo-XGs(y34=TR^&!= z9>u*u-vl9*9PJmd)~-e%tl4_xD3?Mt*Um|82ZELXbP(f#rgR}^H)N8g_B7iXN_CU3 zrIN)TcT6^uF?dVqfXC<~SRF&T^b6}#`qDg13_#G}T>w@}c~pY%105O=E_|idaJBOqp;4j(v9U!yZh~<=TO*l8dz;;#}3??0}u~?EjDX-Us#kC z5-?h9a8j?kioC62-Rv>M5+Xd& z0M-Shuq2eWl)9dfT$ub0&HU0X?5}&I*al>Z+)EA~$Ky>j3GH6Hv@wWGKsGgz?p}QW zJi`Gh@K-xb=U5tUil!{9j6--8QDe}pxuT>KP(p|&#chNeBCzS7CWr zhb^la;+F|7#4t3F&^{^>U=EPunAk*jkejgzq3CCE=+IiGg~vp0fk$8HC>fWI#~l&@ zO?H491pJFBXQn|I6X|_&!_$RfGYHsaAs2^S$Zg6Yu+c<>`Ju<1l*BJr?K&t?5%Ajg z&WQZSrny9WgW(u}}^p6&dc%0#Zu10c<$$AE$=(G)-9aij3<@lBO@ zZ`V7onR=`oH2XgLTMr%h1bKi+F={i!LNQ0n+*1mGX9SSjVLwk48!UyKDbf7sWVYQ^ zoi_MvdGOenp&5Kbnmp{Qt6R&0CI12hNBR+4tb!9X>|A1wCgVuOlFlTEng)O|jz~9* zp|Eb!|D<5vzu{nNy3RUct7S8EXLIX4XP}@_YWusLxE&&Q zO?4eLLJ$QvB0BuE8gIr~z;+vyC-YJunDE?_!Ms>g&q->)moO-NKuSLL!2qfYr& z{Lj_pL{^@a-vQ?R;lZ?A?Fozk$SY7DUpey2?Ihiaul_0DjY9W!Ut6?j35}%pmlWZ; ztA&&9?=i9;k#zj}=(%(%i=yMv$HNDvvnIO*FV($G{Eaa!PT||kg_oiB*RUlCtsBoP z1bEJ>iqW8_EWCI%Tc`~|8d_~JrnhK6T9r}U$*$!%y&oKyu*=~10n8_dS5gwxt_(9n z@*78RC(KQ~qq(M?((6Fb=J!;+rjw3+$p8naITFm^DNws{aS_sBqqq*TW_)WzCon3? zJc&xab)5Z%N^Qm>*TPB0di6zdfos@2d(JVo&|UhThhlo&tL@Bm=Er$g?s^2sHshML zgrh2S>INMDg#2`K82&EA-}+HQhAIhdixDm}wF9FzevffIxTS4c{(92Sl0e?8L-eeC zySQ%^BuPan@*?sQ28oep5f=D18%^cP!?nJpB8qK@Ei_Se=2w zdD$b|NshL2_q3_!OQ?VAPQJ>mCajWU^<((^joG!3x37mvzp~nFpH7gx@4*kn(xfM6 zRrQ|P(m3*u(3L7f*HDUN|3>iRVPXV3gXkrM{^c98VQJa=kLSGkv?WR@R(VtAkK^Ni zDF7?_8Z(NMz&PYjFd1ijNY4}xfm4?nyxlc7-`#6FG^(M}Z~Pm^MN8U~utgf2Ag~&x zp(y2Vw~7-Sx9|T#^Nqel2sj)wkYuaATC^HL@w ze38Ep zo?tk|AaHWEb}y#KDsN}+@3Dy3L2@hWq1tuy?Ygl!#h8IDIo->g8$H~^O zU8}J+jCnA+nVTSL4|N*EdC{|CY93(<#!is))W`x~--GU^Irg^z8+acEV8>;Tkr)t){zi+3tJ!wDwys9H9T#iMv zo>i$}`YR7TI%N*hbG5^4r zcym6I^DRU*!9o9G5s?w67qLQVI&^_5&RA6g%!YCuSwRqJFu}C9DKZXKWeHAEHmMZ% z(>XpMsr@3^CCsxFR~lBx7{=^!iBk%*@ibZYIq6V%a{VOGLc@e@rfVSU598!edioPe zBQdi^1k*cTw!ND9;A)2$FWnx*j!I(&CG;!tIyYF~8gANSp154(oTl4zG>JT7L{W<= z0Kxlq#1~xxzF$E;NC-~#1mI`Btx4+0cEJ1S?b}3kvY>zQ8IXpfQ(*wzJ`kO(YkMUs z+Pm&F{A&nC{f;^E7=!VNaDaEkDzZdUq1~r_ok_Dw$Mq;$ge=0zC0zROPlwVGprRpxF+uoG^QRkPzk{j zy1-voD3_~gI1;Gn`WiYbj3!^;I1_z|tkgXv{bBpzicT3C z`~oCYFtCJoJ9@Ifl>8vhSWx?hd8Wur_Sn(1wU7CB2^V1$!pz=BwRG0nac@R1j)uQFQoA%X@bY{&*lb2kVw$11{rs?{#cQ84#aInaC1qn94EUnQ97PWG@2MAVcj z<5jWbjvQ;+n%{c|f#7FmH5jaLBT`KVLt$qNV&pOm`8fsDlunW3NKY``^y2Y40j$oL z&>Z-U+{GWIGO_hjr9Vv)Oczpk$(W*iSe~B%DKj-G)ZGN+W;`OJ$s3$LfY8~laHa!*2$FLyGoC6%7KeUupZ8CckDbQ0FZ5)gN?c$;Y9zf6x;k^EV z_S@l)0eV5q#W)`ka=s%fwFYkajDcTpQPnU7l{h^R3c00&$#Jm5s7s=bO+t6RB^dXz z{G-Xkl}iN2CPdPk5@}@_>86HO+iz;}BilVJNsL+rrrtr^6qL$%G%kc6VWlgd znQKk%eATdINUQwoRO3HzD}J5SB!%B(02+32!d|ar^f)8hQ_3rs;8Mjch?KQu&7Fqk`ntN? zm1Q+GPupv1>gp}Owd7AXlc5yz zwfpBZfIEG(B>0S+2XoOe1uFq222n62WQRz*)R|Vqt0VFZtIZw?>YBh|2<3Acok9EP|_uC>CzL-8I6!vqB>EpZ;8 z{Ql<`9y_UZj6_Gj`@zQC@9LW#63Shh504$RNEEfX$Lq|b)}-B(4v#-;N*@S6exxz3 z39q9KY3;MN@q0-H?NTP@2}`upvhCNlZ1zk1O{0j*b4RVPg(2T_QpAm!WSrq7#4c9_ z@F3AwYL!Ea_{EWTlRxbit%#;y3@L}0AeLGj-SgWhz)CK6Mz`Sw7^A~63KV7H{?5d} z?< zRYEo*pEEMLHVgKGta<{=HN1RENR>oXHxK99cmgWS>K2d^bT-XPky^Ci-Hb16#ly69 z?O#z%UD{ucQ-2!DE@MdMzZ#fIExajLgxS#22O}`!j3{0IO%9_Ai&Wc@m+;CGO` z)$>!)&_Rl4t4KkYiGo>LH=J2nmmOsIvVQNSz_NGs?$FmZpZKd2<4-m0!5y|uJMifn zjLjlMz@y?ISQH{_`5`Ci2(`akyITi)JM&l4+EVRCjLt(g6(Ii(to(-&RL-EjKR|Vb zVKAnB_u-@m94J@`IZNOGECeYzYcg0H(E)9iB@Y)rtq4rgwP$`JqsN`X^WtWu*YGr8 zTwVyE#;#%Mf4fnhq%t0$_iAhIsj$X+qAsn!OBl6NZlbP#@16Icj$9RsHT$R6OokXD zU&afp6Zdw5UI7}ivKxfdf0^mH8*7Ixl`;&&cn?|Yrv-EhZEH=~~(zO%; z)E?CF9~?&2(PV{3h3UEIdIt;;YdyhCXV-;($IAhps0e47EKc%zt!ZO;XsNY!F0xeZ$}lj6i5AoN_@pJeS$HLbsVgftc!hkl*UDf=IdG4nat4<-En(y zb%eh4$AK|~%pEQ`3OP{J(q;2BLQ#xBmN<~{=VO2Xd93lf*`Eg^KO>I#PSvS=GQvc+ z=f+>IfuGOPfNlc@4U8vuIt;5vG4N~}96}LH?MM~zHn0*5C>Qab7w-PK=~r;_O?+3H z31wC7AMK)oTnI!b)6_Vq-|iK1qzdX+eN&DQj`{P}Cc4{l(gs7pl&rt|5IcDu<_Hb9 z*1S|D{n_zr+gr}hZ1zGd+psj`LEoN+7G)>~kXkWJ6H7zxDL}^3Lk_aq+QmJh3NChw zZgi*M172LRDd+%UCQzauABa}QX{7eb^jDL^qM|NG(~5&6ZUb6QN>qG~>oyd_Uz$d?m8TC% zQO@;19vLXZG#ju{<-|(RNY8?%uy6<-vX^c|DKMCAZKwat(Y3IT|FERR==0Uge2#hS zQ+%i_%SD~(!dMzTYT$+*N__P~55-vQ2@iyP8e?iuD@8GUk$N|Xj4v@hhro;Z`zGNOVFY)xR zwm(QqY<{oF`L-8x3`e>l0!T0GVOsg5d#{ei_jWqWRHAkqSV1fPhqf)T9+T3__~9#A zcAN9i71ox|LBTnjQcvUC?)}mBNuff|#hx2&VptmEFmMbz?5hY~FA8Vj8O=e27<<49 z$&PrWAPeV-Lby4lQ+uPIc4-Xf2;fVjDaYnokwYnjQg5)LO@_2cY@SsNlwKo1y8nWN z_$BQOu46@In)R^t^;+ENc(j}#iLMVKkJ&>MrVM8D%Wz%3VP{;m8i0w88jRlW zyQY`E3>MEDpKb1S&Ur=PBYaO?Wwb$OIq4!iU zF=Cf7^Ub-i$_|u)#x8mMR^BK*h{E?EvfZ`^-(5Q@G<0m$|Y-b_RpU!9CuXc5Ck&g?W}LT8(-g zcCfl(nW8EdJi=OEq01T*&QVBaPO=CQ!Rtc#Azn&f=caueCmq3-~?f468%7A-?-Y@-Xu@-ZZyk}1+nod+6O<}4A@801~9!;f5IuwL*t|37bJMo7W zL^9-SS;JenWx%Hw)#7w>ZY_so75i*4T3!=Ujv$e9(3|yP`s>6WSC`=j*OV zg@okjCY)Q?PI@UM4$VGWd+_WePcie-kneD*fu@{xUe+-Pn4igJ>e6Cnhqu8Z#uM3x zSDZj6V!47*lp5K~NW>ST(Gw;Y7N+OPd>m*0Sb}<-$f3vs$T)H*pC`6KPNhJCok*J@ z33>K93_5s=hhJ@p|L|Kp*Pa;5$#t7bbeaY}l;1;fI{K-obC2|~nB8VT{%HAJ)UwFM z@$ve2(CM&aC*;Yi843@7oOr-kwR@_vC&_6hjm7k^IHmyX4do4gwh!+WJFkU0k!f{n z)uZyKn{|&Bmwk2$?dAda7AVT6HRe(yxq4y@0KuWy8u|xiOJebrM4ky&FV}`Fpm~iY^UR4u8IP-Py2> zH}jz0pSBy1uqUGhnVykZ&|%o7N6?bsxJe%>B<@AqMK{D(H5F#wtYG&0BWmOuf))?= z)uzg2GVE}G6JKb+fh(X=JGac*$v-T%s(dNV!FNKb(hw6;mIKwg*Mlp z&j@_sxhg3S&41~gJ)wsiIRth+m3J9lEiCn6&i6eiZz>-2_ zyxh{A;L_yBD{;VT5bhsN;O_{uF2^;Ny)#YBR^x1}d3FxlzRi25F_CF_*gM*1fRtAmxl2+p^jtMPdy1y;qVV$A*+nI@nt2-7UL1PLL6 zNM9`F*1K3bGO;^ibb4hd1IB4VR~>;w5k1HaK#kuZyTbz5&oiTYCjWbaDSfgg=$PXw1~TWb4BUp*x<6#BX0~iVku*z!di2 zgIY}c%0Oo;`xH3PJv6YD2I!pYIOc^7Asrqkdv5MoU}&tU55HE1BOqlKVJu&tZPac2s z=oEgBuf>?2wUh3ZjBlM>8?l!(4S6-pHFS39jEMr&-GS(wJxedziWBi+x#m6zxXeCm zI}W+N|EBGkKtqr6Gyp(eb!6M`Y3}`}P94WD`aJx7BA(B-xP7eVgvxxJw3zA34!&Q% zZn{Tnw^JFoigy_VbGDWl)32p%_nypY{(5Bg{e5QFUe&X6Z&j{RxWIu9!y7sQ?<%-Y z?Z<~0_2zNqbI6Vr96+`N+Pd)=P?#ISpbLQ1cs#x87akDi&xEI3XRHXOIaDz0IVk{l=bb8#xYc=d6dZehaQK9F>l5X(fkyCCyjj=SsPk+;lR zXQm47ToqwF{p>;gwts^k)2yEy+s9B{n^PTcdg))6&m~{LR$q>*`utk|*YySG#{7Ci zy`Z)WWjFc9b-+?b-frnV+;fJ|{goG$Kz3Od3qSc^2ND4)TVvi7z6c-_${QpwLh3~ zT$2--S!zg4IVJVOhh}+wbPB?Py^iVK(h=PAl-KKti5fqz^TY~8%M*7@VBFU*fLz%@ zJHt#_GAi9g>_|Ky+R=RRi)MFeYFxXHSK$P1$fqt9LYSq~eMxAzUYFX){Bb|88hu z-RZNgCx)!do?1LkmN{;9 zoRdrg61%^NA}%$8#4o-h*Khz^sq}|t<+UsPnGNf&56EZBK|G)bIM_%g7upRHP*YtX z9HQY@mnXT|UOCw~VOQ7d^r^O2clXRgyEl14G`IA!w}kQ>C{R-1mC`#=+~;d}VwKh> zT)!PuqIJIT^S<69XUSQH!y1oeWx667&woE=YxRnFMw5mF4%GeV{~WD+yB!IyNTV^R zybmX6h=7H1?m*Zpm<9~y!Z zji0;zu8aCgUrjrIv`>@-wOdghqUA6ufDm)C95G4$eYaA`GCK$Sj{fL6ZoT`2VU5Kw zE)}E;U_psE5L;sM>|upX3)FCu3R5{-1eHhXh3|H|nTMu?4mKXD;`AHC=*Pb|s_hd*;w016Ho4QOGrGW$Ma~&hrcZB)uW2M zGC+Ue!Iihm_B`vlT6J9lu}MM8FQ{GAWF;8)+8VM38<-3)v=$F_b__3oNTxt*$H-X9 z6QL+`F3oEc{55nI`ZSyh;_I-W5XIq~C{AgFl0Uq-QU$Td=geD1eSbBk{34c7nPOn< zIs&YNZt={YIun?b!>6FL=PV<^*-&B@!3zog0n(P#7Xpv8&`Iq2{JqBG`8R!us#cNzcO^9N>~ZXg%5Qh6|Tqw7mG?N zYJ0ZKlZT}54(=Ra{b>jKxKk?yL%!?gRJ*h4JOR9MXPWFXT9!^;BrN|Ua*LmnaQVsh z#||Z;gOl+Vk8GQbB`=(2ieo!aXVG73px#THsU+|xCnz?%liU1^bew6XKAHn&MQ#i> zG2ANMx61bezpJa0{+Q3DYY958qU7?Y_BEWR!AB-`C#N7jkX4IngW~KA*VgmcOTEYg>?QA#vchC@3?kJY6qet%c1m;`xk4QB3m2@ zbXp6eFyaO(B+*iEvx03>rw=_Sdm%T&5rokoYA* zdm8Xpg|sr+WWXBd6>|(BR9iQk;+Y<_xTyKM_v6C>JL}idw-`~%PMoT-nZuniYpTf% zLNSp;OY)qwr>kNVV9y_cg-JPOuU}qR_^@b`(;M17$oc?_LCjFdT4-J3_g)*OlYgEa z8<kV`(`otn=ER>um);I|ty}s}1R2Hn8hW z39L^>KF<8gPR`aYLUF(>^gPW_G2(FqI1#-*V9=Xr68_LKjANA8k2Q^B1|w4td=dlr zHaUSH!}h}O<4+VBFDMuyk*el3D`+*b)P@1CgrbUsWR|RU%_iC;QA8rR2b2C#8W#dw z4Fd1}no`bpPNBS03i~{8*~4w_AQpop=EY6ru&G0l%yfX}k&{ddQh}Q0y zTm@lZPeXZGon#0(f0*|R`r+y#;P%bo7(`kM;MUmqqMV2s6pf4UQangF;d|1dC#6SP z@7nvf#@rHunY;6!_mD4u9J5a0`MN? zLX!zmqMz0ggIp{7_NW(Mt%S-Z@^7W_pV?~4-)sU5fq|0G)E)+ZEdN4O;(_J+A#vlZ zbazjsj3P;et}rZ~R-g-zZg5auTA`nVxoAI9Plk#v?S=cz8r;c41!F+G=QgcwoyEk$ zdE6|xRYiF zSvd=5qt+m-zq+8)rdt0~rP~J%Y_J5G&45;w$&w=p2VX$zJs=SD!TbXzaP0~)9@($R zm(Q8(tyFP+6v$76N>B?qP$ba+lsLg@B&P%>km^yA=56z4^f5`quh57Jn8y1*Gl(z4m@rPKptsJPMTk2*^}tgEl|F%A z*yNgGt)bILPoWGF2>}RwO~LmfC9>g4kD3@ToMyaj^Tacdga|9>y5}G!-fNHM`vQ(% zbVb0<+AW`q#xc7HX^j|Mivy8V0PPF~z8GBM!e5EH#J(BPTXsDB!1V))K7nB%U^|ak z$vG)mw(~vyQk%IB&6iO~3X!bxcD`c}$#IVH#6I03w|9usV*chAOqsoHJT8LGYeY&I z9fsmsn*W+*pY%x~#M~dGru@%B7piHF3S98O*}L8%o`sv#kk7?k?gqu%$XZmS z4)l-RgdGHIT;b?=N@9dd_TlLLi@V`VRC`-{`-GK(fgYi27c}Ut2me)F1^l7}xcwk5 ziJc^BbigSe`%O5W?d@a0MG0D1^sxNw`t1&OIJvvh9G!__D78+8Ze#4C8}3VAg<*YM zlK5mTD*e{u&%130;&-E5|IGWCsjvRglJ@Pr-haGjO9g;7?j6Umm)Q(2X=f8p-0=wFwocQ*`s@~8hze31Y73>$r5g&W!P}3i zOZt0Bbx9YCin1WbXk=kT-aQFEb9M)4=5 z4$ub=E;stDxSYd}+&%F=7F=sO?V5X{Mzdo_)iQyof_`K388JtF%9HAd5Eeq0VGLbB zHn(7_Xpi($LLC%T&4!j^{F$TB8cASAYY;&~b@sn2oD{2*IP0CL0{PJA4Vg?hvo#6N zZifBer}o#~tU)Ksh$6lFG#z<-6UYM&QqN-wmWN!{L)X3hT@~8$r54zJe)rIcXPqgkFS5XahzQLMm;gee2p`0Q*U#?FESf-~ zm2)T&@eF?OFc{E>1H9w}1d`xL!)R9^^4U$dhW4@Na-Vn*fl4&a;T^ud4zd&9iJo_F zd~n>*RugdVeXba-DP@Tt*0J=V;L=U#oK9j8B;4tyQ5*H!6(?CouB20AK|)1JZ;` zwwMSU;_@VWun_EzZs806kC=q-oEV{`nB|Vt0Fdi&Ko_VICkG7exRC)U4nu^lu54q1 z?1R`RwFK1V`gq=*W|FSNhZVM&zkjuUS;$g(YVc!dRP-TrO{QhZ*TyXNipAh%J&&{n z>OReY%?>mLefgu5Bo$ zIxmqIDtTNt))oM!)Vxb{B<)zlqF5nEy+-R?=tSLnr~V-a+$iu++fW-o2;(voiYTpC zJ=)ZTGF;Tzt-31b>cMjN6v;gZ|t67~euJ7so?{%#tWa+{U>r(uS8D7E) zMvF20;b?Wl79>v^q(*osYHG3zGt@t7KPg5mrpx9Y+Y@C0HsWY;8Nsqa^ikY?-2cuagyF`T`GS$#NY z^8V-(;UWK$ac!WO;cjUTocMB=VdH>4-~1i_TTdDnB=k0?VE_1%e1)T;rV$EcJ1|FV ziE9CdKnaGW(;&OZW1(?n@TpK0C5tv-p^q)i&kF(0VE_pX_y{0NDFI5jA%NdQs%J<2 z6*K72>A#Y)n*r_M7#&&#wSz4ew8ZyuR{GLc2xYR$M`+j6$iK};0Bu9~zl)ZB3Bi|< zF9l1OP(zWQp2i{fk4NnsJpE1mv^94iK9zxyL@=9O3n(tmeL^2?0Ku!`-Jy z0x3c)1RMl;>9EvD0i1ba7ybKT^!pto;{dmWg00yS2U_tN(1rcO|n=WyF^XC^|vnmh9j3R5N|dt&Ee#6lLk0?i_8eY~2a?`bek9wGjgMaZ<E< z-VH^@rGect1KUzd!xc|@CSjjF7W#P9gWkNzH^GqvCwQRbF&TOyjvj_1fjEyUK1>*p!HE@3U9c7f{4HZfV*_ok zAxJhjuw#HY)yH@g2EDu~15}yz1)Hl;y0gE`??om zkbyQXHNDC89d<9bWCd;9MuCR%R0J26N{TzQd@- zz**x|sV{3ZV)w2*DQX=n)6r@JL#J~#2kPN@tqaNM=5h67qFp*P~b!aI3e7^*MfBBMINk2%?BG#W(kY0v16rveKgLDai_6+ zdez0u#HW%z$g`10WUy4h)v!^MMAews=4x3iukR&;GRbu6G~k4np!vBpnaq*6Ga1f9(Pb@c>#A6Zpgrig3SU*aObmacIOmZSBn5Je@8+ zM{VuiuTi1rPipEsev5rs5DZM;Qc1fs{^I}lve=0ujEVeHEw!$_5~kOH=f#2JNl(V? z@_&?a*TT=!`-?gym{R{45=?V4;c&;HEFJ@_w>e-oisR3qu%HGTCXo){^kk^;%Fir8=eHCw5ku<0!_~zR+btAz;7cy$^KW9$G!;0B0>fk0ZZ%PHz-iG<- zM54uO*RMmLBHAjlR79D@el^{Gqp48 z>abNCNFZS^VK8_wclD$Mv^4v~kl$O9OS|W}sGUHHHw5c1*;l#sclm4Hy0-#->icS&mroWT|cO= ze8hnO6_ZAy+isb2`g-2L^@&*s|m37fBC z`g%0j-Y;*YpG#)=-;i!zr@FOxajd@Umb-aLQsO87Bs@rt0N^FF*097KQylAXI0^xpiCOH|{XwO^clXZjV)u^4%P4Y-s5 zNL)a=Y5;kM0Abr%>?1__Msyc_+5t2Sp)v@oWn3;VO2Fzf;;rz zBnNRmHl*JzHB>x7QUm-UBTu z=>cEHI+GXOug`9&sc^^?vdsC%f114XbJ<577eHOxuKPyj^p(m7cuH1( zqkg~hck-we=?)OxTdHHKaj82V7>N$9y)iVTsIuL0M(EOGf{Y>-fYzs22&~#3wN^(1 zz+m>Wh?QfkzWdJ8CRM#*Uw1haCO~cmFb+Xb4>3+mk(@pxwA4S$v5h+24EtwR($wEW z1*`cu9#7%yW0b967TPC<(H&SG8ao|5EFEljrMx_>Zu1*Y7QUNZUV0y0uen-i)9?N0 z-z49Pbt#ss_VXE=J&k*3o|}YGA1S&|2qsj47{cF@ZW!F4iWgBy7fXEt_rb9BL_Ec8 zW{Hcj1<;3^T`x!5_QnnIUIdtE%(X;9Ov%Z)+2KG14ssD61_Zz!jZtH)FaWxB-lQVb zq{Z&!{O<pY``UUERQFG>|$*FbkVigK4))@6e7y1$=4R|21j%}r3 z$@bvdzoQf3)8}fruOF;mCq}*yDnYWN5l`fS15p4CO4uuhNx)&$(L!#V{1)wY-KAH+ zFS*|D zpqmCKJd9(RH1yH!Y~7Y+%6(SMHQ74K7<184o-+pYQS=ws+JHv!0`$HGqFx*SOA z#vzPL4IfSr8w_sSmRtFcxmJJRx+xX6m(2%|1yG|C;hp9Q&mZgigiQ;mqsk%R9U{Fp~JVD!RT z34#TvAINVufoZ3zk0CJCN54|=tn!uzn(uySfL6gm5d$X=pUMyI(*Zeyt`Pi`*>rY4 zK#Z--5>pq^&7&&Kp58V5NP9+SLOmK1>WmYVCFqsvt|+*>X+$T3y_ytY-+VFlKyd-D z{q(Js+?LXQv()r)4k)}8W5vb%tl1bP zGXol#1S+j5H`uzRS-^rqe4~Sn;R{^iwdGG=H;gzr`Upl{1YbSS2?3ljDSS9J=@b#@ zmWB^;=?PF*;~&(x>6~S=xV|%1yT*S*A=LE!O@_}PJe(;r5S0dlZiV2&uz7p~Z4OCd zdOs7B@#wmaW({ehoafb8zaO4w>i#a5e{Tenyq~RDtu@41a1n)iI5$Bx!GRo-ARWme zVVfQVfb{a!d-t70su5#=ni<(jWH)XVfH8lB=0uG2>1jkIFTQl!F4E9xZ?3{EmfO16 zWyb!K#r&NDd1sFe?$8R&%4Ne8%^PeQ%H~zN`I+=FIKi^;V&M(xS9SFS(ck}#!ag z3q?DoOauN&^e65^*Dh&?etdWUbviG8qbl9zBWg%4d9RL%z3)km)m(>(oD|nDQ%;F! zmfVfcJDULp-V&YHME#>5H9J1mYi@UYP=!AB+RW~G+ogs7O^$B*D&AN_AuxCISdW(& z>=Lb(8b<5Nh=#0_;h>#4MPzE);0gu}1P2n15~LQ;dv#Cr*!5^d_&C3O=rcEEO;HoU zV@M1~Qg9+O4S+DHDuyj;fF*3nC%B!V=kStbvXbmUC)-tOsv*U~`BBiQG_?$uyIB{- z2lG~mqEi<&YlexYEEOjTxlHkmRWvAE=+{;f+4qJMu^`L|d;Wqm5e+vMxvJIG1o^t7t4 z-z=X&weaxpAg{6h$f-Vlw=(Uu&xceUgO<>*JwG2=Tc6=n`}N8OQF~#V2x*$M9z;qqG9^`lVUzRqvHIdVw-s;Kl9JuJ|R2M0%G3!__DPM6rfm8Agmih>u|BKYsdFxCtHP zJfr1BM^bf1To~6@EGEBe5LAoPcze!l=2C4$}_c8|NM96+rx>4 zDtIYgW=WpQ5luM1zZS8)O%f(&wPgVM!Tzx5lCMltIO~4E@>q_rQ5}>_SwJamL4f58 zSxE^g2(YZ1c@qB`Zr<`W+4&O(rN*tAr$D+<0!uJJgHIod<_%e|Ut)h0XP-$`_7s+1 zM2v6TCie4b2>%PCt+`iZUq|be5C6$Nw1;?;cm|0`_;&VoO&p!Kf3JEYwq6~%pA~zy zh7PuV>5C&8@`0Jo?EUuNZamkR%k^pd3_?<{Gql<|Zj5eKt6;g8BkY7iqK^~_mPmHk2!_7sfK^&&KJCzOG(8pVhMdp@Ad7*dmuO=yG?!xKkoNQ`UZmP}z` z;cGl`Fd@$TocO^#-|Rm}DP$gv%~yMi@KLYZal7PeAz{7q zh^Gscgv=nvoUuz!tH6xz(?p7)y;7vFWX-H(D@y_78UbN~y1=7yz^y5mSFiE?S%-Tu zI#VF#<_ov~8B4p<%Qw#Ew!8vcPhFPMk1GimPWQ@}@YDY*k`{DiJj`}sYJ-e^n5gn~ zLt*UdXnZUNlSN~p_qF;?zzufe09O1}&mnGzbdRUI@A`^K>NLkWAbp#&w%ibm^Szi_ z(<~dD37iBGu!cMU-XaNshm2i}tq!#JbE*-y2*w|u!*R32-w;%x#SzTFpdB2NItFDs z!A}!MWY5?N5>pf7SUC_`T`uQKLBNtJXTl zG8Z|9*#CM%a<5NUiab=A^>w-fhHnot-<%7bZPd3JE+mx*1xDnfqDW}&bL2kw-b}ky z9A%T6fgBh^N?WWK*hmcoCdw1J1=skaKnapgyiBo(e|U(-w;0S=?83HiNNfdhfe|>s zP7cM0kO8((U5nyhM-Y}uoo>3|9wQuH0VRi-rSKDv(l8}OwlRE(*W(&Hd=#RFVLGgm zGKuj(>(j-#wdL3PNjVDo{4`D&8`rK8k{r}Rf&ulP)F(F5gI?Fk{r5xkIgN-N_KKQJ z<2=|PT8%Y~>U}C-dcO~X{fM(WUgFX3fIs*!j$-=jvwBqO5`x+M?>oqMTyGiNn2z=U z;5ic3yAXLlKlT2JLfaE30YWCeoDLIyzEh(AmMIcQCu3V#^@*kWLlxT>7;HA0_4vI? z*h`Me>2vY|YS>!a$pqeH`^hjP*3%eha{YIIwqWBNWc^|8?Q7eMd?ZfY9un);Ms7f~ zI^Bv%FQ12m(yRu6hUbYLf;X%d_!=rB$I&Ga>N{w&4<6K zv|TWRvw$N$uMbDPQid!k0w~&-Fh+MCi_OIt0t`={hD+i>)Jm_aEuMqM!fSD5(@8;909brGBADv3(E z4~%l(Js^}IDYfWMk6icH`hPmm{{J7N1UJI~MlGs#yd`DD)kXOg#pPv{ z73C$xl_f>hrIn>s)m7D%h6HwA~*U3UQWA^(8+4qWers|6hhCR`w{*<-e|?XGM!rB!1R^SnOihj0U$3&ifB) zqLX_Elxy}VYd(c##lwB|vd384f3Omo#0n`qz-EZEekLLT1i468iYJE?LN$aF=<-#PJD*^`r!?qmIUHBfmSsDT@D4L z*lws%xSUzshUMHQUWYH=79q%qVxG0B`iqe>`G)Db`EL;$xW>9!OY4RQ{ViM{9x2T7 zY9|lrSiLiqw5Ruk|0kIj-%R*Bv-}+!jxcg&$@s57FPscdHbLf(jy>-8^0uRBONm=5 zo$Y0jhqPLcBIeKRF#U1%fL1ud2iJjH=ibDzTi%eb=eJt3OccT~XOshkjmo+waQL8z z7#zKV$(dhmi;u#%jD7VFwVbNb*F!V1LTJqZt|9*-L~+{P9@ZNqgW3M=KWk{H5JjSx z2P`|NTD8^OKJk+8lM8BlWkmZpK`%Ddequ?-AV zx*gx7N=KlprE#Z*CQB3+Md}_6^+u7YS}<`WUy!$_7j$W_;G-8ib}{5JsTHZwfr-!8=DI_3^{?xDuW{9R9;v z0*DR7wwn_Q4C%KZv9%#;NGLK~3}V|4rSRM|6<3FZcNE}$lG}0`OUfyOatSWf`1Z}4 zvq}k%q?!fhmW{=o=ro`V+dUEgdDVU*Ea8$nNvPB4Z!g_No8k}}@N*7gSSPII7EM~X z6l7fZdN?QR=;&O%+2YDZ?_ww%7eh?Ichw!nx@%iPc2B74zLjIKYUs?w<`B+Ni0x=i zKs-SVI-9_49|Ncb0DGj$5-$dGNlvRrh>>CW^WpEmvh&otOKxMG1T7zf&Xi@JKS`{W z>HA}uo!~unl`_-qZc2JlRozf`osRK*v~Rn&$&z12Ad1*t(@Y{rAs=4&N^V;xruj7& zh=OAZ+Y zm3+R>8k70(L?U}!K%j#P62lZ6(fB|Yh6{Yo02NH6ZGF1SPYLUDN0ZNJB?dA^wi_)qE-eyTWujjK?)q4sw* zQI)Hif2!r-Z4mE)7wJdki(()t1S2i{%abqp5>2{=q*j8T(8(g%iCVbQ_ zmoBpnO8tu4!wSc<3-Exg{+b$ZDxAk20HO(*Azu0UfZOC7t;5!|*==X1k%+s;Y z3&)}e;1h8UiZNXQoJ|{JX5(dF6Hh#WFY+Y@_HYFB-bUvzoN9v^N6NqkkU=MhwYRKI zOXCAk8+7|*prwKV_~%FiZkm0nObg5{co`VL5AYW`>INYTh#y3yEJ9_*7-ae#CR@u-IraaohffgD%98 zq(YH+zSK)cg}CHgWhIGeF;IAr?EzJ|OzMGNm!m6e>{}<*Hj9yl7DqV~gg&<~&hrn( zQOpn1;r@H(qzVq}nH}g(g2sdHV|& zKqm-I;Q-MZ6yQQg1c??o>KSelG`4JZ{P24JjEBqcWpGI|+43#FI#T}GZ?XVeMg>Ar zc2{$T7vnfC{u~QI%?7c{XQq=IeBWHIB9E<7+{ zcN+x0^v|K8Dp|WQj=WwEgZ=K(UFFH_ikT@l899Z0TuFTv%6>3m1%=^mr)f=)+@l)e z27uiJ6G%eAKs|v_QZ2L>m*9g4QD-aUrQ0z>%x_9x2s3WvC`kBQ!A4AxDnmv|?huTe z99q+|8$D4u@i%5XH1l$jLb=~EgbO6-n|;@#D=TM97Gp13lO-xl`P^--Rc}@*sbL=6=Di2OpN zN`v=B1`*X1llXV#G~0g^!*_T9vbLI45#myk%&@DhIDeIy-Kc6|*^#q%BU)`I^OBA= z1$kZ1IX8`nBjGLI&sol(@O_3soEa^`nwpf;Eb*dpk19sY-?mcY>MVKNxDHo9;VNG~lH zpq7M?FU9rAUKGK>HSJLBZ-2TcV!=P+I3nQrmp^iL#>}W1gEiKo!sS|1{*dr7tI{Vo z3d#Dd&rj*kCnc++yXmlu@3U7ol69^wbYMEo$gpT@I=nsz^W5?i52M zeteb{16Gs$ppAdG_%p1VNd#YKV;+AAXAFS?gP6!#TU>yMw+s__ufzeqplVHJyWuAO z)8yE_d4)q%7;iPEQ~Tskxq*l3J+~Xj0BrGh2q1fr)bmxvO)^~f6UOKV zrVc?m!baMBq?E{7UG!>XAP_E20(_IzTY59$=<btx=|D zL%Q0SwcahYCA{H;_%HW94_i&RQDI>GWb_eLZ#uAZ{sy3A@9g^F`2|^#MqSW&Q&Uy{ zSkNmJoF^KWQoMHxJAI;)s_f`%qAi!^WI_VmM1$|rTC+)OzKYKxxb8`H{_`!awEXN} z+(vM&OfwI+g_t)im)_&(j0_Cn*!|B3NUnaaGx+RK|Ank;M_^J=Ah{<2Ln5P+NRi$E zc}WD}Q~c)F2bfl5(Zb55g&&+$E%X2WJu8SV9UTPW}WHJVU*$plR!zD}a&5+=2 zL?0swUwF76sAhoR2=V~!BmfC3iQcw8-*lntY$%9Turg{rv5w?Mf8$nxp$1V!?th+q zW*SuqvO|{YvP8-4ij<3K`oYc{s8!9F<0{Fdy`N^_kq*BYe%Kr|U$Sn*?uDlm`H#Cc z)YyCpPO4J$f=ejM+dE}SGKo-GXxt|6^|LQ7Z6ESaBn!h|T-+@Ve zLkqb%7x1B+$zt#-HaKx7(iCZ4>gAbDXkg&abCf^r=+Mtw7O#>O=PhAPT_LX%yLhDb znM;OlD$uZ6TYz0Ph|~09=_`?i^H&ypcJ8MuU;j19(Z5mLc2_Ha$!~okeVXM|EFT3} zC-fa0?~$&sEx&giIvoi!y5mX1s=VQdaIhZ%II|&%LMcLrqhP?C_DQbyCFardp*m}&FXpqtJ)g!#~5Rk;+YK;S#orUo(?_MJ|9ump~Xfjfx?^R>gsBTqy*J;GEyW^s0jnOT$OrmjW`~ zb-AI773xbXt=oDpxOEm}c^o{ttDB#AEKgidmEv=0sN~h4G*STGI zU2*A``78Wl!{!}r70Dm_`AQ4w_`XHq0QW~8^j`l3%MzvdZCb;>SY9GrZjHvM1Q-%J zk7H_p99LpK;^Y8ndTtvg`Aro+n;%F#?PN0-2p-`WZXpLV?T-o@tMh5@5A2%m~ibi){?>=a{kHOlfDx;5g4rHFB4ZxRjW$;1! z01rS5vv*Gq2dvNd=-GHr7i9^F7vz>n5K4F{!g$E(Kao&ZZeW@`m=a!Nv%_=T_Mznc z^tJXLjP(fxKGP^hSA?#bp$+ziSnh|Z{K`>_%7QGD)wAhcNuA*lDDf*=eQnW6^LCTI z?&h|!H(`0a=X&(1XZp&Iyeg~B7BF8Tl4{rVy|DBixY#=6fR}PD*XE-Y=NExYH|2ZE zmK-PI!`3UnV+bD^s+RNkezJl021;p|_?e;;FA$nf&{`^(h-rwSig671ORv~;Rf26J zsVE)<@%jP6gW$z)tUhVVr&S$2tMD>gj-}7TW|SN@CE(9cy!d<3_GA5WPG<9?)Lc@| z;}!@GwwCjbxD&6Jy@0zljWl(#dYZuMr5Q})|4wDqLeobR9#y((j&DIs!5V1G zWJJ%sxV4WL6j#ic+#-J4?tCTlR|l5@SOB76{6rR^Vv{w%;(X87neVzP`X#@1Jq;Ie zXVC>d8cq_8kDLz&Y%w9k`;_4=vF7-a??=OYA8PI&lB_i+lTLn#fcJUr1mWeZgxBR})K4*$${2*0{ktL6nOs4y5Ze09gJUdo zGElkszE-o^)?o>3)6VsbWCQ!1!D37gfD#F+&Nm^Av|?FT8>~;3Cws}|tZyxYuNhSqM1}uY zdrN5Yh&OkbOnYxwv4;}&v8u~}4w&=jZdG&pD+2m=EboyOp7*n=BAm0VCjiPSMMkW<{ zfE$4rdj)FGgRz`w`Z3;(E~00T2H0BKZUbk>+zSR_0MY=FG7N*Es#*<&&`D%bGb9lN4tddbeN2-R-9WbR zyKjL#Y!*pqRu<n}aW%VhIc= zS8f4&5OAx;9XZ0cn+e>Z4w7xtBJS17{V6ynYia#ZAMFc6GzEE+7e7%I9)ChC0kNnT z?c{G4qJ-!(mQhxR2U8e~&wlWH*q3<6sp8d2G_hftqH!)0ME12M#lc`T;7RT&RWJGF z54i+A-~3KWU2c;@2S=u~$SSUuz&Jy>r_Q~O%Je;Eo?HEW4gYr7NgFdKRwtq``s3F= zeTXYh!V7J~zlYcF2pJETh>;xGkP|4Ai0>;Bz^9nk_9G~`@8kJ4%ZseSjxhw6Xa!Mx zl8>;Gu6^>}|BboLp~E7?^iBrMrNhb=t`L!`N>k4E`aT2e9A zeug9?Vdh$vlz5EnF9;9u|JG56J+$_Thg|vv%py6~lQ+GFn!dewcm*`I)KU$6i(Oul zdn{;@#2&b+SK1Ys%rn8`;qEtS_#|N}-tueqC1x8|BIjRZe?OB5wuLRM%r<|mk(O_T zk~TL5ki-FRq|De~*1(Th>jHZAG`B+m|L{Q58jB%B6@Y-PQVu634D7oLf@a1v0*pEV zV1c65a9JL=w`7|9@k0cCK|z8PEo*Du^pp%1BR%2x7Y1Cfza7=muWg?cNf*S^O8)em zCN)xep*@cAelTJ~f0twVW0|PzY>B|c*3b4fr$m9eUrJ9BoYss(66{Nq&0>B9suOkX z&uK(o4YQjEXtj>lUj!_#^>vrbHGLd5%78uw4c-dkd1L-?^rZVWW#4s=CTi z3mYU=8L}e+)~53!{MVa*vpWyk7Jt7gk>*Kkng0H{!<*A2LOkG82S)G9hkxTu4>u)T z^G@G>{T!LK89+h%@J^}koj*xG-YdD26%~n-WRmKx+$6*qdtEwMd#rtGQ1>nuIE-PQ zcoQOb_5nTg`zKC&dmj^oh!VI2s8uXPqaaAXl`*QPJ7u%q!p_eIkS$@JG+3{o`akOV zUZILja(>G}Q*s^&$xLxE!PVy6ZqZ}PCsgTSx||lt4T^HCaY^IL7-6|d0 zex_a)qDYHJ#7=<-)B)~IBus!u0lMW^dFD`m;V-Q<8RWgI_6%-JaJ{rx=_fN0LA@lg zFS{R|%fxyU9jZ0L+sjn-yGixErjMXSWYaf~EG7AE-pqp+WQ)7Z5!_5SIW{)iKY5Q5 zg!49LOlkffs_AvV)As);FEPQtB7UBYyag2{MHK~=m6gS%?<#7_8mh}0%fJPVl@KclEU(s)?#7YkXH;djF*jDu-@-tbP#ZJL+Qz5ozpSyvQhDMX0D5fKn^Ve+qu+ zpwns1r2NFoZEFi=a=*Vq2csYm*UhtTgy_^@>P*22H^O}60-$d7UwoXC5oF__+f-Kk zEuHtZcur1~VH~o7D5yBFst$`HI2`@$PTQ4s`Cs$tc1G%yWe;V+(K1CIol-uM~c4D+otI^oj?^z@|<%3knbcvs%Y!H%BMP1;GwAGaCGZSLW3k z9o_RWq;KM~1zUSIiKn!jCyc6z6P_XD5xLYD24mu|_2 zx{G8jixNDsTTEe`kIU~ogCVIHP*9%}vX`_UXAjH#(E`KiiNh-NBxCHC4@;IGQJq;FRfJIM7|QFjYl_ ze0fzS5jyYKusX0@8>`%-fK@y@pJd%ulZEEozaQ*Oq6GYz2RY zV-V+i0l}DfK)zyY0qcFu-?g@TBkg11;3fAIgCz5(pAo0BriHC+962Xv6&$$yB0?}C zLfR;0Ar_U9Jva)iH;MF&@7t8qr_%|W`Pyt;NswX5`Aczqx}y(y+SiY4m3LFChp9_w z*eg5HbHDhs%lz*BtiPzk@y+qx9`S=f#`h{%9!wz6)t7y2tksn9MX*3Qjkf4VLih;t zl^>*x?jf{s3Lp6y;jf|%GOqF^f-RFnjl)H|7iGdJVwU}F;2jB3C(PX2YTrqokTXFF z<<*@Ph$2><*W-4s$hmCidjN~S=GT_{)eNXCla=+h#*Cezk~QmA>q%DskJFRqcBG#l zNtgP4_c?9;Behg3Y-4zQ?Db)QVw>`}$lrHe7OYFq8^Z=MfPfxcZ4e@}<;=p+M(DJ{ z>3d^Te>KsF-LJ`bG@1<&P-HJh-#2*fzv|ud*A-nGSXyrBp8axonYyDd-ngPqgiHsf zZaf1q%UhY5Y2Pj%N%_%{t6o6Qh_Iqn)uxD&U%&pN{%yML4APD7ik+eNVdeEO^$!tR zfCX>1i1VXJZdAE01z*I59<@PkQWJT;hhxUw*pGHqPbpD-gD91!5YV_$liD6r^JCXX zY|0hiKX)b^kEDaNeE{TX*kTS6WD6+ZkN}Kd(7TU2nCzZ>2Y;@`g|r;R4xqT@+}sN8 z2?^bdOeD6^-`wcbsG9YYF5H$(4FvLtI�*O?vYn0!;-jAx73sC7rtc2NY5A*Nl| z-?2S;EX$(rM&42M72{osJ!L?~?6J7qtT=6tZOzR~9iCFcnWbeCiaMPUdu^=w2&{V_ zjs}sb{y7rTq5uV!R^KQ@U2BYygwy{wRL~#y)WI&KG3|N(fT|A9REMg&ZyCCP0t-c~9t?ZJ9C99-ePJ|GexL-}OLfoxZ&ws=avEv%5Rc`+Ik5?<29n zLp%(%`@FN?aLM1g-kRkG2TQ%7JGzv1F~CCzhI*9|e=l=!VZlZ4y4{hwwt3GIHqHNP z)hG8YuF8r~j)@$VROzzAe4!rh!%vlkToNNlQclc%xFY?cyZ`h`$jf8KnHcis%h93t z*VnhtOY3v5zT8sp^U7i-KeLN0>{-OQxOB8CE-9u=CPvo zBn11qu#9jGDPt)S)jU7!P|)#pvc)egl#kv$?l|G@?Hmq1LxMbQZJCF|hgAr#X#od8LVZ zf>59v{vJfLer=KXOR9@dq+tf%78xl}-aA%<&S$hqut)2CSI0K6*Cn0GP>Jp+Q!5{z z4q=UX#;vyfc6~0PPo3V13^vteuKix@_27+xQRyxnj=+vpzcA|mBkC)o>S}^z&%r&o zLvVL@cXxLPZo%CWG`LG}cXtU8+}$m>OORk6yv@CLt@rEvoilr8y1S~o3Z60Qg`0gT zf~01bfPYzM{|Sm<#6PkwF;kzW9{Dam-);u%1`6=;&xnhlMM`dmp$CCp&yb+ZffBv} z)C-MQq6)N7ijWZN>?%%m8jfdZZ}nE{Leek*mOyzLG@^a1JwM@?v(Ht3L<&cJ>AqE! zp@GHvXEV>=kaVaT$8H(1>j~EHeL&MD_oOb>0pSUdTQ9%uDBg6nZ9=9%-p@%lP4HI4 zMw}OKU!||cemS-i`gKv4IJ0YbQ0b^2-0o1Xy1hEDTf`Q5!&%%}&~R4waeEFt=}V4b z*F}QOGtWnbO%gPcMbHUQdZ`dW3|_N8_DKM*y`uDhDgNvL&nnGdSt$2^y`~1CpCSY(tL2{T7 zr<1!(o06O0R*2*DYUC2KShSSgB|Py*Ppsp;=gWIe7x4*s9w{DJH#$jq#g&i|EZ*sR z7JT|W*rd`aoyJHbcR#ZjA*RQ|rf^u7z?26B*?Wy*q@Q`)-`$T?*NU>ZxVD%tq$VeW ziCFxfHa~I7WO4|kgBd=)y|y2%!|Y#OdeMYk1Q5xSC>V+tGN>r430X`6B+@Voy&|!F z8KLIssuWZLt>LsKpx~3t@oj$B`3(K7ax3^N0ebnEwQUJfDFOqLrvSKR;`4lMK=B_L z8qVQd`EJi%^$Y*)LxJ3`F{(s`X?d8w-_EVnh_#(BH?)pgeQ53O{H^NOkbga=vb(%{ zHBT&|mFWIsg88f9(WvT*KcGheRGl9wP`bXgy_I4D76{bCA7lbx$1;{623&FVQ8*CI zN*T!F{^1JKBP~qQh%f;ej38sGV0*+?U5^A{BwZr9~VrkJ6(cu_2bSCpkO0yp! z%|b|2@-%@<{%6xU9!N3NkDR|tgjtbBZ$@&A>3xp^C2vV=Ws5w;DyjEZ`jP z?ufWB+SC^75;OpH$fSjiPe$YcB|?KxSk&eK`I$LAk%bA8&nr7+gzqLs|MkP?IS4`N^<~MR96Mgnad2hg1pK)v>*4kHOZXtRtU+e2VOiNOeI1! zPv}fU*UFV&cw3T6q4rJ7t0t@m6flXbHZdtYcLa;Yo6RHsuxu)HQnBQU9i%Df!05*& z7{Lc;)I?XU3L#O8wwRlLeNYwv1BP?nA5{}!Jx5gcgmb~#uW4=-mXOVP@ituuFBcJt$B*zvCEeEplXJxFQ z1vHQwm|7NMPi};g``b~|jYh9(v;Q%B+{R0PdnS!{UOK)YosP`sSV2{}(X(tzf zp)&h;cM;ZIOe>4s+v*zYBkxig>-WQB|9l$31aQgcr*k`&;J0X+2DziXEI92{xCZXoM# zVI4vRqL9!^6Y*idhXLq!59JcUX-53>{gxxWHsj?k1y-9KIDYyVSEma#nyqm;FTyBT zAs`Kxn)-2HsL}98lX;$pmCd(+X)Ry+V>UN{N>39$&sZI7@nt01sj)~!U|ZOA;KrM$ z?qgc8mB;Xh=Jjb_DtefkN!HGVp ze+r`%5!C;^J?LttZe}2mvq>W;x=<>DIDhSKZAT%G;@B)6!t?ne9-q+J=U+Jg=Df_W z6k%TvLX{ROacdCj0zGY@Ihy(xYLd+gKG!mn)ITIf2AW&XV}FzOHn;Ulbd20U&gO(B z0~vKuQ+XA)c??WQznV&&D%yifWcF+PlqhS*T3QpOem(y8_}>LJ58oK!A}FW2mJR2$p8gx(j~LfZI2eX10lk~myv>kr%zv{d`zv11j*?Q zFA49|!ibl%9nQg`^)3vF#&s@Dbg4s4Srfbd>mU`9oRW%v_hC8l>I+W~KPll&3EOhD zw=Pv`o;&cax8C)=-kXwhi4Ld|lUR z`wwnLn=-3X?>L>HC0lTWgb)GjGIfS*8r{?>5_h<3@e2%?{HjeT)ATYEZ$oq)lY&@} z{5hqITblsFt0IuhR~@=UhVNXyFGD1Ilc&8Fy^2QR|>?29CBm&*z(<=^KrZz_&F zU~QYHKxu1hgX!AYdt=A)wEaWzIu}yr6c2w!2ebpmkFomDlJvU~dCtzh@kyd&S&EHH z9(UM9g+?f1joPP;C^ut&qKLmuGuAUeaZvhs!_zNy58};_>ckT>M#2%(|D(<>jj)+4$=cT!@4BbYEvG> zq~y;g6I@zm38%ZN5>-0(-$y*igCO!CiGf##yvm}k_&z=n&=!o>U=A*VD+SH$c;Z>H zk_Wj`(UY{NH=ta0Gd?qt@-;$`BgCSYy=|Bhv#=oiI#}Ifn0qN*Dyyt0x}L-+*FHPt zI6k6!t5&8?Y@UgB{jK?Bf(7*Q65u`I%vv@67zfCO4l%4BBM_(%TvlX(0ED}vQSnxr+{?(P~I z#HEemj?q82uu*-{cX*goE`DuKR5}-(Ma2gn=Ge6wslcoHvqf94B5M&*j@jt_<1YIG zoRv0*$dkZT%Pw8FR6zx!pgLCMh+$WYlk;zgb3964E)$Qq|GVgZfO6Y5@*Pw}M1N2$ zyT(%B=<)6z(I!vRA($8G^L;h`dJ)%8^|%F(nvA#t0{W!D8616saG>kAi+{N6sGc_2 zL+im%1Im$tWD)KiL#Ul26cW}0VhnP-GDDkk;!OeMxvSgHL;hmEBZx9+hSs*TK9K{l zIKn!^-(2mP1WV!|oMuKI;Plof>l&Gd5MBKEtj0x;i#PlV1}fv5s7MG<3O#=OQe$ao zX*pxhQdvN}R}3X-R?AFHw#vi=_7uRfq!^ZP66?eMJv!CgZ2w@y0B{(Ge|R9sewIQS zAaCbpUiw$E)q-0H>!ip}^D@r}QGu-SUzl1$KO~G$hVN9_Zsi|}0U58cmEnzOlwU^5 zbK2Myc0QZA-wuMD?>6S9e2Cr{P4DnMa7TI&E>EJ8(A-3x_|~D+qvD7`S^u4JZxp_0 z>6Udp>7Lo&zays>>ty7r#@fFB^!$@iptfvaIP*8DIK=0l2rLlEC$!6@8A2VHDRe&u zP$p2}Ie;Esk^G?*U`qWbJ5&4)L=Xr`dVEi}k5L2*!OjVyMc6;*=q0PAF?AfqVz6$J zaPt5bH`$G5o!u+?zx~ia*TlOMeNa;QU?lRL@ z0j@(%;jHW-`6tRj>))+e zCtkQeO}{!9O>(Bj`ra_Z+o*ekBITdT=l^nLzRuPR4<|^!=7^C_a$*~=b=;@=;F6{? zYQdZQvvJI``KU1VweQM$SSC0>pqX^eK%$s<|AE4>Ja zp=tDCrpt|%X;{4__=368tdY)~-#4d`M`Xyq--{@!hg}=r3R66P&LfRiOJHE-#wq50 zzU}`*gcCWJ{g35nC1T{a6a85UXBfU3(hKxbWkYJqoX0Ks*>*|Ibov{ANiFQZK`Ort zQ>%qD?XDml&0+OCN)l5D;Ju&p98kj_+z9#TH*P_9Lr2sBDS$~x+=g(0oSm4e0@U!O zyvX;vs|EAv!`jCch}X~va)%s&=I@X*$}JX^h&YG|4t${ZotB{dsgDN zr=%H(U`Y}YU1)QM?fdp09X}IjSAx;+_Cdo?M&6sN+M{Uyk*rXe0^2!C4W^L3lAV_X zUiqEuuMpNQUTJs)-4L#1sRlWi!faQA=!;jne;63Fb>;&REk;#?(MDbQzzrwYFS``D z&4~ebPD~Q9ewGeh&>np{n_eS`-98x2NjWnoMZL=oT6p{4vGTH`7x?F-ICUe4{UnZV zspySzulxtdud_!Z_(kz+uK6_wSlj<@uQkN@Eomq z9%@?t!SaE1@dPcn0!gNb)Ou_(8tA$gU|;pQ@Vlo)pQu%#_=0K0R%dMU%=lyRZ1vCd zb6Fv*H6rYrngOfY?*=ohqzW@#vwag9{U`R`#(4oS#pFYK_%7<90=y5bO(i;yLgP-| zt+wZzLZ_2e`j(%+;Ty<2aE!OCr}3Z(DO}ZVC9v1v4o7WTY~??qxa^;#rJKKtuG#d} zt)s2pP$8DU&j1zrX4Ldtnw}bShTTVl@k=+rX!?MIWGwK#8+rjx>KWLDuK5-)rQpqf zyb2I-NZ&$ulbNJ@;&Ng0m{?cB{^U9~JOqsF&c9R9-B;26wqF{`NV@F%!&AY%)M8}R z4y~%U#@?6}%QsFz9sgVa@Q8o+CEINo1H#>M|TJyZR%>92DYkN$TyLV9U~WJREsQ8Tmz zTNb5|TB>K7HgR1jW`k_5Tais#Yw3~{6=SzCL$Mj01S0-FIay*TAX5G>sR;}GLKi2& zFcjyPRF+qimlYHhlonN%l~k0Ll^0c17FQQml#~`1739~Jm6aEl6c&`1R|5G=dfZ5H zY9GroCeS@^A_wOCDDMF#Jj{(r4S0Vq|3FoTSZRms0-OPfDDlX#%+OeZOqhkMhJImk)UM@tyy-<-B-HmF`?42CigFlR5Cot~ z=IwuCRam^#Vg@mPO&?(ljSdn4t|Nk~)B<4cx^rZ}bCpGUXGcT~;!s79?9u{bA{ZJc z1bt7QL*9Vd_%Wh?WB14JlWnoeC6`<4QbPFSx7Y68BJzUl>aWi>En$xoO0noWW}$ zvsnDtl>au{r6F$DLRQ~aHGp#<*ffGn#~#Z`g%D$heAi0HZM@DoG}<7fKnN0RrMpUB z(}WcOphy3RX=`o#$&VlgazqBz2SN8jfWWh}>G8mM@%IAD_+I=+hh9Osh(e=WIX2E) zJ3};ci1k>7Fwp)VXT4v574({T_cF<|>wlXR2RhT;@GcCQ@RjeX&LQ0*>9k#BBp6FD z8f}8Z%KfN_N7MQKt;_vK^_;n#m+`sfuxSTo(W^^dPM>9DS95}n3OWmy%dc2qyN zDk#KW{fT_|mFaZzt+ju-NXvqP7$UQbR0p(W)15gTVOSO8;7BbQ`yNyMJ}ee_zYV5X zwE_vm(~<+CKq73)uM4{A$>EQNMt=q%&vSYl$i{5zCM^bgaGIi17Bd97p1l^v~S{Al>T#&8ry|t0yl-91^)KB{)Opa)1 zR^uZpvdLRJ91?V0_TNEx$qS3udt5T&RzK|I`hDU0yWVa+FB|mnoMpzT#p%g0ubgS} z1XwJUisSFZpvx36gH*&h{z~A1LCVr0zubYI;>OpC&Os6lXs21t5L>r6M*0GZE+%rC zV&lQno96Ctzd*Pl9m|;_?2QA(XsL;s?Dw+g`gX7J78#@Q73gl9aqs1e)#}z)(`U}w zf>dg~yvFU{od!8vR%P|6UXD(_S$%DZhHA#qC%ex1G|~U7IMB$zuYo8scB)Kto-?=cgNinaiGXlrd`5%PH191ng)EFR^*68zXpK-~hoAyBb0UrL_ z(4+sGg$iv|3o60gHU-?F!5p8epSBQZSW9n&?3>e{_!iQYKj{6aKH=!&}(c6$-0gL-Vb&pd59bf_k|C;;t~-sgL$xmZgW5pk*6cr-9b z`WWQgB*(vK66ca0(EUTAnveq`gE(>g-k(1N-~6WqRe-{<|?7N_-#MFbChw=KSS z!dh*1UZU6iF;Bp6Ir^G1#tVgIe7%P#hu4+XMrGtpu`ou<{3{$PDN-)8@mlX+6DhKI zeVc(M`P1zo-CL1>TF{=>VvySw2K3GG4wwkIMUT^Sgw0%u-9~_DhsebdR3aG;NJl2} ze;Qc(5k(U39?PngDD}coMag4d%RI^maz+ng*y+^dn!O3Y#zAdKXLoY1Y`HQkNpt$J zFMsYI1cjbbBsB{CIGDHk+o2U3GaYl4PsxSvnD(N0dzrYfDj1E_^)ZNw z{#yNI>=(-EmmEKUhLU#a|57O_^>U5!LpnL9Lw&u+T$9e#O}?0ARX|;26cCT zW%WS^Dyb14Sew_5!Aht#IXo86842ou7IhJQ8>rVTbe#!zqaX=beeJK8q$)BnTV3tlmadRa^YNWeJjqK=2_`s!2)VP3 z2=&DnL_%8lGan#n&@V;t<=dt=tL0=e+z3S?O$?wC9{X{blyfz~^GtaoRX?+I;n>-c zB)Y!hMG#lfMGu(ZMcXW35|r6JzeUJV+d++lck>RSukpW|`9uq3I;SPRuN= zqo_9C?P`!jX#aDF^T(0ykA)wPAnS(gtW%U=Nho71Il{gwiIZ9$q%sOh41xxdz_GZY zQa#v7ooOIv5xJKmIe{hw9h=d2L;&Ph9&)1b)woWVGk1LoIR{oy!!nKNjX0Js!P(@P z{W${#Lw!6Sp7PJy)fX1fJ9iuV?`w=Dw}=P&fb^c1^MBj4=PHcl&!!zCpZ9e+!aY3A zbMBux>L&A>j*DF8zz&~pW;+e#h}>&NMNb^f-gU-xAjU6~ArP1LoPVlB>?(;?Kr`kY?f(CD8FLPx?Sdu`>SS_dxs<3n zgT}^&RE{&BfSI8Oi*xO4&#p~O%R=RkY;K-Rg<=2k5pxyXk?Lw|aqQD!X)Dol|8?k> zPdtA{@9d@$iMtW+zC|Barv7mHu0M&o?fv&>_kG0;dX~w5-CuC-4B}T?hK?vDwHpGQdEhJB$I${z z%LL);fi?@n}NG^%Z-?bJ-Yd&cA8yO#4ilMtz!!+FU10Pgc!T_d%fA zqqz5ckWN!AV#}j8QD8)EY`?K?Li7$F=aJ;eD(1T36gqz~vtef_8@^ke{?)TA9J2TY zBdaqoU+zGDY!6>gTxRCKRqRS#pK5A32$v+xi}G#Z3Knnxz#)1TcIpz0vH}@W&>go3 zx<3L4es+KcNHGz3Kr42M=VB5MBDoPDN;1AlxS)m$GnRL!6xTws*1G*b*vIHi~XFh7FSfQ4Y-9Vx&=^}Kn7_9TqDo& zVTKs9TC0!it^lSO#$*8bB;S^qLxC2YgDI}2SmBW1IzHv884QYVZb4W(Y7Z@%Pqtvy zUl){7GbniyTv0LR@fDv0B1vPYkbJLIwrgZN@?mUTMJDuhIUGCl@i$I*Khk%lM&Pnz z75M7N8aj}rcjyECsu@&PrY_5z)IiqABYzX=j@&s!);wbP>BJU^_6s%{Bj(MM&dIoh zTsnvY*w9Q*^HN>dK?7yrw#&T91QGeqf;c3;xM2hH&OyE+ywiTW=;hzNjSyzULiP&s zUKJ?UBpYQ=**LEamoa@TcmjG)UPgL`=RY|3-oLW1ZyZ|0#Lj`nwEzEN6gtz ztShD^A5nwP-hJ}%ukzYEe@TIB{K!F#iXV_<%MN5w2yf8sp>859XUW$%giWm~dqy0d3xP3tpr zbL-IVkA`?H$!tW)zfA$>xCHKNOB$~>H~vD!N@H1{=uaz_x5i!!xS?$wb{SjVreb4j zTy>-AQn?2WuGXW%32v;ENI=Yyc*;XZ2qu{brtd7P+vz#kgaMnrM!jerjlRF^_Q z1I>V?gDO{cs$slN$)$SnX=&Pxf&wG6M!es6w0MZK?y(v0xbTc|=wUlykXR>971F&L z4I`_tBY8Krus+QZCM;C9;H_lW1!9xzHrLbIm&Avx@s97ol4_Yz%iqS0`?3CD=sxcW zmZ&6_ZfEVLdyKzOp@I}sn1#tEJGT*}O?_gd$%FYH{;NGs&8ZnPq+J-eMk2ShK??_A z&>{~kQqn-iK}`cbtRm3EGoYLG&6hyh72H}5+F{r!T^yDVm0Q+m%ala6R)I_3@VL{~DUPr3ug#F^mR0FlJtT#w6JrDl)WPoPwDYi{JrqPapp??e)|- zt-g&GG3P%h&yNXEC?N$<{T{gxy<(ZTauFuIX4CBQ5#`}jKho2g*feKKkNR9vRVGf2 zLQ~87jM+i+x)d(@PT^21rjKuz#t)R+I`9N`a~1VP|Ivy?Me!JAx-t#_tCwdr{Jy4M zXvl#*ptC_w9!FH^{e&lJe<#O>OxF0h_$-YvTzhDm8GgrL49S0O&JZ zyjCzonOY1_!}mz%x-nEdRMd45dHTF*68zP?{jAA(P1bz#YN`3*rZFd%4B?@`66wkP z-uisMXo7a^z>7kd92Sj`>SE%YSt->YQSGY?gWSoTG=wW2B*`wnq9N&L&+LlL-w8d{ z(MZYUdaTc~Br!Q;qRy% z+Lz54aS=rEjEi1d!XC6C3iAU;u`hFWM}W!LL&0kNKd_b(CqG5vspfk}+LX^8_PV^g z)if|$)#r@*;XXboG?kLwiLDEU+Ca8x1z!4bW%Br5aC5D@-px!3!i+}i55|T)81LP< zN)u?3RjvOXyH0)no_jqVxo&VpQ+q6aC?QQF0v7lv-rD1&6lS@@+CRm9E_r!xJWjYa zgs0$zCIY!JcUS{Bk8{`ItudA4n(!&XY+K7tdO8MF)!-&CK`e$J`Qev&jcNHy?h?Ry zoe00P+}nk!zc$J5oB*3(ch5w~$^_mHEi**_6-vzZu9D_zLA&*zmo?NBfhYZ&W%S7E z&(r7bCBQjgN-i<1z5F{3|2-X7w-H5$4$_jfL4jVBiXf~BF1)*ow48QVAatvrI<6AJ8hb1;huD`%)UaKqL6y0EvPIw|b2B1?Tb2e4J|v-+*k;*rl#QNCnzq7{))Ssls8%hp`$YpFb~1NR+~S699T%F?RRf zCNie`I{n9~hYKw$PEU8v4SD5>+&LCmY%-ts*A1(8leKH%>7GBB;13h z8yb~y;bP=-N^Z~E&hPQxK62^by$`WtLyM298vGnKscK6GZPodS{46YTId8ZbBkhbN zq4{m^)^SA#9Q6VF7J`pr<7rwp?F4_`3!QL#FLRr24eXdAqQ)&)Tx13nlqt>mi@%M= zH~bhYNi?K2YoRmbHO0l$1&-R&R^ea0nxZU^)uc3>jOjxK^KsEf;*L z`fYiqMS-sHW!$hqZ&id}T0y446L41X@gIm=N;}nCoN!1C+H)|te}^i+*#jN(W+fAi z0mui`?eL`FJ$69E;`>uBMR4BaHCG-)eq}^K_WG)_ih6{rn4ziO83EE^^3LaC*Ia@h z1y=48u)@*4l7?NWjmDx*&!2Upsw_^mL(*-3q4pfJ^mIJ@nHk43jZ9!3rg2#jT_>+( zHGH7{Qre>Y!@WhuGZ!X-H(v~e4UE=@9Yr6^sG_Lnt7OHY!g!VBMdBYeP8)$K8JfB*h3%R?IAXhu2 z)cv7?{v+C$@rPs4Vt-UtiByngY4 zugfIPPB51M_3~~&VmrAULUt4L-NIQO{7O|vykJ9R-4tlxofy{0x`W2p4FL0U;DUQ> zkc}G~4oM@b18R`JeC8@bJBwU}~= z%A+UUF);a@T0sgPo;8bWqU+$(&R%@wnX8N7gPr%!-0NyPKF)&-un|0vR`1l4cH*(C z`#^Dz5kXKE8Z_{L;;;yyZ2&47tHijDRoe`E=-2G@KCdDl4V}9P$vZfo9xo%Snv@oe zW2yf`kwTkqsFdg9+;v_?XoV&&?8JZgUCrd5Yzuz|Rw3ijrG7J^RyiqD4l-{9yl+yg z-}AhU5YzpqcR{4_4T{iTcd;%ch40_C>NH#gM2p|(q^u6t7df{BE^KP05M3IKA9j}P zmn>IBJOXUGkF_i1s|(pTD)GQT2wGW&MqN8j?)b>ynFi2UzPaZ$Jx|^kP4ule@O9;4 z5YSF*{ewJMUeLq*G@y+yyoe|}Eq3J(v#`01RKwy)E)rhxUbT`#tPd3o@Gyx!EU4#$ ze6UXcD3?l6r82GiP&}0?n%Y{r%XJvGsOf7j80q8T9*@k^C-<4#x&S9wXLeUxB*K3zf2$i$Bo? zI;LB)P^}FyA8HZKjnJsC_}5eg8S7p$0^J&V=PUQ^3q?ec3wJzb0$0cu$IoRoi?93; zOBZxy7`D&NraR$nv6SOR`515+OQ~;ub`}?kaL3p=j(^^Q{(C;qX1BBLtc!M1SMJL@T^GQI+rn}B+Z;~N&x2g{T6!a(wQ5OUY>Q=$0 zlmeUyk3l>SkI?x@zp5j*`1Zpf;tsIRcNZukznWLUwL34G2QO8-RAu&XmXi`O$BA6p zQ=QXDEATjuT$g$1#;nMRoIOxz`qcA#-;qySM^mWz_JstEP~30Nl%PNo!Z(H0!-sp# z486|>vp!kj?eb?|t8rRLFE!^7JfLP-q*3d~h2f=z~)^#Gp_ zberm%Bv~g;^pGmBPDoghQ5+A{RSmp-@}?L_*16$CIk+gZ+g3KuSfkSgOMx=ZyY5(? z;qi)mmfRk`IVSTjEQI;Lzn4(I;3S>TduUAZjk=9+v4?ZS$B4+(-n_5;=egIpRZag@cMuh-`mtvy zOny&86~?0G+}nb_s{ciZYUnwzV1XY-!{no1^1EU3FQGCChFh3x#wJk(0<*&ARp&k_ z{UC4X6UOhfZi;c;Gfr|IN))lrO!3@yCsm4VdnuB+wObucH}{!#?#mTp!_tAS8!n32 z3*L1gA>HlkBi+xM05odueNnM7H!c3?X4ns}!v#~+o zy3`7}rWYp^KqcySk9qFRGZfk$2FQo)eZGh^4pz#4F^7z>gy{`||I!F7Rrt2r{{c__ zenNMP$e1zT{ff1yU8Fo}&K^u8K7eU4Pe9<Nsc@q}6!H!T$bOMv$)Pas^nblZBzzYpd zlf`NAVOoxAi%SOlIw>_ObP$6-OXpQ@peJMXkbuId;Dd4&j@%Ek^n7y98lvTRJToEryzt&?cVx|BA6 z!=(}ur?$3J{rCILO)Js=_uSzxY$XXu_&h~Wk8by%C*JVl0`FncM~v(m1L1ZPn3K7Q zfqIcEp`yE_s5|+vc!bOTOZjnI5)ev(N&J`PnpiD{%8JLU*&%pkwxGwya6t@ReclT8 z9$i~DJ-SQq&^><>MW*;~GAeX8lLT46RbvdSTxu{Hudnc4YZPq^8GaHSM64UD#LA2A z=Y)UUV&=qmv0BEt6w>?EjlahkZ^&8<@hP9E$VgzR|51n*)>EYeJG!~)i80O)V^dSp ze-YOdz~g#V(OU&37edKfz72`$Z0gFy z626I5-`4UM&Bjm=H9H4Rmj#r5Uog(a0`)s1DP zwT;!yl{GEZbybx)vfb_4Mh;OuJ1=N?n9_*X z0_}1%09U6|{N%mM^*l0hD}xRJdago5O+6a7 z5_I#?V%Sf$+aPjR;Mb^lYPl%s!(?|!y<&prFC$w2loR^%dU{gus8~)*sYTayQ-QGP z(0V$|SNpP7$|mvipgFO)+hkxhe#=s60>3fTojm@Cey3J~a6#i0d}^IkxlzE1S*62~ zzK>mlxBGw$rTaVC^&8equjOVc@qX*<*ca+QU?bVh)5060=UKclu8$_8$9PbOY;8*n zP6nDt);(xL+Dp$6X*0S*#gmHQQc1uVi?sBP3*yD@3F6x+7ArSqw-v#{(N#b!L!01# z0Wqo)#Qgv5x3Bt29P-R5r*A~E!YhzBV4JWN(tTUpANvG8BV(Nv=iEg3M*i0wYv#CA zHLMzshp4ZK=i&9(M5Fyk@zasV-zg&4B$lIy6fwA1B09LBe6+CnB9}M_H4MPTk+-`; zUq1ayUFag-``*j>4ZY0wKU5GTZ0yOHY~O%?c~a9qqEzd*6qf$# zb+YM83YsSb*Mp6ma=6 z0ZfPD`t6ly4AjWpMtJKpYF2N%Hkvx%w`y#s}W;h$?fOar1&4H7~(B@D#4%ht;$DHXC-tTj*3ZAT#a(ppBFnzkax$!5 zG0MYkeRAtks$IrhlDUmA6am z40BKiwOUjAPb|o$Q~QvGXA6a-E9cCIs;x0)DE2G0!{|=QFFKu{bJ?eP)tAuSP1~Y( zCJoxj?=y$!9JA8x+x2=P4m5m6AJ&Adryh`=-&M;!W1yeo<}DrCOc9ZP2j_y^gm?vC zr7>FdUam2RgH4JwBOLzWe4QxNp~<&2rtN*%qq%+Vb01I7G0l79M>rk*yo!BfZsi=FMw+ zu1RZR3<}sf#I)TRR^r@e$E+>1&Rr?9rSHDDVnr`dd82m)ID>F7B7EpZk5sokH3f{` z_X5^BQ_hwwM>HAb5*J+a;W0e^36b2EkL@>G#PMj)dT8rh3~%3+?j;d6##d!wY$GXQ zU~aLo`uSb^FQJrZRO#eWuOmLyk}->R?KV^wkESpBw4(<@$|=!^dGC6-HsU0lVJdN9 zOE}67Z_d8m#yc$;h(d{jHLamcAl_)Y8+{86865ij(6@jbR)`{~tQ1ri&x#KZIG2+P z1gSFD&kJ8^oDbkaGsXnl5E_^XC^y*rnTA;@CSup*6Tm+dQ1cue)hn;oAo%S(tAE0N z*`Z;YI(?&qkI`LqJ<)Z6mh^K3DqI;WD$#zsnw67%Pq06`tyAjl<$FDbY<$3Gu&ox8 zOa$jMUUZG6p?+b#$)OYbSk6#d^F#u?@NW(FWk12SWDA=zw=C1h5MW@HM)3YfqgBVU z)@D6bq~CXg(f^rVWN0J@DQF1?WPRLXmW+!;GskYKyW3=Bmn<}ar#F9Dlk|e-*NKzg z+n4gg7@Fk801uDV2&Q~Ud~J1=IkCSX99F%x@SHc{_rqgl&yNiv+Tu(DqwLH(e)uL- ziM91=#Rfx3t)Y(TStXj#6>~gzFT3H5@hS;(+uEd*{mE(D=e#dATy(MaS+=4^8xD1y_(m%nT(a~Ad;-hP%65pKG3Hnoxn@V z%q}!v%CB#H-^gsXY15l$Iq_Y@X51%tf69X3iRP`m%O`J=pNqjRNH`)$Mr z!=Y*daf_qY!2ufqXez=L{LcplqPYU;vvtyr8Oi4lW5^YspdYVB*m)WMg^c25&hi_#Y=W1jz@@lnbUe z%{h}0}NJa|O0tDfNX4#J)sm>r2< zEq<};cdUe-!ONqHIC38lO27L)!z)dR$4h9z8Lc@{_po!TTKsnG4zXY%7?Se%4&To^ z{QFBRItRpm$6E|!9!IKFWHC|ym~n|(Nzu)1w=1Z0u2|EdONu5dRer3n-blS-;Tau

q@an!Ssp+uO@$35$k}ko1Y_TJ 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 q3Pd6?HZTUPnc+i92rd|t`u_pqfJR#C| z%WfQ16h+s$_f}PxtGnHPB$ya%Bpv}V;4xqZ68QllF+}16GRemv_yC58LFPzdz#K)2 zKoL(^ehjvf%;6d1(7!6!FIKO7x9VrV#d ztm&)I`vdEk0!a*n9;`#mhaX>g^1(+}764*+GX@4?XpW8@Xaba%j!LotO$>Pbzmyx-uZcMW zl*6R6`5|7%>_7Jg$Qbkl)j&!mz0X)IFCiw8r0D>@xOH3I8KB5(K`VOih{@4(5!1a$ z-58vU>})rz>K$T)y`6i-S?;_+2##`a7s0StKvf!|R)jDk&sVJ5DIh39+YQfRoHxkq zecJ9FdcUG9bD+nXIiu0@AeQ;EWjqwDNqB!A`?o<|U&WXPD@)evUDmCmuM5=IXzCeP z*)zLh2p0icv zt6m@(hcjEK1>|KGE7%(D3Viopz}~}e@F7umC0%p~&~zPH+2OUssE}JQM%Z%gc>}q7 z=jI%c_OAz{a(6}VUmHC1jy>u3G>A002ovPDHLkV1nPlL8$-$ literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_bells/textures/mcl_bells_bell_top.png b/mods/ITEMS/mcl_bells/textures/mcl_bells_bell_top.png new file mode 100644 index 0000000000000000000000000000000000000000..d018844e979f47a6bf50f9cd584b0b8ee07fe4d2 GIT binary patch literal 656 zcmV;B0&o3^P)7jym_0wld{PA1jv2H-r!N`yElI#053GQSt{qpw&BOXO`ueZOf<#mI9Smrt(f7 zoiP%@FM!g=Gv;vuai%E~Y()G@#05)dkY`#uP~Gt%gb#ug$RQX zdK-v#2*GSYBqKVJvypA!4iTRO15;@bjn;rLhHs3XNHzh1NTRlx;s2moC>9_u^qx45 zH>{L{+CG4#!yr$aAGQohyn+}cL^VeD$BBB_x+Jv zz96FbFd_yyzak-^CwyEGeL(oHx~Q@r72=?j4NLZwWB-d%1WiAP_{tcLm7U)9aGzPq z#_%MygQa(1CMDshpuJsVT`eLEl}gepM-5uN6CN_pNg@tfe?p~lv}ba1rb$_rb!g7c z7+(i~;87tOeY}Xu9gztiJ4oVoe+VCX)p^?f%-KWa3vFb!TS4TRX%bSZ q)YgGBV-&!6SU+%gdOvD}%>M#EHfDj-|GowQ0000 0 then minetest.sound_play("fire_extinguish_flame", {pos = pos, gain = 0.25, max_hear_distance = 16}, true) end end, on_construct=function(pos) local under = minetest.get_node(vector.offset(pos,0,-1,0)).name - if under ~= "mcl_nether:soul_sand" and under ~= "mcl_blackstone:soul_soil" then + if minetest.get_item_group(under,"soul_block") > 0 then minetest.swap_node(pos, {name = "air"}) end - end, - drop="", - _mcl_blast_resistance = 0, + end }) local old_onconstruct=minetest.registered_nodes["mcl_fire:fire"].on_construct minetest.registered_nodes["mcl_fire:fire"].on_construct=function(pos) local under = minetest.get_node(vector.offset(pos,0,-1,0)).name - if under == "mcl_nether:soul_sand" or under == "mcl_blackstone:soul_soil" then + if minetest.get_item_group(under,"soul_block") > 0 then minetest.swap_node(pos, {name = "mcl_blackstone:soul_fire"}) end old_onconstruct(pos) end ---[[ -minetest.register_node("mcl_blackstone:chain", { - description = S("Chain"), - drawtype = "plantlike", - _doc_items_longdesc = S(""), - _doc_items_hidden = false, - paramtype2 = "facedir", - on_place = mcl_util.rotate_axis, - on_rotate = on_rotate, - tiles = {"mcl_blackstone_chain.png"}, - inventory_image = "mcl_blackstone_chain_inv.png", - wield_image = "mcl_blackstone_chain_inv.png", - selection_box = { - type = "fixed", - fixed = {{ -2/16, -8/16, -2/16, 2/16, 8/16, 2/16 }}, - }, - paramtype = "light", - paramtype2 = "color", - walkable = false, - is_ground_content = true, - groups = {pickaxey=2,deco_block=1}, - sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 2, - _mcl_hardness = 1, -}) -]]-- - --slabs/stairs - mcl_stairs.register_stair_and_slab_simple("blackstone", "mcl_blackstone:blackstone", "Blackstone Stair", "Blackstone Slab", "Double Blackstone Slab") - - mcl_stairs.register_stair_and_slab_simple("blackstone_polished", "mcl_blackstone:blackstone_polished", "Polished Blackstone Stair", "Polished Blackstone Slab", "Polished Double Blackstone Slab") - - mcl_stairs.register_stair_and_slab_simple("blackstone_chiseled_polished", "mcl_blackstone:blackstone_chiseled_polished", "Polished Chiseled Blackstone Stair", "Chiseled Polished Blackstone Slab", "Double Polished Chiseled Blackstone Slab") - - mcl_stairs.register_stair_and_slab_simple("blackstone_brick_polished", "mcl_blackstone:blackstone_brick_polished", "Polished Blackstone Brick Stair", "Polished Blackstone Brick Slab", "Double Polished Blackstone Brick Slab") --Wall - mcl_walls.register_wall("mcl_blackstone:wall", S("Blackstone Wall"), "mcl_blackstone:blackstone") - ---Redstone Things ---[[ -mesecon.register_pressure_plate( - "mcl_blackstone:pressure_plate_blackstone", - S("Blackstone Pressure Plate"), - {"mcl_blackstone.png"}, - {"mcl_blackstone.png"}, - "mcl_blackstone.png", - nil, - {{"mcl_blackstone:blackstone", "mcl_blackstone:blackstone"}}, --- mcl_sounds.node_sound_stone_defaults(), - {pickaxey=1, material_stone=1}, - { player = true, mob = true }, - S("A Blackstone pressure plate is a redstone component which supplies its surrounding blocks with redstone power while a player or mob stands on top of it. It is not triggered by anything else.")) - - -mesecon.register_button( - "stone", - S("Blacktone Button"), - "mcl_blackstone.png", - "mcl_blackstone:blackstone", --- mcl_sounds.node_sound_stone_defaults(), - {material_stone=1,handy=1,pickaxey=1,cracky=3}, - 1, - false, - (""), - "mesecons_button_push") -]]-- --lavacooling - - minetest.register_abm({ label = "Lava cooling (basalt)", nodenames = {"group:lava"}, @@ -300,9 +203,7 @@ minetest.register_abm({ chance = 1, action = function(pos, node, active_object_count, active_object_count_wider) local water = minetest.find_nodes_in_area({x=pos.x-1, y=pos.y-1, z=pos.z-1}, {x=pos.x+1, y=pos.y+1, z=pos.z+1}, "mcl_core:ice") - local lavatype = minetest.registered_nodes[node.name].liquidtype - for w=1, #water do local waternode = minetest.get_node(water[w]) local watertype = minetest.registered_nodes[waternode.name].liquidtype @@ -317,33 +218,6 @@ minetest.register_abm({ end, }) - ---[[minetest.register_abm({ - label = "Fire souling", - nodenames = {"mcl_nether:soul_sand"}, - neighbors = {"mcl_fire:fire"}, - interval = 1, - chance = 1, - action = function(pos, node, active_object_count, active_object_count_wider) - local water = minetest.find_nodes_in_area({x=pos.x-1, y=pos.y-1, z=pos.z-1}, {x=pos.x+1, y=pos.y+1, z=pos.z+1}, "mcl_fire:fire") - - local lavatype = minetest.registered_nodes[node.name].liquidtype - - for w=1, #water do - local waternode = minetest.get_node(water[w]) - local watertype = minetest.registered_nodes[waternode.name].liquidtype - if water[w].y < pos.y and water[w].x == pos.x and water[w].z == pos.z then - minetest.set_node(water[w], {name="mcl_blackstone:soul_fire"}) - elseif lavatype == "flowing" and water[w].y == pos.y and (water[w].x == pos.x or water[w].z == pos.z) then - minetest.set_node(pos, {name="mcl_blackstone:soul_fire"}) - elseif lavatype == "flowing" and water[w].y > pos.y and water[w].x == pos.x and water[w].z == pos.z then - minetest.set_node(pos, {name="mcl_blackstone:soul_fire"}) - end - end - end, -}) -]]-- - minetest.register_abm({ label = "Lava cooling (blackstone)", nodenames = {"group:lava"}, @@ -352,9 +226,7 @@ minetest.register_abm({ chance = 1, action = function(pos, node, active_object_count, active_object_count_wider) local water = minetest.find_nodes_in_area({x=pos.x-1, y=pos.y-1, z=pos.z-1}, {x=pos.x+1, y=pos.y+1, z=pos.z+1}, "mcl_core:packed_ice") - local lavatype = minetest.registered_nodes[node.name].liquidtype - for w=1, #water do local waternode = minetest.get_node(water[w]) local watertype = minetest.registered_nodes[waternode.name].liquidtype @@ -370,161 +242,61 @@ minetest.register_abm({ }) --crafting - - - minetest.register_craft({ - output = 'mcl_blackstone:blackstone_polished 4', + output = "mcl_blackstone:blackstone_polished 4", recipe = { - {'mcl_blackstone:blackstone','mcl_blackstone:blackstone'}, - {'mcl_blackstone:blackstone','mcl_blackstone:blackstone'}, - } -}) - -minetest.register_craft({ - output = 'mcl_blackstone:basalt_polished 4', - recipe = { - {'mcl_blackstone:basalt','mcl_blackstone:basalt'}, - {'mcl_blackstone:basalt','mcl_blackstone:basalt'}, - } -}) - -minetest.register_craft({ - output = 'mcl_blackstone:blackstone_chiseled_polished 2', - recipe = { - {'mcl_blackstone:blackstone_polished'}, - {'mcl_blackstone:blackstone_polished'}, + {"mcl_blackstone:blackstone","mcl_blackstone:blackstone"}, + {"mcl_blackstone:blackstone","mcl_blackstone:blackstone"}, } }) minetest.register_craft({ - output = 'mcl_blackstone:blackstone_brick_polished 4', + output = "mcl_blackstone:basalt_polished 4", recipe = { - {'mcl_blackstone:blackstone_polished','mcl_blackstone:blackstone_polished'}, - {'mcl_blackstone:blackstone_polished','mcl_blackstone:blackstone_polished'}, - } -}) - - -minetest.register_craft({ - output = 'mcl_tools:pick_stone', - recipe = { - {'mcl_blackstone:blackstone', 'mcl_blackstone:blackstone', 'mcl_blackstone:blackstone'}, - {'', 'mcl_core:stick', ''}, - {'', 'mcl_core:stick', ''}, - } -}) - - -minetest.register_craft({ - output = 'mcl_tools:axe_stone', - recipe = { - {'mcl_blackstone:blackstone', 'mcl_blackstone:blackstone'}, - {'mcl_blackstone:blackstone', 'mcl_core:stick'}, - {'', 'mcl_core:stick'}, - } -}) - - -minetest.register_craft({ - output = 'mcl_tools:axe_stone', - recipe = { - {'mcl_blackstone:blackstone', 'mcl_blackstone:blackstone'}, - {'mcl_core:stick', 'mcl_blackstone:blackstone'}, - {'', 'mcl_core:stick'}, - } -}) - - -minetest.register_craft({ - output = 'mcl_tools:shovel_stone', - recipe = { - {'mcl_blackstone:blackstone'}, - {'mcl_core:stick'}, - {'mcl_core:stick'}, - } -}) - - -minetest.register_craft({ - output = 'mcl_tools:sword_stone', - recipe = { - {'mcl_blackstone:blackstone'}, - {'mcl_blackstone:blackstone'}, - {'mcl_core:stick'}, - } -}) - - -minetest.register_craft({ - output = "mcl_farming:hoe_stone", - recipe = { - {"mcl_blackstone:blackstone", "mcl_blackstone:blackstone"}, - {"", "mcl_core:stick"}, - {"", "mcl_core:stick"} + {"mcl_blackstone:basalt","mcl_blackstone:basalt"}, + {"mcl_blackstone:basalt","mcl_blackstone:basalt"}, } }) minetest.register_craft({ - output = "mcl_farming:hoe_stone", + output = "mcl_blackstone:blackstone_chiseled_polished 2", recipe = { - {"mcl_blackstone:blackstone", "mcl_blackstone:blackstone"}, - {"mcl_core:stick", ""}, - {"mcl_core:stick", ""} + {"mcl_blackstone:blackstone_polished"}, + {"mcl_blackstone:blackstone_polished"}, } }) - minetest.register_craft({ - output = "mcl_furnaces:furnace", + output = "mcl_blackstone:blackstone_brick_polished 4", recipe = { - {"mcl_blackstone:blackstone", "mcl_blackstone:blackstone", "mcl_blackstone:blackstone"}, - {"mcl_blackstone:blackstone", "", "mcl_blackstone:blackstone"}, - {"mcl_blackstone:blackstone", "mcl_blackstone:blackstone", "mcl_blackstone:blackstone"} + {"mcl_blackstone:blackstone_polished","mcl_blackstone:blackstone_polished"}, + {"mcl_blackstone:blackstone_polished","mcl_blackstone:blackstone_polished"}, } }) - - - - minetest.register_craft({ - output = 'mcl_core:packed_ice', + output = "mcl_blackstone:quartz_brick 4", recipe = { - {'mcl_core:ice','mcl_core:ice'}, - {'mcl_core:ice','mcl_core:ice'}, + {"mcl_nether:quartz_block","mcl_nether:quartz_block"}, + {"mcl_nether:quartz_block","mcl_nether:quartz_block"}, } }) - -minetest.register_craft({ - output = 'mcl_blackstone:quartz_brick 4', - recipe = { - {'mcl_nether:quartz_block','mcl_nether:quartz_block'}, - {'mcl_nether:quartz_block','mcl_nether:quartz_block'}, - } -}) - - minetest.register_craft({ type = "cooking", - output = 'mcl_core:gold_ingot', - recipe = 'mcl_blackstone:nether_gold', + output = "mcl_core:gold_ingot", + recipe = "mcl_blackstone:nether_gold", cooktime = 10, }) - minetest.register_craft({ type = "cooking", - output = 'mcl_core:gold_ingot', - recipe = 'mcl_blackstone:blackstone_gilded', + output = "mcl_core:gold_ingot", + recipe = "mcl_blackstone:blackstone_gilded", cooktime = 10, }) - minetest.register_craft({ type = "cooking", - output = 'mcl_nether:quartz_smooth', - recipe = 'mcl_nether:quartz_block', + output = "mcl_nether:quartz_smooth", + recipe = "mcl_nether:quartz_block", cooktime = 10, }) - +--[[ Commented out for now because there the discussion how to handle this is ongoing] --Generating - - local specialstones = { "mcl_blackstone:blackstone", "mcl_blackstone:basalt", "mcl_blackstone:soul_soil" } for s=1, #specialstones do local node = specialstones[s] @@ -537,16 +309,6 @@ for s=1, #specialstones do clust_size = 3, y_min = mcl_vars.mg_nether_min, y_max = mcl_vars.mg_nether_max, - noise_params = { - offset = 0, - scale = 1, - spread = {x=250, y=250, z=250}, - seed = 12345, - octaves = 3, - persist = 0.6, - lacunarity = 2, - flags = "defaults", - }, }) minetest.register_ore({ ore_type = "blob", @@ -557,263 +319,35 @@ for s=1, #specialstones do clust_size = 5, y_min = mcl_vars.mg_nether_min, y_max = mcl_vars.mg_nether_max, - noise_params = { - offset = 0, - scale = 1, - spread = {x=250, y=250, z=250}, - seed = 12345, - octaves = 3, - persist = 0.6, - lacunarity = 2, - flags = "defaults", - }, }) end - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_blackstone:blackstone_gilded", - wherein = "mcl_blackstone:blackstone", - clust_scarcity = 4775, - clust_num_ores = 2, - clust_size = 2, - y_min = mcl_vars.mg_nether_min, - y_max = mcl_vars.mg_nether_max, - }) +if minetest.settings:get_bool("mcl_generate_ores", true) then - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_blackstone:nether_gold", - wherein = "mcl_nether:netherrack", - clust_scarcity = 830, - clust_num_ores = 5, - clust_size = 3, - y_min = mcl_vars.mg_nether_min, - y_max = mcl_vars.mg_nether_max, - }) - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_blackstone:nether_gold", - wherein = "mcl_nether:netherrack", - clust_scarcity = 1660, - clust_num_ores = 4, - clust_size = 2, - y_min = mcl_vars.mg_nether_min, - y_max = mcl_vars.mg_nether_max, - }) - - - ---This is in progress - ---[[ -local specialstones = { "mcl_blackstone:blackstone"} -for s=1, #specialstones do - local node = specialstones[s] - minetest.register_ore({ - ore_type = "blob", - ore = node, - wherein = {"mcl_blackstone:basalt"}, - clust_scarcity = 8*8*8, - clust_num_ores = 28, - clust_size = 3, - y_min = mcl_vars.mg_nether_min, - y_max = mcl_vars.mg_nether_max, - }) - minetest.register_ore({ - ore_type = "blob", - ore = node, - wherein = {"mcl_blackstone:basalt"}, - clust_scarcity = 8*8*8, - clust_num_ores = 40, - clust_size = 5, - y_min = mcl_vars.mg_nether_min, - y_max = mcl_vars.mg_nether_max, - }) end - - - - - - ---Biomes - - - - minetest.register_biome({ - name = "Basalt_Deltas", - node_filler = "mcl_blackstone:basalt", - node_stone = "mcl_blackstone:basalt", - node_water = "air", - node_river_water = "air", - y_min = mcl_vars.mg_nether_min, - node_riverbed = "mcl_core:lava_source", - depth_riverbed = 2, - y_max = mcl_vars.mg_nether_max, - humidity_point = 36, - heat_point = 100, - spread = {x = 1, y = 1, z = 1}, - humidity_point = 0, - _mcl_biome_type = "hot", - _mcl_palette_index = 12, - }) - - - - -- Magma blocks - minetest.register_ore({ - ore_type = "blob", - ore = "mcl_nether:magma", - wherein = {"mcl_blackstone:basalt", "mcl_core:stone"}, - clust_scarcity = 8*8*8, - clust_num_ores = 45, - clust_size = 6, - y_min = mcl_worlds.layer_to_y(23, "nether"), - y_max = mcl_worlds.layer_to_y(37, "nether"), - }) - minetest.register_ore({ - ore_type = "blob", - ore = "mcl_nether:magma", - wherein = {"mcl_blackstone:basalt"}, - clust_scarcity = 10*10*10, - clust_num_ores = 65, - clust_size = 8, - y_min = mcl_worlds.layer_to_y(23, "nether"), - y_max = mcl_worlds.layer_to_y(37, "nether"), - }) - - -- Glowstone - minetest.register_ore({ - ore_type = "blob", - ore = "mcl_nether:glowstone", - wherein = {"mcl_blackstone:basalt", "mcl_core:stone"}, - clust_scarcity = 26 * 26 * 26, - clust_size = 5, - y_min = mcl_vars.mg_lava_nether_max + 10, - y_max = mcl_vars.mg_nether_max, - noise_threshold = 0.0, - noise_params = { - offset = 0.5, - scale = 0.1, - spread = {x = 5, y = 5, z = 5}, - seed = 17676, - octaves = 1, - persist = 0.0 - }, - }) - - -- Gravel (Nether) - minetest.register_ore({ - ore_type = "sheet", - ore = "mcl_core:gravel", - wherein = {"mcl_blackstone:basalt", "mcl_core:stone"}, - column_height_min = 1, - column_height_max = 1, - column_midpoint_factor = 0, - y_min = mcl_worlds.layer_to_y(63, "nether"), - -- This should be 65, but for some reason with this setting, the sheet ore really stops at 65. o_O - y_max = mcl_worlds.layer_to_y(65+2, "nether"), - noise_threshold = 0.2, - noise_params = { - offset = 0.0, - scale = 0.5, - spread = {x = 20, y = 20, z = 20}, - seed = 766, - octaves = 3, - persist = 0.6, - }, - }) - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_nether:nether_lava_source", - wherein = {"mcl_blackstone:basalt", "mcl_core:stone"}, - clust_scarcity = 500, - clust_num_ores = 1, - clust_size = 1, - y_min = mcl_vars.mg_nether_min, - y_max = mcl_vars.mg_lava_nether_max + 1, - }) - - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_nether:nether_lava_source", - wherein = {"mcl_blackstone:basalt", "mcl_core:stone"}, - clust_scarcity = 1000, - clust_num_ores = 1, - clust_size = 1, - y_min = mcl_vars.mg_lava_nether_max + 2, - y_max = mcl_vars.mg_lava_nether_max + 12, - }) - - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_nether:nether_lava_source", - wherein = {"mcl_blackstone:basalt", "mcl_core:stone"}, - clust_scarcity = 2000, - clust_num_ores = 1, - clust_size = 1, - y_min = mcl_vars.mg_lava_nether_max + 13, - y_max = mcl_vars.mg_lava_nether_max + 48, - }) - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_nether:nether_lava_source", - wherein = {"mcl_blackstone:basalt", "mcl_core:stone"}, - clust_scarcity = 3500, - clust_num_ores = 1, - clust_size = 1, - y_min = mcl_vars.mg_lava_nether_max + 49, - y_max = mcl_vars.mg_nether_max, - }) - - -local specialstones = { "mcl_nether:netherrack"} -for s=1, #specialstones do - local node = specialstones[s] - minetest.register_ore({ - ore_type = "blob", - ore = node, - wherein = {"mcl_blackstone:basalt"}, - clust_scarcity = 8*8*8, - clust_num_ores = 28, - clust_size = 3, - y_min = mcl_vars.mg_nether_min, - y_max = mcl_vars.mg_nether_max, - }) - minetest.register_ore({ - ore_type = "blob", - ore = node, - wherein = {"mcl_blackstone:basalt"}, - clust_scarcity = 8*8*8, - clust_num_ores = 40, - clust_size = 5, - y_min = mcl_vars.mg_nether_min, - y_max = mcl_vars.mg_nether_max, - }) -end -]]-- - +--]] +--soul torch mcl_torches.register_torch({ - name = "soul_torch", - description = S("Soul Torch"), + name="soul_torch", + description=S("Soul Torch"), doc_items_longdesc = S("Torches are light sources which can be placed at the side or on the top of most blocks."), doc_items_hidden = false, - icon = "soul_torch_on_floor.png", + icon="soul_torch_on_floor.png", tiles = {{ name = "soul_torch_on_floor_animated.png", animation = {type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 3.3} }}, - light = 10, + light = 12, --soul torches are a bit dimmer than normal torches groups = {dig_immediate = 3, deco_block = 1}, sounds = mcl_sounds.node_sound_wood_defaults(), - particles = true + particles = true, }) minetest.register_craft({ output = "mcl_blackstone:soul_torch 4", recipe = { - { "mcl_nether:soul_sand" }, + {"group:coal"}, { "mcl_core:stick" }, + { "group:soul_block" }, } }) diff --git a/mods/ITEMS/mcl_blackstone/locale/mcl_blackstone.de.tr b/mods/ITEMS/mcl_blackstone/locale/mcl_blackstone.de.tr index 9766a07d5..dee9cd15e 100644 --- a/mods/ITEMS/mcl_blackstone/locale/mcl_blackstone.de.tr +++ b/mods/ITEMS/mcl_blackstone/locale/mcl_blackstone.de.tr @@ -1,7 +1,7 @@ # textdomain: mcl_blackstone Blackstone=Schwarzstein Polished Blackstone=Polierter Schwarzstein -Chiseled Polished Blackstone=Gemeißelter polierter Schwarzstein +Chieseled Polished Blackstone=Gemeißelter polierter Schwarzstein Polished Blackstone Bricks=Polierter Schwarzsteinziegel Basalt=Basalt Polished Basalt=Polierter Basalt diff --git a/mods/ITEMS/mcl_blackstone/locale/template.txt b/mods/ITEMS/mcl_blackstone/locale/template.txt index ec7e561ba..0af51d7d3 100644 --- a/mods/ITEMS/mcl_blackstone/locale/template.txt +++ b/mods/ITEMS/mcl_blackstone/locale/template.txt @@ -1,7 +1,7 @@ # textdomain: mcl_blackstone Blackstone= Polished Blackstone= -Chiseled Polished Blackstone= +Chieseled Polished Blackstone= Polished Blackstone Bricks= Basalt= Polished Basalt= @@ -21,4 +21,3 @@ Eternal Soul Fire= Gilded Blackstone= Nether Gold Ore= Smooth Basalt= -Blackstone Wall= diff --git a/mods/ITEMS/mcl_blackstone/mod.conf b/mods/ITEMS/mcl_blackstone/mod.conf index a46b4b35d..8728f5b01 100644 --- a/mods/ITEMS/mcl_blackstone/mod.conf +++ b/mods/ITEMS/mcl_blackstone/mod.conf @@ -1,2 +1,3 @@ name = mcl_blackstone -depends = mcl_core,screwdriver,mcl_stairs,mclx_stairs,mcl_walls,mclx_fences,mcl_torches, mcl_fire +author = debian044 +depends = mcl_core, screwdriver, mcl_stairs, mclx_stairs, mcl_walls, mclx_fences, mcl_torches, mcl_fire diff --git a/mods/ITEMS/mcl_blackstone/schematics/mcl_blackstone_nether_fossil_1.mts b/mods/ITEMS/mcl_blackstone/schematics/mcl_blackstone_nether_fossil_1.mts new file mode 100644 index 0000000000000000000000000000000000000000..7ec39bacffc1ed9623caff7428926d9ff074ff89 GIT binary patch literal 78 zcmeYb3HD`RVPFPA-un7_1||mP#LOZF;oRh$_~iVeRI8-?ywv!loc!eMiaE&%4vako gXF85Zi)EcsTvH^#B5Yt8)#bn_9V^MuvQJ1308*D1J^%m! literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_blackstone/schematics/mcl_blackstone_nether_fossil_2.mts b/mods/ITEMS/mcl_blackstone/schematics/mcl_blackstone_nether_fossil_2.mts new file mode 100644 index 0000000000000000000000000000000000000000..bafc88993850e8a746706e8d181da94a5677ecca GIT binary patch literal 112 zcmeYb3HD`RVPFMf-g+QlU}9iS%q(IM&P~pVPtGq&wMxp*ON~#;$xqI%n3J5Kz#*|v zMR`g}OSkf7iNGgrXQi{AEo?4Q&|+Uy#Ad+kGR3*#aF{GxLUO``hm49A4<05uKjYIa O<#AcT%#atLcG1D%t literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_blackstone/textures/lantern.png b/mods/ITEMS/mcl_blackstone/textures/lantern.png new file mode 100644 index 0000000000000000000000000000000000000000..a0cec3cbfae5ae507ba783d8cb83bbb3563832b5 GIT binary patch literal 1328 zcmV-01<(44P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U-|amgFc5{O1&N1SAj=$H6S`%?;-G6D;NI%35A` zReiR}G*~H%AVMtZ`hWip_YW@i998y1RJ8-5AZr=zDY}CNP!U8Pv;ARtt_7s0{11grfKg+PX?c zF$}Rnu?96SlgZvhX%zX@L-eiK37uhXS!;6y%RaLk<-Q z5}k-7Q8CF$#VK zTpMA;AtMbPHu5O9YDd-As?n2jpQ}bkwW(NKe)>=iX4RJvG?x>Znn5v+1jThKfQ06$ znKz1&r*cy>pBa-v7^;y>aWLDV7!-`1SO(qNJ(T-YHz)CrbmNbdb5pvXP|i*1j&g5x zdq=fa){YXEKywyOPJI|y*x=Buu$8$deYtku4e&S6-#}juG-8+yE;UjVeC9zb_u0Z( zA^7zp_V%yT?hjrF&F{H%&0S_9@zgahNLbkF4-hmFeeBTt?!OQgyw$=H>M$a@P-c&# zz-Gqr_o%sR_bC-5yA>Z$Y(udJJDVK$Lus@Fea6Of{g$0gj{814Amh4LW^=KqMcRtr zEsxxCX$!$T^Bw#(Zz$PoE*nc%8ihABcVqh|H1|fReuV`_70?DwraOtPJrWF?-Xap) zUk)2wbsk#}|GlsT?YC0N z{r<|MSKGoiY}bUN$c-;b-trrc;bTK8fJ5DHMEJKbwEP}{?vFF?gT!;KohF-VJuFsREb zpooza2I}$(47Oqt3_rhpV_=Y1V0cbWH2(bdje(tu3vV=Hb-|Ax-x&6tJ;T6YY{J0s m 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 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) @@ -248,7 +251,7 @@ function ARROW_ENTITY.on_step(self, dtime) -- Punch target object but avoid hurting enderman. if not lua or lua.name ~= "mobs_mc:enderman" then if not self._in_player then - damage_particles(self.object:get_pos(), self._is_critical) + damage_particles(vector.add(pos, vector.multiply(self.object:get_velocity(), 0.1)), self._is_critical) end if mcl_burning.is_burning(self.object) then mcl_burning.set_on_fire(obj, 5) @@ -258,7 +261,7 @@ function ARROW_ENTITY.on_step(self, dtime) full_punch_interval=1.0, damage_groups={fleshy=self._damage}, }, self.object:get_velocity()) - if mcl_util and mcl_util.is_player(obj) then + if obj:is_player() then if not mcl_shields.is_blocking(obj) then local placement self._placement = math.random(1, 2) @@ -303,13 +306,15 @@ function ARROW_ENTITY.on_step(self, dtime) minetest.after(150, function() self.object:remove() end) + else + self.object:remove() end end end if is_player then - if self._shooter and (mcl_util and mcl_util.is_player(self._shooter)) and not self._in_player and not self._blocked then + if self._shooter and self._shooter:is_player() and not self._in_player and not self._blocked then -- “Ding” sound for hitting another player minetest.sound_play({name="mcl_bows_hit_player", gain=0.1}, {to_player=self._shooter:get_player_name()}, true) end @@ -327,7 +332,6 @@ function ARROW_ENTITY.on_step(self, dtime) end end if not self._in_player and not self._blocked then - minetest.sound_play({name="mcl_bows_hit_other", gain=0.3}, {pos=self.object:get_pos(), max_hear_distance=16}, true) end end @@ -392,6 +396,11 @@ function ARROW_ENTITY.on_step(self, dtime) tnt.ignite(self._stuckin) end + -- Activate target + if mod_target and snode.name == "mcl_target:target_off" then + mcl_target.hit(self._stuckin, 1) --10 redstone ticks + end + -- Push the button! Push, push, push the button! if mod_button and minetest.get_item_group(node.name, "button") > 0 and minetest.get_item_group(node.name, "button_push_by_arrow") == 1 then local bdir = minetest.wallmounted_to_dir(node.param2) diff --git a/mods/ITEMS/mcl_bows/crossbow.lua b/mods/ITEMS/mcl_bows/crossbow.lua index 49a434c5b..01900503b 100644 --- a/mods/ITEMS/mcl_bows/crossbow.lua +++ b/mods/ITEMS/mcl_bows/crossbow.lua @@ -181,7 +181,7 @@ S("The speed and damage of the arrow increases the longer you charge. The regula itemstack:get_meta():set_string("active", "true") return itemstack end, - groups = {not_in_creative_inventory=1,weapon=1,weapon_ranged=1,crossbow=1,enchantability=1}, + groups = {weapon=1,weapon_ranged=1,crossbow=1,enchantability=1,not_in_creative_inventory=1}, _mcl_uses = 326, }) diff --git a/mods/ITEMS/mcl_bows/locale/mcl_bows.zh_TW.tr b/mods/ITEMS/mcl_bows/locale/mcl_bows.zh_TW.tr new file mode 100644 index 000000000..6b59895d3 --- /dev/null +++ b/mods/ITEMS/mcl_bows/locale/mcl_bows.zh_TW.tr @@ -0,0 +1,14 @@ +# textdomain: mcl_bows +Arrow=箭 +Arrows are ammunition for bows and dispensers.=箭頭是弓箭和發射器的彈藥。 +An arrow fired from a bow has a regular damage of 1-9. At full charge, there's a 20% chance of a critical hit dealing 10 damage instead. An arrow fired from a dispenser always deals 3 damage.=從弓上射出的箭有1-9的常規傷害。在最大能量的情況下,有20%的機會暴擊,造成10的傷害。從發射器中發射的箭總是造成3點傷害。 +Arrows might get stuck on solid blocks and can be retrieved again. They are also capable of pushing wooden buttons.=箭頭可能會卡在固體方塊上,可以再次取回。他們也能按下木質按鈕。 +To use arrows as ammunition for a bow, just put them anywhere in your inventory, they will be used up automatically. To use arrows as ammunition for a dispenser, place them in the dispenser's inventory. To retrieve an arrow that sticks in a block, simply walk close to it.=要把箭作為弓的彈藥,只需把它們放在你物品欄的任何地方,它們就會被自動使用。要使用箭作為發射器的彈藥,把它們放在發射器的物品欄中。要取回插在方塊上的箭,只需走到它附近。 +Bow=弓 +Bows are ranged weapons to shoot arrows at your foes.=弓是遠程武器,可以向敵人發射箭頭。 +The speed and damage of the arrow increases the longer you charge. The regular damage of the arrow is between 1 and 9. At full charge, there's also a 20% of a critical hit, dealing 10 damage instead.=拉弓時間越長,箭的速度和傷害越大。箭的常規傷害在1到9之間。在拉滿弓的情況下,20%的機會暴擊,造成10的傷害。 +To use the bow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to shoot.=要使用這把弓,你首先需要在你物品欄的任何地方至少有一支箭(除非在創造模式下)。按住鼠標右鍵充電,鬆開即可射擊。 +Ammunition=彈藥 +Damage from bow: 1-10=從弓發射時的傷害:1-10 +Damage from dispenser: 3=從發射器發射時的傷害:3 +Launches arrows=發射箭 diff --git a/mods/ITEMS/mcl_bows/mod.conf b/mods/ITEMS/mcl_bows/mod.conf index a23eb72ab..66ffec496 100644 --- a/mods/ITEMS/mcl_bows/mod.conf +++ b/mods/ITEMS/mcl_bows/mod.conf @@ -1,6 +1,5 @@ name = mcl_bows author = Arcelmi -description = This mod adds bows and arrows for MineClone 2. -depends = controls, mcl_particles, mcl_enchanting, mcl_init, mcl_shields +description = This mod adds bows and arrows for MineClone 5 +depends = controls, mcl_particles, mcl_enchanting, mcl_init, mcl_util, mcl_shields optional_depends = awards, mcl_achievements, mcl_core, mcl_mobitems, playerphysics, doc, doc_identifier, mesecons_button - diff --git a/mods/ITEMS/mcl_bows/rocket.lua b/mods/ITEMS/mcl_bows/rocket.lua index cac466376..5f04ce535 100644 --- a/mods/ITEMS/mcl_bows/rocket.lua +++ b/mods/ITEMS/mcl_bows/rocket.lua @@ -18,23 +18,10 @@ local function dir_to_pitch(dir) return -math.atan2(-dir.y, xz) end -local function random_arrow_positions(positions, placement) - if positions == "x" then - return math.random(-4, 4) - elseif positions == "y" then - return math.random(0, 10) - end - if placement == "front" and positions == "z" then - return 3 - elseif placement == "back" and positions == "z" then - return -3 - end - return 0 -end - local function damage_explosion(self, damagemulitplier) - mcl_explosions.explode(self.object:get_pos(), 3, {}) - local objects = minetest.get_objects_inside_radius(self.object:get_pos(), 8) + local p = self.object:get_pos() + mcl_explosions.explode(p, 3, {}) + local objects = minetest.get_objects_inside_radius(p, 8) for _,obj in pairs(objects) do if obj:is_player() then mcl_util.deal_damage(obj, damagemulitplier - vector.distance(self.object:get_pos(), obj:get_pos()), {type = "explosion"}) @@ -52,10 +39,10 @@ end local function particle_explosion(self) local particle_pattern = math.random(1, 3) - local fpitch = 0 - local true_type = "" - local type = math.random(1,2) - local size = math.random(1,3) + local fpitch + --local true_type + local type = math.random(1, 2) + local size = math.random(1, 3) local colors = {"red", "yellow", "blue", "green", "white"} local this_colors = {colors[math.random(#colors)], colors[math.random(#colors)], colors[math.random(#colors)]} @@ -67,11 +54,11 @@ local function particle_explosion(self) fpitch = math.random(60, 70) end - if type == 1 then + --[[if type == 1 then true_type = "Popper" else true_type = "Floof" - end + end]] if type == 1 then minetest.sound_play("mcl_bows_firework", { @@ -246,6 +233,7 @@ end local mod_awards = minetest.get_modpath("awards") and minetest.get_modpath("mcl_achievements") local mod_button = minetest.get_modpath("mesecons_button") +local mod_target = minetest.get_modpath("mcl_target") minetest.register_craftitem("mcl_bows:rocket", { description = S("Arrow"), @@ -425,36 +413,41 @@ function ARROW_ENTITY.on_step(self, dtime) end -- Iterate through all objects and remember the closest attackable object - for k, obj in pairs(objs) do - local ok = false - -- Arrows can only damage players and mobs - if obj:is_player() then - ok = true - elseif obj:get_luaentity() then - if (obj:get_luaentity()._cmi_is_mob or obj:get_luaentity()._hittable_by_projectile) then + local arrow_dir = self.object:get_velocity() + --create a raycast from the arrow based on the velocity of the arrow to deal with lag + local raycast = minetest.raycast(pos, vector.add(pos, vector.multiply(arrow_dir, 0.1)), true, false) + for hitpoint in raycast do + if hitpoint.type == "object" then + -- find the closest object that is in the way of the arrow + local ok = false + if hitpoint.ref:is_player() then ok = true + elseif hitpoint.ref:get_luaentity() then + if (hitpoint.ref:get_luaentity().is_mob or hitpoint.ref:get_luaentity()._hittable_by_projectile) then + ok = true + end end - end - - if ok then - local dist = vector.distance(pos, obj:get_pos()) - if not closest_object or not closest_distance then - closest_object = obj - closest_distance = dist - elseif dist < closest_distance then - closest_object = obj - closest_distance = dist + if ok then + local dist = vector.distance(hitpoint.ref:get_pos(), pos) + if not closest_object or not closest_distance then + closest_object = hitpoint.ref + closest_distance = dist + elseif dist < closest_distance then + closest_object = hitpoint.ref + closest_distance = dist + end end end end + -- If an attackable object was found, we will damage the closest one only if closest_object then 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) @@ -581,6 +574,11 @@ function ARROW_ENTITY.on_step(self, dtime) tnt.ignite(self._stuckin) end + -- Activate target + if mod_target and snode.name == "mcl_target:target_off" then + mcl_target.hit(self._stuckin, 1) --10 redstone ticks + end + -- Push the button! Push, push, push the button! if mod_button and minetest.get_item_group(node.name, "button") > 0 and minetest.get_item_group(node.name, "button_push_by_arrow") == 1 then local bdir = minetest.wallmounted_to_dir(node.param2) diff --git a/mods/ITEMS/mcl_brewing/init.lua b/mods/ITEMS/mcl_brewing/init.lua index 38f81fa36..9c6879430 100644 --- a/mods/ITEMS/mcl_brewing/init.lua +++ b/mods/ITEMS/mcl_brewing/init.lua @@ -369,6 +369,9 @@ local function allow_take(pos, listname, index, stack, player) minetest.record_protection_violation(pos, name) return 0 else + if listname == "stand" then + awards.unlock(name, "mcl:localBrewery") + end return stack:get_count() end end @@ -959,7 +962,7 @@ minetest.register_craft({ output = "mcl_brewing:stand_000", recipe = { { "", "mcl_mobitems:blaze_rod", "" }, - { "mcl_core:cobble", "mcl_core:cobble", "mcl_core:cobble" }, + { "group:cobble", "group:cobble", "group:cobble" }, } }) diff --git a/mods/ITEMS/mcl_brewing/locale/mcl_brewing.zh_TW.tr b/mods/ITEMS/mcl_brewing/locale/mcl_brewing.zh_TW.tr new file mode 100644 index 000000000..da4b70890 --- /dev/null +++ b/mods/ITEMS/mcl_brewing/locale/mcl_brewing.zh_TW.tr @@ -0,0 +1,10 @@ +# textdomain: mcl_brewing +Brewing Stand=釀造台 +Inventory=物品欄 +To use a brewing stand, rightclick it.=右鍵點擊以使用釀造台。 +To brew, you need blaze powder as fuel, a brewing material and at least 1 glass bottle filled with a liquid.=釀造時,你需要烈焰粉作為燃料,一個釀造材料和至少1個裝滿液體的玻璃瓶。 +Place the blaze powder in the left slot, the brewing material in the middle slot and 1-3 bottles in the remaining slots.=將烈焰粉放在左邊的槽中,將釀造材料放在中間的槽中,將1-3個瓶子放在其餘的槽中。 +When you have found a good combination, the brewing will commence automatically and steam starts to appear, using up the fuel and brewing material. The potions will soon be ready.=當你找到一個好的組合時,釀造將自動開始,並開始出現蒸汽,耗盡燃料和釀造材料。藥水很快就會準備好。 +Different combinations of brewing materials and liquids will give different results. Try to experiment!=釀造材料和液體的不同組合會產生不同的結果。試著去實驗吧! +The stand allows you to brew potions!=釀造台可以讓你釀製藥水! +Brew Potions=釀造藥水 diff --git a/mods/ITEMS/mcl_buckets/init.lua b/mods/ITEMS/mcl_buckets/init.lua index 61efc02e4..acf45a137 100644 --- a/mods/ITEMS/mcl_buckets/init.lua +++ b/mods/ITEMS/mcl_buckets/init.lua @@ -19,47 +19,55 @@ local string = string local raycast = minetest.raycast local get_node = minetest.get_node +local set_node = minetest.set_node local add_node = minetest.add_node local add_item = minetest.add_item +local registered_nodes = minetest.registered_nodes +local get_item_group = minetest.get_item_group +local is_creative_enabled = minetest.is_creative_enabled +local is_protected = minetest.is_protected +local record_protection_violation = minetest.record_protection_violation -if mod_mcl_core then - minetest.register_craft({ - output = "mcl_buckets:bucket_empty 1", - recipe = { - {"mcl_core:iron_ingot", "", "mcl_core:iron_ingot"}, - {"", "mcl_core:iron_ingot", ""}, - }, - }) -end -mcl_buckets = {} -mcl_buckets.liquids = {} +minetest.register_craft({ + output = "mcl_buckets:bucket_empty 1", + recipe = { + {"mcl_core:iron_ingot", "", "mcl_core:iron_ingot"}, + {"", "mcl_core:iron_ingot", ""}, + }, +}) + + +mcl_buckets = { + liquids = {}, + buckets = {}, +} -- Sound helper functions for placing and taking liquids local function sound_place(itemname, pos) - local def = minetest.registered_nodes[itemname] + local def = registered_nodes[itemname] if def and def.sounds and def.sounds.place then minetest.sound_play(def.sounds.place, {gain=1.0, pos = pos, pitch = 1 + math.random(-10, 10)*0.005}, true) end end local function sound_take(itemname, pos) - local def = minetest.registered_nodes[itemname] + local def = registered_nodes[itemname] if def and def.sounds and def.sounds.dug then minetest.sound_play(def.sounds.dug, {gain=1.0, pos = pos, pitch = 1 + math.random(-10, 10)*0.005}, true) end end local function place_liquid(pos, itemstring) - local fullness = minetest.registered_nodes[itemstring].liquid_range + local fullness = registered_nodes[itemstring].liquid_range sound_place(itemstring, pos) - minetest.add_node(pos, {name=itemstring, param2=fullness}) + add_node(pos, {name=itemstring, param2=fullness}) end local function give_bucket(new_bucket, itemstack, user) local inv = user:get_inventory() - if minetest.is_creative_enabled(user:get_player_name()) then + if is_creative_enabled(user:get_player_name()) then --TODO: is a full bucket added if inv doesn't contain one? return itemstack else @@ -80,9 +88,7 @@ end local pointable_sources = {} local function bucket_raycast(user) - --local pos = user:get_pos() local pos = user:get_pos() - --local pos = vector.add(user:get_pos(), user:get_bone_position("Head_Control")) pos.y = pos.y + user:get_properties().eye_height local look_dir = user:get_look_dir() look_dir = vector.multiply(look_dir, 5) @@ -92,7 +98,6 @@ local function bucket_raycast(user) if ray then for pointed_thing in ray do if pointed_thing and pointable_sources[get_node(pointed_thing.above).name] then - --minetest.chat_send_all("found!") return {under=pointed_thing.under,above=pointed_thing.above} end end @@ -126,7 +131,7 @@ end local function get_bucket_drop(itemstack, user, take_bucket) -- Handle bucket item and inventory stuff - if take_bucket and not minetest.is_creative_enabled(user:get_player_name()) then + if take_bucket and not is_creative_enabled(user:get_player_name()) then -- Add empty bucket and put it into inventory, if possible. -- Drop empty bucket otherwise. local new_bucket = ItemStack("mcl_buckets:bucket_empty") @@ -147,6 +152,174 @@ local function get_bucket_drop(itemstack, user, take_bucket) end end +local function on_place_bucket(itemstack, user, pointed_thing, def) + -- Must be pointing to node + if pointed_thing.type ~= "node" then + return + end + -- Call on_rightclick if the pointed node defines it + local new_stack = mcl_util.call_on_rightclick(itemstack, user, pointed_thing) + if new_stack then + return new_stack + end + + local undernode = get_node(pointed_thing.under) + local abovenode = get_node(pointed_thing.above) + + if registered_nodes[undernode.name] and registered_nodes[undernode.name].buildable_to or get_item_group(undernode.name, "cauldron") == 1 then + local result, take_bucket = get_extra_check(def.extra_check, pointed_thing.under, user) + if result then + local node_place = get_node_place(def.source_place, pointed_thing.under) + local pns = user:get_player_name() + + -- Check protection + if is_protected(pointed_thing.under, pns) then + record_protection_violation(pointed_thing.under, pns) + return itemstack + end + + -- Place liquid + place_liquid(pointed_thing.under, node_place) + + -- Update doc mod + if mod_doc and doc.entry_exists("nodes", node_place) then + doc.mark_entry_as_revealed(user:get_player_name(), "nodes", node_place) + end + end + return get_bucket_drop(itemstack, user, take_bucket) + elseif registered_nodes[abovenode.name] and registered_nodes[abovenode.name].buildable_to or get_item_group(abovenode.name, "cauldron") == 1 then + local result, take_bucket = get_extra_check(def.extra_check, pointed_thing.above, user) + if result then + local node_place = get_node_place(def.source_place, pointed_thing.above) + local pns = user:get_player_name() + + -- Check protection + if is_protected(pointed_thing.above, pns) then + record_protection_violation(pointed_thing.above, pns) + return itemstack + end + + -- Place liquid + place_liquid(pointed_thing.above, node_place) + + -- Update doc mod + if mod_doc and doc.entry_exists("nodes", node_place) then + doc.mark_entry_as_revealed(user:get_player_name(), "nodes", node_place) + end + end + return get_bucket_drop(itemstack, user, take_bucket) + else + return itemstack + end +end + + +local function on_place_bucket_empty(itemstack, user, pointed_thing) + -- Must be pointing to node + if pointed_thing.type ~= "node" then + return itemstack + end + + -- Call on_rightclick if the pointed node defines it + local new_stack = mcl_util.call_on_rightclick(itemstack, user, pointed_thing) + if new_stack then + return new_stack + end + + local node = get_node(pointed_thing.under) + local nn = node.name + + local new_bucket + local liquid_node = bucket_raycast(user) + if liquid_node then + if is_protected(liquid_node.above, user:get_player_name()) then + record_protection_violation(liquid_node.above, user:get_player_name()) + end + local liquid_name = get_node(liquid_node.above).name + if liquid_name then + local liquid_def = mcl_buckets.liquids[liquid_name] + if liquid_def then + -- Fill bucket, but not in Creative Mode + -- FIXME: remove this line + --if not is_creative_enabled(user:get_player_name()) then + if not false then + new_bucket = ItemStack({name = liquid_def.bucketname}) + if liquid_def.on_take then + liquid_def.on_take(user) + end + end + add_node(liquid_node.above, {name="air"}) + sound_take(nn, liquid_node.above) + + if mod_doc and doc.entry_exists("nodes", liquid_name) then + doc.mark_entry_as_revealed(user:get_player_name(), "nodes", liquid_name) + end + if new_bucket then + return give_bucket(new_bucket, itemstack, user) + end + else + minetest.log("error", string.format("[mcl_buckets] Node [%s] has invalid group [_mcl_bucket_pointable]!", liquid_name)) + end + end + return itemstack + else + -- FIXME: replace this ugly code by cauldrons API + if nn == "mcl_cauldrons:cauldron_3" then + -- Take water out of full cauldron + set_node(pointed_thing.under, {name="mcl_cauldrons:cauldron"}) + if not is_creative_enabled(user:get_player_name()) then + new_bucket = ItemStack("mcl_buckets:bucket_water") + end + sound_take("mcl_core:water_source", pointed_thing.under) + elseif nn == "mcl_cauldrons:cauldron_3r" then + -- Take river water out of full cauldron + set_node(pointed_thing.under, {name="mcl_cauldrons:cauldron"}) + if not is_creative_enabled(user:get_player_name()) then + new_bucket = ItemStack("mcl_buckets:bucket_river_water") + end + sound_take("mclx_core:river_water_source", pointed_thing.under) + elseif nn == "mcl_cauldrons:cauldron_3_lava" then + set_node(pointed_thing.under, {name="mcl_cauldrons:cauldron"}) + if not is_creative_enabled(user:get_player_name()) then + new_bucket = ItemStack("mcl_buckets:bucket_lava") + end + sound_take("mcl_core:lava_source", pointed_thing.under) + end + if new_bucket then + return give_bucket(new_bucket, itemstack, user) + end + end + return itemstack +end + +controls.register_on_press(function(player, key) + if key ~= "RMB" then + return + end + + local wielded_item = player:get_wielded_item() + local itemname = wielded_item:get_name() + local def = mcl_buckets.buckets[itemname] + + if itemname == "mcl_buckets:bucket_empty" then + local pointed_thing = mcl_util.get_pointed_thing(player, true) + + if not pointed_thing then + return + end + wielded_item = on_place_bucket_empty(wielded_item, player, pointed_thing) + elseif def then + local pointed_thing = mcl_util.get_pointed_thing(player, false) + + if not pointed_thing then + return + end + wielded_item = on_place_bucket(wielded_item, player, pointed_thing, def) + end + + player:set_wielded_item(wielded_item) +end) + function mcl_buckets.register_liquid(def) for _,source in ipairs(def.source_take) do mcl_buckets.liquids[source] = { @@ -161,6 +334,8 @@ function mcl_buckets.register_liquid(def) end end + mcl_buckets.buckets[def.bucketname] = def + if def.bucketname == nil or def.bucketname == "" then error(string.format("[mcl_bucket] Invalid itemname then registering [%s]!", def.name)) end @@ -173,6 +348,7 @@ function mcl_buckets.register_liquid(def) inventory_image = def.inventory_image, stack_max = 1, groups = def.groups, +<<<<<<< HEAD on_place = function(itemstack, user, pointed_thing) -- Must be pointing to node if pointed_thing.type ~= "node" then @@ -241,7 +417,7 @@ function mcl_buckets.register_liquid(def) end end, _on_dispense = function(stack, pos, droppos, dropnode, dropdir) - local buildable = minetest.registered_nodes[dropnode.name].buildable_to or dropnode.name == "mcl_portals:portal" + local buildable = registered_nodes[dropnode.name].buildable_to or dropnode.name == "mcl_portals:portal" if not buildable then return stack end local result, take_bucket = get_extra_check(def.extra_check, droppos, nil) if result then -- Fail placement of liquid if result is false @@ -260,81 +436,8 @@ minetest.register_craftitem("mcl_buckets:bucket_empty", { _doc_items_longdesc = S("A bucket can be used to collect and release liquids."), _doc_items_usagehelp = S("Punch a liquid source to collect it. You can then use the filled bucket to place the liquid somewhere else."), _tt_help = S("Collects liquids"), - --liquids_pointable = true, inventory_image = "bucket.png", stack_max = 16, - on_place = function(itemstack, user, pointed_thing) - -- Must be pointing to node - if pointed_thing.type ~= "node" then - return itemstack - end - - -- Call on_rightclick if the pointed node defines it - local new_stack = mcl_util.call_on_rightclick(itemstack, user, pointed_thing) - if new_stack then - return new_stack - end - - local node = minetest.get_node(pointed_thing.under) - local nn = node.name - - local new_bucket - local liquid_node = bucket_raycast(user) - if liquid_node then - if minetest.is_protected(liquid_node.above, user:get_player_name()) then - minetest.record_protection_violation(liquid_node.above, user:get_player_name()) - end - local liquid_name = get_node(liquid_node.above).name - if liquid_name then - local liquid_def = mcl_buckets.liquids[liquid_name] - if liquid_def then - --minetest.chat_send_all("test") - -- Fill bucket, but not in Creative Mode - -- FIXME: remove this line - --if not minetest.is_creative_enabled(user:get_player_name()) then - if not false then - new_bucket = ItemStack({name = liquid_def.bucketname}) - if liquid_def.on_take then - liquid_def.on_take(user) - end - end - add_node(liquid_node.above, {name="air"}) - sound_take(nn, liquid_node.above) - - if mod_doc and doc.entry_exists("nodes", liquid_name) then - doc.mark_entry_as_revealed(user:get_player_name(), "nodes", liquid_name) - end - if new_bucket then - return give_bucket(new_bucket, itemstack, user) - end - else - minetest.log("error", string.format("[mcl_buckets] Node [%s] has invalid group [_mcl_bucket_pointable]!", liquid_name)) - end - end - return itemstack - else - -- FIXME: replace this ugly code by cauldrons API - if nn == "mcl_cauldrons:cauldron_3" then - -- Take water out of full cauldron - minetest.set_node(pointed_thing.under, {name="mcl_cauldrons:cauldron"}) - if not minetest.is_creative_enabled(user:get_player_name()) then - new_bucket = ItemStack("mcl_buckets:bucket_water") - end - sound_take("mcl_core:water_source", pointed_thing.under) - elseif nn == "mcl_cauldrons:cauldron_3r" then - -- Take river water out of full cauldron - minetest.set_node(pointed_thing.under, {name="mcl_cauldrons:cauldron"}) - if not minetest.is_creative_enabled(user:get_player_name()) then - new_bucket = ItemStack("mcl_buckets:bucket_river_water") - end - sound_take("mclx_core:river_water_source", pointed_thing.under) - end - if new_bucket then - return give_bucket(new_bucket, itemstack, user) - end - end - return itemstack - end, _on_dispense = function(stack, pos, droppos, dropnode, dropdir) -- Fill empty bucket with liquid or drop bucket if no liquid local collect_liquid = false @@ -348,13 +451,13 @@ minetest.register_craftitem("mcl_buckets:bucket_empty", { collect_liquid = true end if collect_liquid then - minetest.set_node(droppos, {name="air"}) + set_node(droppos, {name="air"}) -- Fill bucket with liquid stack = new_bucket else -- No liquid found: Drop empty bucket - minetest.add_item(droppos, stack) + add_item(droppos, stack) stack:take_item() end return stack diff --git a/mods/ITEMS/mcl_buckets/locale/mcl_buckets.zh_TW.tr b/mods/ITEMS/mcl_buckets/locale/mcl_buckets.zh_TW.tr new file mode 100644 index 000000000..a9db929b2 --- /dev/null +++ b/mods/ITEMS/mcl_buckets/locale/mcl_buckets.zh_TW.tr @@ -0,0 +1,17 @@ +# textdomain: mcl_buckets +Empty Bucket=空桶 +A bucket can be used to collect and release liquids.=桶可以用來收集和倒出液體。 +Punch a liquid source to collect it. You can then use the filled bucket to place the liquid somewhere else.=擊打一個液體源頭來收集它。然後你可以用裝滿的桶把液體放在其他地方。 +Lava Bucket=熔岩桶 +A bucket can be used to collect and release liquids. This one is filled with hot lava, safely contained inside. Use with caution.=桶可以用來收集和釋放液體。這個桶裡裝的是熱的熔岩,安全地裝在裡面。使用時要小心! +Get in a safe distance and place the bucket to empty it and create a lava source at this spot. Don't burn yourself!=在安全距離內,將熔岩倒出,在這個地方創造一個熔岩源頭。不要燒到自己! +Water Bucket=水桶 +A bucket can be used to collect and release liquids. This one is filled with water.=桶可以用來收集和倒出液體。這個桶裡裝的是水。 +Place it to empty the bucket and create a water source.=放置它以清空水桶並創建水源。 +River Water Bucket=河水桶 +A bucket can be used to collect and release liquids. This one is filled with river water.=桶可以用來收集和倒出液體。這個桶裡裝的是河水。 +Place it to empty the bucket and create a river water source.=放置它以清空水桶並創建河水源。 +Collects liquids=攜帶流體 +Places a lava source=放置熔岩源頭 +Places a water source=放置水源 +Places a river water source=放置河水源頭 diff --git a/mods/ITEMS/mcl_buckets/mod.conf b/mods/ITEMS/mcl_buckets/mod.conf index 0d7b764b8..ba945b033 100644 --- a/mods/ITEMS/mcl_buckets/mod.conf +++ b/mods/ITEMS/mcl_buckets/mod.conf @@ -1,6 +1,6 @@ name = mcl_buckets author = Kahrl description = -depends = mcl_worlds, mcl_util +depends = mcl_worlds, mcl_util, controls optional_depends = mcl_core, mclx_core, doc diff --git a/mods/ITEMS/mcl_buckets/register.lua b/mods/ITEMS/mcl_buckets/register.lua index 1a7c8fe14..365966724 100644 --- a/mods/ITEMS/mcl_buckets/register.lua +++ b/mods/ITEMS/mcl_buckets/register.lua @@ -10,13 +10,6 @@ local function sound_place(itemname, pos) end end ---[[local sound_take = function(itemname, pos) - local def = minetest.registered_nodes[itemname] - if def and def.sounds and def.sounds.dug then - minetest.sound_play(def.sounds.dug, {gain=1.0, pos = pos, pitch = 1 + math.random(-10, 10)*0.005}, true) - end -end]] - if mod_mcl_core then -- Lava bucket mcl_buckets.register_liquid({ @@ -29,11 +22,21 @@ if mod_mcl_core then end end, source_take = {"mcl_core:lava_source", "mcl_nether:nether_lava_source"}, - on_take = function(user) - if has_awards and user and user:is_player() then - awards.unlock(user:get_player_name(), "mcl:hotStuff") - end - end, + on_take = function(user) + if has_awards and user and user:is_player() then + awards.unlock(user:get_player_name(), "mcl:hotStuff") + end + end, + extra_check = function(pos, placer) + local nn = minetest.get_node(pos).name + if minetest.get_item_group(nn, "cauldron") ~= 0 then + if nn ~= "mcl_cauldrons:cauldron_3_lava" then + minetest.set_node(pos, {name="mcl_cauldrons:cauldron_3_lava"}) + end + sound_place("mcl_core:lava_source", pos) + return false, true + end + end, bucketname = "mcl_buckets:bucket_lava", inventory_image = "bucket_lava.png", name = S("Lava Bucket"), diff --git a/mods/ITEMS/mcl_cake/init.lua b/mods/ITEMS/mcl_cake/init.lua index 6a7c1f6ca..1b0824e77 100644 --- a/mods/ITEMS/mcl_cake/init.lua +++ b/mods/ITEMS/mcl_cake/init.lua @@ -52,7 +52,10 @@ minetest.register_node("mcl_cake:cake", { fixed = full_cake }, stack_max = 1, - groups = {handy=1, cake=7, food=2, no_eat_delay=1, compostability=100, attached_node=1, dig_by_piston=1, comparator_signal=14}, + groups = { + handy = 1, attached_node = 1, dig_by_piston = 1, comparator_signal = 14, + cake = 7, food = 2, no_eat_delay = 1, compostability = 100 + }, drop = "", on_rightclick = function(pos, node, clicker, itemstack) -- Cake is subject to protection @@ -125,7 +128,11 @@ local register_slice = function(level, nodebox, desc) type = "fixed", fixed = nodebox, }, - groups = {handy=1, cake=level, food=2, no_eat_delay=1, compostability=100, attached_node=1, not_in_creative_inventory=1, dig_by_piston=1, comparator_signal=level*2}, + groups = { + handy = 1, attached_node = 1, not_in_creative_inventory = 1, + dig_by_piston = 1, cake = level, comparator_signal = level * 2, + food = 2, no_eat_delay = 1 + }, drop = "", on_rightclick = on_rightclick, sounds = mcl_sounds.node_sound_leaves_defaults(), diff --git a/mods/ITEMS/mcl_cake/locale/mcl_cake.zh_TW.tr b/mods/ITEMS/mcl_cake/locale/mcl_cake.zh_TW.tr new file mode 100644 index 000000000..702791b49 --- /dev/null +++ b/mods/ITEMS/mcl_cake/locale/mcl_cake.zh_TW.tr @@ -0,0 +1,12 @@ +# textdomain: mcl_cake +Cake=蛋糕 +Cakes can be placed and eaten to restore hunger points. A cake has 7 slices. Each slice restores 2 hunger points and 0.4 saturation points. Cakes will be destroyed when dug or when the block below them is broken.=蛋糕可以被放置和食用,以恢復飢餓值。一個蛋糕有7片。每片可以恢復2個飢餓值和0.4個飽食度。蛋糕在被挖掘或其下面的方塊被打破時將被摧毀。 +Place the cake anywhere, then rightclick it to eat a single slice. You can't eat from the cake when your hunger bar is full.=將蛋糕放在任何地方,然後右鍵單擊以吃一小片。 當您的飢餓條已滿時,您不能從蛋糕上吃東西。 +Cake (6 Slices Left)=蛋糕(還剩6片) +Cake (5 Slices Left)=蛋糕(還剩5片) +Cake (4 Slices Left)=蛋糕(還剩4片) +Cake (3 Slices Left)=蛋糕(還剩3片) +Cake (2 Slices Left)=蛋糕(還剩2片) +Cake (1 Slice Left)=蛋糕(還剩1片) +With 7 tasty slices!=有七塊美味的蛋糕! +Hunger points: +@1 per slice=飢餓值:每片 +@1 diff --git a/mods/ITEMS/mcl_cauldrons/init.lua b/mods/ITEMS/mcl_cauldrons/init.lua index 4b6fcd318..6a8270794 100644 --- a/mods/ITEMS/mcl_cauldrons/init.lua +++ b/mods/ITEMS/mcl_cauldrons/init.lua @@ -5,7 +5,7 @@ local S = minetest.get_translator(minetest.get_current_modname()) -- TODO: Extinguish fire of burning entities -- Convenience function because the cauldron nodeboxes are very similar -local create_cauldron_nodebox = function(water_level) +local function create_cauldron_nodebox(water_level) local floor_y if water_level == 0 then -- empty floor_y = -0.1875 @@ -36,12 +36,6 @@ local create_cauldron_nodebox = function(water_level) } end -local cauldron_nodeboxes = {} -for w=0,3 do - cauldron_nodeboxes[w] = create_cauldron_nodebox(w) -end - - -- Empty cauldron minetest.register_node("mcl_cauldrons:cauldron", { description = S("Cauldron"), @@ -55,7 +49,7 @@ minetest.register_node("mcl_cauldrons:cauldron", { paramtype = "light", is_ground_content = false, groups = {pickaxey=1, deco_block=1, cauldron=1}, - node_box = cauldron_nodeboxes[0], + node_box = create_cauldron_nodebox(0), selection_box = { type = "regular" }, tiles = { "mcl_cauldrons_cauldron_inner.png^mcl_cauldrons_cauldron_top.png", @@ -68,12 +62,15 @@ minetest.register_node("mcl_cauldrons:cauldron", { }) -- Template function for cauldrons with water -local register_filled_cauldron = function(water_level, description, river_water) +local function register_filled_cauldron(water_level, description, liquid) local id = "mcl_cauldrons:cauldron_"..water_level local water_tex - if river_water then + if liquid == "river_water" then id = id .. "r" water_tex = "default_river_water_source_animated.png^[verticalframe:16:0" + elseif liquid == "lava" then + id = id .. "_lava" + water_tex = "default_lava_source_animated.png^[verticalframe:16:0" else water_tex = "default_water_source_animated.png^[verticalframe:16:0" end @@ -85,8 +82,8 @@ local register_filled_cauldron = function(water_level, description, river_water) paramtype = "light", is_ground_content = false, groups = {pickaxey=1, not_in_creative_inventory=1, cauldron=(1+water_level), cauldron_filled=water_level, comparator_signal=water_level}, - node_box = cauldron_nodeboxes[water_level], - collision_box = cauldron_nodeboxes[0], + node_box = create_cauldron_nodebox(water_level), + collision_box = create_cauldron_nodebox(0), selection_box = { type = "regular" }, tiles = { "("..water_tex..")^mcl_cauldrons_cauldron_top.png", @@ -106,14 +103,12 @@ local register_filled_cauldron = function(water_level, description, river_water) end -- Filled cauldrons (3 levels) -register_filled_cauldron(1, S("Cauldron (1/3 Water)")) -register_filled_cauldron(2, S("Cauldron (2/3 Water)")) -register_filled_cauldron(3, S("Cauldron (3/3 Water)")) - -if minetest.get_modpath("mclx_core") then - register_filled_cauldron(1, S("Cauldron (1/3 River Water)"), true) - register_filled_cauldron(2, S("Cauldron (2/3 River Water)"), true) - register_filled_cauldron(3, S("Cauldron (3/3 River Water)"), true) +for i=1,3 do + register_filled_cauldron(i, S("Cauldron (" ..i .. "/3 Water)")) + register_filled_cauldron(i, S("Cauldron (" ..i .. "/3 Water)"),"lava") + if minetest.get_modpath("mclx_core") then + register_filled_cauldron(i, S("Cauldron (" ..i .. "/3 Water)"),"river_water") + end end minetest.register_craft({ @@ -125,20 +120,36 @@ minetest.register_craft({ } }) -minetest.register_abm({ - label = "cauldrons", - nodenames = {"group:cauldron_filled"}, - interval = 1, - chance = 1, - -- TODO: Move to playerinfo/playerplus/mob api - action = function(pos, node) - for _, obj in pairs(minetest.get_objects_inside_radius(pos, 0.4)) do - if mcl_burning.is_burning(obj) then - mcl_burning.extinguish(obj) - local new_group = minetest.get_item_group(node.name, "cauldron_filled") - 1 - minetest.swap_node(pos, {name = "mcl_cauldrons:cauldron" .. (new_group == 0 and "" or "_" .. new_group)}) - break +local function cauldron_extinguish(obj,pos) + local node = minetest.get_node(pos) + if mcl_burning.is_burning(obj) then + mcl_burning.extinguish(obj) + local new_group = minetest.get_item_group(node.name, "cauldron_filled") - 1 + minetest.swap_node(pos, {name = "mcl_cauldrons:cauldron" .. (new_group == 0 and "" or "_" .. new_group)}) + end +end + +local etime = 0 +minetest.register_globalstep(function(dtime) + etime = dtime + etime + if etime < 0.5 then return end + etime = 0 + for _,pl in pairs(minetest.get_connected_players()) do + local n = minetest.find_node_near(pl:get_pos(),0.4,{"group:cauldron_filled"},true) + if n and not minetest.get_node(n).name:find("lava") then + cauldron_extinguish(pl,n) + elseif n and minetest.get_node(n).name:find("lava") then + mcl_burning.set_on_fire(pl, 5) + end + end + for _,ent in pairs(minetest.luaentities) do + if ent.object:get_pos() and ent.is_mob then + local n = minetest.find_node_near(ent.object:get_pos(),0.4,{"group:cauldron_filled"},true) + if n and not minetest.get_node(n).name:find("lava") then + cauldron_extinguish(ent.object,n) + elseif n and minetest.get_node(n).name:find("lava") then + mcl_burning.set_on_fire(ent.object, 5) end end end -}) +end) diff --git a/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.zh_TW.tr b/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.zh_TW.tr new file mode 100644 index 000000000..ea3b97c41 --- /dev/null +++ b/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.zh_TW.tr @@ -0,0 +1,11 @@ +# textdomain: mcl_cauldron +Cauldron=鍋釜 +Cauldrons are used to store water and slowly fill up under rain. They can also be used to wash off banners.=鍋釜是用來儲水的,在雨水的作用下慢慢填滿。它們也可以用來清洗旗幟。 +Place a water pucket into the cauldron to fill it with water. Place an empty bucket on a full cauldron to retrieve the water. Place a water bottle into the cauldron to fill the cauldron to one third with water. Place a glass bottle in a cauldron with water to retrieve one third of the water. Use an emblazoned banner on a cauldron with water to wash off its top layer.=將水桶放入鍋釜中,使其充滿水。將一個空桶放在裝滿水的大鍋上,以取回水。將一個水瓶放入鍋釜內,使大鍋內增加三分之一的水。將一個玻璃瓶放在有水的鍋釜裡,取回三分之一的水。在有水的鍋釜上使用印有圖案的旗幟,以洗掉其上層。 +Cauldron (1/3 Water)=鍋釜(1/3 水) +Cauldron (2/3 Water)=鍋釜(2/3 水) +Cauldron (3/3 Water)=鍋釜(3/3 水) +Cauldron (1/3 River Water)=鍋釜(1/3 河水) +Cauldron (2/3 River Water)=鍋釜(2/3 河水) +Cauldron (3/3 River Water)=鍋釜(3/3 河水) +Stores water=儲存水 diff --git a/mods/ITEMS/mcl_cauldrons/mod.conf b/mods/ITEMS/mcl_cauldrons/mod.conf index 4787d60f9..36d5b303b 100644 --- a/mods/ITEMS/mcl_cauldrons/mod.conf +++ b/mods/ITEMS/mcl_cauldrons/mod.conf @@ -1,3 +1,3 @@ name = mcl_cauldrons depends = mcl_core, mcl_sounds -optional_depends = mclx_core, doc +optional_depends = mclx_core, doc, mcl_burning diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index 2ad6518a7..09fc94d94 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -3,6 +3,41 @@ local F = minetest.formspec_escape local C = minetest.colorize local mod_doc = minetest.get_modpath("doc") +-- Christmas chest setup +local it_is_christmas = false +local date = os.date("*t") +if ( + date.month == 12 and ( + date.day == 24 or + date.day == 25 or + date.day == 26 + ) +) then + it_is_christmas = true +end + +local tiles_chest_normal_small = {"mcl_chests_normal.png"} +local tiles_chest_normal_double = {"mcl_chests_normal_double.png"} + +if it_is_christmas then + tiles_chest_normal_small = {"mcl_chests_normal_present.png^mcl_chests_noise.png"} + tiles_chest_normal_double = {"mcl_chests_normal_double_present.png^mcl_chests_noise_double.png"} +end + +local tiles_chest_trapped_small = {"mcl_chests_trapped.png"} +local tiles_chest_trapped_double = {"mcl_chests_trapped_double.png"} + +if it_is_christmas then + tiles_chest_trapped_small = {"mcl_chests_trapped_present.png^mcl_chests_noise.png"} + tiles_chest_trapped_double = {"mcl_chests_trapped_double_present.png^mcl_chests_noise_double.png"} +end + +local tiles_chest_ender_small = {"mcl_chests_ender.png"} + +if it_is_christmas then + tiles_chest_ender_small = {"mcl_chests_ender_present.png^mcl_chests_noise.png"} +end + -- Chest Entity local animate_chests = (minetest.settings:get_bool("animated_chests") ~= false) local entity_animations = { @@ -214,7 +249,7 @@ local function chest_update_after_close(pos) mesecon.receptor_off(pos, trapped_chest_mesecons_rules) elseif node.name == "mcl_chests:trapped_chest_on_left" then minetest.swap_node(pos, {name="mcl_chests:trapped_chest_left", param2 = node.param2}) - find_or_create_entity(pos, "mcl_chests:trapped_chest_left", {"mcl_chests_trapped_double.png"}, node.param2, true, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_left") + find_or_create_entity(pos, "mcl_chests:trapped_chest_left", tiles_chest_trapped_double, node.param2, true, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_left") mesecon.receptor_off(pos, trapped_chest_mesecons_rules) local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left") @@ -226,7 +261,7 @@ local function chest_update_after_close(pos) local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right") minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_left", param2 = node.param2}) - find_or_create_entity(pos_other, "mcl_chests:trapped_chest_left", {"mcl_chests_trapped_double.png"}, node.param2, true, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_left") + find_or_create_entity(pos_other, "mcl_chests:trapped_chest_left", tiles_chest_trapped_double, node.param2, true, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_left") mesecon.receptor_off(pos_other, trapped_chest_mesecons_rules) elseif node.name == "mcl_chests:barrel_open" then minetest.swap_node(pos, {name = "mcl_chests:barrel", param2 = node.param2}) @@ -340,6 +375,14 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile end end + local drop_items_chest = mcl_util.drop_items_from_meta_container("main") + + local function on_chest_blast(pos) + local node = minetest.get_node(pos) + drop_items_chest(pos, node) + minetest.remove_node(pos) + end + local function limit_put_list(stack, list) for _, other in ipairs(list) do stack = other:add_item(stack) @@ -839,8 +882,8 @@ register_chest("chest", chestusage, S("27 inventory slots") .. "\n" .. S("Can be combined to a large chest"), { - small = {"mcl_chests_normal.png"}, - double = {"mcl_chests_normal_double.png"}, + small = tiles_chest_normal_small, + double = tiles_chest_normal_double, inv = {"default_chest_top.png", "mcl_chests_chest_bottom.png", "mcl_chests_chest_right.png", "mcl_chests_chest_left.png", "mcl_chests_chest_back.png", "default_chest_front.png"}, @@ -855,8 +898,8 @@ register_chest("chest", ) local traptiles = { - small = {"mcl_chests_trapped.png"}, - double = {"mcl_chests_trapped_double.png"}, + small = tiles_chest_trapped_small, + double = tiles_chest_trapped_double, inv = {"mcl_chests_chest_trapped_top.png", "mcl_chests_chest_trapped_bottom.png", "mcl_chests_chest_trapped_right.png", "mcl_chests_chest_trapped_left.png", "mcl_chests_chest_trapped_back.png", "mcl_chests_chest_trapped_front.png"}, @@ -889,7 +932,7 @@ register_chest("trapped_chest", meta:set_int("players", 1) minetest.swap_node(pos, {name="mcl_chests:trapped_chest_on_left", param2 = node.param2}) - find_or_create_entity(pos, "mcl_chests:trapped_chest_on_left", {"mcl_chests_trapped_double.png"}, node.param2, true, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_on_left") + find_or_create_entity(pos, "mcl_chests:trapped_chest_on_left", tiles_chest_trapped_double, node.param2, true, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_on_left") mesecon.receptor_on(pos, trapped_chest_mesecons_rules) local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left") @@ -903,7 +946,7 @@ register_chest("trapped_chest", mesecon.receptor_on(pos, trapped_chest_mesecons_rules) minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_on_left", param2 = node.param2}) - find_or_create_entity(pos_other, "mcl_chests:trapped_chest_on_left", {"mcl_chests_trapped_double.png"}, node.param2, true, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_on_left") + find_or_create_entity(pos_other, "mcl_chests:trapped_chest_on_left", tiles_chest_trapped_double, node.param2, true, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_on_left") mesecon.receptor_on(pos_other, trapped_chest_mesecons_rules) end ) @@ -960,7 +1003,7 @@ minetest.register_node("mcl_chests:ender_chest", { _doc_items_usagehelp = S("Rightclick the ender chest to access your personal interdimensional inventory."), drawtype = "mesh", mesh = "mcl_chests_chest.obj", - tiles = {"mcl_chests_ender.png"}, + tiles = tiles_chest_ender_small, use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false, paramtype = "light", paramtype2 = "facedir", diff --git a/mods/ITEMS/mcl_chests/textures/mcl_chests_ender_present.png b/mods/ITEMS/mcl_chests/textures/mcl_chests_ender_present.png new file mode 100644 index 0000000000000000000000000000000000000000..85df1bfba0c5d08e3224ffb8dfef2128592962b2 GIT binary patch literal 286 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 literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_chests/textures/mcl_chests_normal_double_present.png b/mods/ITEMS/mcl_chests/textures/mcl_chests_normal_double_present.png new file mode 100644 index 0000000000000000000000000000000000000000..55139fcb2fb79e1ca5872fdb7a3df233b0be263a GIT binary patch literal 307 zcmV-30nGl1P)Hn z9|RjT1k3;c?(R9M69l}iqS zFc5~j@B&_;CLX{>-MaX1V7LG#asU&0eUVQ3vLF@$80Xu}FpIA((}&pLA{w*-6r}+a zMGpX8p}x1kglZprmKg%+vvL73T7ZZ^fH?%q|AX}jhHqse|1j0UM2tl002ovPDHLk FV1ifUc7^}| literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_chests/textures/mcl_chests_normal_present.png b/mods/ITEMS/mcl_chests/textures/mcl_chests_normal_present.png new file mode 100644 index 0000000000000000000000000000000000000000..23faf46b890e0a2f10f34f4db01f1e4807673d50 GIT binary patch literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|ei2$Dv*Tez_Ee3{F3=9pTqGuQw z-fL>Uy~6P4rT-SYx-URAj3q&S!3+-1ZlnP@n>}3|Lp+YZoqU$}kO7Zd@#8aGb{iT5 zxlIfh(-`WCo;~|on8WP4ME8PH*A?~1`AU0DdMCF?&Tn>b(P{0_5zR6v?#u0wd0e$J za4W|Q$%q0g*0PWX{w@Fh8_fA|Cu{l74K-PY_e9KI{!l&W$jlJ2YJ+cPL%>#!&u27P z_J`ZH+<&)d_0_ZOPp41JnC>^r?9vXut>3qKu~(N@aEty~%+S5%`j(5eORu*&^|)2s gsa(h}Ed2i%>-vo28$?zf0r{7~)78&qol`;+02_UBCIA2c literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_chests/textures/mcl_chests_trapped_double_present.png b/mods/ITEMS/mcl_chests/textures/mcl_chests_trapped_double_present.png new file mode 100644 index 0000000000000000000000000000000000000000..2d10331f32669d2eb7e6d375fc8d594c164fb3d6 GIT binary patch literal 307 zcmV-30nGl1P)H+ z3IISA03b?-G-af(R9M69l}iqS zFc5~j@B&_;CLX{>-MaX1V7LG#asU&0eUVQ3vLF@$80Xu}FpIA((}&pLA{w*-6r}+a zMGpX8p}x1kglZprmKg%+vvL73T7ZZ^fH?%q|AX}jhHqse|1j0UM2tl002ovPDHLk FV1kmecgg?& literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_chests/textures/mcl_chests_trapped_present.png b/mods/ITEMS/mcl_chests/textures/mcl_chests_trapped_present.png new file mode 100644 index 0000000000000000000000000000000000000000..473f24c573614c7b5c7bfb886255dd197ac6c312 GIT binary patch literal 286 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|ei2$Dv*Te!KOG{KVQNgR-By~yA z{PUNupMUr6&C^?H3P2ggk|4ie28U-i(tw;To-U3d9>KZsjLAG0gjd;4Wd&fFK#F@5AbJ93vgz9ccLll zsMo|52Xu8?-MAJwa5DAu_MUE(=r(U;WMJ{D5aDP#upofJH(W$RA|hUZE9=fgR^Oh5 z3llR}CP*D(4mMaj;m@*Z(^yWHdlhi4VaQssabskZ(Tuha0%n5i8MsX|L>By#@wVt` e3N*OFz)-j4?A_hFR*3=K&*16m=d#Wzp$Pz8q+#y> literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_clock/locale/mcl_clock.zh_TW.tr b/mods/ITEMS/mcl_clock/locale/mcl_clock.zh_TW.tr new file mode 100644 index 000000000..c6834373f --- /dev/null +++ b/mods/ITEMS/mcl_clock/locale/mcl_clock.zh_TW.tr @@ -0,0 +1,5 @@ +# textdomain: mcl_clock +Clocks are tools which shows the current time of day in the Overworld.=時鐘顯示世界上當前時間的工具。 +The clock contains a rotating disc with a sun symbol (yellow disc) and moon symbol and a little “pointer” which shows the current time of day by estimating the real position of the sun and the moon in the sky. Noon is represented by the sun symbol and midnight is represented by the moon symbol.=時鐘包含一個帶有太陽符號(黃色圓盤)和月亮符號的旋轉圓盤,以及一個小「指針」,通過估計太陽和月亮在天空中的實際位置來顯示當前的時間。正午由太陽符號表示,午夜由月亮符號表示。 +Clock=時鐘 +Displays the time of day in the Overworld=顯示世界上當前的時間 diff --git a/mods/ITEMS/mcl_cocoas/locale/mcl_cocoas.zh_TW.tr b/mods/ITEMS/mcl_cocoas/locale/mcl_cocoas.zh_TW.tr new file mode 100644 index 000000000..d71e2b11b --- /dev/null +++ b/mods/ITEMS/mcl_cocoas/locale/mcl_cocoas.zh_TW.tr @@ -0,0 +1,6 @@ +# textdomain: mcl_cocoas +Premature Cocoa Pod=成長中的可可豆莢(第1階段) +Cocoa pods grow on the side of jungle trees in 3 stages.=可可莢果分3個階段生長在叢林樹的側面。 +Medium Cocoa Pod=成長中的可可豆莢(第2階段) +Mature Cocoa Pod=成熟的可可豆莢 +A mature cocoa pod grew on a jungle tree to its full size and it is ready to be harvested for cocoa beans. It won't grow any further.=一個成熟的可可豆莢在叢林樹上成熟,它已經準備好被收穫成可可豆了。它不會再長了。 diff --git a/mods/ITEMS/mcl_compass/API.md b/mods/ITEMS/mcl_compass/API.md new file mode 100644 index 000000000..8a8e7247e --- /dev/null +++ b/mods/ITEMS/mcl_compass/API.md @@ -0,0 +1,20 @@ +# mcl_compass + +# Compass API + +##mcl_compass.stereotype = "mcl_compass:" .. stereotype_frame +Default compass craftitem. This is also the image that is shown in the inventory. + +##mcl_compass/init.lua:function mcl_compass.get_compass_itemname(pos, dir, itemstack) +Returns the itemname of a compass with needle direction matching the +current compass position. + + pos: position of the compass; + dir: rotational orientation of the compass; + itemstack: the compass including its optional lodestone metadata. + +##mcl_compass/init.lua:function mcl_compass.get_compass_image(pos, dir) +-- Returns partial itemname of a compass with needle direction matching compass position. +-- Legacy compatibility function for mods using older api. + + diff --git a/mods/ITEMS/mcl_compass/init.lua b/mods/ITEMS/mcl_compass/init.lua index dbb2e8358..789caf947 100644 --- a/mods/ITEMS/mcl_compass/init.lua +++ b/mods/ITEMS/mcl_compass/init.lua @@ -1,188 +1,249 @@ ---TODO: Add advancement - local S = minetest.get_translator(minetest.get_current_modname()) mcl_compass = {} +local compass_types = { + { + name = "compass", + desc = S("Compass"), + tt = S("Points to the world origin"), + longdesc = S("Compasses are tools which point to the world origin (X=0, Z=0) or the spawn point in the Overworld."), + usagehelp = S("A Compass always points to the world spawn point when the player is in the overworld. In other dimensions, it spins randomly."), + }, + { + name = "compass_lodestone", + desc = S("Lodestone Compass"), + tt = S("Points to a lodestone"), + longdesc = S("Lodestone compasses resemble regular compasses, but they point to a specific lodestone."), + usagehelp = S("A Lodestone compass can be made from an ordinary compass by using it on a lodestone. After becoming a lodestone compass, it always points to its linked lodestone, provided that they are in the same dimension. If not in the same dimension, the lodestone compass spins randomly, similarly to a regular compass when outside the overworld. A lodestone compass can be relinked with another lodestone."), + } +} + +-- Number of dynamic compass images (and items registered.) local compass_frames = 32 ---Not sure spawn point should be dymanic (is it in mc?) ---local default_spawn_settings = minetest.settings:get("static_spawnpoint") +-- The image/item that is craftable and shown in inventories. +local stereotype_frame = 18 --- Timer for random compass spinning -local random_timer = 0 -local random_timer_trigger = 0.5 -- random compass spinning tick in seconds. Incr ease if there are performance problems +-- random compass spinning tick in seconds. +-- Increase if there are performance problems. +local spin_timer_tick = 0.5 -local random_frame = math.random(0, compass_frames-1) +-- Local aliases to globals for better lua performance +local m_deg = math.deg +local m_atan2 = math.atan2 +local m_floor = math.floor +local m_rnd = math.random +local vec_new = vector.new +local string_find = string.find +local string_to_pos = minetest.string_to_pos +local get_connected_players = minetest.get_connected_players +local get_item_group = minetest.get_item_group +local setting_get_pos = minetest.setting_get_pos +local compass_works = mcl_worlds.compass_works +local y_to_layer = mcl_worlds.y_to_layer -function mcl_compass.get_compass_image(pos, dir, x, y, z) - -- Compasses do not work in certain zones - if mcl_worlds.compass_works(pos) and x ~= nil and y ~= nil and z ~= nil then - local _, dim = mcl_worlds.y_to_layer(y) - local _, playerdim = mcl_worlds.y_to_layer(pos.y) - - if dim == playerdim then --Check if player and compass target are in the same dimension, above check is just if the diemension is valid for the non lodestone compass - local spawn = {x=x,y=y,z=z} - local ssp = minetest.setting_get_pos("static_spawnpoint") - if ssp and x == 0 and y == 0 and z == 0 then - spawn = ssp - if type(spawn) ~= "table" or type(spawn.x) ~= "number" or type(spawn.y) ~= "number" or type(spawn.z) ~= "number" then - spawn = {x=0,y=0,z=0} - end - end - local angle_north = math.deg(math.atan2(spawn.x - pos.x, spawn.z - pos.z)) - if angle_north < 0 then angle_north = angle_north + 360 end - local angle_dir = -math.deg(dir) - local angle_relative = (angle_north - angle_dir + 180) % 360 - return math.floor((angle_relative/11.25) + 0.5) % compass_frames +-- Initialize random compass frame for spinning compass. It is updated in +-- the compass globalstep function. +local random_frame = m_rnd(0, compass_frames-1) + +local function get_far_node(pos, itemstack) --code from minetest dev wiki: https://dev.minetest.net/minetest.get_node, some edits have been made to add a cooldown for force loads + local node = minetest.get_node(pos) + if node.name == "ignore" then + local tstamp = tonumber(itemstack:get_meta():get_string("last_forceload")) + if tstamp == nil then --this is only relevant for new lodestone compasses, the ones that have never performes a forceload yet + itemstack:get_meta():set_string("last_forceload", tostring(os.time(os.date("!*t")))) + tstamp = tonumber(os.time(os.date("!*t"))) + end + if tonumber(os.time(os.date("!*t"))) - tstamp > 180 then --current time in secounds - old time in secounds, if it is over 180 (3 mins): forceload + itemstack:get_meta():set_string("last_forceload", tostring(os.time(os.date("!*t")))) + minetest.get_voxel_manip():read_from_map(pos, pos) + node = minetest.get_node(pos) + else + node = {name="mcl_compass:lodestone"} --cooldown not over yet, pretend like there is something... + end + end + return node +end + +--- Get compass needle angle. +-- Returns the angle that the compass needle should point at expressed in +-- 360 degrees divided by the number of possible compass image frames.. +-- +-- pos: position of the compass; +-- target: position that the needle points towards; +-- dir: rotational direction of the compass. +-- +local function get_compass_angle(pos, target, dir) + local angle_north = m_deg(m_atan2(target.x - pos.x, target.z - pos.z)) + if angle_north < 0 then angle_north = angle_north + 360 end + local angle_dir = -m_deg(dir) + local angle_relative = (angle_north - angle_dir + 180) % 360 + return m_floor((angle_relative/11.25) + 0.5) % compass_frames +end + +--- Get compass image frame. +-- Returns the compass image frame with the needle direction matching the +-- compass' current position. +-- +-- pos: position of the compass; +-- dir: rotational direction of the compass. +-- itemstack: the compass including its optional lodestone metadata. +-- +local function get_compass_frame(pos, dir, itemstack) + if not string_find(itemstack:get_name(), "_lodestone") then -- normal compass + -- Compasses only work in the overworld + if compass_works(pos) then + local spawn_pos = setting_get_pos("static_spawnpoint") + or vec_new(0, 0, 0) + return get_compass_angle(pos, spawn_pos, dir) else return random_frame end - else - if x ~= 0 and y ~= 0 and z~= 0 and x ~= nil and y ~= nil and x~= nil then - local _, dim = mcl_worlds.y_to_layer(y) - local _, playerdim = mcl_worlds.y_to_layer(pos.y) - if dim == playerdim then --already explained that very same if statement above - local spawn = {x=x,y=y,z=z} - local ssp = minetest.setting_get_pos("static_spawnpoint") - if ssp and x == 0 and y == 0 and z == 0 then - spawn = ssp - if type(spawn) ~= "table" or type(spawn.x) ~= "number" or type(spawn.y) ~= "number" or type(spawn.z) ~= "number" then - spawn = {x=0,y=0,z=0} - end - end - local angle_north = math.deg(math.atan2(spawn.x - pos.x, spawn.z - pos.z)) - if angle_north < 0 then angle_north = angle_north + 360 end - local angle_dir = -math.deg(dir) - local angle_relative = (angle_north - angle_dir + 180) % 360 - return math.floor((angle_relative/11.25) + 0.5) % compass_frames - else + else -- lodestone compass + local lpos_str = itemstack:get_meta():get_string("pointsto") + local lpos = string_to_pos(lpos_str) + if not lpos then + minetest.log("warning", "mcl_compass: invalid lodestone position!") + return random_frame + end + local _, l_dim = y_to_layer(lpos.y) + local _, p_dim = y_to_layer(pos.y) + -- compass and lodestone must be in the same dimension + if l_dim == p_dim then + --check if lodestone still exists + if get_far_node(lpos, itemstack).name == "mcl_compass:lodestone" then + return get_compass_angle(pos, lpos, dir) + else -- lodestone got destroyed return random_frame end - else return random_frame end end end -minetest.register_globalstep(function(dtime) - random_timer = random_timer + dtime +-- Export stereotype item for other mods to use +mcl_compass.stereotype = "mcl_compass:" .. stereotype_frame - if random_timer >= random_timer_trigger then - random_frame = (random_frame + math.random(-1, 1)) % compass_frames - random_timer = 0 +--- Get partial compass itemname. +-- Returns partial itemname of a compass with needle direction matching compass position. +-- Legacy compatibility function for mods using older api. +-- +function mcl_compass.get_compass_image(pos, dir) + minetest.log("warning", "mcl_compass: deprecated function " .. + "get_compass_image() called, use get_compass_itemname().") + local itemstack = ItemStack(mcl_compass.stereotype) + return get_compass_frame(pos, dir, itemstack) +end + +--- Get compass itemname. +-- Returns the itemname of a compass with needle direction matching the +-- current compass position. +-- +-- pos: position of the compass; +-- dir: rotational orientation of the compass; +-- itemstack: the compass including its optional lodestone metadata. +-- +function mcl_compass.get_compass_itemname(pos, dir, itemstack) + if not itemstack then + minetest.log("warning", "mcl_compass.get_compass_image called without itemstack!") + return "mcl_compass:" .. stereotype_frame end - for i,player in pairs(minetest.get_connected_players()) do - local function has_compass(player) - for _,stack in pairs(player:get_inventory():get_list("main")) do - if minetest.get_item_group(stack:get_name(), "compass") ~= 0 then - return true - end - end - return false - end - if has_compass(player) then - local pos = player:get_pos() + local frame = get_compass_frame(pos, dir, itemstack) + if itemstack:get_meta():get_string("pointsto") ~= "" then + return "mcl_compass:" .. frame .. "_lodestone" + else + return "mcl_compass:" .. frame + end +end - for j,stack in pairs(player:get_inventory():get_list("main")) do - x = stack:get_meta():get_string("x") -- i know i could write the pos in meta, but i like this method more, and it is basicly the same, since else there would be one table with 3 values, and i have 3 values on their own - y = stack:get_meta():get_string("y") - z = stack:get_meta():get_string("z") - - x = tonumber(x) - y = tonumber(y) - z = tonumber(z) - - if x == nil or y == nil or z == nil then --checking if the compass has lodestone meta - compass_image = mcl_compass.get_compass_image(pos, player:get_look_horizontal(), 0, 0, 0) --no lodestone meta - else - checkblock = {x = x, y = y, z = z} - local function get_far_node(pos) --function that tries to read node normally, and does it even if its unloaded https://dev.minetest.net/minetest.get_node - local node = minetest.get_node(pos) - if node.name == "ignore" then - minetest.get_voxel_manip():read_from_map(pos, pos) - node = minetest.get_node(pos) - end - return node +-- Timer for randomly spinning compass. +-- Gets updated and checked in the globalstep function. +local spin_timer = 0 + +-- Compass globalstep function. +-- * updates random spin counter and random frame of spinning compasses; +-- * updates all compasses in player's inventories to match the correct +-- needle orientations for their current positions. +-- +minetest.register_globalstep(function(dtime) + spin_timer = spin_timer + dtime + if spin_timer >= spin_timer_tick then + random_frame = (random_frame + m_rnd(-1, 1)) % compass_frames + spin_timer = 0 + end + + local compass_nr, compass_frame + local pos, dir, inv + for _, player in pairs(get_connected_players()) do + pos = player:get_pos() + dir = player:get_look_horizontal() + inv = player:get_inventory() + for j, stack in pairs(inv:get_list("main")) do + compass_nr = get_item_group(stack:get_name(), "compass") + if compass_nr ~= 0 then + -- check if current compass image still matches true orientation + compass_frame = get_compass_frame(pos, dir, stack) + if compass_nr - 1 ~= compass_frame then + + if string_find(stack:get_name(), "_lodestone") then + stack:set_name("mcl_compass:" .. compass_frame .. "_lodestone") + awards.unlock(player:get_player_name(), "mcl:countryLode") + else + stack:set_name("mcl_compass:" .. compass_frame) end - - if get_far_node(checkblock).name == "mcl_compass:lodestone" then --check if lodestone still exists - compass_image = mcl_compass.get_compass_image(pos, player:get_look_horizontal(), x, y, z) - compass_image = compass_image .. "_lodestone" - else -- lodestone got destroyed - compass_image = random_frame .. "_lodestone" - end - - - end - - if minetest.get_item_group(stack:get_name(), "compass") ~= 0 and - minetest.get_item_group(stack:get_name(), "compass")-1 ~= compass_image then - local itemname = "mcl_compass:"..compass_image - stack:set_name(itemname) - player:get_inventory():set_stack("main", j, stack) + inv:set_stack("main", j, stack) end end end end end) -local images = {} -for frame = 0, compass_frames-1 do - local s = string.format("%02d", frame) - table.insert(images, "mcl_compass_compass_"..s..".png") -end - +-- +-- Node and craftitem definitions +-- local doc_mod = minetest.get_modpath("doc") -local stereotype_frame = 18 -for i,img in ipairs(images) do - local inv = 1 - if i == stereotype_frame then - inv = 0 +for _, item in pairs(compass_types) do + local name_fmt, img_fmt + if item.name == "compass" then + name_fmt = "mcl_compass:%d" + img_fmt = "mcl_compass_compass_%02d.png" + elseif item.name == "compass_lodestone" then + name_fmt = "mcl_compass:%d_lodestone" + img_fmt = "mcl_compass_compass_%02d.png^[colorize:purple:50" end - local use_doc, longdesc, tt - --Why is there no usage help? This should be fixed. - --local usagehelp - use_doc = i == stereotype_frame - if use_doc then - tt = S("Points to the world origin") - longdesc = S("Compasses are tools which point to the world origin (X=0, Z=0) or the spawn point in the Overworld.") - end - local itemstring = "mcl_compass:"..(i-1) - minetest.register_craftitem(itemstring, { - description = S("Compass"), - _tt_help = tt, - _doc_items_create_entry = use_doc, - _doc_items_longdesc = longdesc, - --_doc_items_usagehelp = usagehelp, - inventory_image = img, - wield_image = img, - stack_max = 64, - groups = {not_in_creative_inventory=inv, compass=i, tool=1, disable_repair=1 } - }) - - minetest.register_craftitem(itemstring .. "_lodestone", { - description = S("Lodestone Compass"), - _tt_help = tt, - _doc_items_create_entry = use_doc, - _doc_items_longdesc = longdesc, - --_doc_items_usagehelp = usagehelp, - inventory_image = img .. "^[colorize:purple:50", - wield_image = img .. "^[colorize:purple:50", - stack_max = 64, - groups = {not_in_creative_inventory=1, compass=i, tool=1, disable_repair=1 } - }) + for i = 0, compass_frames - 1 do + local itemstring = string.format(name_fmt, i) + local def = { + description = item.desc, + _tt_help = item.tt, + inventory_image = string.format(img_fmt, i), + wield_image = string.format(img_fmt, i), + groups = {compass = i + 1, tool = 1, disable_repair = 1}, + } + if i == stereotype_frame then + def._doc_items_longdesc = item.longdesc + def._doc_items_usagehelp = item.usagehelp + if string.match(itemstring, "lodestone") then + def.groups.not_in_creative_inventory = 1 + end + else + def._doc_items_create_entry = false + def.groups.not_in_creative_inventory = 1 + end + minetest.register_craftitem(itemstring, table.copy(def)) - -- Help aliases. Makes sure the lookup tool works correctly - if not use_doc and doc_mod then - doc.add_entry_alias("craftitems", "mcl_compass:"..(stereotype_frame-1), "craftitems", itemstring) + -- Help aliases. Makes sure the lookup tool works correctly + if doc_mod and i ~= stereotype_frame then + doc.add_entry_alias("craftitems", "mcl_compass:"..(stereotype_frame), "craftitems", itemstring) + end end end minetest.register_craft({ - output = "mcl_compass:"..stereotype_frame, + output = "mcl_compass:" .. stereotype_frame, recipe = { {"", "mcl_core:iron_ingot", ""}, {"mcl_core:iron_ingot", "mesecons:redstone", "mcl_core:iron_ingot"}, @@ -190,29 +251,18 @@ minetest.register_craft({ } }) -minetest.register_craft({ - output = "mcl_compass:lodestone", - recipe = { - {"mcl_core:stonebrickcarved","mcl_core:stonebrickcarved","mcl_core:stonebrickcarved"}, - {"mcl_core:stonebrickcarved", "mcl_nether:netherite_ingot", "mcl_core:stonebrickcarved"}, - {"mcl_core:stonebrickcarved", "mcl_core:stonebrickcarved", "mcl_core:stonebrickcarved"} - } -}) - -minetest.register_alias("mcl_compass:compass", "mcl_compass:"..stereotype_frame) - --- Export stereotype item for other mods to use -mcl_compass.stereotype = "mcl_compass:"..tostring(stereotype_frame) - +minetest.register_alias("mcl_compass:compass", "mcl_compass:" .. stereotype_frame) minetest.register_node("mcl_compass:lodestone",{ description=S("Lodestone"), on_rightclick = function(pos, node, player, itemstack) - if itemstack.get_name(itemstack).match(itemstack.get_name(itemstack),"mcl_compass:") then - if itemstack.get_name(itemstack) ~= "mcl_compass:lodestone" then - itemstack:get_meta():set_string("x", pos.x) - itemstack:get_meta():set_string("y", pos.y) - itemstack:get_meta():set_string("z", pos.z) + local name = itemstack.get_name(itemstack) + if string_find(name,"mcl_compass:") then + if name ~= "mcl_compass:lodestone" then + itemstack:get_meta():set_string("pointsto", minetest.pos_to_string(pos)) + local dir = player:get_look_horizontal() + local frame = get_compass_frame(pos, dir, itemstack) + itemstack:set_name("mcl_compass:" .. frame .. "_lodestone") end end end, @@ -228,4 +278,13 @@ minetest.register_node("mcl_compass:lodestone",{ _mcl_hardness = 1.5, _mcl_blast_resistance = 6, sounds = mcl_sounds.node_sound_stone_defaults() -}) \ No newline at end of file +}) + +minetest.register_craft({ + output = "mcl_compass:lodestone", + recipe = { + {"mcl_core:stonebrickcarved","mcl_core:stonebrickcarved","mcl_core:stonebrickcarved"}, + {"mcl_core:stonebrickcarved", "mcl_nether:netherite_ingot", "mcl_core:stonebrickcarved"}, + {"mcl_core:stonebrickcarved", "mcl_core:stonebrickcarved", "mcl_core:stonebrickcarved"} + } +}) diff --git a/mods/ITEMS/mcl_compass/locale/mcl_compass.de.tr b/mods/ITEMS/mcl_compass/locale/mcl_compass.de.tr index cf4c814ce..9e0366508 100644 --- a/mods/ITEMS/mcl_compass/locale/mcl_compass.de.tr +++ b/mods/ITEMS/mcl_compass/locale/mcl_compass.de.tr @@ -1,4 +1,9 @@ # textdomain: mcl_compass -Compasses are tools which point to the world origin (X@=0, Z@=0) or the spawn point in the Overworld.=Kompasse sind Werkzeuge, die zum Ursprungspunkt der Welt (X@=0, Z@=0) oder zum Einstiegspunkt der Welt zeigen. Compass=Kompass Points to the world origin=Zeigt zum Startpunkt der Welt +Compasses are tools which point to the world origin (X@=0, Z@=0) or the spawn point in the Overworld.=Kompasse sind Werkzeuge, die zum Ursprungspunkt der Welt (X@=0, Z@=0) oder zum Einstiegspunkt der Welt zeigen. +A Compass always points to the world spawn point when the player is in the overworld. In other dimensions, it spins randomly.=Ein Kompass zeigt immer zum Weltspawn in der Oberwelt. In sämtlichen anderen Dimensionen dreht er sich zufällig. +Lodestone Compass=Leitstein Kompass +Points to a lodestone=Zeigt zu einem Leitstein +Lodestone compasses resemble regular compasses, but they point to a specific lodestone.=Leitstein Kompasse ähneln normalen Kompassen, aber sie zeigen zu einen spezifischen Leitstein. +A Lodestone compass can be made from an ordinary compass by using it on a lodestone. After becoming a lodestone compass, it always points to its linked lodestone, provided that they are in the same dimension. If not in the same dimension, the lodestone compass spins randomly, similarly to a regular compass when outside the overworld. A lodestone compass can be relinked with another lodestone.=Ein Leitstein Kompass kann mit einem normalen Kompass erstellt werden indem man ihn auf einem Leitstein benutzt. Nachdem er ein Leitstein Kompass geworden ist, wird er immer zu seinem Leitstein zeigen, sofern sie in der selben Dimension sind. Wenn sie nicht in der selben Dimension sind, dreht sich der Leitstein Kompass zufällig, wie ein normaler Kompass außerhalb der Oberwelt. Ein Leitstein Kompass kann mit einem anderem Leitstein verknüpft werden. diff --git a/mods/ITEMS/mcl_compass/locale/mcl_compass.es.tr b/mods/ITEMS/mcl_compass/locale/mcl_compass.es.tr index 4f9fd5294..77b36cad9 100644 --- a/mods/ITEMS/mcl_compass/locale/mcl_compass.es.tr +++ b/mods/ITEMS/mcl_compass/locale/mcl_compass.es.tr @@ -1,3 +1,9 @@ # textdomain: mcl_compass +Compass=Brújula +Points to the world origin= Compasses are tools which point to the world origin (X@=0, Z@=0) or the spawn point in the Overworld.=Las brújulas son herramientas que apuntan al origen del mundo (X @ = 0, Z @ = 0) o al punto de generación en el mundo. -Compass=Brújula \ No newline at end of file +A Compass always points to the world spawn point when the player is in the overworld. In other dimensions, it spins randomly.= +Lodestone Compass= +Points to a lodestone= +Lodestone compasses resemble regular compasses, but they point to a specific lodestone.= +A Lodestone compass can be made from an ordinary compass by using it on a lodestone. After becoming a lodestone compass, it always points to its linked lodestone, provided that they are in the same dimension. If not in the same dimension, the lodestone compass spins randomly, similarly to a regular compass when outside the overworld. A lodestone compass can be relinked with another lodestone.= diff --git a/mods/ITEMS/mcl_compass/locale/mcl_compass.fr.tr b/mods/ITEMS/mcl_compass/locale/mcl_compass.fr.tr index 8ad4bda79..c09b334a0 100644 --- a/mods/ITEMS/mcl_compass/locale/mcl_compass.fr.tr +++ b/mods/ITEMS/mcl_compass/locale/mcl_compass.fr.tr @@ -1,6 +1,9 @@ # textdomain: mcl_compass -Compasses are tools which point to the world origin (X@=0, Z@=0) or the spawn point in the Overworld.=Les boussoles sont des outils qui pointent vers l'origine du monde (X@=0,Z@=0) ou le point d'apparition dans l'Overworld. Compass=Boussole Points to the world origin=Pointe vers l'origine mondiale -Lodestone Compass=Boussole magnétisée -Lodestone=Magnétite +Compasses are tools which point to the world origin (X@=0, Z@=0) or the spawn point in the Overworld.=Les boussoles sont des outils qui pointent vers l'origine du monde (X@=0,Z@=0) ou le point d'apparition dans l'Overworld. +A Compass always points to the world spawn point when the player is in the overworld. In other dimensions, it spins randomly.= +Lodestone Compass= +Points to a lodestone= +Lodestone compasses resemble regular compasses, but they point to a specific lodestone.= +A Lodestone compass can be made from an ordinary compass by using it on a lodestone. After becoming a lodestone compass, it always points to its linked lodestone, provided that they are in the same dimension. If not in the same dimension, the lodestone compass spins randomly, similarly to a regular compass when outside the overworld. A lodestone compass can be relinked with another lodestone.= diff --git a/mods/ITEMS/mcl_compass/locale/mcl_compass.pl.tr b/mods/ITEMS/mcl_compass/locale/mcl_compass.pl.tr index 2a9533652..33ac4b204 100644 --- a/mods/ITEMS/mcl_compass/locale/mcl_compass.pl.tr +++ b/mods/ITEMS/mcl_compass/locale/mcl_compass.pl.tr @@ -1,4 +1,9 @@ # textdomain: mcl_compass -Compasses are tools which point to the world origin (X@=0, Z@=0) or the spawn point in the Overworld.=Kompasy to narzędzia które wskazują na punkt początku świata (X@=0, Z@=0) lub na miejsce odrodzenia na Powierzchni. Compass=Kompas Points to the world origin=Wskazuje na początek świata +Compasses are tools which point to the world origin (X@=0, Z@=0) or the spawn point in the Overworld.=Kompasy to narzędzia które wskazują na punkt początku świata (X@=0, Z@=0) lub na miejsce odrodzenia na Powierzchni. +A Compass always points to the world spawn point when the player is in the overworld. In other dimensions, it spins randomly.= +Lodestone Compass= +Points to a lodestone= +Lodestone compasses resemble regular compasses, but they point to a specific lodestone.= +A Lodestone compass can be made from an ordinary compass by using it on a lodestone. After becoming a lodestone compass, it always points to its linked lodestone, provided that they are in the same dimension. If not in the same dimension, the lodestone compass spins randomly, similarly to a regular compass when outside the overworld. A lodestone compass can be relinked with another lodestone.= diff --git a/mods/ITEMS/mcl_compass/locale/mcl_compass.ru.tr b/mods/ITEMS/mcl_compass/locale/mcl_compass.ru.tr index dadf20c7d..7fd98de87 100644 --- a/mods/ITEMS/mcl_compass/locale/mcl_compass.ru.tr +++ b/mods/ITEMS/mcl_compass/locale/mcl_compass.ru.tr @@ -1,4 +1,9 @@ # textdomain: mcl_compass -Compasses are tools which point to the world origin (X@=0, Z@=0) or the spawn point in the Overworld.=Компас - инструмент, показывающий на начало мира (X@=0, Z@=0) или на точку возрождения в Верхнем Мире. Compass=Компас Points to the world origin=Указывает на начало мира +Compasses are tools which point to the world origin (X@=0, Z@=0) or the spawn point in the Overworld.=Компас - инструмент, показывающий на начало мира (X@=0, Z@=0) или на точку возрождения в Верхнем Мире. +A Compass always points to the world spawn point when the player is in the overworld. In other dimensions, it spins randomly.= +Lodestone Compass= +Points to a lodestone= +Lodestone compasses resemble regular compasses, but they point to a specific lodestone.= +A Lodestone compass can be made from an ordinary compass by using it on a lodestone. After becoming a lodestone compass, it always points to its linked lodestone, provided that they are in the same dimension. If not in the same dimension, the lodestone compass spins randomly, similarly to a regular compass when outside the overworld. A lodestone compass can be relinked with another lodestone.= diff --git a/mods/ITEMS/mcl_compass/locale/mcl_compass.zh_TW.tr b/mods/ITEMS/mcl_compass/locale/mcl_compass.zh_TW.tr new file mode 100644 index 000000000..257487a55 --- /dev/null +++ b/mods/ITEMS/mcl_compass/locale/mcl_compass.zh_TW.tr @@ -0,0 +1,9 @@ +# textdomain: mcl_compass +Compass=指南針 +Points to the world origin=指向世界原點 +Compasses are tools which point to the world origin (X@=0, Z@=0) or the spawn point in the Overworld.=指南針是指向世界原點(X@=0,Z@=0)或主世界的出生點的工具。 +A Compass always points to the world spawn point when the player is in the overworld. In other dimensions, it spins randomly.= +Lodestone Compass= +Points to a lodestone= +Lodestone compasses resemble regular compasses, but they point to a specific lodestone.= +A Lodestone compass can be made from an ordinary compass by using it on a lodestone. After becoming a lodestone compass, it always points to its linked lodestone, provided that they are in the same dimension. If not in the same dimension, the lodestone compass spins randomly, similarly to a regular compass when outside the overworld. A lodestone compass can be relinked with another lodestone.= diff --git a/mods/ITEMS/mcl_compass/locale/template.txt b/mods/ITEMS/mcl_compass/locale/template.txt index 48157aa14..909e21a36 100644 --- a/mods/ITEMS/mcl_compass/locale/template.txt +++ b/mods/ITEMS/mcl_compass/locale/template.txt @@ -1,6 +1,9 @@ # textdomain: mcl_compass -Compasses are tools which point to the world origin (X@=0, Z@=0) or the spawn point in the Overworld.= Compass= Points to the world origin= +Compasses are tools which point to the world origin (X@=0, Z@=0) or the spawn point in the Overworld.= +A Compass always points to the world spawn point when the player is in the overworld. In other dimensions, it spins randomly.= Lodestone Compass= -Lodestone= \ No newline at end of file +Points to a lodestone= +Lodestone compasses resemble regular compasses, but they point to a specific lodestone.= +A Lodestone compass can be made from an ordinary compass by using it on a lodestone. After becoming a lodestone compass, it always points to its linked lodestone, provided that they are in the same dimension. If not in the same dimension, the lodestone compass spins randomly, similarly to a regular compass when outside the overworld. A lodestone compass can be relinked with another lodestone.= diff --git a/mods/ITEMS/mcl_compass/mod.conf b/mods/ITEMS/mcl_compass/mod.conf index b807d678e..361cd7d3a 100644 --- a/mods/ITEMS/mcl_compass/mod.conf +++ b/mods/ITEMS/mcl_compass/mod.conf @@ -1,4 +1,4 @@ name = mcl_compass description = A compass item which points towards the world origin. -depends = mcl_core, mcl_worlds, mesecons, mcl_nether, mcl_sounds -optional_depends = doc \ No newline at end of file +depends = mcl_core, mcl_worlds, mesecons, mcl_sounds +optional_depends = doc diff --git a/mods/ITEMS/mcl_composters/init.lua b/mods/ITEMS/mcl_composters/init.lua index 6c0450b2f..4e366347a 100644 --- a/mods/ITEMS/mcl_composters/init.lua +++ b/mods/ITEMS/mcl_composters/init.lua @@ -32,33 +32,58 @@ minetest.register_craft({ } }) +minetest.register_craft({ + type = "fuel", + recipe = "mcl_composters:composter", + burntime = 15, +}) + +local get_item_group = minetest.get_item_group +local is_creative_enabled = minetest.is_creative_enabled +local registered_nodes = minetest.registered_nodes +local swap_node = minetest.swap_node +local get_node_timer = minetest.get_node_timer +local add_item = minetest.add_item +local vector_offset = vector.offset +local is_protected = minetest.is_protected +local record_protection_violation = minetest.record_protection_violation + +--- Fill the composter when rightclicked. +-- +-- `on_rightclick` handler for composter blocks of all fill levels except +-- for the "ready" composter (see: composter_harvest). +-- If the item used on the composter block is compostable, there is a chance +-- that the level of the composter may increase, depending on the value of +-- compostability of the item. +-- +-- parameters are the standard parameters passed to `on_rightclick`. +-- returns the remaining itemstack. +-- local function composter_add_item(pos, node, player, itemstack, pointed_thing) - -- - -- handler for filling the composter when rightclicked - -- - -- as an on_rightclick handler, it returns an itemstack - -- if not player or (player:get_player_control() and player:get_player_control().sneak) then return itemstack end - if not itemstack and itemstack:is_empty() then + local name = player:get_player_name() + if is_protected(pos, name) then + record_protection_violation(pos, name) + return itemstack + end + if not itemstack or itemstack:is_empty() then return itemstack end local itemname = itemstack:get_name() - local chance = minetest.get_item_group(itemname, "compostability") - + local chance = get_item_group(itemname, "compostability") if chance > 0 then - if not minetest.is_creative_enabled(player:get_player_name()) then + if not is_creative_enabled(player:get_player_name()) then itemstack:take_item() end -- calculate leveling up chance local rand = math.random(0,100) if chance >= rand then -- get current compost level - local node_defs = minetest.registered_nodes[node.name] - local level = node_defs["_mcl_compost_level"] + local level = registered_nodes[node.name]["_mcl_compost_level"] -- spawn green particles above new layer - mcl_dye.add_bone_meal_particle(vector.add(pos, {x=0, y=level/8, z=0})) + mcl_dye.add_bone_meal_particle(vector_offset(pos, 0, level/8, 0)) -- TODO: play some sounds -- update composter block if level < 7 then @@ -66,11 +91,11 @@ local function composter_add_item(pos, node, player, itemstack, pointed_thing) else level = "ready" end - minetest.swap_node(pos, {name = "mcl_composters:composter_" .. level}) + swap_node(pos, {name = "mcl_composters:composter_" .. level}) -- a full composter becomes ready for harvest after one second -- the block will get updated by the node timer callback set in node reg def if level == 7 then - local timer = minetest.get_node_timer(pos) + local timer = get_node_timer(pos) timer:start(1) end end @@ -78,39 +103,50 @@ local function composter_add_item(pos, node, player, itemstack, pointed_thing) return itemstack end +--- Update a full composter block to ready for harvesting. +-- +-- `on_timer` handler. The timer is set in function 'composter_add_item' +-- when the composter level has reached 7. +-- +-- pos: position of the composter block. +-- returns false, thereby cancelling further activity of the timer. +-- local function composter_ready(pos) - -- - -- update the composter block to ready for harvesting - -- this function is a node callback on_timer. - -- the timer is set in function 'composter_fill' when composter level is 7 - -- - -- returns false in order to cancel further activity of the timer - -- - minetest.swap_node(pos, {name = "mcl_composters:composter_ready"}) - -- maybe spawn particles again? - -- TODO: play some sounds - return false + swap_node(pos, {name = "mcl_composters:composter_ready"}) end +--- Spawn bone meal item and reset composter block. +-- +-- `on_rightclick` handler for the "ready" composter block. Causes a +-- bone meal item to be spawned from the composter and resets the +-- composter block to an empty composter block. +-- +-- parameterss are the standard parameters passed to `on_rightclick`. +-- returns itemstack (unchanged in this function). +-- local function composter_harvest(pos, node, player, itemstack, pointed_thing) - -- - -- handler for harvesting bone meal from a ready composter when rightclicked - -- if not player or (player:get_player_control() and player:get_player_control().sneak) then - return + return itemstack + end + local name = player:get_player_name() + if is_protected(pos, name) then + record_protection_violation(pos, name) + return itemstack end -- reset ready type composter to empty type - minetest.swap_node(pos, {name="mcl_composters:composter"}) + swap_node(pos, {name="mcl_composters:composter"}) -- spawn bone meal item (wtf dye?! is this how they make white cocoa) - minetest.add_item(pos, "mcl_dye:white") + add_item(pos, "mcl_dye:white") -- TODO play some sounds - + return itemstack end +--- Construct composter nodeboxes with varying levels of compost. +-- +-- level: compost level in the composter +-- returns a nodebox definition table. +-- local function composter_get_nodeboxes(level) - -- - -- Convenience function to construct the nodeboxes for varying levels of compost - -- local top_y_tbl = {[0]=-7, -5, -3, -1, 1, 3, 5, 7} local top_y = top_y_tbl[level] / 16 return { @@ -125,9 +161,9 @@ local function composter_get_nodeboxes(level) } end +--- Register empty composter node. -- --- Register empty composter node --- This is the base model that is craftable and can be placed in an inventory +-- This is the craftable base model that can be placed in an inventory. -- minetest.register_node("mcl_composters:composter", { description = composter_description, @@ -143,22 +179,21 @@ minetest.register_node("mcl_composters:composter", { "mcl_composter_bottom.png", "mcl_composter_side.png" }, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false, is_ground_content = false, groups = { handy=1, material_wood=1, deco_block=1, dirtifier=1, flammable=2, fire_encouragement=3, fire_flammability=4, }, sounds = mcl_sounds.node_sound_wood_defaults(), - _mcl_hardness = 2, - _mcl_blast_resistance = 2, + _mcl_hardness = 0.6, + _mcl_blast_resistance = 0.6, _mcl_compost_level = 0, on_rightclick = composter_add_item }) +--- Template function for composters with compost. -- --- Template function for composters with compost --- For each fill level a custom node is registered +-- For each fill level a custom node is registered. -- local function register_filled_composter(level) local id = "mcl_composters:composter_"..level @@ -174,7 +209,6 @@ local function register_filled_composter(level) "mcl_composter_bottom.png", "mcl_composter_side.png" }, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false, is_ground_content = false, groups = { handy=1, material_wood=1, deco_block=1, dirtifier=1, @@ -184,8 +218,8 @@ local function register_filled_composter(level) }, sounds = mcl_sounds.node_sound_wood_defaults(), drop = "mcl_composters:composter", - _mcl_hardness = 2, - _mcl_blast_resistance = 2, + _mcl_hardness = 0.6, + _mcl_blast_resistance = 0.6, _mcl_compost_level = level, on_rightclick = composter_add_item, on_timer = composter_ready @@ -197,20 +231,17 @@ local function register_filled_composter(level) end end --- --- Register filled composters (7 levels) +--- Register filled composters (7 levels). -- for level = 1, 7 do register_filled_composter(level) end --- --- Register composter ready to be harvested +--- Register composter that is ready to be harvested. -- minetest.register_node("mcl_composters:composter_ready", { description = S("Composter") .. "(" .. S("ready for harvest") .. ")", _doc_items_create_entry = false, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false, paramtype = "light", drawtype = "nodebox", node_box = composter_get_nodeboxes(7), @@ -229,8 +260,8 @@ minetest.register_node("mcl_composters:composter_ready", { }, sounds = mcl_sounds.node_sound_wood_defaults(), drop = "mcl_composters:composter", - _mcl_hardness = 2, - _mcl_blast_resistance = 2, + _mcl_hardness = 0.6, + _mcl_blast_resistance = 0.6, _mcl_compost_level = 7, on_rightclick = composter_harvest }) diff --git a/mods/ITEMS/mcl_copper/README.md b/mods/ITEMS/mcl_copper/README.md index 7c1d3a2c2..6a6f2d7d2 100644 --- a/mods/ITEMS/mcl_copper/README.md +++ b/mods/ITEMS/mcl_copper/README.md @@ -1,4 +1,7 @@ -# mcl_copper -### by NO11 +# MineClone2 Copper + +### by NO11 + Adds copper ore, blocks and items. -You need the Minetest subgame "Mineclone 2" to use the mod. \ No newline at end of file + +![screenshot](./screenshot.png) diff --git a/mods/ITEMS/mcl_copper/crafting.lua b/mods/ITEMS/mcl_copper/crafting.lua index 16649e808..77022a26d 100644 --- a/mods/ITEMS/mcl_copper/crafting.lua +++ b/mods/ITEMS/mcl_copper/crafting.lua @@ -4,64 +4,73 @@ minetest.register_craft({ { "mcl_copper:raw_copper", "mcl_copper:raw_copper", "mcl_copper:raw_copper" }, { "mcl_copper:raw_copper", "mcl_copper:raw_copper", "mcl_copper:raw_copper" }, { "mcl_copper:raw_copper", "mcl_copper:raw_copper", "mcl_copper:raw_copper" }, - } + }, }) + minetest.register_craft({ output = "mcl_copper:block", recipe = { { "mcl_copper:copper_ingot", "mcl_copper:copper_ingot" }, { "mcl_copper:copper_ingot", "mcl_copper:copper_ingot" }, - } + }, }) + minetest.register_craft({ output = "mcl_copper:block_cut 4", recipe = { { "mcl_copper:block", "mcl_copper:block" }, { "mcl_copper:block", "mcl_copper:block" }, - } + }, }) + minetest.register_craft({ output = "mcl_copper:block_exposed_cut 4", recipe = { { "mcl_copper:block_exposed", "mcl_copper:block_exposed" }, { "mcl_copper:block_exposed", "mcl_copper:block_exposed" }, - } + }, }) + minetest.register_craft({ output = "mcl_copper:block_oxidized_cut 4", recipe = { { "mcl_copper:block_oxidized", "mcl_copper:block_oxidized" }, { "mcl_copper:block_oxidized", "mcl_copper:block_oxidized" }, - } + }, }) + minetest.register_craft({ output = "mcl_copper:mcl_copper:block_weathered_cut 4", recipe = { { "mcl_copper:block_weathered", "mcl_copper:block_weathered" }, { "mcl_copper:block_weathered", "mcl_copper:block_weathered" }, - } + }, }) + minetest.register_craft({ output = "mcl_copper:copper_ingot 4", recipe = { { "mcl_copper:block" }, - } + }, }) + minetest.register_craft({ output = "mcl_copper:raw_copper 9", recipe = { { "mcl_copper:block_raw" }, - } + }, }) + minetest.register_craft({ type = "cooking", output = "mcl_copper:copper_ingot", recipe = "mcl_copper:raw_copper", cooktime = 10, }) + minetest.register_craft({ type = "cooking", output = "mcl_copper:copper_ingot", recipe = "mcl_copper:stone_with_copper", cooktime = 10, -}) \ No newline at end of file +}) diff --git a/mods/ITEMS/mcl_copper/functions.lua b/mods/ITEMS/mcl_copper/functions.lua index c553d5927..deacf711c 100644 --- a/mods/ITEMS/mcl_copper/functions.lua +++ b/mods/ITEMS/mcl_copper/functions.lua @@ -63,40 +63,42 @@ local function add_wear(placer, itemstack) end local function anti_oxidation(itemstack, placer, pointed_thing) - if pointed_thing.type ~= "node" then return end + local pointed_thing = pointed_thing + if pointed_thing.type ~= "node" then return end - local node = minetest.get_node(pointed_thing.under) - local noddef = minetest.registered_nodes[minetest.get_node(pointed_thing.under).name] + local pointed_thing_under = pointed_thing.under + local node = minetest.get_node(pointed_thing_under) + local node_def = minetest.registered_nodes[node.name] + if not node_def then return end - if not placer:get_player_control().sneak and noddef.on_rightclick then - return minetest.item_place(itemstack, placer, pointed_thing) - end + if not placer:get_player_control().sneak and node_def.on_rightclick then + return minetest.item_place(itemstack, placer, pointed_thing) + end - if minetest.is_protected(pointed_thing.under, placer:get_player_name()) then - minetest.record_protection_violation(pointed_thing.under, placer:get_player_name()) - return itemstack - end + local placer_name = placer:get_player_name() + if minetest.is_protected(pointed_thing_under, placer_name) then + minetest.record_protection_violation(pointed_thing_under, placer_name) + return itemstack + end - if noddef._mcl_stripped_variant == nil then + if not node_def._mcl_stripped_variant then for _, c in pairs(stairs) do - if noddef.name == "mcl_stairs:"..c[1].."_copper_"..c[2].."_cut"..c[3] then - minetest.swap_node(pointed_thing.under, {name="mcl_stairs:"..c[1].."_copper_"..c[4], param2=node.param2}) + if node_def.name == "mcl_stairs:"..c[1].."_copper_"..c[2].."_cut"..c[3] then + minetest.swap_node(pointed_thing_under, {name="mcl_stairs:"..c[1].."_copper_"..c[4], param2=node.param2}) anti_oxidation_particles(pointed_thing) add_wear(placer, itemstack) end end - if noddef._mcl_anti_oxidation_variant ~= nil then - minetest.swap_node(pointed_thing.under, {name=noddef._mcl_anti_oxidation_variant, param2=node.param2}) + if node_def._mcl_anti_oxidation_variant then + minetest.swap_node(pointed_thing_under, {name=node_def._mcl_anti_oxidation_variant, param2=node.param2}) anti_oxidation_particles(pointed_thing) add_wear(placer, itemstack) end - elseif noddef._mcl_stripped_variant ~= nil then - minetest.swap_node(pointed_thing.under, {name=noddef._mcl_stripped_variant, param2=node.param2}) + elseif node_def._mcl_stripped_variant then + minetest.swap_node(pointed_thing_under, {name=node_def._mcl_stripped_variant, param2=node.param2}) add_wear(placer, itemstack) - else - return itemstack end - return itemstack + return itemstack end local function register_axe_override(axe_name) diff --git a/mods/ITEMS/mcl_copper/items.lua b/mods/ITEMS/mcl_copper/items.lua index 41faae79b..7ad6f00a9 100644 --- a/mods/ITEMS/mcl_copper/items.lua +++ b/mods/ITEMS/mcl_copper/items.lua @@ -4,13 +4,12 @@ minetest.register_craftitem("mcl_copper:copper_ingot", { description = S("Copper Ingot"), _doc_items_longdesc = S("Molten Raw Copper. It is used to craft blocks."), inventory_image = "mcl_copper_ingot.png", - stack_max = 64, - groups = { craftitem=1 }, + groups = { craftitem = 1 }, }) + minetest.register_craftitem("mcl_copper:raw_copper", { description = S("Raw Copper"), _doc_items_longdesc = S("Raw Copper. Mine a Copper Ore to get it."), inventory_image = "mcl_copper_raw.png", - stack_max = 64, - groups = { craftitem=1, blast_furnace_smeltable=1 }, -}) \ No newline at end of file + groups = { craftitem = 1, blast_furnace_smeltable=1 }, +}) diff --git a/mods/ITEMS/mcl_copper/nodes.lua b/mods/ITEMS/mcl_copper/nodes.lua index 427306c91..9722ce2ec 100644 --- a/mods/ITEMS/mcl_copper/nodes.lua +++ b/mods/ITEMS/mcl_copper/nodes.lua @@ -5,8 +5,7 @@ minetest.register_node("mcl_copper:stone_with_copper", { _doc_items_longdesc = S("Some copper contained in stone, it is pretty common and can be found below sea level."), tiles = {"default_stone.png^mcl_copper_ore.png"}, is_ground_content = true, - stack_max = 64, - groups = {pickaxey=3, building_block=1, material_stone=1, blast_furnace_smeltable=1}, + groups = {pickaxey = 3, building_block = 1, material_stone = 1, blast_furnace_smeltable=1}, drop = "mcl_copper:raw_copper", sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 3, @@ -21,8 +20,7 @@ minetest.register_node("mcl_copper:block_raw", { _doc_items_longdesc = S("A block used for compact raw copper storage."), tiles = {"mcl_copper_block_raw.png"}, is_ground_content = false, - stack_max = 64, - groups = {pickaxey=2, building_block=1}, + groups = {pickaxey = 2, building_block = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -33,11 +31,10 @@ minetest.register_node("mcl_copper:block", { _doc_items_longdesc = S("A block of copper is mostly a decorative block."), tiles = {"mcl_copper_block.png"}, is_ground_content = false, - stack_max = 64, - groups = {pickaxey=2, building_block=1}, + groups = {pickaxey = 2, building_block = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, - _mcl_hardness = 5, + _mcl_hardness = 3, }) minetest.register_node("mcl_copper:block_exposed", { @@ -45,8 +42,7 @@ minetest.register_node("mcl_copper:block_exposed", { _doc_items_longdesc = S("Exposed copper is a decorative block."), tiles = {"mcl_copper_exposed.png"}, is_ground_content = false, - stack_max = 64, - groups = {pickaxey=2, building_block=1}, + groups = {pickaxey = 2, building_block = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -58,8 +54,7 @@ minetest.register_node("mcl_copper:block_oxidized", { _doc_items_longdesc = S("Oxidized copper is a decorative block."), tiles = {"mcl_copper_oxidized.png"}, is_ground_content = false, - stack_max = 64, - groups = {pickaxey=2, building_block=1}, + groups = {pickaxey = 2, building_block = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -71,8 +66,7 @@ minetest.register_node("mcl_copper:block_weathered", { _doc_items_longdesc = S("Weathered copper is a decorative block."), tiles = {"mcl_copper_weathered.png"}, is_ground_content = false, - stack_max = 64, - groups = {pickaxey=2, building_block=1}, + groups = {pickaxey = 2, building_block = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -84,8 +78,7 @@ minetest.register_node("mcl_copper:block_cut", { _doc_items_longdesc = S("Cut copper is a decorative block."), tiles = {"mcl_copper_block_cut.png"}, is_ground_content = false, - stack_max = 64, - groups = {pickaxey=2, building_block=1}, + groups = {pickaxey = 2, building_block = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -96,8 +89,7 @@ minetest.register_node("mcl_copper:block_exposed_cut", { _doc_items_longdesc = S("Exposed cut copper is a decorative block."), tiles = {"mcl_copper_exposed_cut.png"}, is_ground_content = false, - stack_max = 64, - groups = {pickaxey=2, building_block=1}, + groups = {pickaxey = 2, building_block = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -109,8 +101,7 @@ minetest.register_node("mcl_copper:block_oxidized_cut", { _doc_items_longdesc = S("Oxidized cut copper is a decorative block."), tiles = {"mcl_copper_oxidized_cut.png"}, is_ground_content = false, - stack_max = 64, - groups = {pickaxey=2, building_block=1}, + groups = {pickaxey = 2, building_block = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -122,8 +113,7 @@ minetest.register_node("mcl_copper:block_weathered_cut", { _doc_items_longdesc = S("Weathered cut copper is a decorative block."), tiles = {"mcl_copper_weathered_cut.png"}, is_ground_content = false, - stack_max = 64, - groups = {pickaxey=2, building_block=1}, + groups = {pickaxey = 2, building_block = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -131,57 +121,57 @@ minetest.register_node("mcl_copper:block_weathered_cut", { }) mcl_stairs.register_slab("copper_cut", "mcl_copper:block_cut", - {pickaxey=2}, + {pickaxey = 2}, {"mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png"}, S("Slab of Cut Copper"), nil, nil, nil, S("Double Slab of Cut Copper")) mcl_stairs.register_slab("copper_exposed_cut", "mcl_copper:block_exposed_cut", - {pickaxey=2}, + {pickaxey = 2}, {"mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png"}, S("Slab of Exposed Cut Copper"), nil, nil, nil, S("Double Slab of Exposed Cut Copper")) mcl_stairs.register_slab("copper_oxidized_cut", "mcl_copper:block_oxidized_cut", - {pickaxey=2}, + {pickaxey = 2}, {"mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png"}, S("Slab of Oxidized Cut Copper"), nil, nil, nil, S("Double Slab of Oxidized Cut Copper")) mcl_stairs.register_slab("copper_weathered_cut", "mcl_copper:block_weathered_cut", - {pickaxey=2}, + {pickaxey = 2}, {"mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png"}, S("Slab of Weathered Cut Copper"), nil, nil, nil, S("Double Slab of Weathered Cut Copper")) mcl_stairs.register_stair("copper_cut", "mcl_copper:block_cut", - {pickaxey=2}, + {pickaxey = 2}, {"mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png"}, S("Stairs of Cut Copper"), nil, 6, nil, "woodlike") mcl_stairs.register_stair("copper_exposed_cut", "mcl_copper:block_exposed_cut", - {pickaxey=2}, + {pickaxey = 2}, {"mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png"}, S("Stairs of Exposed Cut Copper"), nil, 6, nil, "woodlike") mcl_stairs.register_stair("copper_oxidized_cut", "mcl_copper:block_oxidized_cut", - {pickaxey=2}, + {pickaxey = 2}, {"mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png"}, S("Stairs of Oxidized Cut Copper"), nil, 6, nil, "woodlike") mcl_stairs.register_stair("copper_weathered_cut", "mcl_copper:block_weathered_cut", - {pickaxey=2}, + {pickaxey = 2}, {"mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png"}, S("Stairs of Weathered Cut Copper"), nil, 6, nil, - "woodlike") \ No newline at end of file + "woodlike") diff --git a/mods/ITEMS/mcl_core/crafting.lua b/mods/ITEMS/mcl_core/crafting.lua index 252282602..9220ce42a 100644 --- a/mods/ITEMS/mcl_core/crafting.lua +++ b/mods/ITEMS/mcl_core/crafting.lua @@ -228,14 +228,14 @@ minetest.register_craft({ minetest.register_craft({ type = "cooking", output = "mcl_core:iron_nugget", - recipe = "mobs_mc:iron_horse_armor", + recipe = "mcl_mobitems:iron_horse_armor", cooktime = 10, }) minetest.register_craft({ type = "cooking", output = "mcl_core:gold_nugget", - recipe = "mobs_mc:gold_horse_armor", + recipe = "mcl_mobitems:gold_horse_armor", cooktime = 10, }) @@ -382,8 +382,14 @@ minetest.register_craft({ } }) --- TODO: Add crafting recipe: 9 ice → 1 packed ice --- Add it when silk touch tools work. +minetest.register_craft({ + output = 'mcl_core:packed_ice 1', + recipe = { + {'mcl_core:ice', 'mcl_core:ice', 'mcl_core:ice'}, + {'mcl_core:ice', 'mcl_core:ice', 'mcl_core:ice'}, + {'mcl_core:ice', 'mcl_core:ice', 'mcl_core:ice'}, + } +}) -- -- Crafting (tool repair) diff --git a/mods/ITEMS/mcl_core/craftitems.lua b/mods/ITEMS/mcl_core/craftitems.lua index 26519ab7e..fc84c50f5 100644 --- a/mods/ITEMS/mcl_core/craftitems.lua +++ b/mods/ITEMS/mcl_core/craftitems.lua @@ -139,7 +139,7 @@ minetest.register_craftitem("mcl_core:apple", { stack_max = 64, on_place = minetest.item_eat(4), on_secondary_use = minetest.item_eat(4), - groups = { food = 2, eatable = 4, compostability=65 }, + groups = { food = 2, eatable = 4, compostability = 65 }, _mcl_saturation = 2.4, }) diff --git a/mods/ITEMS/mcl_core/functions.lua b/mods/ITEMS/mcl_core/functions.lua index dbf4acb48..e0786d37d 100644 --- a/mods/ITEMS/mcl_core/functions.lua +++ b/mods/ITEMS/mcl_core/functions.lua @@ -362,7 +362,8 @@ minetest.register_abm({ end local posses = { { 1, 0 }, { -1, 0 }, { 0, 1 }, { 0, -1 } } for _, p in pairs(posses) do - if minetest.registered_nodes[minetest.get_node(vector.new(pos.x + p[1], pos.y, pos.z + p[2])).name].walkable then + local ndef = minetest.registered_nodes[minetest.get_node(vector.new(pos.x + p[1], pos.y, pos.z + p[2])).name] + if ndef and ndef.walkable then local posy = pos.y while minetest.get_node(vector.new(pos.x, posy, pos.z)).name == "mcl_core:cactus" do local pos = vector.new(pos.x, posy, pos.z) @@ -771,6 +772,30 @@ function mcl_core.generate_spruce_tree(pos) minetest.place_schematic({ x = pos.x - 3, y = pos.y - 1, z = pos.z - 3 }, path, "0", nil, false) end +local function find_necorner(p) + local n=minetest.get_node_or_nil(vector.offset(p,0,1,1)) + local e=minetest.get_node_or_nil(vector.offset(p,1,1,0)) + if n and n.name == "mcl_core:sprucetree" then + p=vector.offset(p,0,0,1) + end + if e and e.name == "mcl_core:sprucetree" then + p=vector.offset(p,1,0,0) + end + return p +end + +local function generate_spruce_podzol(ps) + local pos=find_necorner(ps) + local pos1=vector.offset(pos,-6,-6,-6) + local pos2=vector.offset(pos,6,6,6) + local nn=minetest.find_nodes_in_area_under_air(pos1, pos2, {"group:dirt"}) + for k,v in pairs(nn) do + if math.random(vector.distance(pos,v)) < 4 and not (math.abs(pos.x-v.x) == 6 and math.abs(pos.z-v.z) == 6) then --leave out the corners + minetest.set_node(v,{name="mcl_core:podzol"}) + end + end +end + function mcl_core.generate_huge_spruce_tree(pos) local r1 = math.random(1, 2) local r2 = math.random(1, 4) @@ -787,6 +812,7 @@ function mcl_core.generate_huge_spruce_tree(pos) path = modpath.."/schematics/mcl_core_spruce_huge_up_"..r2..".mts" end minetest.place_schematic(vector.add(pos, offset), path, "0", nil, false) + generate_spruce_podzol(pos) end -- END of spruce tree functions -- @@ -993,7 +1019,7 @@ minetest.register_abm({ -- If this was mycelium, uproot plant above if n2.name == "mcl_core:mycelium" then local tad = minetest.registered_nodes[minetest.get_node(above).name] - if tad.groups and tad.groups.non_mycelium_plant then + if tad and tad.groups and tad.groups.non_mycelium_plant then minetest.dig_node(above) end end @@ -1485,7 +1511,7 @@ minetest.register_abm({ function mcl_core.supports_vines(nodename) local def = minetest.registered_nodes[nodename] -- Rules: 1) walkable 2) full cube - return def.walkable and + return def and def.walkable and (def.node_box == nil or def.node_box.type == "regular") and (def.collision_box == nil or def.collision_box.type == "regular") end @@ -1825,3 +1851,43 @@ function mcl_core.after_snow_destruct(pos) mcl_core.clear_snow_dirt(npos, node) end + +-- Obsidian crying + +local crying_obsidian_tears = { + "mcl_core_crying_obsidian_tear.png", + "mcl_core_crying_obsidian_tear2.png", + "mcl_core_crying_obsidian_tear3.png" +} + +local psdef = { + amount = 10, + time = 0.9, --everything longer than 1 is a coord exploit + minvel = vector.new(0,-0.15,0), + maxvel = vector.new(0,-0.001,0), + minacc = vector.new(0,-0.1,0), + maxacc = vector.new(0,-0.001,0), + minexptime = 1, + maxexptime = 6, + minsize = 0.1, + maxsize = 0.25, + collisiondetection = true, + collision_removal = true, + object_collision = true, + vertical = true, +} + +minetest.register_abm({ + label = "Obsidian cries", + nodenames = {"mcl_core:crying_obsidian"}, + interval = 60, + chance = 10, + action = function(pos, node) + psdef.minpos = vector.offset(pos,-0.6,-0.51,-0.6) + psdef.maxpos = vector.offset(pos,0.6,-0.51,0.6) + for _,t in pairs(crying_obsidian_tears) do + psdef.texture = t + minetest.add_particlespawner(psdef) + end + end +}) diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.zh_TW.tr b/mods/ITEMS/mcl_core/locale/mcl_core.zh_TW.tr new file mode 100644 index 000000000..177341846 --- /dev/null +++ b/mods/ITEMS/mcl_core/locale/mcl_core.zh_TW.tr @@ -0,0 +1,257 @@ +# textdomain: mcl_core +@1 could not survive in lava.=@1試圖在熔岩中游泳 +@1 died in lava.=@1試圖在熔岩中游泳 +@1 melted in lava.=@1試圖在熔岩中游泳 +@1 took a bath in a hot lava tub.=@1試圖在熔岩中游泳 +A block of diamond is mostly a shiny decorative block but also useful as a compact storage of diamonds.=鑽石磚主要是一種閃亮的裝飾方塊,但也可以作為鑽石的省位存儲方式。 +A block of emerald is mostly a shiny decorative block but also useful as a compact storage of emeralds.=綠寶石磚主要是一種閃亮的裝飾方塊,但也可以作為綠寶石的省位存儲方式。 +A block of gold is mostly a shiny decorative block but also useful as a compact storage of gold ingots.=金磚主要是一種閃亮的裝飾方塊,但也可以作為黃金的省位存儲方式。 +A block of iron is mostly a decorative block but also useful as a compact storage of iron ingots.=鐵磚主要是一種裝飾方塊,但也可以作為鐵的省位存儲方式。 +A cactus can only be placed on top of another cactus or any sand.=仙人掌只可以拜擺放在其他仙人掌或沙上。 +A decorative and mostly transparent block.=一種用於裝飾並且基本上是透明的方塊。 +A grass block is dirt with a grass cover. Grass blocks are resourceful blocks which allow the growth of all sorts of plants. They can be turned into farmland with a hoe and turned into grass paths with a shovel. In light, the grass slowly spreads onto dirt nearby. Under an opaque block or a liquid, a grass block may turn back to dirt.=草方塊是有草覆蓋的泥土。草方塊是重要的方塊,是各種植物生長的基礎。它們可以用鋤頭變成農田,用鐵鍬變成草徑。在光照下,草會慢慢蔓延到附近的泥土上。在不透明的方塊或液體下,草方塊可能會變回泥土。 +A lapis lazuli block is mostly a decorative block but also useful as a compact storage of lapis lazuli.=青金石磚主要是一種裝飾方塊,但也可以作為青金石的省位存儲方式。 +A lava source sets fire to a couple of air blocks above when they're next to a flammable block.=當熔岩源與易燃方塊相鄰時,會將附近點燃。 +A piece of ladder which allows you to climb vertically. Ladders can only be placed on the side of solid blocks and not on glass, leaves, ice, slabs, glowstone, nor sea lanterns.=一塊可以讓你垂直攀爬的梯子。梯子只能放在不透明方塊的側面,不能放在玻璃、樹葉、冰塊、石板、螢石、海燈龍等透明方塊上。 +Acacia Leaves=相思木葉 +Acacia Sapling=相思木樹苗 +Acacia Wood=相思木原木 +Acacia Wood Planks=相思木木材 +Acacia leaves are grown from acacia trees.=相思木葉是由相思木樹生長出來的。 +Andesite=安山岩 +Andesite is an igneous rock.=安山岩是一種火成岩。 +Apple=蘋果 +Apples are food items which can be eaten.=蘋果是一種可以被食用的食物 +Barrier=屏障 +Barriers are invisble walkable blocks. They are used to create boundaries of adventure maps and the like. Monsters and animals won't appear on barriers, and fences do not connect to barriers. Other blocks can be built on barriers like on any other block.=屏障是看不見但可行走的方塊。它們通常被用來創建冒險地圖的邊界。怪物和動物不會出現在屏障上,柵欄也不會連接到屏障上。其他方塊可以像在其他方塊上一樣被放置在屏障上。 +Bedrock=基岩 +Bedrock is a very hard type of rock. It can not be broken, destroyed, collected or moved by normal means, unless in Creative Mode.=基岩是一種堅實無比的石頭。除了創造模式的玩家,沒有人可以以正常方式破壞、銷毀、收集或移動它。 +Birch Bark=白樺樹皮 +Birch Leaves=白樺樹葉 +Birch Sapling=白樺樹樹苗 +Birch Wood=白樺樹原木 +Birch Wood Planks=白樺樹木材 +Birch leaves are grown from birch trees.=白樺樹葉是由白樺樹樹生長出來的。 +Black Stained Glass=黑色玻璃 +Block of Coal=煤炭磚 +Block of Diamond=鑽石磚 +Block of Emerald=綠寶石磚 +Block of Gold=金磚 +Block of Iron=鐵磚 +Blocks of coal are useful as a compact storage of coal and very useful as a furnace fuel. A block of coal is as efficient as 10 coal.=煤炭磚作為煤炭的省位存儲方式,作為熔爐燃料非常有用。一個煤炭磚的燃燒時間相當於10塊煤炭。 +Blue Stained Glass=藍色玻璃 +Bone Block=骨塊 +Bone blocks are decorative blocks and a compact storage of bone meal.=骨粉塊是一個裝飾方塊,也是骨粉的省位存儲方式。 +Bowl=碗 +Bowls are mainly used to hold tasty soups.=碗主要用來盛湯。 +Brick=紅磚頭 +Brick Block=紅磚 +Brick blocks are a good building material for building solid houses and can take quite a punch.=紅磚是一種很好的建築材料,可以用來建造堅固的房屋,並可以承受相當大的壓力。 +Bricks are used to craft brick blocks.=紅磚頭是用來合成紅磚的原料。 +Brown Stained Glass=棕色玻璃 +Cactus=仙人掌 +Charcoal=木炭 +Charcoal is an alternative furnace fuel created by cooking wood in a furnace. It has the same burning time as coal and also shares many of its crafting recipes, but it can not be used to create coal blocks.=木炭可作爲煤炭的替代,通過在熔爐中烹飪原木而產生的。它的燃燒時間與煤炭相同,也也可用來合成許多煤炭可合成的東西,但它不能用來製作煤炭磚。 +Chiseled Stone Bricks=鏨制石磚 +Chiseled Red Sandstone=鏨制紅砂岩 +Chiseled Sandstone=鏨制砂岩 +Chiseled red sandstone is a decorative building block.=鏨制紅砂岩是一個裝飾方塊。 +Chiseled sandstone is a decorative building block.=鏨制砂岩是一個裝飾方塊。 +Clay=黏土 +Clay Ball=黏土球 +Clay balls are a raw material, mainly used to create bricks in the furnace.=黏土球是一種原料,主要用於製磚。 +Clay is a versatile kind of earth commonly found at beaches underwater.=黏土是一種多功能的土,常見於岸邊。 +Coal=煤炭 +Coal Ore=煤礦 +Coarse Dirt=粗泥 +Coarse dirt acts as a soil for some plants and is similar to dirt, but it will never grow a cover.=粗粗泥作為一些植物的土壤,與泥土相似,但它永遠不會長草。 +Cobblestone=鵝卵石 +Cobweb=蜘蛛網 +Cobwebs can be walked through, but significantly slow you down.=蜘蛛網可以穿過,但它會大大降低你的速度。 +Cracked Stone Bricks=裂紋石磚 +Cut Red Sandstone=切製紅砂岩 +Cut Sandstone=切製砂岩 +Cut red sandstone is a decorative building block.=切製紅砂岩是裝飾性的方塊。 +Cut sandstone is a decorative building block.=切製砂岩是裝飾性的方塊。 +Cyan Stained Glass=青色玻璃 +Dark Oak Bark=黑橡木樹皮 +Dark Oak Leaves=黑橡木樹葉 +Dark Oak Sapling=黑橡木樹苗 +Dark Oak Wood=黑橡木原木 +Dark Oak Wood Planks=黑橡木木材 +Dark oak leaves are grown from dark oak trees.=黑橡木樹葉是由黑橡樹生長出來的。 +Dark oak saplings can grow into dark oaks, but only in groups. A lonely dark oak sapling won't grow. A group of four dark oak saplings grows into a dark oak after some time when they are placed on soil (such as dirt) in a 2×2 square and exposed to light.=黑橡木樹苗可以長成黑橡樹,但只能成群生長。單獨的黑橡木樹苗是長不出來的。四棵黑橡木樹苗以2×2的形態放在土壤(如泥土)上,並暴露在光照下,一段時間後就會長成一棵黑橡樹。 +Dead Bush=枯灌木 +Dead bushes are unremarkable plants often found in dry areas. They can be harvested for sticks.=枯灌木是一種不起眼的植物,經常在乾旱地區發現。它們可以被收割成木棒。 +Diamond=鑽石 +Diamond Ore=鑽石礦 +Diamond ore is rare and can be found in clusters near the bottom of the world.=鑽石礦非常稀少,可以在接近世界底部的地方找到它們。 +Diamonds are precious minerals and useful to create the highest tier of armor and tools.=鑽石是珍貴的礦物,可用於製造最高等級的裝甲和工具 +Diorite=閃長岩 +Diorite is an igneous rock.=閃長岩是一種火成岩。 +Dirt=泥土 +Dirt acts as a soil for a few plants. When in light, this block may grow a grass or mycelium cover if such blocks are nearby.=泥土可以作为一些植物的土壤。在光照下,如果附近有草方塊或菌絲土,草或菌絲可呢會蔓延到這裏。 +Emerald=綠寶石 +Emerald Ore=綠寶石礦 +Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=綠寶石礦是綠寶石的礦石。它非常稀少,只可以單獨出現,不會成堆出現。 +Emeralds are not very useful on their own, but they can exchanged for gold ingots by crafting.=綠寶石本身用途不太多,但可以通過合成來得到金錠。 +Flint=燧石 +Flint is a raw material.=燧石是原材料。 +Flowing Lava=流動的熔岩 +Flowing Water=流動的水 +Frosted Ice=霜冰 +Frosted ice is a short-lived solid block. It melts into a water source within a few seconds.=霜冰是一種壽命很短的固體方塊。它在幾秒鐘內就會融化,成爲水源。 +Glass=草 +Gold Ingot=金錠 +Gold Nugget=金粒 +Gold Ore=金礦 +Gold nuggets are very small pieces of molten gold; the main purpose is to create gold ingots.=金粒是非常小塊的金,主要用來合成金錠。 +Golden Apple=進蘋果 +Golden apples are precious food items which can be eaten.=金蘋果是可以吃的珍貴食品。 +Granite=花崗岩 +Grass Block=草方塊 +Grass Path=草徑 +Grass paths are a decorative variant of grass blocks. Their top has a different color and they are a bit lower than grass blocks, making them useful to build footpaths. Grass paths can be created with a shovel. A grass path turns into dirt when it is below a solid block.=草徑是草方塊的一種裝飾變種。它們的頂部顏色和草方塊不同,而且它們比草方塊低一些,因此它們對建造人行道很有用。草徑可以用鏟子來創造。當草徑位於不透明方塊下時,它就會變成泥土。 +Gravel=礫石 +Green Stained Glass=綠色玻璃 +Grey Stained Glass=灰色玻璃 +Ice=冰 +Ice is a solid block usually found in cold areas. It melts near block light sources at a light level of 12 or higher. When it melts or is broken while resting on top of another block, it will turn into a water source.=冰是一種通常在寒冷地區發現的不透明方塊。它在光照度為12或更高的方塊光源附近會融化。當它融化或被打破時,如果它當時在另一個方塊的頂部,它將變成一個水源。 +In the End dimension, starting a fire on this block will create an eternal fire.=在終界,在此方塊上點火將產生永恆之火。 +Iron Ingot=鐵錠 +Iron Nugget=鐵粒 +Iron Ore=鐵礦 +Iron nuggets are very small pieces of molten iron; the main purpose is to create iron ingots.=鐵粒是非常小塊的鐵,主要用來合成鐵錠。 +Jungle Bark=叢林樹皮 +Jungle Leaves=叢林輸葉 +Jungle Sapling=叢林樹苗 +Jungle Wood=叢林原木 +Jungle Wood Planks=叢林木材 +Jungle leaves are grown from jungle trees.=叢林樹葉是由叢林樹生長出來的。 +Ladder=梯子 +Lapis Lazuli Block=青金石磚 +Lapis Lazuli Ore=青金石礦 +Lapis lazuli ore is the ore of lapis lazuli. It can be rarely found in clusters near the bottom of the world.=青金石礦是青金石的礦石。在世界底部附近能發現成群的和稀有的青金石礦。 +Lava Source=熔岩源 +Lava is hot and rather dangerous. Don't touch it, it will hurt you a lot and it is hard to get out.=熔岩很熱並相當危險。不要碰它,它會對你造成很大的傷害,而且很難脫身。 +Light Blue Stained Glass=淺藍色玻璃 +Light Grey Stained Glass=淺灰色玻璃 +Lime Stained Glass=淺綠色玻璃 +Lit Redstone Ore=被點亮的紅石礦 +Magenta Stained Glass=洋紅色玻璃 +Molten gold. It is used to craft armor, tools, and whatnot.=融化的金。用來製作盔甲、工具等等。 +Molten iron. It is used to craft armor, tools, and whatnot.=融化的鐵。用來製作盔甲、工具等等。 +Mossy Cobblestone=青苔鵝卵石 +Mossy Stone Bricks=青苔石磚 +Mycelium=菌絲土 +Mycelium is a type of dirt and the ideal soil for mushrooms. Unlike other dirt-type blocks, it can not be turned into farmland with a hoe. In light, mycelium slowly spreads over nearby dirt. Under an opaque block or a liquid, it eventually turns back into dirt.=菌絲是泥土的一種,也是蘑菇的理想土壤。與其他泥土類方塊不同,它不能用鋤頭把它變成農田。在光照之下,菌絲會在附近的泥土上慢慢蔓延。在不透明方塊或液體下,它最終會變回泥土。 +Oak Bark=橡樹皮 +Oak Leaves=橡樹葉 +Oak Sapling=橡樹樹苗 +Oak Wood=橡樹原木 +Oak Wood Planks=橡樹木材 +Oak leaves are grown from oak trees.=橡樹樹葉是由橡樹生長出來的。 +Obsidian=黑曜石 +Obsidian is an extremely hard mineral with an enourmous blast-resistance. Obsidian is formed when water meets lava.=黑曜石是一種極其堅硬的礦物,具有極強的抗爆性。黑曜石是由水與熔岩源相遇而形成的。 +One of the most common blocks in the world, almost the entire underground consists of stone. It sometimes contains ores. Stone may be created when water meets lava.=世界上最常見的方塊之一,幾乎整個地下都由石頭組成。它有時也包含礦石。當水與流動的熔岩相遇時,可能會產生石頭。 +Orange Stained Glass=橙色玻璃 +Packed Ice=冰磚 +Packed ice is a compressed form of ice. It is opaque and solid.=冰塊是冰的壓縮形式。它是不透明的固體方塊。 +Paper=紙 +Paper is used to craft books and maps.=紙是用來合成書和地圖的物品。 +Pink Stained Glass=粉紅色玻璃 +Podzol=灰壤 +Podzol is a type of dirt found in taiga forests. Only a few plants are able to survive on it.=灰壤是一種在針葉林中發現的泥土。只有少數植物能在上面生存。 +Polished Andesite=拋光安山岩 +Polished Diorite=拋光閃長岩 +Polished Granite=拋光花崗岩 +Polished Stone=拋光石頭 +Polished andesite is a decorative building block made from andesite.=拋光閃長岩是由閃長岩製成的裝飾性方塊。 +Polished diorite is a decorative building block made from diorite.=拋光安山岩是由安山岩製成的裝飾性方塊。 +Polished granite is a decorative building block made from granite.=拋光花崗岩是由花崗岩製成的裝飾性方塊。 +Purple Stained Glass=紫色玻璃 +Realm Barrier=維度分割屏障 +Red Sand=紅沙 +Red Sandstone=紅砂岩 +Red Stained Glass=紅色玻璃 +Red sand is found in large quantities in mesa biomes.=红沙在山地生態域中大量存在。 +Red sandstone is compressed red sand and is a rather soft kind of stone.=紅砂岩是壓縮的紅砂,是一種比較軟的石頭。 +Redstone Ore=紅石礦 +Redstone ore is commonly found near the bottom of the world. It glows when it is punched or walked upon.=紅石礦可以在距離世界底部比較近的地方生成。它會在受到壓力或被擊打時發光。 +Sand=沙 +Sand is found in large quantities at beaches and deserts.=沙大量存在於海灘和沙漠中。 +Sandstone=砂岩 +Sandstone is compressed sand and is a rather soft kind of stone.=砂岩是壓縮的沙,是一種比較軟的石頭。 +Slime Block=史萊姆方塊 +Slime blocks are very bouncy and prevent fall damage.=史萊姆方塊擁有驚人的彈性,正因如此,它可以防止掉落傷害。 +Smooth Red Sandstone=平滑紅砂岩 +Smooth Sandstone=平滑砂岩 +Smooth red sandstone is a decorative building block.=平滑紅砂岩是一種裝飾性建築材料。 +Smooth sandstone is compressed sand and is a rather soft kind of stone.=平滑砂岩是一種裝飾性建築材料。 +Snow=雪 +Some coal contained in stone, it is very common and can be found inside stone in medium to large clusters at nearly every height.=煤礦在石頭中非常常見,幾乎在任何高度的石頭中也可以找到中小形的煤礦。 +Some iron contained in stone, it is prety common and can be found below sea level.=鐵礦的稀有度比煤礦小一點,可以在海平面下找到。 +Spruce Bark=杉木樹皮 +Spruce Leaves=杉木樹葉 +Spruce Sapling=杉木樹苗 +Spruce Wood=杉木原木 +Spruce Wood Planks=杉木木材 +Spruce leaves are grown from spruce trees.=杉木樹葉是由杉樹生長出來的。 +Stained glass is a decorative and mostly transparent block which comes in various different colors.=染色玻璃是一種大多是透明的裝飾性方塊,有各種不同的顏色。 +Stick=木棒 +Sticks are a very versatile crafting material; used in countless crafting recipes.=木棒是一種非常通用的製作材料;使用它的合成配方不計其數。 +Stone=石頭 +Stone Bricks=石磚 +Sugar=糖 +Sugar Canes=甘蔗 +Sugar canes are a plant which has some uses in crafting. Sugar canes will slowly grow up to 3 blocks when they are next to water and are placed on a grass block, dirt, sand, red sand, podzol or coarse dirt. When a sugar cane is broken, all sugar canes connected above will break as well.=甘蔗是一種植物,在合成上有一定的用途。當甘蔗在水旁邊而且放在草塊、泥土、沙子、紅沙、豆莢或粗土上的時候,會慢慢長到3格高。當一根甘蔗被折斷時,上面連接的所有甘蔗也會折斷。 +Sugar canes can only be placed top of other sugar canes and on top of blocks on which they would grow.=甘蔗只能放在其他甘蔗或會讓它生長的方塊的上面。 +Sugar comes from sugar canes and is used to make sweet foods.=糖來自甘蔗,用於製作甜食。 +The trunk of a birch tree.=白樺樹的樹幹。 +The trunk of a dark oak tree.=黑橡樹的樹幹。 +The trunk of a jungle tree.=叢林木的樹幹。 +The trunk of a spruce tree.=杉木的樹幹。 +The trunk of an acacia.=相思木的樹幹。 +The trunk of an oak tree.=黑橡木的樹幹。 +This block consists of a couple of loose stones and can't support itself.=這塊石頭由一些鬆散的石頭組成,無法支撐自己。 +This is a decorative block surrounded by the bark of a tree trunk.=這是一個由樹皮包圍的裝飾方塊。 +This is a full block of snow. Snow of this thickness is usually found in areas of extreme cold.=這是一整塊的雪。這種厚度的雪通常出現在極寒地區。 +This is a piece of cactus commonly found in dry areas, especially deserts. Over time, cacti will grow up to 3 blocks high on sand or red sand. A cactus hurts living beings touching it with a damage of 1 HP every half second. When a cactus block is broken, all cactus blocks connected above it will break as well.=這是一片常見於乾燥地區(尤其是沙漠)的仙人掌。隨著時間的推移,仙人掌會在沙子或紅沙上長到3塊高。當有生物接觸它時,該生物會每半秒受到1HP的傷害。當一個仙​​人掌塊被打破時,它上面連接的所有仙人掌塊也會被打破。 +This stone contains pure gold, a rare metal.=這塊石頭含有一種稀有金屬——純金。 +Top Snow=雪 +Top snow is a layer of snow. It melts near light sources other than the sun with a light level of 12 or higher.=頂雪是一層雪。它會在光照度為12或更高的非太陽光源附近融化。 +Vines=藤蔓 +Vines are climbable blocks which can be placed on the sides of solid full-cube blocks. Vines slowly grow and spread.=藤蔓是可以攀爬的方塊,可以放在不透明方塊的側面。藤蔓會慢慢生長和蔓延。 +Void=虛空 +Water=水 +Water Source=水源 +Water is abundant in oceans and also appears in a few springs in the ground. You can swim easily in water, but you need to catch your breath from time to time.=水是海洋的主要構成部分,也出現在地下水中。在水中可以輕鬆地游泳,但需要時常透氣。 +When placed on soil (such as dirt) and exposed to light, a birch sapling will grow into a birch after some time.=將白樺樹苗放在土壤(如泥土)上並接受光照,一段時間後就會長成白樺樹。 +When placed on soil (such as dirt) and exposed to light, a jungle sapling will grow into a jungle tree after some time. When there are 4 jungle saplings in a 2×2 square, they will grow to a huge jungle tree.=將叢林樹苗放在土壤(如泥土)上並接受光照,一段時間後就會長成叢林樹。當2×2的正方形裡有4棵叢林樹苗時,它們會長成一棵巨大的叢林樹。 +When placed on soil (such as dirt) and exposed to light, a spruce sapling will grow into a spruce after some time. When there are 4 spruce saplings in a 2×2 square, they will grow to a huge spruce.=將杉木樹苗放在土壤(如泥土)上並接受光照,一段時間後就會長成杉木樹。當2×2的正方形裡有4棵杉木樹苗時,它們會長成一棵巨大的杉木樹。 +When placed on soil (such as dirt) and exposed to light, an acacia sapling will grow into an acacia after some time.=將相思木樹苗放在土壤(如泥土)上並接受光照,一段時間後就會長成相思木樹。 +When placed on soil (such as dirt) and exposed to light, an oak sapling will grow into an oak after some time.=將黑橡木樹苗放在土壤(如泥土)上並接受光照,一段時間後就會長成黑橡樹。 +When you hold a barrier in hand, you reveal all placed barriers in a short distance around you.=當你手握一個屏障時,你會看到附近所有放置的屏障。 +White Stained Glass=白色玻璃 +Yellow Stained Glass=黃色玻璃 +“Coal” refers to coal lumps obtained by digging coal ore which can be found underground. Coal is your standard furnace fuel, but it can also be used to make torches, coal blocks and a few other things.=「煤」指的是通過挖掘地下可以找到的煤礦而得到的煤塊。煤是標準的燃料,但也可以用來製作火把、煤塊和其他一些東西。 +Water interacts with lava in various ways:=水與熔岩的相互作用如下: +• When water is directly above or horizontally next to a lava source, the lava turns into obsidian.=• 當水在熔岩源的正上方或水平旁邊時,熔岩就會變成黑曜石。 +• When flowing water touches flowing lava either from above or horizontally, the lava turns into cobblestone.=• 當流水從上方或水平方向接觸到流動的熔岩時,熔岩就會變成鵝卵石。 +• When water is directly below lava, the water turns into stone.=• 當水位於熔岩下時,水就會變成石頭。 +Lava interacts with water various ways:=熔岩與水的相互作用如下: +• When a lava source is directly below or horizontally next to water, the lava turns into obsidian.=• 當水在熔岩源的正上方或水平旁邊時,熔岩就會變成黑曜石。 +• When lava is directly above water, the water turns into stone.=• 當熔岩位於水上時,水就會變成石頭。 +Stained Glass=染色玻璃 +Granite is an igneous rock.=花崗岩是火成岩。 +Top snow can be stacked and has one of 8 different height levels. At levels 2-8, top snow is collidable. Top snow drops 2-9 snowballs, depending on its height.=雪可以疊加,並有8個不同的高度等級。在2-8級時,頂雪是不可穿過的。雪會根據其高度掉落2-9個雪球。 +This block can only be placed on full solid blocks and on another top snow (which increases its height).=此方塊只能放在完整的不透明方塊上或另一個雪上。如果它被放置在另一個雪上,會增加其高度。 +Needs soil and water to grow=需要泥土和水來生長 +Needs soil and light to grow=需要泥土和光照來生長 +Grows on sand=在沙上生長 +Contact damage: @1 per half second=接触伤害:每半秒@1次 +Slows down movement=減低行走速度 +2×2 saplings required=必須以2×2的形態擺放樹苗 +2×2 saplings @= large tree=以2×2的形態可長成大形樹木 +Grows on sand or dirt next to water=在靠近水的沙或泥土上生長 +Stackable=可堆疊 diff --git a/mods/ITEMS/mcl_core/nodes_base.lua b/mods/ITEMS/mcl_core/nodes_base.lua index 87aa101ac..b518e4687 100644 --- a/mods/ITEMS/mcl_core/nodes_base.lua +++ b/mods/ITEMS/mcl_core/nodes_base.lua @@ -138,7 +138,7 @@ minetest.register_node("mcl_core:stone_with_redstone_lit", { light_source = 9, is_ground_content = true, stack_max = 64, - groups = {pickaxey=4, not_in_creative_inventory=1, material_stone=1, xp=7}, + groups = {pickaxey=4, not_in_creative_inventory=1, material_stone=1, xp=7, blast_furnace_smeltable=1}, drop = { items = { max_items = 1, @@ -369,7 +369,12 @@ minetest.register_node("mcl_core:dirt_with_grass", { color = "#8EB971", is_ground_content = true, stack_max = 64, - groups = {handy=1,shovely=1,dirt=2,grass_block=1, grass_block_no_snow=1, soil=1, soil_sapling=2, soil_sugarcane=1, cultivatable=2, spreading_dirt_type=1, enderman_takable=1, building_block=1, compostability=30}, + groups = { + handy = 1, shovely = 1, dirt = 2, grass_block = 1, grass_block_no_snow = 1, + soil = 1, soil_sapling = 2, soil_sugarcane = 1, cultivatable = 2, + spreading_dirt_type = 1, enderman_takable = 1, building_block = 1, + compostability = 30, path_creation_possible=1 + }, drop = "mcl_core:dirt", sounds = mcl_sounds.node_sound_dirt_defaults({ footstep = {name="default_grass_footstep", gain=0.1}, @@ -385,7 +390,7 @@ minetest.register_node("mcl_core:dirt_with_grass", { return mcl_core.on_snowable_construct(pos) end, _mcl_snowed = "mcl_core:dirt_with_grass_snow", - _mcl_blast_resistance = 0.5, + _mcl_blast_resistance = 0.6, _mcl_hardness = 0.6, _mcl_silk_touch_drop = true, }) @@ -422,7 +427,7 @@ minetest.register_node("mcl_core:mycelium", { tiles = {"mcl_core_mycelium_top.png", "default_dirt.png", {name="mcl_core_mycelium_side.png", tileable_vertical=false}}, is_ground_content = true, stack_max = 64, - groups = {handy=1,shovely=1, dirt=2,spreading_dirt_type=1, enderman_takable=1, building_block=1}, + groups = { handy = 1, shovely = 1, dirt = 2, spreading_dirt_type = 1, enderman_takable = 1, building_block = 1, soil_sapling = 2, path_creation_possible=1}, drop = "mcl_core:dirt", sounds = mcl_sounds.node_sound_dirt_defaults({ footstep = {name="default_grass_footstep", gain=0.1}, @@ -430,7 +435,7 @@ minetest.register_node("mcl_core:mycelium", { on_construct = mcl_core.on_snowable_construct, _mcl_snowed = "mcl_core:mycelium_snow", - _mcl_blast_resistance = 0.5, + _mcl_blast_resistance = 0.6, _mcl_hardness = 0.6, _mcl_silk_touch_drop = true, }) @@ -442,13 +447,13 @@ minetest.register_node("mcl_core:podzol", { tiles = {"mcl_core_dirt_podzol_top.png", "default_dirt.png", {name="mcl_core_dirt_podzol_side.png", tileable_vertical=false}}, is_ground_content = true, stack_max = 64, - groups = {handy=1,shovely=3, dirt=2,soil=1, soil_sapling=2, soil_sugarcane=1, enderman_takable=1, building_block=1}, + groups = {handy=1,shovely=3, dirt=2,soil=1, soil_sapling=2, soil_sugarcane=1, enderman_takable=1, building_block=1,path_creation_possible=1}, drop = "mcl_core:dirt", sounds = mcl_sounds.node_sound_dirt_defaults(), on_construct = mcl_core.on_snowable_construct, _mcl_snowed = "mcl_core:podzol_snow", - _mcl_blast_resistance = 0.5, - _mcl_hardness = 0.6, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, _mcl_silk_touch_drop = true, }) mcl_core.register_snowed_node("mcl_core:podzol_snow", "mcl_core:podzol", nil, nil, false, S("Podzol with Snow")) @@ -460,7 +465,7 @@ minetest.register_node("mcl_core:dirt", { tiles = {"default_dirt.png"}, is_ground_content = true, stack_max = 64, - groups = {handy=1,shovely=1, dirt=1,soil=1, soil_sapling=2, soil_sugarcane=1, cultivatable=2, enderman_takable=1, building_block=1}, + groups = {handy=1,shovely=1, dirt=1,soil=1, soil_sapling=2, soil_sugarcane=1, cultivatable=2, enderman_takable=1, building_block=1, path_creation_possible=1}, sounds = mcl_sounds.node_sound_dirt_defaults(), _mcl_blast_resistance = 0.5, _mcl_hardness = 0.5, @@ -485,7 +490,7 @@ minetest.register_node("mcl_core:coarse_dirt", { tiles = {"mcl_core_coarse_dirt.png"}, is_ground_content = true, stack_max = 64, - groups = {handy=1,shovely=1, dirt=3,soil=1, soil_sugarcane=1, cultivatable=1, enderman_takable=1, building_block=1}, + groups = { handy = 1,shovely = 1, dirt = 3, soil = 1, soil_sugarcane = 1, cultivatable = 1, enderman_takable = 1, building_block = 1, soil_sapling = 2, path_creation_possible=1}, sounds = mcl_sounds.node_sound_dirt_defaults(), _mcl_blast_resistance = 0.5, _mcl_hardness = 0.5, @@ -565,8 +570,8 @@ minetest.register_node("mcl_core:sandstonesmooth", { stack_max = 64, groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 0.8, - _mcl_hardness = 0.8, + _mcl_blast_resistance = 6, + _mcl_hardness = 2, }) minetest.register_node("mcl_core:sandstonecarved", { @@ -590,8 +595,8 @@ minetest.register_node("mcl_core:sandstonesmooth2", { stack_max = 64, groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 0.8, - _mcl_hardness = 0.8, + _mcl_blast_resistance = 6, + _mcl_hardness = 2, }) -- red sandstone -- @@ -733,7 +738,7 @@ minetest.register_node("mcl_core:cobble", { tiles = {"default_cobble.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, cobble=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, @@ -784,7 +789,7 @@ minetest.register_node("mcl_core:goldblock", { groups = {pickaxey=4, building_block=1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, - _mcl_hardness = 5, + _mcl_hardness = 3, }) minetest.register_node("mcl_core:diamondblock", { @@ -1084,8 +1089,8 @@ minetest.register_node("mcl_core:snowblock", { on_construct = mcl_core.on_snow_construct, after_destruct = mcl_core.after_snow_destruct, drop = "mcl_throwing:snowball 4", - _mcl_blast_resistance = 0.2, - _mcl_hardness = 0.2, + _mcl_blast_resistance = 0.1, + _mcl_hardness = 0.1, _mcl_silk_touch_drop = true, }) diff --git a/mods/ITEMS/mcl_core/nodes_cactuscane.lua b/mods/ITEMS/mcl_core/nodes_cactuscane.lua index cea73da11..62d5cc2b5 100644 --- a/mods/ITEMS/mcl_core/nodes_cactuscane.lua +++ b/mods/ITEMS/mcl_core/nodes_cactuscane.lua @@ -12,7 +12,10 @@ minetest.register_node("mcl_core:cactus", { tiles = {"mcl_core_cactus_top.png", "mcl_core_cactus_bottom.png", "mcl_core_cactus_side.png"}, is_ground_content = true, stack_max = 64, - groups = {handy=1, attached_node=1, plant=1, deco_block=1, dig_by_piston=1, enderman_takable=1, compostability=50}, + groups = { + handy = 1, attached_node = 1, deco_block = 1, dig_by_piston = 1, + plant = 1, enderman_takable = 1, compostability = 50 + }, sounds = mcl_sounds.node_sound_wood_defaults(), paramtype = "light", sunlight_propagates = true, @@ -54,7 +57,7 @@ minetest.register_node("mcl_core:reeds", { _doc_items_usagehelp = S("Sugar canes can only be placed top of other sugar canes and on top of blocks on which they would grow."), drawtype = "plantlike", paramtype2 = "color", - tiles = {"default_papyrus.png"}, + tiles = {"mcl_core_papyrus.png"}, palette = "mcl_core_palette_grass.png", palette_index = 0, inventory_image = "mcl_core_reeds.png", @@ -79,7 +82,10 @@ minetest.register_node("mcl_core:reeds", { }, }, stack_max = 64, - groups = {dig_immediate=3, craftitem=1, deco_block=1, plant=1, non_mycelium_plant=1, dig_by_piston=1, compostability=50}, + groups = { + dig_immediate = 3, craftitem = 1, deco_block = 1, dig_by_piston = 1, + plant = 1, non_mycelium_plant = 1, compostability = 50 + }, sounds = mcl_sounds.node_sound_leaves_defaults(), node_placement_prediction = "", drop = "mcl_core:reeds", -- to prevent color inheritation diff --git a/mods/ITEMS/mcl_core/nodes_climb.lua b/mods/ITEMS/mcl_core/nodes_climb.lua index d99954e3f..1a6780618 100644 --- a/mods/ITEMS/mcl_core/nodes_climb.lua +++ b/mods/ITEMS/mcl_core/nodes_climb.lua @@ -104,7 +104,11 @@ minetest.register_node("mcl_core:vine", { type = "wallmounted", }, stack_max = 64, - groups = {handy=1,axey=1,shearsy=1,swordy=1, flammable=2,deco_block=1,destroy_by_lava_flow=1,dig_by_piston=1, fire_encouragement=15, fire_flammability=100, compostability=50}, + groups = { + handy = 1, axey = 1, shearsy = 1, swordy = 1, deco_block = 1, + dig_by_piston = 1, destroy_by_lava_flow = 1, compostability = 50, + flammable = 2, fire_encouragement = 15, fire_flammability = 100 + }, sounds = mcl_sounds.node_sound_leaves_defaults(), drop = "", _mcl_shears_drop = true, diff --git a/mods/ITEMS/mcl_core/nodes_misc.lua b/mods/ITEMS/mcl_core/nodes_misc.lua index 67669a861..5f5b005e2 100644 --- a/mods/ITEMS/mcl_core/nodes_misc.lua +++ b/mods/ITEMS/mcl_core/nodes_misc.lua @@ -65,7 +65,7 @@ minetest.register_node("mcl_core:slimeblock", { neighbor_node = minetest.get_node(neighbor_pos) end local name = neighbor_node.name - if name ~= "air" and name ~= "ignore" then + if name ~= "air" and name ~= "ignore" and not mesecon.mvps_unsticky[name] then local piston, piston_side, piston_up, piston_down = false, false, false, false if name == "mesecons_pistons:piston_sticky_off" or name == "mesecons_pistons:piston_normal_off" then piston, piston_side = true, true diff --git a/mods/ITEMS/mcl_core/nodes_trees.lua b/mods/ITEMS/mcl_core/nodes_trees.lua index 060879e17..a2a8bf7ba 100644 --- a/mods/ITEMS/mcl_core/nodes_trees.lua +++ b/mods/ITEMS/mcl_core/nodes_trees.lua @@ -195,7 +195,11 @@ local function register_sapling(subname, description, longdesc, tt_help, texture fixed = selbox }, stack_max = 64, - groups = {dig_immediate=3, plant=1,sapling=1,non_mycelium_plant=1,attached_node=1,dig_by_water=1,dig_by_piston=1,destroy_by_lava_flow=1,deco_block=1, compostability=30}, + groups = { + plant = 1, sapling = 1, non_mycelium_plant = 1, attached_node = 1, + deco_block = 1, dig_immediate = 3, dig_by_water = 1, dig_by_piston = 1, + destroy_by_lava_flow = 1, compostability = 30 + }, sounds = mcl_sounds.node_sound_leaves_defaults(), on_construct = function(pos) local meta = minetest.get_meta(pos) @@ -205,9 +209,9 @@ local function register_sapling(subname, description, longdesc, tt_help, texture local node_below = minetest.get_node_or_nil({x=pos.x,y=pos.y-1,z=pos.z}) if not node_below then return false end local nn = node_below.name - return ((minetest.get_item_group(nn, "grass_block") == 1) or - nn=="mcl_core:podzol" or nn=="mcl_core:podzol_snow" or - nn=="mcl_core:dirt") + return minetest.get_item_group(nn, "grass_block") == 1 or + nn == "mcl_core:podzol" or nn == "mcl_core:podzol_snow" or + nn == "mcl_core:dirt" or nn == "mcl_core:mycelium" or nn == "mcl_core:coarse_dirt" end), node_placement_prediction = "", _mcl_blast_resistance = 0, diff --git a/mods/ITEMS/mcl_core/textures/default_glass_detail.png b/mods/ITEMS/mcl_core/textures/default_glass_detail.png index 791309817e12424da6c346ac9e68cf0abb1ca2ba..6205f84a588ec196f612f886fef310a1baffb8a6 100644 GIT binary patch delta 102 zcmX@7Rxv>$fr*)cfgx$G_$MI66W|l#3Z(Df{{STa|Nrm0>L4qS#aI&L7tG-B>_!@p zBjxGh7{YNqIl-ZUnTL(%j6zpyCNeP>TA%Vs0jgr~boFyt=akR{07aZ1 Aa{vGU literal 4942 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 R+ypQvJUAk#JRolUe*soZUVH!m diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_crying_obsidian_tear.png b/mods/ITEMS/mcl_core/textures/mcl_core_crying_obsidian_tear.png new file mode 100644 index 0000000000000000000000000000000000000000..94d9bd21a144595e901bb17602460e27daee5a3d GIT binary patch literal 91 zcmeAS@N?(olHy`uVBq!ia0vp^%s|Y-!3HF~bz9kil#-{5V+hCfWRHaC+8K;oGp5Yc mNz7q8me!|UAZY;-lwg>r&Stai=HZ7x)eN4lelF{r5}E))v=+($ literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_crying_obsidian_tear2.png b/mods/ITEMS/mcl_core/textures/mcl_core_crying_obsidian_tear2.png new file mode 100644 index 0000000000000000000000000000000000000000..07d1978ba23a617431a2da41091d30c61f416f11 GIT binary patch literal 86 zcmeAS@N?(olHy`uVBq!ia0vp^OhC-c!3HFEzPi^4q+~r^978y+Cno@bM?!RM+s2uX iPfD^$^fxv(GBN~tv3@`LcGW7NLIzJ)KbLh*2~7ZTpBTyj literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_crying_obsidian_tear3.png b/mods/ITEMS/mcl_core/textures/mcl_core_crying_obsidian_tear3.png new file mode 100644 index 0000000000000000000000000000000000000000..ea0f58393c9f01294b071249ff0fc4d6dab73d65 GIT binary patch literal 83 zcmeAS@N?(olHy`uVBq!ia0vp^Od!m`1|*BN@u~nRDNh&25RU7~2|(bH5M4Xhurc>* dX{wqx8-rphi$O@~f>%IQ44$rjF6*2UngF9R6UYDn literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_glass_black_detail.png b/mods/ITEMS/mcl_core/textures/mcl_core_glass_black_detail.png index 48bcb54c4887c96985dc6dec6ac85ca5c32d7e6d..9dac71149d27312b7d3f18f8cba1eae27bf26b3d 100644 GIT binary patch delta 95 zcmaE)QaC{(l98E#fkD+aR|!b51^9%xN`isz;d!w@5vGzLzu>e9TdgO7coLp2jv*Y; q$q5Y1d}3^jd~B?YY(5QItPK1n3@d*XKI8?eVeoYIb6Mw<&;$V2{uM|7 literal 4706 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 literal 4709 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 diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_glass_gray_detail.png b/mods/ITEMS/mcl_core/textures/mcl_core_glass_gray_detail.png index f7daeba1984614baa75a8e35ad9b4145351a8140..4dbc15680bbc0e19b57fdf1e740163d0990cf3bd 100644 GIT binary patch delta 95 zcmcbwQaC{(l98E#fkD+aR|!b51^9%x`hdY{sR)n+Q%R6taN2~e){|m^JPA)1#}JO_ q+SB_QJ2{_&jcKXT3_llStx@B4hu z_nk~OO5+!~I{P?75acR}7A1hsDVEF00lfP?d5u8Oghz$46jK6{Pcj&Bl}3w^Oa%sv zgqbxe2r_r}mZvv%kz6+1SSGH>kT`9;odGkuBPwnLbmicy9|=3_ey}^c);`o}Re0Ia z+OXI~^ zJL|}fx^7F@M ze~h2M76Jc}dUj{C-N~7|=IoYv-|XouO3%36=Gj@-5c}Z^?Ur4R$lR%?6~V`At~C3d z_g++#*}ow9@n&AJE2mh#!^?rpx={PTwc+^zK40Uqj-8i$GeJA2eET5}CQ;um z4{0vUAqF2b7(L`wsj){M9BFTd)$5Ec9j>;iX$3pkUsSa>c0R~XPiq~x-;_=3{(7*p ztH4Y#dwOWcjoPR{_I1gb z@aBW3vhudq9*bvH+IZD1Ch3cy8CC0ky19et*pzWpcFnxcC6Ha|>Z~ADauhWtwBk9* z=jUHHrZui?{nP7mxw8o`TXAP#Q)kJZz28g?jz{cr-Ks;K%qZTUHYl&_<6mzGi}c&O z_2Qy?0Z-kAoL+@RK7S~^f_u+Akd|({&kpPe9}Q4`O59>TitDI|5?5eUv(5l^1_XtK znGFbIzwFCD7>B+VFB<#Gb08XoeI-*I@;I_!X(ZEAR`U^ zW(FYx2M8?zBk)`!iiz_uy(wTUgc2RiH{=?%)^U_54bx&e5K4fm^mj@wlEg_zGb|LS zH9CVe3y}Rzq)DTCOV&HRSv=Np#x?@dM{(bYelxo@7(~Uz@kKbAYiUm+5|AzR`AQts zDEZb~1;*eqFb0bfMCT|dEEWb+crb%Wf$2dg%0lQEm!TK~CD9WmM2}(?C;(2?030?O zMcJ^5MNwfGlfpt+ObVjpaw$9(gQ4OgD5_**V<0{>YJe&c?bxm?P)Yy=E9fj#iKr++ z3?_i$GBFB*1YrP*jRi4O9HxrHwn8aUeiUxhAz(Q*Iz)}p40^TIVIiC!A(aTo3@ZHA zBGn=$6-W?}7i;vn=C=-+Mu#Pu5DT01AQsHvaDsR|HcaOR1-%VQ#*73|q6L!4SnXgIzR-vvCfq2)ajk%CX^CXXw916A3=wU5J(=Tv=#z+!!9%v(W^1Azefc1#;*CT#R^if6o^Vm;c|I& z3JZo&3c_R4DRerjVse7mbe?LMwo!BfSDEq=BNm|slY(i0fUMJy=31$o_iiuwnV5wq zm;oRe6b4g9=kQr{K9jcqrt@K#OdA=PX4%zmCJv$f4<{kkfHB7a$Q!nS;{}{nw9(^g zgfk0`zvF9UEq=!e0D8R0d+|F?*En78#lU+7kE?5(uJ>Z#y@JQp^?#$w`RxM_rU$=* z^1*~5O~CMVUw_~|0Coo7R& z+x+#Zdy^cuKMZ7Pq7&pZ?K_Is`E5>e^i-$MlG{f-wmtp*_mWHEn3u~FGTm;S$_cyP zz2e#l+x4j%52?DmYO~5qOT=eng-I^Q$t9srGn|+V<};pTQwy=OyQQ_G+3CW6LI>~O zJEx3ucrLoR?7)oa{SN(C59}wd2TuBHakYPFpfCGg@#(GdrSjFcs`FENcKHYFstlau zw)vOo$*GkdE<4R--0CIlbDjxQH5boGj`e6i7Ptn1>l+plHFrpgl+*5iD3MAd+-9eg zT>QLLL5_H_Wb*5^w<^BdzpdUWYK#4jy^(n@d)7Q|PGfTDkLK8a8vbIlZjFm=QF`r1 zM|%6vuETqvU)4P^*+XsYjG^sMvl1uz*>rb(dnPwAabRuRtlHO-3fG@XU$QpHCz-=O z#bazw{4M-$RaYA7S2sDl?CVW8AjeO>jsA0Ehv0hmrOvLCYM)oHp!0W)ZDBLpOTn|L zgCcg32x3G2kRwOKeg!Na7^0UE5HxYB<+6dQs=a{G(IklzJKlEjoH8$P%?AsjfGJoa zijZ;J(5Le@@| aMGOdv=yuI2m~@f?U?7P&UUWDzqxir6I@vM+ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_glass_green_detail.png b/mods/ITEMS/mcl_core/textures/mcl_core_glass_green_detail.png index fb54f942be2872a83811ec6a18cde6045b39d3f6..03b9943f12313f565f67774b41398285e5d969ce 100644 GIT binary patch delta 95 zcmaE&QaC{(l98E#fkD+aR|!b51^9%xrqvq*(azt;Qh*{%B|(0{X%n_uPl^TdBs^Ul tLpY+76BwBJ#Ml`5*jO3ad>XV^8Td^YR{kn{$O}}%;OXk;vd$@?2>^zP7uNs) literal 4708 zcmeHLdsGu=79T_&KCptIh$u1Wg0e{_k4Z=*ghwKY7=!>qDJql6Bn0vz2_&EbQmiOv zRZuD_Dryla;%mhhB4q{FN~uCo6a;OlLd#K9RCX0~Cjk*p`;X^r|0Cy2GP&RH{_efM zd%y2wvN<#)$ZoRBWB>r{1bnUt`ez;$+??3tNcuf7WFZH>4B2S|7bip46Uxw*Qm^=e}d) zv+k2MLv)FH@t|!#alvdT_kace(#~&?%&>prJYU$Y=gp~HBj#VL^66L+$n^>!s6E(W z7uLS$+`n4xbot1&;QZc>%atC@yDTmYJ&n3ie_|e|y`o68s7Au+tUPi8X^iHPoXU>3 z9-0@-Oe;KB%RB#SV)Y)o69NC)+8pXyl@{mqgU|D?C`aurTMq^7U=iB3rQGz(**H-5 z)wF(~7QE=pnCCFK%rQpMEZOp9FOagKpf9>d)Bc>liLt3$PvF9$<8I0pA_DFb9Ju*{prlDM*97>+csx!cm@W|rLQ~Fnd-l6K363KeTD-Ids*gtT3Jd zMK{iKaBSUdO$E9lZ0iWq;{tVHLr95c`xNPgpRdk9CzjPJMAI#6PtWK*WK&h=(S#d_ zx|d(zp&BgxRaE?D{)N7Kond>Q$>Lq>ehhaOG-mz8c=cmv>Kwk*_u_fWK6$80W+zxKL8PwzcBEunnV}@JIYrC}HOD~Wy2Yf&7HNF#y-o>87c!TV0e z`Di6lmWaD_gaZ4<#>eaR8WxFUFc^piDp9SKk;qIYlLS&o6bb=D5Ok?3J!~YXbnYgK zVGb^;L$q>@UanT*Oq{S-ovdf$@z^@aeKfk3t3s zgrTDzCJAJ6rN-=qiTx2$FPDB0>!aLEE9P>>CW5(-@_vMVU%MHMp@c#fSB)f_(i3pm zcvF0qM2*NLEb}cLqB0p&vXnq$QW*pqosJSX5IIX0EBVr*6>DhWmf zK~j(^C3_PXD8rjTV;~4YEWxsYXbg}crc)sp@-|aR5Y|$)RtaP6lq+EwO46ug<^_}B zEdNje8&4q)CvLWcDqy`7b713_%T>w756}p?5)IeGCN;@)8c1PyQ_0>8ItVhDA3!Tn ztqz++6DJuYQifA7wS|Qhg9!_p<`g3^dtkM&0<|ctS8F5GY6Tl_N&si_G>b+h5 zC(R;5WC*3eSf40j8i58%K>|!cK>~y@DX3HmOC|K-W{tAz)Ka|x)}sD0tWvBRY=F$w z;5^MzF8VkZLp*BI38at-WD0>ojUY2v5Sayedx2yY2;xa21(Qs>`hCSdq(5llV+M>l z1~9*28+N>4rxj`RxEj&SB;#NB8tKJf7y+Xm5AsR+j>|PJ*C#3PN#OD68kg&n6!;|Y z_;mf>5?hzW7=dt-${9NnTgqPr* ztfp+Sl^zY5$>mL)RS{snI6LNGq|J_A51O1WigmSW&HB5aHKKU?uG%C{XUE!m)t1>Yo6Dr_&cz8|=jHI~Bhn(LUc%@2zKFA>Qm8MPf-P5c z>pHIdyS2*p#&h3+?w;!sq4j^bzkGgV&dg`l&svU@=sG>7oysbj@9QxS>dC6x78@0t z-c@9Xez1GK`|d)IY4*AQow+im&}nLcG2go=47xr`M3i}}lU4>h-9GP;0fXfgf7k7M zgcC>CIV{Kt4fVHQ7@c$T+dMJe|4rCu?=rh~T`SpMZo71=)y{(fDT5C(o>qN9Wsslz z&FZkHIzG8^U= zzZ2}TyPG#i+Za2|$T_TDW?6mCuX|7X7l>QwXMXt?x7-J8Hhst6f4Y_3+0oS2UL$iE z8UlXk);4flZ|7mprq<%%AT9s_^8p)%92&wblQjI#bpSABhUu~Z_7pi|MjO3A$g_Dk zb=Gt$>lnV8iv%E<#<~aeLkjEd$7XkA nCUU)pTvkm;YRPQM=28H_almf>6{lJdqX7iG5bp7SxUByHR(a#1 diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_glass_light_blue_detail.png b/mods/ITEMS/mcl_core/textures/mcl_core_glass_light_blue_detail.png index 5c7a34fcef1e9ea940f3d6d7d69073c034cdeaff..842441a2c6252409b1b5ed2517dc03a9094dbe0b 100644 GIT binary patch delta 95 zcmaE&QaC{(l98E#fkD+aR|!b51^9%xrp>$oL<(w}7*i*`j>R^*5RvMY5J*Gd7wR|P%jf=?7hb`lWrwEuX{_CIpYWM=N;cklh(`+X;0 zwuOcS+E_VR0RUhl3KE86_Zfx@XMugYJR1c8!1P&0WQ;BxOv9@+Dk&;Q@Vaz0f=BeI z6ae&{k9UWiyysyZFuJmNk%!*|ILex9UFgLC|DR4 zxbz(EbuF)^FF%^Jexu#p>f%9<&Sx`|N(u)%d`o-;CA*TfZ_Z>Z1pTjLw(Vb@cj#4h z*R39#w!L}j+360&e<^NWZs|5J_*&a}kCnH-=*+3f+y8Q@wMn|e5ih3x)P-N3re2-3 zt1e*R@xxuwcan3@PWwmCi`aF9^$!cz&3nhwJ~`HWCDrptJFU0lPwpG*8?rfHEOTV*9zNh9)M{jJ`aKlSSmL1IS1t@`Sa6FGt^ zfuGC4f~$cKT%X$w<3`S94-OqXe9Oe`NL^c_c{a8zoKS51W5mmNkV-)UVU+|S=@n{h zc>sX7K(7X&WJHITATm_RCk)h`Bj8b(PgubeQ^ab2BoPhD&>#^RA(2ozKFE4dO{S74WQBq}*+Z)f zNX0m=Q;gDH^%492g=aazufdYO$!)k3t5D z#Gw-&1`1@TLT&WI$o|Muhe|(?^-*pHjj^1`iD2#%xF1=+uia>jS&79wp$bYdq$d*c z35NJQSOuXl&-ln5ekNQOH>*Kh_w?{fHH)vR?3VD1K~X1 zP!XR%BT+s`Lgk=NiaGEJ%TQ&C{(~YCRUi>M(7+~@#h}pG92S>OWi#1a`Uj(EM5Dzf z(SS*%kZ2sE#?TfXRt!cgXqZzBz$nLR;rVM2P^Z#Fs#J15!H^Q(;AtFhy!TjBf>14H zk#3my@tOAnWn*t+OF)hqRd~E{YuEioMCd|40?Fk!a& z^gNujBE()8FwLRL&+hB&RR^OiclNt8(4g?Rx#sOzn_ad?Svtt#o#V`X2hEx;Ulz3m z1ixJqo@jUP{8~Xz_qv<)X4$K@RZ6?&97x(-lpD|-nGt1umXN#nc><13qrc#a@*1_@ zbT_uN*Ws=_T|CtH;1VphcqP2MviwW?Cl*hxmmk*lxZD0MYv26E?(>)rvYHCwR>W<% zw=XT`_ILALzbkdOwcGyMK6+K@Z0lY6V$QxW<|T)4l8mET8@+V)jav7OAmv!qBJKCR zcu7ptOt;+7P+z;RVsft@Es_v?--LZWnt89}pN9*N;g;l^e|yj`_3iDAgLScVHub*? z%*%Ybxg7c2r}#|XEx>YXL(mT=+xb1+ZJk}`WKJU^ zz|Vb}R>9mGMcCQYLb5ba2rz;9fF&Dcj$o3{)Ilq?05E-);W7dC?3;rLEp;MsfaQH_ zhZ#JZ=J+yGOyngJ`bKhEp=Ep1U3Y9UZD{hD-yqGjw;MjCc0ADB(4gLdyWIYhqt8jH q&g{6|o#)BA&zi!_mdu*@F92|QVjI7trDXtv0Ym{I!sC7kS^opi1@P4X diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_glass_lime_detail.png b/mods/ITEMS/mcl_core/textures/mcl_core_glass_lime_detail.png index 963933572563e7d08979c1c002c688f0b4aee0d9..8b80407d3ca5e6bb271cdb10912dd6e693ded83a 100644 GIT binary patch delta 95 zcmaE%QaC{(l98E#fkD+aR|!b51^9%x)}N6CBBnf+-#`(jk|4j}v@O1TaS?83{1OQWA7X$zR literal 4712 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 diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_glass_magenta_detail.png b/mods/ITEMS/mcl_core/textures/mcl_core_glass_magenta_detail.png index 8a1ffeda806b54a1b77e5f1a5184ee45bacac7c4..cd2d234587336d898dc1968f608d8d13d6436708 100644 GIT binary patch delta 95 zcmaE?QaC{(l98E#fkD+aR|!b51^9%xZt}SSMDu3E%K=50N`m}?(poShs&%>-Ha6Ym&^~-~RUA-`VG^ zOg4uu3ADsH;vfjJ6b1>x!RIvnWi|!8JHH%8AZT)5R%Em`9La!HYNb?`iox1U6$WEE znG}L_ZBGlrj(53R_zy2{STIRww)tTKdFhGu@oQGLZhJJB#H)IfQZX5;&56sk>io}8 z%fjl?R<|W6+RyrIxd84NE{_DjMHPcGc?yw$hRhgY~eMf2utuAJBNI(qYgki3Hf zC))3IST_GVFEcmOe&?4v8$wK7XD_U_D#ojaY9%6jl zg|lZqf7wxEP87+jm%qFn)4S&c|4dhllTp?^-LA^ieW%X0{uPrilcXS6W+~|8mI58ZZE?&`}P&nY~ z*!@>t?D4+(t;1i%;j}#0Kfi8YnC$7z?}F3!|6rC}V0&P3@9$3QCCY)0hT!je`jZE4 z4!ZPP51Osc_4acv+5YozuvxZq%%COP?NG^`(9&gKS2)VR^hb*pb5Nz6h)9%TjHr{V z!0vz`FP=_?pedLZ7GsGr1sC6Y?jjzRNx1lBbP-vk;$um&pe!{Ok+mce%}PPp5feu zjBp4r4XT!@v@)dv)^j3aWtx_Y#{)n7u0FX+BzjM;(2S}8^dRXF6^TM5ljL&J*a(f* zKOK;a7WB6fnn-Ynkis#IGEI$Q{^^)P>oS%?g1(PerKwX5?MP4(mWs&%R0Fb7#-$7t zibCH<=p{&$$yJ6ZAoe(sO^=<$Ilt{!8DA6>1c|rjf zug}ksC{dY&WB5uF(-DM0LkLtl$|lex5(+^~!%za1K_k;BRE){MkTFz3g+_}gP)tt+ z$cZw*Lt&#*7L7(Dpcq9=pkY!Pfh|SBEmKNi(aB2B)#rgn>!qgft ziF!^7nMfV+=$C~9ngPNh`Z)yzh6vCLhp)yEtx_GSRHkzA`jTLMq+z^auaQLwl4$@U zQ$O*eGw+8aj@*rGfmE5n1;d815VIK=i!5fM;_>VnrBs`Ns4?F}&?)E!43ME4*xewd z$9Qx`5~kOQOr;PgR07pAlEUQBnH(y8KAFNHlkud{hDrKe{jOs#(*J1UWdMvh20+}1 z4ID4vv?9Gfu0}P}%lHqzM%UsW%mAn-l6;iD6LL++^-&6Z6nJ8~Cgl1k1wINqFz%hOHMLJ%;S^`$``oDh+BIRb|Dv}m z!;`GLF0JBq-2ME{1*6=U%}1o|Gm4W7@;CW6L}o3uIFH}t-Jf9QN%j1LEzGOad~vs~ zvE`iE^*--EA3eSz5ltBoJXl^n)9%HT7q`mGG#zeM-{lm|@phX{f1FdlJ#Jatny#XZ z=+3=!T=wp9v$Edu+Ab<)kFCXS-A-0f82yTUI5Cl>Ton~;d%MOh8zCR9T%h^-S6Ccf zKizdxXsECC+~`d|SLBQFzHh=l8D85}c)4uHQL}(;CSR5KrN8aWets_2lSz5@nMtY7 zn=SHe3!`-_isP%F_M+{_4nTh;b}mX8Y@#O&?&?pDnCd*~ZhLJ*T13RFwM|aN!@@$# z*8I1$4RKaFUa4}C(S_4KkM_04qRxjt@!5Gc?;d3OuiBvf$6L4^cbnVVFD5z;4MA5Q zshfDSZs&t%(<$QMKmkOD=0K)Q8GQ&?%vC|lH4rq_Mt@C$_7%+lMpLa&=~2Ktlf|f@6LOIsXMD+Up_! diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_glass_orange_detail.png b/mods/ITEMS/mcl_core/textures/mcl_core_glass_orange_detail.png index 4894833f1f20d23b89b273b462e9bee265ccf99f..930992769a3f188200b55cba43384d33fa10397c 100644 GIT binary patch delta 95 zcmaE%QaC{(l98E#fkD+aR|!b51^9%x-l#VQqOjlT)j$!Zk|4j}v@O1TaS?83{1OS^d7!&{i literal 4712 zcmeHLdsGu=79T`j8eY0U4~m4S1;o7Hk?;(UfB^&qMAS?slQ2LYCV@oIqKJynf}pO* zK>-m#S#_*Nr_e(&;v;D_&w*QfHCNpy%zkBcRyZ1Z! zvN~3wc#3DPB7#|J+JSdBMp*_tw^o`g)oV`&LUuK|V#i&OgZh;(=rD z-stOcw=|rr-}B)3t%}kJpRX3U?!J1nq)fxT^z&SQ*XWlzJ!N5D@;?&~cMfgZ^#>{WtauH(1#=B^jbK zQYrQhxZ0wXeI92H3-+D=T(pnVWG8k>di`=kF}8Hpzss*sf0=_r^O7<)xepB9u?=pAeI_rZz4cU{2N>{|Gog8pV=disVfA97_;ytXNe$gzM60@jE zz9nP%Bx}cg37p_bld41a#Cy*;>gch>F2L>3(ZBQttc_oFR!HK|#eFm5`li<+UOsJ= z;tQzdw0TYgmjfHj6TAzDk@H73H5WQBKA85OJI50D*QFi2m6lT2b1s5*JWZy&(p=<{ zcv$(Q_cU9X7a6xy(Q*2C$ASlsVx9~&BLPomsJ`AVx{<){UY)+w{kC5%&Mouyv+JQ% zzUckm%QNo`cFBIkE+pJ(Ka|s>c-8WF4ctf+HqKv`+4bU9LhJrzNv-|vF||dm?t3NG zJvYV7obZ?wPuI)PmvJ5rCj!>mUO6*=!S=I(r1JiaGorWsYp>-|VIXdDd(_{GW<8o# zC0KuV#mdNp-A&J{$|Bc2+4R#l+MF=OcUP}*3U<{~@+vIq?K|yr1{CB~zwRt?xto`` zYq@Q1a&Ep~kb6zZwXlb?2OZz!+I)Z3-QjuFJ=KP^hW@*aB?rK0xME-gl0*x6h)O|% zr78(ZGAPtwL?Fo5-=Kz(bX13zpmI#fCp1Veyo5e=r+VJaowhzUznnL0j!0QC6x`6<*Q(HOi^JIVs!gKU7+WGab5 zRw&5hJ+!)zEC4c^&>wne0Ii7~}J#Dg=}AOpjD1OqI&0RHBs4VGt#M4kB8Efv$uz z#%E=Ok^(3hOG;(Y8Em42!(f1H5R}MeAOMPvFzFOj!liLg6O#ALua8F1he7Glaw!v{q?ra7?*_yiUGvJ#y$lACJ#^xFIa=ZI+Z3~rOMzFj49!bo~HK3 z`;IJ1IHm;_tBf5#+VerMeB^Cp1Trv_3XeCnEe}RUf@t9^RB8$Y{6FV7^Bi z>b)HMgT-QUSZuBg1`N|!Tq1*pf+sphN$|v^fPaF@cVAlM1dKD3uTbe_Le#Zf)O=i*;KXtwW0~w$%h>y}g(F?9@^^ zoBHH)i`szSiWIpx^L5Lrmmh!p6zM)x1^q6+7m@y^ohg2^bucY%s=HZF_qXRW{@O1TaS?83{1OSAi7pMRL literal 4708 zcmeHLX;c$g7A`~(kwstx6&*uB0X0b_BxaGY2vGu}?4V*xrBW3NvXKN55jV6I;kbZX zH-mx#irV0A+aQVqY7feBX_OHJr4eCl*M@dMka-EHaHjuw&h$TWP9>H5zWd#KzkA<1 zscZ>Zw7}AQvN;4nmcju4Fz`8Ef0>zr_i0`I2n3DlN{xuogdtjzQl-ENDMr$)RAMAd zN8k{oYka;Z^i-Rhg`j_lfMz5#+tMBfN1ooWWX+2E+dfREc^~gcJSwVPhow!|taEwZ z|MB!4T5SD=LkFLny_=h~J8H64jl|g|w7X+^J=LkT%VhbezPzZiy632CCE=TJ9cPSmLK1g5w&q?i&g4D z)!WWWe&wB+X_nc0T^cG@CoV3c(H_64Ucq;`l-eu(Q59I+o6~o`A@|}oE^1#HQB?lT z&eVnNoyY@Iht@{B?u0oH%*W0R^h^5T>H1>0>u1N>g83G)S?0k{&%}E-`Widgx7a!I zZWxcQ?i4-H1-zOS8h=u_)7>i5_}?Z`7tsUNvg^)MTc+%HMcnLaMBLutK+*%JZJQUaxcYZr~;`iwK3*{HV8 zsSASK(-Q@-3kgba3EX{(?r3BCAE@4j7u0GwI$*bJ`eSm~<*VG-HoHR9ZB}(&+%?41 zcIJe+H+)Nsquew9K(CzKRGw)cS(@;)@l5oQ;)K$>2~#qgYXTW(6L5K5d6q-;aruju z3v7A1U-&ZFy$fgW%}q;j)221k3*K&J->*GH9Q%jt;@MK`+4-THw(+Fz;tLn=XC$q; z!ISk!Prp2ax;H}GiuGkHry{FnWkf|_XO4{TNWSmec_!H z6t(~S>xVf(>tAesd{Mn>f$ZwdTbzu26>v_jNrgi3>SjyVKgZfm?S0%w{Bo>S(X{>6 zf==gdn;x^(8@=ZByE-j-_ur5h)C^mpRE( zCB}JS{__VZz&AcQUZYX+Xf&->OVxT%6)Fjh&gF7xFoVWmPym9WUMbfgI*MHFtfv^@ z@W<4sico3@g`A}4L_~^Y4WCQ~>!eTl$&|stpXuf5K^1@=G##R((Wx*^CZi4YP-_G! zfMhVCKlM;YfK!APhN%_FDijl>U~-M~Pzo{n*E;-FqMdOXjXbEF`!~2A{gPY zP(Z){RJaJGaF}yg6fvCv<6JIl4uTJ4BSv}i6)G75+DXU|2}V=OC59M!!Fj$RLOz*6 z9f)eMgh&w$4jlO8g@im=_XQe3$gpq?qF0kXhY2&-9GJ=E!b~=s{sk0;snlQ+^_+B= z%HSAQ^ljmRVt}xSeog^_!47KS`Kd5OqfkXC6jDA}p8!ekX&7&k=Ri{e2sJ>g)KC22 z%+Et41K$R=fRr#Skw}KIt1Wkq-~d4kEfOf$S>k-fiQ zv_t7Uo0%Jz9*7*X^EX!}5fBzT#iSv9!?di(F%FXDQ)5khUm4fb)d_D40()14#oM%9 zPV#PPUiF~Tc;nJ7NARYJ1qpkyGXz&6QX?%ckTblx6*S@AdDpcFe5`b~dfyY0D5l2NB_kxn z*JgT5#;v2-BC_v?Q0xA6ZF_$%-f_%q{x*|c2j->pK3e;#Vwne<{$hqnq0fgb*;)(Z z^~(#sIs5!2+EkVgeUv;3OzgSNitE|goe(~5no)C8)s^J%@HgwOPc7&d?zOz1-OKzo z)=KAHs0cK!{L!Z)w`mzV?Xa~^PI=}-Xw2rSfc>W$_$|%18=EdkCinG0H#$_;y{FvE z2G6FZqM!x-5DRjG#;^%iAFzy71}srS&^SB&Wd!BsO$5d<8ey@O1TaS?83{1ORfS7kvN# literal 4710 zcmeHLdsGu=79T|AAy!d=R#C>FMHiDy-Vcbpl}LjKsDP+UCX+Bi9wY$*D!3LDMdcyZ z$GQqqAXQM?Er?Q96c86gd?8p?)T)TfBE|P2l>HJA@ofL`ob7+)oSDqr$M4?z`|kZt zzU&C_Upm=xrX>VHlZC$Cf#7?p;WD2H?hY>oQ3x9MDls@j8;HikDz#EdMB}hFL50J( zj*vo-?&t3P9@&o;Soyp;EZ(zaUP?_2av<%jhr{{v(M3gcXHIkFp|lhvqH4Y8l*`9| z9PEoPNY2!sEjrdw+I%Q$ne%R!nMay#Wn`;)^q)Uv#izyR9^epV(4c112M-H#WWpU2&p zzOTZk=iN=`l8Y@f5-ik}U1tV%yu{rVF8$5w-V?P=1BFGw_0;PbvXZA=A&gbm{e1LY zrTV(SJ+>Wk#JW)6aY|a9pLyDmBdI$%r`3{?@zdNX8)~Xb_1C`jPk)_1hk0N8K=6Iu z1y^^3zjoKGDHcid>0~xRue}fpRg7>+3O|W2G|K(E)%Pq|(a?%}dOl|GXY0deq!r~D`KA_h(F?`un zlN9qpo2!{yAbr+?mGzgRz0JQh4cOkbD3vo6UU@{7o$fnf))Qp+@?CqrE8g`iB`I7A z=LN=GwNK$k>^s)#w#t5^{zT-8=HrDYMH}~p9lsq`a;czIR6H-}gtX&!afL4C)xSEP zHEw+PWjV97S=zWJsH zy5gIKP3(96E@d~?#og^vRP@MuCasYR!|8KA?^}Rmb)V{hW^Xm1QjP`v0Q?rx9 zl2aCYI^<mM5l1I2 zwuD{P5-C5>d&w{acoUE!wOSRQN{x??r^GWTO0|qisDJI#flaQ4p$JP95!` z(fY&zkl}=W*FzHw_7Q3zu2IISG2AB(S7;qaLrAa@e^snH+E|VRqvFxH9GGfARN6-& zmkLDzBOV3{WQ1I0^a5mmWT_>jAISPBH-pAl&gevd`v~qw*6(XK8Urhli0`e$Vh!mD zy#*vge7;195fZ-f5#`b7TwKB>GZ7At%#>hEGAd@$$e5TZMcEvLj)L|uus#GORA{uQ z0>ceZKtdq^4nx9VOA!u6X3%K}nTY`$E{6_oJQkOMVl0fy!bU+XR}-Ks(df}x8K5Kp zii?UROdf|##@IMW31f)KTqYMI(@_SS&A}N62d5jMBp82*QY}ZpauRY>hEr7vnNeXN zobM4J6p-i?&V2`Vtyo zkznZf;hy(IWkYX6BM?m(RWNL9TRw^n1<{~!_|S>~zabSCi7I3`nD60+dM_t_XR%mp zKrN1=WDMi6$xJDiOXeYfaJH0(ViGovGMGb!kDzOmQf)k{#yw=9Qcw+OAY(P~0wa|R zjYW@G$4BA@o)9{XOrw+Oj9?mv&tmeK3}=MKM-UQqxL~Sbs^3@aO8p;BT#W{!wgKQb zBm>(E*sZ7|+tn~(@Bb!%paof*vjo1??)J6og9=DC6DI96 zm+Jj(y?w^pm3UhJDJ3j#rPxUO&+}iJM{AZ@Y~Z0_L|ta`gZij1p_S>aL7x;)v+^v`Q^*OhknU~MOlLchuGFN^AHU`6!peYqiMl7q?JwyN6LprF@V8fNDX z3inUGlhw~m4gXB%makl9T6xC($)UD2m_yMN_v~{!??GnUt9+0A&?0ERd;RCO^Rk%( z1JIQx>IOIa+gadjI#KMm)Ei!{B!^S diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_glass_red_detail.png b/mods/ITEMS/mcl_core/textures/mcl_core_glass_red_detail.png index db44333b236b889c978025fa5d52a1a98badb03d..587fbdbdd49fd444ee8e07ff6edb75ec25de881b 100644 GIT binary patch delta 95 zcmaE)QaC{(l98E#fkD+aR|!b51^9%x&NMa#BBhKsEI<*ak|4j}v@O1TaS?83{1OOgA7C!(0 literal 4706 zcmeHLd010d7Jn33L{y-|B8r57#VXlDHV9jS5HW~hM;v+Y{HDY(4+^@i=!d!G-$0sJk=wN+2Q7y4|rm^A3npLdj+ zJ5+xuI5IA9?SZb^`!h-zezWfJfYG61OJ;HQ%G9t2PEJ7qkDQJ?Jc*E%OSj$ZN-n-SfAF(QwS|(X%;y{+sp*nmiZ#xZ4k> z`Apvig%wmeH<#o=M@na7>#t-AZ4X$+6n6U+O}8zXGnMm=$Y=G27kk_*+&l!y)4HGl zGNUBs8;*QRnDZAB$rI10jr_QHX4SHU*p_|%QPIiT=B<4Plf-^ju}!kBgrju^&C4fU zPa89SCZ1!SzK=9UeR>*cwtKMt_+0DTt>;8hVnNgOoo8y1rZ8cfBn8 zu72IHrkMWAfub7bKX30iEUv)r6xN*aIeJR>0BcH2et9Sx9@?54vVpwpvyxWJoIVWdqGU9;Z*_uIUeb5?B~;WRbdGh8%yrYmuzJbwK~@XhZeS3%iSN zMm+NFb?moYRS*>RhT=6i5OYaY8+N$N?~_|$U{Sc^K>SJK1w2%xAj47>f{_ghHCP-F z6c}t!!)OMkBOsU@SMrI^>MsxpxRg&!^cPdbY5|sxN3PIdu`8nE&=nadS4s>HvI{iu z0DuD1!32XMQ>o<{_(U@<4?LU96e7XwqRZeDlf*Fufl7lBm}DlIN(wjN*>qx%9U)L7 zmGLCPc_R?ujZaM1>C`+5MX%SB^$fB~Bd5@~TrP!5r_kvn;6c*nD0Q%bq||zwAcir7 zm=@LGY8|dp5=@vdqRP_oi9|3?cw3)BEf$Z$E43pm06r)NSWTgksT75RGB!f13(p21 zBL)3#gfVEIb=i>b%E7NYT-Fb(SX6+>R8bV40W#xN1RG+IuM@MB2A4)+QmH5jLFrVIj46dV2m@nqxb!hlBBfRbD^bh@1;EKT zz+uo38coVzk(ii_N@8+Y2#L$3%Sd#XhOikdIu*u{F%SziI8Y^=IkqYjloUY07{;Kn zscaIA(3zkbmW+fTQiMc9r7Q-E!9ke_%?u?)dGk~n1q`MWSHNR=O_G!~OeXR{eJE}H=!h7+0b5-^PxDA9yT zqmtD#rbx5A34z0t5{YYpM~+GH zBbpC`<->2oOCS?B4-p7v+45j?IEfa{#-!#%AZ~aFO^20o46N@FLA|x(zcX1>CWFpm zA{-J|=1&Im~8;W4cox> z0(L9P=yo;2nTf_f@G~+Oe_#dxJ)Y!)_#LNfoURXI;DemU)iqAn2QlzL&g1I(ztLs) z?!bd7!LJ}aIL;Vu@lznkq7WAdVnhPL+rJ1PXm;tUQhsDZ$c)CNu?LCHR+HA-%8o?4 z2*W41)`U6EDM+b|x7pO~%furksWYrv@>hEr<855!OFUAoLVvZqeEquUyYTsgOC{-! z_r6*l+|j=Br}LHtDMeMXHn+XYwwA67Z;V?JZ~qVCx}e@PTLzu+k}F!@p#7}9;c830 z?Tvp2^*wxaO)9p2E$mD_G~MO7_4C_@4r)7mr<}+y_X_fz>HjGIa&c;6>gV^$^+|Vk zczN&G?mNZN_?t^Y%64b_Erv2q`6B;ot`f4GqgtL2<$ULyZ!S!&uJP0E?jj&bmz{jp z#l(a<&PrN$^KYdHF?3+j)HiwewtaoDq}q1gMyt)0VcCOsbAPR0%wW@=eqyyhWWcD% zwYU7slD&UE-SZ4>J5~YxM}BvHMt_rkTK}frWwDbyE!x{IHfF`fzRGLz*!xDbZSs$$ zgUrIzDTd(vs`-}Z&xSnQ*|r$8;|F^}GNaC-Wu3a; jzivY35sUp3i=+^A{QTs?#aAeg0SqJxj}{&aOUwT+_uT6n diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_glass_silver_detail.png b/mods/ITEMS/mcl_core/textures/mcl_core_glass_silver_detail.png index 8ff77440aa60fc1195c826381b8b67223208fe09..49d444b80fd94a61e405bf962e61cc29b540cc3b 100644 GIT binary patch delta 95 zcmaE;QaC{(l98E#fkD+aR|!b51^9%x&IE&qLp{fVB1|Pge!*!Iwpve$1@a_3T^vI= rqLULCnEAxm82Q*(8QFXqv{)JVO&C`GDtyQbRKwuu>gTe~DWM4f$e9?) literal 4705 zcmeHLc~leU79T|x5fFJ#pe!YhD2h&&$%HJj6NISH2q>rsOlBrwge)e31llS=tq5%u zL==UBib_SaT76oqwc_?3OY4T92-UhkRou0TAa4>7@x1=yIj{ebb0#x$zu*1cdw<{k zzLPI&#F1gP)-Kin0N9Gcg;CVq-gsGAP~RR;`%nNF`6x3cP8)^lXezZ*N~RJtZH9`V z5qeSz0Q#$4MRN&?4lCZ7Nd}^58-sG3+ikgiFZyobZEDF2%pKtcseIXLpKfZh0t?#>w zPb!4tpJ0HJlG{J39b#ZEFJkg?s8OZ*FA^JU6rq~Ny~gm z$17!RZ(b;J5@H)BHf&ipeaeC!Rp6Zvk+;Bk(wLIq)^qc3d57RW zD);h^&1-MHIIX&&!#-oQ`iHxRUkJM|OlbD)NxO4jmRHtwW_8TMglz$3teUl-H^zlF zns23dZ2Nfjl|{~nCAs`VUY#3GKbqp1`m5o7OOx%Qtql2sd{=Xp%C_#(w-?Ig`&>Ck zHf7AV`EAn=hU-X;vn98<=Sc(7;#rZmBE>A-uz``7T;@|$^x}#eTURTdoYUC#XlZ2G zGUgdyYhhmE{_MmCc8dxt*fQx0gVk5;${Nd;`H2^AdDAM{bx(6fjXe6XL)C?{ErIFh zvJJW2ycKxwKLc}^hiX4^um?B}JAzy6Q-xL)X5v-%rWeQB)8;);6?`8)!nK3X@n>CK zeE@D4ogOcxZH-d>;GqzMfFk!#D}V1K=0QvDx-85qj6YZ?Arf+%PO0HT5~%`h zI{kf>6IVBO--!uF5YDVPz3@^le_G+RpY}S7@6}c9$!I!Q)HFX4tF~?3b$e$ulG47d z>6gWV2Wt~*(jK0_H`DcB7mB!Tb;Ag)*Gk8_^UOpeX(kC+v|1Lbc%&)k6x+L?cB%hmg=< zYEq>ol?s}X6O|~_w0H50%h`H9QTp3hERN>CaJDOQ-@|{q{1mGHj{%$e3&={ z^QBA(VWU2f1i`7iP#%u+a4I7y(?o@1f|*LS9Hpj{l%q0&p;E|914h9GL1K{~2-Ewa zCW|-~)k-M`KX4AINYlTA#*lI%T8kRhWceUWn9Jj^5!eUjGWqX7^9i+v>O>o|3Pkz!4`IouLPk*Qd!V7-+R49~EFUhH$>H-L zM2fH=1ed@ND#h3kAHz|YgZscJ+%MZ8yGAM1>QFTiB%>;&s-YUlR1Iy4Ny@43=b}p{ zj5;x47Q})fm>t973OF1A8=1yr37AZfF;FnWxT@b)?92EcO?*v&A=?1u*Keb?7iza+ z3~pBgni*yM8$Sbc@i#`GsE31mkiNrm4a@aG3VaZFxVwhs`XB{92t3?f|2Mg;-yL`e z1@$XPM;&Jf1ilRbBUX_iA!1QT$lHGi0ANb~=lOo&Cj;G1Cr0l8$D5DIwUSmwItoKa zIaLRb^Io}d>paW#_q-4?JSyJJyg7S?N8UV3C)r~6c=Mn~W~Uk(Mdw3j^(00mkGpwd zX+V41r`L{|tz5X~TWPCv`I4gioY2!Tne%LZ1athKC0Vgy_H(`{_oU{twv%U@k6Qiu z#Q)EZ&N@88;-&ES1v_0GA6q=Wv~!21-OFx&cF6>Pua7yM*{9aV$Hp(aS)z-(UOZu9 z@g^_3ae1#C=P%qe-e!ZofLAh?Q|A;#m+_QK=g%I0`H0tYlv!0hT~m68CW$-c;F%*9 z2aTH)mve4+z61<jT^_ z=Tm1>3(4#-A;1A90G3>m(@R-KtHKv(0AS2NjMoTYbBQx$wA6|sLM?CGIN5W-R`9wb zWtt%p2F38|u@b&U>SAV|wZ;&f)d)b~Gx7!;m}fBDa2dCGAIi?c8#^uHC)WPa-06_B f-Qvs1o&_U-yL;^B+BBcgQ8a)kG*Y-XI4S$TKZ@!M diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_glass_white_detail.png b/mods/ITEMS/mcl_core/textures/mcl_core_glass_white_detail.png index baddd95eb50e521fff4980e00b182639fa1c9206..e7e0db92d08c9f7c14c0b0ec193609130bea2d33 100644 GIT binary patch delta 95 zcmaE)QaC{(l98E#fkD+aR|!b51^9%x{s)85ny)!P5vGzLzu>e9TdgO>0(laiE{-7_ r(a8x6%zR>OjC^dYjBGv)TC5EGCJZZo6+Ywzs$uYS^>bP0l+XkKV0;?$ literal 4706 zcmeHLX;c$g7A|ES1QlAq!G#b|Y%%*DN!St~+CdD6AgEL-l~6zylRyG4EGnY7p^b`- z-7pMltGMfo;tuMx%V}FdS_25Kh$}SXhBW;WK;caP@to;@d$ZlD8GVEWP@QWD?EN-dxqtRa?Am?7?#Z!JZp^UYuRF zzthT{ap1?@8Omewgo>g|6I_3OQn#T*%jtOLb#LmZH+psAHtUL#4GRwZ&YJ$nZc^Ls zr|w>!bF1I{dgDsPt69NI+*~FKmo5l?;o`y{*Xq*x_&s#PwFTaczbU!TBP zKRuq5JsM70N%O%$$v!iR4pYWC4}S{Pws2>*I9Z1m`IbDyOU_^7YL)_k#_qeW1d}JgE*zR686lit38Gtkj$)`x3`WxrfPMOEV=Gl!}c_H(*6aF z4W~2I4c4o69>2RUBc;-?_D)$tdwSTaCRUTo@4KCqs^jl(ALk!j68d*;+rgIdb^MGg zHSa0Ujy^qd{miZP6-T$ue|ysOaF58t3cW-Gb4RvSm!-Zj0 zQOoO|PYzmCl0>#5N30BN7(UF6Zg=E)w1eG=#4Y0@{AcHF_P93LhBA8E^h3mxhh{Eu zankk_#2@ZBx30(U#F*A5pSL?qe#x{md6$BoH>`B7o%ZX})?0Vl&l~FAQoAc#8auo@ zoj=$wUBM6bEZcD7thdjIfQk1PHmh@r(;fK{CP`5`{=6DV3yw9y+}+ z9gy@*=ubU#(O?fDNl=|SO^cwybX2AH9!McWKKX0Xw5gVKWC#gOMU?=m15qi1LWYUN zk)J%w5-2dG#^MFU9)#3m^3P%onwxpVlFq=10QXP4gV6oCTfhJ%7IOt^B+WcMk${Ic z$LGq_2qxoNZrLokoFSu82sD(!Ake8WgTP^K8?9ES^6=&f;LM(u_Qv`579||h z0YrwmFt~$hD8iI6LB(NYFuP7I*Bf9h8l(W3f^0woS+c=Ru}Jy# zV6-6#HS0vCQa}v}R9ZBJ#br>rbhaOv!X=aOq`rhn=2hLFu|Mg5H1W3p25bYsuh#~) z7qDBAK5bWhnwe$%3qO6e_zNQd>Y*TCr0aHQVzDR*D0uOc9|4lB3 z&j%h<1>S-T;5cIp`-e3I4O@wYghYx$Li+zAfS@UbOAC47)q&$LE{v+cyV{IcV=vzw z;U*ATyH^G~PhByuY>wULXTEeST#_)}rapJMXTcmhcg6e(2{u8mt!l1c7yTlf@o}Lf z$@#(gMFCBXiyKZ`t(dp^N4aTiY4VoBeBs6D%sGyy@cI1CM0*;Q_Fs-@O|@=GWA)|w zD*K;1_-~)IUXh7y-wE!=?HuRUZrfhFvqIP8JMvI&i5K5@BBM38W<$cbI z9IbNZmo7N=;uT`r{{!^9qIpKjhpUXl51TuaqegfRYc!p^m=+cFCj07y(jL)Pr#poo z=_?aP8UxDJGptVkEAYv7Q#|6iYgFK-lWXolcB{^Xe}A~1*VOpSUDH{GM|U@L?TPkk z!1&vR;B0Cuof#&87?2la$HExh!16auc$^M`Mto(yhC$m)#sZ_AUL+RUJ#us(O($C& zzpw+Cri%nY(d?_p$DW=n4=bDO)j7f0*C7JF6KkOc7Ubl#csOrA0MoK%*IR89ye~Yh jZ*|Epw_Q8gXVWmK`pBr|-GaCqfCdr?BLw?{6LbFn3bO0O diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_glass_yellow_detail.png b/mods/ITEMS/mcl_core/textures/mcl_core_glass_yellow_detail.png index 83eedf08ba3242e137825a002e6aed13fbe086fb..b3fc7c8933760046e65e536cd552c125bf75fcee 100644 GIT binary patch delta 95 zcmaE+QaC{(l98E#fkD+aR|!b51^9%xK7DEoM3=TiyaI|al?3?(r%l*uJt-E*lkjwL t4B?1QPGDf>6JulKV`F7x^J&mxW#BhqSoy2)Aumu3gQu&X%Q~loCIJ3{8I1q{ literal 4710 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 literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_crimson/schematics/crimson_fungus_3.mts b/mods/ITEMS/mcl_crimson/schematics/crimson_fungus_3.mts new file mode 100644 index 0000000000000000000000000000000000000000..84f8fa791e276979db2eb451e3e57b3d39f0d6db GIT binary patch literal 273 zcmeYb3HD`RVPI$AWniyI20%gP#LOZFncU=@_`KATjMO442o+zRSX2_9l#`#F%^(Gm zO)kpJEzZxgg3|FBl?54zsSM)Ca>W@%`T4mynduoN6?5K(yya_9;FwZX5V!Z{mC_%b zm;OB7T6#}m!R4YnrYoUS*3CPm{f6mal$Ma7kma7jO}&n`ZfGk)c-pcm{a@9NsB z_xMYZ{gdjf1%&Guz-TbEzi@apT6yk$l9b0;)2C)=cdwC@H0>@Il{ literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_crimson/schematics/warped_fungus_1.mts b/mods/ITEMS/mcl_crimson/schematics/warped_fungus_1.mts new file mode 100644 index 0000000000000000000000000000000000000000..487e39f1a0906daccb454f0d3244043d2b5b7f04 GIT binary patch literal 209 zcmeYb3HD`RVPIw8U|_9>0wA9`F|&w4Ha9sZKDj6}w>Uq~sywl%AT=c(NR`AV<>V)4 zGe}~Q&ZsQNNK9oAN0utiD9X>z&B;v9D5;opHNcVYfC9(j+lPODP4!?|HsS4#SqaTs zLtMoaHrzcmEC0Y9L92`6((f0i7_=R+(UhC~>2=n&XV$Z8OuzmAeyll4=33^JD@xAZ f#}-GfXj-_-bc=W7)n89{&RZYwM@IbUMMVw(i1b?F literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_crimson/schematics/warped_fungus_2.mts b/mods/ITEMS/mcl_crimson/schematics/warped_fungus_2.mts new file mode 100644 index 0000000000000000000000000000000000000000..564731158990f9d900c96f316339d095f18c9513 GIT binary patch literal 193 zcmeYb3HD`RVPIuoV_>ZZ10at%F|&w4Ha9sZKDj6}w>Uq~sywl%AT=c(NR`AV<>V)4 zGl(Ng7iSdZ=jY~Rre~BeNFqx>^<`8RWF)3m%sK1l$albiW75}$HMQPXv?8~cY)@=j z!nkTC!y*MP!&kQ%Z`q}_-<;8x-Wrhc`P*@?t6%T0Yco-K;i4YbvEBNG-=?HqBfqRg R8k<+Y()z3HCnPA$0|1@?P6Ge{ literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_crimson/schematics/warped_fungus_3.mts b/mods/ITEMS/mcl_crimson/schematics/warped_fungus_3.mts new file mode 100644 index 0000000000000000000000000000000000000000..079631a20b410fd6061f69c6bdceea7384102ca6 GIT binary patch literal 223 zcmeYb3HD`RVPIw8VPLIC0zfh5#LOZF+1%uu_~fF@+~WK^tMbI6g4C3FAXO5dl#`#F z%^;2}U7S&rpP!qPnVwO?Ac-si)t6COkdc^LG3V`sK)wSC9L|Z>7UA)30g4=_{>1uv z*sod75g?$(_cMb1RBh-nmg5J{?T?wh@b`^{79vT?Xa7I&sk&Vee}3)$dDiDOE}!60 rn#5@HZSn=9FVB8!U-Y%^2o{p%-NvPICpCU+zQpgX7nrNAst5r9BnVpb literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_crimson/textures/crimson_hyphae.png b/mods/ITEMS/mcl_crimson/textures/crimson_hyphae.png new file mode 100644 index 0000000000000000000000000000000000000000..bf921d408aa9dbeb5e236739970ef4e82358f0cd GIT binary patch literal 6257 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 P00000NkvXXu0mjf%hc(V literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_crimson/textures/crimson_hyphae_wood.png b/mods/ITEMS/mcl_crimson/textures/crimson_hyphae_wood.png new file mode 100644 index 0000000000000000000000000000000000000000..e1f9e70a9b63c02d15fef82add4931711d2ada5a GIT binary patch literal 446 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 JR_+qE>E8zwXeIyv literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_crimson/textures/crimson_nylium_side.png b/mods/ITEMS/mcl_crimson/textures/crimson_nylium_side.png new file mode 100644 index 0000000000000000000000000000000000000000..22d6f872f7a8d5f88482c03ce9d8cac0c152710f GIT binary patch literal 324 zcmV-K0lWT*P)ZrE5JlhYZVDts;~v=(vPA29g)8_D$r*B;v~H;ASC$+Q zDS%A@v*5x?3YYm3Vx|A*{n5yIe+&od0k{p2x%uyH0>D9fKF1V*lWk*8eX|>TZUcAn zHsLzi7}h}rWe#@ZTxyi0Cak80Zvzyer3md^4#4Q62radwaU0)t5tO-gU<;|gzA@Ly z;%!3a=2g8-sAUOkfVHG#ZiQ(^7OR(a9gM%62<hvd=yG~ zt0Fwoq|$6c5TMMzVHxoTlX@oALj1{f%9 zZUNgjU=1JRy!JgRq|7S_)H?>B2yF8->`vNy)jQ}nB+@Xu*)ZEWyMEl^eB2twZ`~?No&?w1^ZrRrw-b^gh$mXjyQTQ$nhdn;f%G z4^Gvlx#SP7YWtU1!a3Ag?v&T!7bmQn9Cq!-N={tPrsBl?D;6J$nbxZ?PWrMX?wjb@ zZZprsO^ZzTyOkL;ZQH5m9sT>awZvyFG!N&HrZ0XU%N_+9SCCBudW9OgD zikf$ZB|6%+H~B%@M!(z`<~#wgx_OJkiQ_>=56yx)Ji)xkREv=y`eXmFvQ_Ge&bu?AH)-n!VYa~>%Z4ka_|6oYLoqt`m2+FCN8SuG#Xk-zDdt=p7H0%SRJWw9Sxf56(@L$1 zXIykW?ZEal3qH85re*p5o=xAXSc^}t>$@7Us41-0Xgz$rv^wYB%;F!~T4tHxTKr6|OJa)cvZF1Ex;xKQZGxiLwmql#@nybK zs!=Gdbpl^s4%657?Kz5^p1W3Ldj!^b*_@9Fttd1{Z`|O{+t0S}^S3Ga%KsSWmf>M~ zZuDzi*3=v`%Ybtgckf>0wwya38IBJ3o-~9?l))izw#l0vW>NJ@Y1?K+|8&JORKXJd z!J8zl{dv$#Z~d1))9lk#S401OgmVtnSB+kXw%`5c=2RmRLG z0UkqjS#!Mc-$dIJWzPB9<~g0{H)}iE^Ijcbx;a_t(qn{!pqc(-?aVw;s_pIM&T+kS zbi$(=Vh-q(?I~`JiW<=G?$E;@`7*Bt9sLyL8(hr`%<9_b)YW%(aLS5M3#%&Kl%Lz~ zTfc4T-M&%-u|R^c-h{Y9TQnxS#C$ZRW}MXahCwO*CJT+>7Yb} z2Y3=Lgjb5B$i0U`G3F?x0GI&57%mhm5PM*soj!xb2zVaYa2FPlCG~~k1c50sC^Ur~ z2Bsu{G#+-2ry)a0M+ig^3}BQZp;%5=dSErYbmY6*Ou%9^5IDgD8^PjWd?hjnL&a0^ zM4Z1;kW9vU8e$kS9-kiKH+Pf*8F^siU|32g5EKdpUO~Z2WU&MijYcC7$pkVPhahlr zl^6z;II(<&nqq{*50Zm2ffN=<#27Uvz?CGy9#||gj~OLLW|wh@J!`ASICSM1n~4frlLSPktZoqaN}w zaVWFX|942j_xV}nYCN%FBVljM-vq{&;z;}ejiG?B;p1Ta~gcRp$vV+A6q z#zT!Bi{ydtaMC21P=n!t1V{*pkVNDNGwB07Ea1Q2pbyrgp7~QENVs?WAE4jrrO8F3 zE8R~5CaHrm{XDSheCa$1DB#gGUqK4V&6P(3aS)f{j-$HLTygGP9u-G*qq%ZP5X~I~ zxnro9VmS5z<})F;Ak9zn=;dh@emyP|HSgB~smpE>yCMiz`x)X88Qfe1^yFLXq-eL{@-}sL*KD@%V32> zmJlop=Eg%H{MS4m1HWSmK~6h4EK@Q6W>NovV~iARAmS^Lsm8<)g%U?bBS(@@ppgoL z(HsMG034BD4kSZ7%@!a!j!c1ZfH)RH&fC#udutbbq>%Y!kn2w7l5jM4h=!x`TzEKu z=Ssu5Belnc$P_A>=>8$QT*8MHfDH1EMQQ-qXQa6_`;2iMtv{y^@rpP|U0g&m5l157 zh;Cs-BAr5{lU=YQyNzKG)F*l}U z#`urc=-;`Ig^hUoN~9{Ji{s#6h4?SSe*`$fFkb*dV!7n6QXdN$k!8$9gycM8LoPVv zz9hW6Fh{FI-AMo7Yqa|Q!3YTT=OCY??`OF_%k@bLd=mI`b$yoWlN9(Q@aO9KzsY6z z{*fCJBft9;$OH8NJoFRtFs{c93h+a{QNQzR_iaTi2GYPtISOTDs{Ux9@^)DvMl{T1 z`J=mx^em@OseW|^nbQhj`gw=BH&iUBWv}H}d3agc84L0Pt%#+WJXL)+Jvc<)l zn+LR6mUZ3t&l*+1-QAfJ_C_0!ZZwQ*?Kyo%`~2lER(70v_{E&Fsb^lo*pq$VFiyG+ zdIqe-1XLQgCQ7r4cjWKK)jR8S+8pT|!YRJkbNMAKlL>m(=al|78Nf5amHIrw%_&rar$>+WCNZ#<+Ww;5k8{fFADrE^UANt~(}vU#RbYJ0&}@H}+n%T5 znW~wpam@+MIxT%x#K!F667J?9FN=zj_{_+(OB0LPy)Rx3Cjb?`4R7NrV*?vcS Hmah3X_W@fx literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_crimson/textures/crimson_stem_stripped_side.png b/mods/ITEMS/mcl_crimson/textures/crimson_stem_stripped_side.png new file mode 100644 index 0000000000000000000000000000000000000000..ad6a41a2ed679bb4aeba43bb934944d4abb9606c GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHV5AX?bjnyzp(=aO1G^$e9Z_zZE z*!$=*P%78c#W95AI&bem!6OPhN6dV<6y&%Lw6XEsVfgkf{_@Am&dLv$R^AAjB4Ype z`o|o}i+-+_)ohy=$^J@W(w+H=eFC==>%K1%SGZcDXO&F(u;dnRk(%v3?rmrDFDxrK pdv)Qp9e3V&OHB>0vv8L9#s2-OsL-oROdvNgc)I$ztaD0e0sukTN5237 literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_crimson/textures/crimson_stem_stripped_top.png b/mods/ITEMS/mcl_crimson/textures/crimson_stem_stripped_top.png new file mode 100644 index 0000000000000000000000000000000000000000..313ae0f5aa60001f2f59a41a8d5eb4773f5145c5 GIT binary patch literal 6699 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 literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_crimson/textures/farming_warped_fungus.png b/mods/ITEMS/mcl_crimson/textures/farming_warped_fungus.png new file mode 100644 index 0000000000000000000000000000000000000000..5b465b6d19bc7968fdde59d78f16954fba229f9c GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`#hxyXAr`&K2@%<6-NVl_?v+v*Jvf zhr`GJ1xx?`KRi`HYC>VE86UI9!6OZCjg0>HXJ!a2myottw(w*9?jD|>Y&^W;3=FO+ WbyseRs4D`kXYh3Ob6Mw<&;$UW{6pdZ literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_crimson/textures/nether_sprouts.png b/mods/ITEMS/mcl_crimson/textures/nether_sprouts.png new file mode 100644 index 0000000000000000000000000000000000000000..27f686d57abe78eff98911a4147a6c96300d9efb GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgf#HWmSP-SF8z7=c2&JY5_^EKa|j zV90mKfXB67TjkgjzcaBnid+2FgtC3}lWE**{zCVLu|dE}p{~_#8o@JUR0Z6`j?CA2 z{k!(|f%yF^_Q^JfIsf2tS*`fx?ToLlg&K4mJsL$8T@`2%v6xd9DtKXg@)G&;zquG% zL~a^HR&jSTs1<9?4!wL-S7J_Es=9%TY3vUBbsOhjlR0qj*X7G6&NDP*8Y$n#D zYTq@*Mwg8tA#ZvPciYlid!+7^u`*cfKlHO`?kmo3FPkphId|S4=nDoVl&|0005}NklvZ_zECO)P@L6&|0Me#Binvcq5)7;eM;HM!&0|A%$gHj{ zyi+<247Va`9TkcV_oV{$rKxIs*8{FGY70v1?jzto=%tp`n65AUA#U>_ZkMh~J2dPS zY#$9uqgv9vpy~m);nrioipwui>-U9S|F3*Zgn<75Vu#pVTts8x00000NkvXXu0mjf DY6u5} literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_crimson/textures/shroomlight.png b/mods/ITEMS/mcl_crimson/textures/shroomlight.png new file mode 100644 index 0000000000000000000000000000000000000000..8961a5a0562b5533ac3653547e30ac264c38d595 GIT binary patch literal 428 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 literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_crimson/textures/stripped_crimson_stem_side.png b/mods/ITEMS/mcl_crimson/textures/stripped_crimson_stem_side.png new file mode 100644 index 0000000000000000000000000000000000000000..ad6a41a2ed679bb4aeba43bb934944d4abb9606c GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHV5AX?bjnyzp(=aO1G^$e9Z_zZE z*!$=*P%78c#W95AI&bem!6OPhN6dV<6y&%Lw6XEsVfgkf{_@Am&dLv$R^AAjB4Ype z`o|o}i+-+_)ohy=$^J@W(w+H=eFC==>%K1%SGZcDXO&F(u;dnRk(%v3?rmrDFDxrK pdv)Qp9e3V&OHB>0vv8L9#s2-OsL-oROdvNgc)I$ztaD0e0sukTN5237 literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_crimson/textures/stripped_crimson_stem_top.png b/mods/ITEMS/mcl_crimson/textures/stripped_crimson_stem_top.png new file mode 100644 index 0000000000000000000000000000000000000000..21696b098b5138b428e35702de9a589d34010c68 GIT binary patch literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa4)6(aP17(c(ln}4*Kg4@=(BZM z>g2k|-Tg+4_lxS#?*=d9fXdoET^vI=uJfKTsO-HHwJNC*h4-GEOi&M* zIG5XMVd$b1v(Q$qhsWXJ8P3q c&DP|rudmSwXID!#0Xm7n)78&qol`;+0JS7o0{{R3 literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_crimson/textures/stripped_warped_stem.png b/mods/ITEMS/mcl_crimson/textures/stripped_warped_stem.png new file mode 100644 index 0000000000000000000000000000000000000000..88a7a8d336829ed45885abbc68ca78d39bd2e208 GIT binary patch literal 6600 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 Oi{bbNvk!W&Nd6a;zRP?7 literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_crimson/textures/stripped_warped_stem_side.png b/mods/ITEMS/mcl_crimson/textures/stripped_warped_stem_side.png new file mode 100644 index 0000000000000000000000000000000000000000..db93c05cb449ae364df6f0653b72382c070aa62d GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^3h)VWwJ`THv-GjD337CZa&=1d zaZ6wQ&%zrhTj=TH7{YO#_v}H@!wNhs7jqe{H4j{SoTqZx!GTvH_y5|K+jIUs@cz7E zp+#`b-u-RKr=&|`f2_ILT)9y1SAy7;lvV4QZYo}BvbK$T)hd*id8wdH{i@lCd0%#v x-!Qqqp!DI3#g1!>cD$V)qV@LRLAgT}|6&qk```DsaR4o6@O1TaS?83{1OR&;P*wl{ literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_crimson/textures/stripped_warped_stem_top.png b/mods/ITEMS/mcl_crimson/textures/stripped_warped_stem_top.png new file mode 100644 index 0000000000000000000000000000000000000000..4a8f14800e6a14771a73a98efe5712a89a97963e GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv4DbnYwKVs(vkGvvi*U7%4suBi zaw`aS%a8S~$qAX56VX!_yDn|g>NcR_PEQxd5RU7-XKeYJ97J3np609g$D*sKwuy1+ zwXV31*9^(;Qmjm#?LDKnCM{*^rMb_nPb|3;v-Ff=w%V@s3v4b+)HNwjp7~W@L~-IR z{~Kqkl1rFh9huy3w!rjP%6z`H#`(YAZ74n6R_OBZar2zzt=Wt7I-_DYEKp8yJoTGv l)BMYuC0Qa>+qfDgK$+wA`K~TU6lJFKcxz7=6U)!c7K@ag9?rI1Va*BFNWn0+@H3mrVj}OHTEjd! z_Tki%&CcqN_k0oi!dI$w>)R#n_qBER?d^YrA1^-C{9ooR^T#;_+BVF0V(s(i8cBTr z7HlB#J)64%Dok43 z6m(9ZYv~8(aF>ls60{g{XKw3D>XbRhka6|4)mathk~sPBB|jUr@7eG65q7P=a+E)2 zV}OpB)<3Ne%+rhZP5P<-jAxqjJe4kuY1(2(qGD(M|CeF6cZTr>A8CcH+jp{_=j=@C zl;4q5dB`Nt#M)Hw=p@fYW!EFlg|i%ZdbHPX`Tp8H9LsMdOw!mm?=qLdTg$KYAGD@F zYs|EqQ3gb(zmbT^0P9NJ6;+w*3|NEQq#G-EI~_dUfxlw2jX$3<~`AoWO4$A OJcFmJpUXO@geCye48R5e literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_crimson/textures/twisting_vines_plant.png b/mods/ITEMS/mcl_crimson/textures/twisting_vines_plant.png new file mode 100644 index 0000000000000000000000000000000000000000..3fd68c0cd1c2a66f0318b5808841ef8ad06a3822 GIT binary patch literal 581 zcmV-L0=oT)P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01m?d01m?e$8V@)00007bV*G`2jmA0 z5i=)E&hF&^00G5GL_t(I%XO1KXxl&-#eWw9s!?JGgHQXAY&a-22O^3Iil*!0yI%a~n9SS=Aio}vbb8v1a1>GIsRCj+>WVB+#8Rt`B5FTWJk0}6PtGwK_}-ov zj=F~B<`MeoSQnMF2Y()?7T|689zRsvPo%wX9B~=oLVj19JIXPg^>RMrsUZ$ TSSkz|00000NkvXXu0mjfd4&5z literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_crimson/textures/warped_hyphae.png b/mods/ITEMS/mcl_crimson/textures/warped_hyphae.png new file mode 100644 index 0000000000000000000000000000000000000000..08dacdf585500551028b08e6af285c527f82a8c6 GIT binary patch literal 6259 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 V!A(Kt%_aZ<002ovPDHLkV1hi@&piMD literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_crimson/textures/warped_hyphae_wood.png b/mods/ITEMS/mcl_crimson/textures/warped_hyphae_wood.png new file mode 100644 index 0000000000000000000000000000000000000000..319ce93f29198348a1e8bcb8d70abeec7164780a GIT binary patch literal 461 zcmV;;0W$uHP)7s=)rK?cLK3QhbH|VBsk{1n3 zH{+j;$6*j72aLKfS0hi`143~Bq;qs+e*Jjy-O#hi3lbw-V)E|4@!#z$DZnN#=!PDE zlk1T@!?+cjya>gb*I4TsB+s~t6PvtXEd`}ip-7jP5g-gIrNRvs^Yrl3zfW%fTqm~x zyiadfdjufMZUC_MNS56!;?^EXKb2odjIclLxLbc-@Vt!0RJ@FA?=Y=rvo5h?zfLV=6apnE;LYR{<0?h zzI_VstQ^-AeEay}ueXmec}MG-*$4HZ4%~ECJrt^o?f`DEq=}IQ_n6;Vi{%iQebDC3 zQiFf_AkL{@;#~Uh^_l%?M=8}p3z(f4`#^mW|Btjj)EHJEXJNwCg)m%Wlbp>2aHYIk z*U$|;rBn+eX>&L9q0Y+~mbu?P`q=N6dc>NQL70(Y)*K0-AbW|YuPgf#c76d4lQ_;t`+=qydAc};Se&k% zyw~rrfk>;pO1R(+&&Z%vMpIiG1v}jnk{)?h_)2ISPFXlpLzAuZS^5Tv1dq9QRD92+ z+?D@*r+A&e-23_e7)la8%wRK2zF{3bU)159&Q6YHDhw^{-6`w1Sqo(EGbX5QzBs-6 zzW=t!OG&GX(j#v_YpvX(a(2?MH^*;UM;}*JHtnA_WgSC;psqIWqaDYO`J~0nl4iKq zef=5J{X3~fEdd;Bn1eGFgp2Gr{|9V$ds}Db8yG2?nOn6n`NFLQ=ll)_o{EyzJGZ_q zcTcR%6|s}5o|~6EJv8CytGB;*rgrChd1}NuzT_%Nh%)oKJB80jw<~`JTcLNZenLgc z(W!TSzmxw^ZOFEDoBrMhe=h70owBsFNaShv((_BTPt0|FmJ-*u$ZYr31<${|UYwpO a{y!nV%a^(H;U!>zGI+ZBxvXPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^Rf1O*l?5=duJqW}N_JV``BR5;6R zQ!9?cFc5ufMKZ__S*pTc6SeK#|qP1hubitwH*MIB7V1H#eS@a;tR>$JxYzys01PN zcB}w^TfS3i5RZ`in%+8`k}j-4v9-3tXdOW}OF%dh0IZtg|tnz+x?v{^JJ=f53a& UQ((#!9smFU07*qoM6N<$f??*b=l}o! literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_crimson/textures/warped_nylium_side.png b/mods/ITEMS/mcl_crimson/textures/warped_nylium_side.png new file mode 100644 index 0000000000000000000000000000000000000000..70354cca043ed2a1f3fa887ee1c7e5ff97dff9ff GIT binary patch literal 402 zcmV;D0d4+?P)neg0 zoqmG{h_Q2&v2zxyDTz+$b^9z8#1_8gZIxyS~&&jz_a z!AxuK>e!@Be38@B8~`Zwm-B#pJpU0x_D-PjBL$E&cCoh?zx62**(KjK#v~&ASm;4T wlJ`DL0FiaLKNHc-XUbNQaIVzlsndSb7Xm1U&V+QnFaQ7m07*qoM6N<$f(37_UjP6A literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_crimson/textures/warped_roots.png b/mods/ITEMS/mcl_crimson/textures/warped_roots.png new file mode 100644 index 0000000000000000000000000000000000000000..fb21ab29053c19e277b9dec691fc5b0d21eb0523 GIT binary patch literal 462 zcmV;<0WtoGP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2jmA0 z5h*BbTnVoL00B-(L_t(I%e9ifYQj(y#=jd1p-7fO$W+%pK?^Q*sXloWgP|muZijHf%^!7Yrf}~0&hLERy}*Be!`@Wd16Q6q z*Di@W?XkSOy+_RwI5*_tfG`p8_71ooqh^Wg>)HcX4tvuasnzUDvQnjCs+j)2j~{TC z6V_>uB>=d~3A>s>%@PPA4sY*dhpNyXxRqgM1Gpb!wiq#0NE-k^5b??!N~^V+ec7mY zb5^MSU_Jpr1_FSa;((XOXZ#*hVwmKKTd~1vJ!d5gsz2_>@b*rQ0sw|?!qCl99@^XM zyCjda9yO}hs0OO$p%L+L+GVdVOwyM}S*T$Gz~Qt5_v3WHY%yZ1^_-DkA`zug?`AdX z2@{c7)Kr2>+KLT6zkU!zJXbIFvZ7Z*H%sYP)#*0=0Et<`;#UePasU7T07*qoM6N<$ Ef`Y`q;Q#;t literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_crimson/textures/warped_stem_stripped_side.png b/mods/ITEMS/mcl_crimson/textures/warped_stem_stripped_side.png new file mode 100644 index 0000000000000000000000000000000000000000..db93c05cb449ae364df6f0653b72382c070aa62d GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^3h)VWwJ`THv-GjD337CZa&=1d zaZ6wQ&%zrhTj=TH7{YO#_v}H@!wNhs7jqe{H4j{SoTqZx!GTvH_y5|K+jIUs@cz7E zp+#`b-u-RKr=&|`f2_ILT)9y1SAy7;lvV4QZYo}BvbK$T)hd*id8wdH{i@lCd0%#v x-!Qqqp!DI3#g1!>cD$V)qV@LRLAgT}|6&qk```DsaR4o6@O1TaS?83{1OR&;P*wl{ literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_crimson/textures/warped_stem_stripped_top.png b/mods/ITEMS/mcl_crimson/textures/warped_stem_stripped_top.png new file mode 100644 index 0000000000000000000000000000000000000000..2e2c35b7c460d17b630b75758b5ca853c8f301f4 GIT binary patch literal 7039 zcmeHLcU)81wvHkoMFA-THbRi9C%w}`fuvi{a{R{C#_xnvKjnHQ89)yBtOrlkI) zWnHvkYU5C97riZg;CIWoZVzPBnnd6I*ZNWC39B1vt0M9@?73+7@PbBLw<~&qi;Gdo zCixlPeZf2Oj~np`nh|yz+JWAQ@6PKSYC0|OR}6cu=DWzvt(r$_E#qt4i?$!$T~@u6 zPngp3!N=W4KJnfGGsE-82cB;hFVNq7hWtx*$iviz-d4R=nzpy-oRu+0Nu9ckJ0USI%cmMiSEsGoMtg5b;Cwtz#oa8vK z@}90d?FzQ@7bD*ZJG@i0y&@St*>+W)`wzd0*xmp;+!*$QF~d6zX3=gQ*`RhY-|Q?{ zS!@wfXEOa=N@=)tZS6XAu)(&#gNZ%IM!JRq1EX?Zd2aPTvSR1cImu?T%7<&`!Q6%Y z^%=0f?xEhZk?;tgU1n3gvkKEV{OIC-U%kBq>m_A4pnhio%;M*JCbgS2Cbq48`^Y!G zz|r7geWi`N!CWC@;v`Oq{qZ2Pl3A5*wJXF&UgDqF7Z;imbX>!pmucdCQ7gcJo0aBb z)0t_ZOW7qc*O#8Y?0qmd`Z}dM9JQ)7N_^o>(+|zggY~L;SE)WLaRa+9Bsw^N!;k?@AKmDW$V;@Iu`Q z(f18t`$Fpcux9%`*B@nDC%K1)sm~Q^9t`l&oxFQ~1Ce?&yguQ9b^4J1*+ZLhdRji1 z*QZXst5=`U^)_)y??L*GCA!J+)8Fo$zv*?M}@0Qct+X3c@x1L?PJ{Na2 z@!7JP*~F7-4OYDhQ_jYhx~(myAV!wCD!rN5TUwjqy3p^<@f7flb z-+94`L)Xe}T?QWi`1bLyT6^zqH4YApEnpoDAIjIp6js^s1WOj~X{j)?6J__7UnjpYs5SHQJlCjOg9bEc{d+Vo>CXPu z6zf2$!&zqRv@uklRKOp;N?f}HGn3VkPnk(yT+b7w*x0INzOR0CJe*?J&}-m;12uXT3s^qo>BRMr-(gS0AjpUtGPIYaIjJwbk#Zy$Yu7CW__LDq2MCLB#bAUFi!RS&Mt6 z;F`%g-RVYIv%6d`MULnagKJI=5YCg369Z?q9XOW1y*=^56HUUg*AoKTQx)@{hh*K~ zR(m{>m(cuFm^)ZHc;QLY)#HuuQ}ce`wkmhW2;|dCs!9Cv+PNzHo(Fq#>+tTo#6%V)&$4h>#xsKZ~rMxI#F)H5)+Vq77^#CR?cv%ZaVy0EW+{xG$Ya-MAG1lzG}-u8(nv9fx#xE@I5>NXdWIP z2Q@UFa}u^V`Bu5ktXUphU~g=olSbwgA(!YI8`vCT8O+;u+P!$H_0CmpnJIH>Y62wy zd9XArMiPDf+T{@aNiME;?&KJSAE+KFSZ9KnJ#(Pz?!~&h4z5KeS&^qVsU7B;z4Q(9 zD_G=pe=fCk%!)gy=s{LW_A@{>g z+TB1?Wa*XZ1CLOzd1c!t-QZ8PNVM`aNSbU08U-Y;(=VBBXZ^6uJocp?b=b6=BQ>t9 zFI_W@;hSOpUT;-g6xYV)DQy_tGR(SdUbRO2T~UbO-MgEoqiog;n4N9gJsf1bYiQ2J zwvI#}*Jh$5`fkS~rw39^Q$?GVhjb2#Zjr5iuem3?&GkOeaw@d1r1YnDO*kzaxDV4@ zU+J51;zszryRElwSMa8P_yAMmNIPvc5jil}GzuR&I>YFGRJK@%WOBqT5UCJKpraKA zb97NinCvJ}4rhTpzQ_sDcfJAv=X0D8iwJZyUE%>o@O|T@U~v3G20K2AP2nJ1oV6Vl zRER(b%9(J5P#}^~6;22hFBST&Tt*?_Du_JF2@ysQfP09gARLdxBhi4Df**@TIBUZl zr5r9b$kTg_0=jZSM9Ae5Dhd@B7l(|)A;nT23PYh#P-rX)iv=JAAX_PtGZlbHW~rnY ze%AM=5;6vK2ZIU%W#Skq z8}y0=MRLpWN+p6A*?65XGEljsvRlC6q9CJGn#ard(C7i5WRzj#@r4qVgc3a-$zgxO zNn)e|6^6q`fdWtn86tz2F<;>2eD3E2ec_LC=MRQJ>OS#*f&LgTl`X2cQa#1&7^PC0 zrxQYHFO?%^^Ep)2PcjBWAQCw&fWk%N0X&{U1}GE|1h7~OEL5?Z~P#j0M*bz(-4}|9JShIax=l@9|b17I37X+aiCbDq=o=n04Q1wy(G!YGL z;fVwc8uul;Ow5(XF{Pjz52^tu&roxz@(i~ft3SIh@o^ELvbfM#G=M=vLy&>NQ*i_; z27?&Q_E`4+9`|r;7Kwx*5dn}*AOd&{mI#nZTs8o;JCjIYVWCklTECxy_kVT|1E8U> z;TaeLl|Z6Gb^l**k40p0aU>E2;Ii;g_RttSKtU6k0G>l2vdAQmOlFRD`hU-d)PN$Ai+~d%HYRmgCd#uuS_2g84b(0yClfw(KYDq3%Z#@eY%?)8(~lZ{++L} z(fD_&fWyBj`KtJS3)i=BeN_a$3jD3QzJ=?nBJfqF>@tYKJY z(hR?jd~WXS-?lt1Q`3lgeXr;04F2o>x6Ln$2-7xUZ2KlCD*Ps(Mds2?7?^FJ*{rEO zyWU50>rdLjHcA_Rw@*5kvhjd=m`-o<!K&LA_TD^m!k$$l+Waa1 zz*jt7+i%8jkQ}v{&v0NYPC<}X=e4#i{V_4we!=cJTbJLcO6Ut*UVjY{toC48 z{m2N$JFg;i-aTr0ZvTxpdmOX3+GuT*I`m`>rC$hBlk|&k+iz~POwe|v+%R#DUhZ9z zMklSinbV~6c$v%3!F~c3+pnTEH~kbId+QpzB5$EaW@NgXUEgBoBPrN+tpkP~PfH0$ zj@~{Nrs=V>rZB`l2Q20LZ(ZrbZ6H5JsGk@}e?+NkW<2_37G-tGrGyvztJeCrajH1d T^+{z=s$ev)g`P*#0p5<(aQL_i{-qEhuFIe}m%G63PK<)I>|C{vXp zSP(_aB#5(61VQ0~SgSZ7QxO40M4X_a@=gLOzT4OP{QchjPxvKd@BOWBt^Mt_*3Kb; zwZhXtZ=N0kfiPftx%pC)orWuVbGSRt4Ehm=qdS^wqJVp=a!lkR*&fcq?vvNE}Gp_8&^IU8yk2s z+pIdbP`@j8c;5a*JO66;S5f|hiDxT*#=cE2zuCMFnKZ|8|C*uHvF!Qpm((w6Y-J{; zT}bMfeI)C}BUGqu7jHV~e>|J4g-g^TXdMk-HjumH<@6VJSEDoCulk+Y=XS7SM{tKQ zW;lOpa)O;*;mw)1fS6Ig@G$+p1j{)F4vnPsuMDT`S}dtc{rOeBt%3nvZ=Cj4%jC`W zV&|yHyp0bn+s=pd7Ch@pD(pz5h&*P2dZP#O`F3H*z|Fm&$(Jar_|Kb7Ey_RU769I@|%{IfU zbF`S~90s>OFB&;^xk`KX79AJY@0dY_hx> zi6kM<%~}{CJJeCVWPR)J`&bW@=Po^XZx(U?;o(_f9tJ_;fg39c)52~ihwTM(;)*O5 zpnR5E6@%I}b@PyB^QP#8hNbgycT&QBBQ?qwad%nI= zm)PbpGUK%DhDv&=UDj>vx(w929(LjTP(z(jKTq+Y-tdAq#VZCMH?F)|E?D4A3M;3i zrQjK%&g3*@OBQZNfyKG^rgP}2C{g;u3<%xfBo@GakamQj+ieVdx}u#{^qp*265@sF-;-tNAfknGv~Ja^HUMPpxVlJrG9)%^9$F^j>| zgJ*rOZ!KW|iF>g2?DOusR+g#rFT{LC@YJI$8xB% zC|X?x%U^F_Z`N97xMleQ*PZ2B4jukEZLPGK=Wq9C0ip7GqFr%l%>fD5nmGl+|9F#BRRS5@t=&ELMKtk|$P z7CEBP)!lcr54HFM*5-8lQ0IB`!Do)o+BIBrs{_k6PhpW7ylOdYyK}a0%26@XcXWFG zT;t=IyrJ>3Y)jjfYj-bM-*`bE?$xnTrfSfWqxLZ zebPvB|EUIX<{m?R8bQGIe^~>vOYc=lrIQSe% zX>`6-L;GiWebRz@zW{5Km|?=(yaj+nU-M3D`?^u`Rs{Zb^9uusL}#z5%|F^6wpC;1y;QXgi$6RzQclieW)C<5Cd|>YzPx2l)!f!0zq?%l7O7ekQ~W| zLii#_)ZnE`6q3(%M6DtD0=^PAD3tFNErkN2R|ImRH*+XlloMT#7Da^#gpeFWMhOKX z88ylgrRJr=pH-))CB%4qX))N~AO0YN#fE5bAu#m|a5ug42rG+dI{wjg>hh$=flmjs$Ad%d1vQvpb zA)D+|A%j#?>bM159u^Kt?Rm0|C)1bp$wnn(2wx~sTd2^JkzCFvoJ1iNs4-j)77{>0 zI1m}kjQavF=kq=v&=>nrt^7+Mu)9zEU!XtgrH)0dE7e`hQK+0U-5pV?c&S`5htH*| zKjL{DE|2qlplii)P~}Y&3_=wa43Y>?i~tcM=s-B$I<84y2-j$uWGGhkys! z1QOmJO$I=FG!aJt&}0f|hbEB7cp@1G@Yn!;5`~|X4_5*xm>iXgiVIVLJQ5KkQ7C8# z0B~p`o5Vr0c{~V>1MP@_J;9D(j|0?Hs&k;au$Yc0JZ91iO90AwVyO@=FTRK?j+A`{ z2l9nbfE-lGhO+|*6f%IP*pmQ&VsG~uv>KAi;51jU;s6YOJZvt9>H%|taJun@UKiu#bSXYN);_qMX4?-ByFNxs6Jwj+E5LK zxT=bqs5w_K1gjp>uzv^s7p8zvair+~#`78aiN!@Kj}%Kc`$_%SVGu|D_dI_E{>0=D zcRQI}s$~9~P5loXZ9HMUU|X?NImv$j6h1y0Z%G2aS}G(`-3F*2XIy?67y*rEE3D)A z5+@WCg+Oq>ohY`C^ZdU^WB^WLo*mB~4RApSO{8!jG?~b;Lvx923WrM~Ks+|6KHyL6 zGBHmc2}&WC5I6_mbB2pcea=YhiTtzq5+4}~sgeu8185uoH^D$0i3$*@Bzx5OX(MS^ zRfqk!Tbil|`T9~P>p@fXC@NExhyeRaR{deY*VdK_rVu=#2 z;!wF?r08$m{{?WI!H3U*L^AQ;g+3WFF3Y5g2#$Gt4!+>v`x5){As!houoESJN*J6vtbzNP4eX##%1Xo1HG-cry0NAsVwY_IPxOMves| zC8^H8bQkd8eqZo`tf%F}J=c%oF8x5$&2gSyXN)LGyqisXgg`b~_CMRZ{g)qEhm9Wn z*_j<~2F^cOJ?o_JEaRC*`Lf=IT~%u)sa4h0g`SWUO#6cHI>F-(v)PF#rGn literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_doors/api_doors.lua b/mods/ITEMS/mcl_doors/api_doors.lua index 7d00c4c69..c2fc7c377 100644 --- a/mods/ITEMS/mcl_doors/api_doors.lua +++ b/mods/ITEMS/mcl_doors/api_doors.lua @@ -1,559 +1,559 @@ -local S = minetest.get_translator(minetest.get_current_modname()) -local minetest_get_meta = minetest.get_meta - --- This helper function calls on_place_node callbacks. -local function on_place_node(place_to, newnode, - placer, oldnode, itemstack, pointed_thing) - -- Run script hook - for _, callback in pairs(minetest.registered_on_placenodes) do - -- Deep-copy pos, node and pointed_thing because callback can modify them - local place_to_copy = {x = place_to.x, y = place_to.y, z = place_to.z} - local newnode_copy = - {name = newnode.name, param1 = newnode.param1, param2 = newnode.param2} - local oldnode_copy = - {name = oldnode.name, param1 = oldnode.param1, param2 = oldnode.param2} - local pointed_thing_copy = { - type = pointed_thing.type, - above = vector.new(pointed_thing.above), - under = vector.new(pointed_thing.under), - ref = pointed_thing.ref, - } - callback(place_to_copy, newnode_copy, placer, - oldnode_copy, itemstack, pointed_thing_copy) - end -end - --- Registers a door --- name: The name of the door --- def: a table with the folowing fields: --- description --- inventory_image --- groups --- tiles_bottom: the tiles of the bottom part of the door {front, side} --- tiles_top: the tiles of the bottom part of the door {front, side} --- If the following fields are not defined the default values are used --- node_box_bottom --- node_box_top --- selection_box_bottom --- selection_box_top --- only_placer_can_open: if true only the player who placed the door can --- open it --- only_redstone_can_open: if true, the door can only be opened by redstone, --- not by rightclicking it - -function mcl_doors:register_door(name, def) - def.groups.not_in_creative_inventory = 1 - def.groups.dig_by_piston = 1 - def.groups.door = 1 - def.groups.mesecon_ignore_opaque_dig = 1 - - if not def.sound_open then - def.sound_open = "doors_door_open" - end - if not def.sound_close then - def.sound_close = "doors_door_close" - end - - local box = {{-8/16, -8/16, -8/16, 8/16, 8/16, -5/16}} - - if not def.node_box_bottom then - def.node_box_bottom = box - end - if not def.node_box_top then - def.node_box_top = box - end - if not def.selection_box_bottom then - def.selection_box_bottom= box - end - if not def.selection_box_top then - def.selection_box_top = box - end - - local longdesc, usagehelp, tt_help - tt_help = def._tt_help - longdesc = def._doc_items_longdesc - if not longdesc then - if def.only_redstone_can_open then - longdesc = S("This door is a 2-block high barrier which can be opened or closed by hand or by redstone power.") - else - longdesc = S("This door is a 2-block high barrier which can only be opened by redstone power, not by hand.") - end - end - usagehelp = def._doc_items_usagehelp - if not usagehelp then - if def.only_redstone_can_open then - usagehelp = S("To open or close this door, send a redstone signal to its bottom half.") - else - usagehelp = S("To open or close this door, rightclick it or send a redstone signal to its bottom half.") - end - end - if not tt_help then - if def.only_redstone_can_open then - tt_help = S("Openable by redstone power") - else - tt_help = S("Openable by players and redstone power") - end - end - - local craftitem_groups = { mesecon_conductor_craftable = 1, deco_block = 1 } - if def.groups and def.groups.flammable then - craftitem_groups.flammable = def.groups.flammable - end - - minetest.register_craftitem(name, { - description = def.description, - _tt_help = tt_help, - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usagehelp, - inventory_image = def.inventory_image, - stack_max = 64, - groups = craftitem_groups, - on_place = function(itemstack, placer, pointed_thing) - if not pointed_thing.type == "node" or not placer or not placer:is_player() then - return itemstack - end - local pn = placer:get_player_name() - if minetest.is_protected(pointed_thing.above, pn) and minetest.is_protected(pointed_thing.under, pn) then - return itemstack - end - local ptu = pointed_thing.under - local nu = minetest.get_node(ptu) - -- Pointed thing's rightclick action takes precedence, unless player holds down the sneak key - if minetest.registered_nodes[nu.name] and minetest.registered_nodes[nu.name].on_rightclick and not placer:get_player_control().sneak then - return minetest.registered_nodes[nu.name].on_rightclick(ptu, nu, placer, itemstack) - end - - local pt - if minetest.registered_nodes[nu.name] and minetest.registered_nodes[nu.name].buildable_to then - pt = pointed_thing.under - else - pt = pointed_thing.above - end - local pt2 = {x=pt.x, y=pt.y, z=pt.z} - pt2.y = pt2.y+1 - local ptname = minetest.get_node(pt).name - local pt2name = minetest.get_node(pt2).name - if - (minetest.registered_nodes[ptname] and not minetest.registered_nodes[ptname].buildable_to) or - (minetest.registered_nodes[pt2name] and not minetest.registered_nodes[pt2name].buildable_to) - then - return itemstack - end - - -- get left coordinate for checking if another door is there - local pt_left = {x=pt.x, y=pt.y, z=pt.z} - local p2 = minetest.dir_to_facedir(placer:get_look_dir()) - - if p2 == 0 then - pt_left.x = pt_left.x-1 - elseif p2 == 1 then - pt_left.z = pt_left.z+1 - elseif p2 == 2 then - pt_left.x = pt_left.x+1 - elseif p2 == 3 then - pt_left.z = pt_left.z-1 - end - - local left_node = minetest.get_node(pt_left) - - -- Set door nodes - minetest.set_node(pt, {name=name.."_b_1", param2=p2}) - minetest.set_node(pt2, {name=name.."_t_1", param2=p2}) - - if def.sounds and def.sounds.place then - minetest.sound_play(def.sounds.place, {pos=pt}, true) - end - - if def.only_placer_can_open then - local meta = minetest_get_meta(pt) - meta:set_string("doors_owner", "") - meta = minetest_get_meta(pt2) - meta:set_string("doors_owner", "") - end - - local meta1 = minetest_get_meta(pt) - local meta2 = minetest_get_meta(pt2) - -- save mirror state for the correct door - if left_node.name:sub(1, #name) == name then - meta1:set_int("is_mirrored", 1) - meta2:set_int("is_mirrored", 1) - end - - -- Save open state. 1 = open. 0 = closed - meta1:set_int("is_open", 0) - meta2:set_int("is_open", 0) - - - if not minetest.is_creative_enabled(pn) then - itemstack:take_item() - end - - on_place_node(pt, minetest.get_node(pt), placer, nu, itemstack, pointed_thing) - on_place_node(pt2, minetest.get_node(pt2), placer, minetest.get_node({x=ptu.x,y=ptu.y+1,z=ptu.z}), itemstack, pointed_thing) - - return itemstack - end, - }) - - local tt = def.tiles_top - local tb = def.tiles_bottom - - local function on_open_close(pos, dir, check_name, replace, replace_dir) - local meta1 = minetest_get_meta(pos) - pos.y = pos.y+dir - local meta2 = minetest_get_meta(pos) - - -- if name of other door is not the same as check_name -> return - if not minetest.get_node(pos).name == check_name then - return - end - - -- swap directions if mirrored - local params = {3,0,1,2} - if meta1:get_int("is_open") == 0 and meta2:get_int("is_mirrored") == 0 or meta1:get_int("is_open") == 1 and meta2:get_int("is_mirrored") == 1 then - params = {1,2,3,0} - end - - local p2 = minetest.get_node(pos).param2 - local np2 = params[p2+1] - - minetest.swap_node(pos, {name=replace_dir, param2=np2}) - pos.y = pos.y-dir - minetest.swap_node(pos, {name=replace, param2=np2}) - - local door_switching_sound - if meta1:get_int("is_open") == 1 then - door_switching_sound = def.sound_close - meta1:set_int("is_open", 0) - meta2:set_int("is_open", 0) - else - door_switching_sound = def.sound_open - meta1:set_int("is_open", 1) - meta2:set_int("is_open", 1) - end - minetest.sound_play(door_switching_sound, {pos = pos, gain = 0.5, max_hear_distance = 16}, true) - end - - local function on_mesecons_signal_open(pos, node) - on_open_close(pos, 1, name.."_t_1", name.."_b_2", name.."_t_2") - end - local function on_mesecons_signal_close(pos, node) - if not mesecon.is_powered({x=pos.x,y=pos.y+1,z=pos.z}) then - on_open_close(pos, 1, name.."_t_2", name.."_b_1", name.."_t_1") - end - end - local function on_mesecons_signal_open_top(pos, node) - on_mesecons_signal_open({x=pos.x, y=pos.y-1, z=pos.z}, node) - end - local function on_mesecons_signal_close_top(pos, node) - if not mesecon.is_powered({x=pos.x,y=pos.y-1,z=pos.z}) then - on_mesecons_signal_close({x=pos.x, y=pos.y-1, z=pos.z}, node) - end - end - - local function check_player_priv(pos, player) - if not def.only_placer_can_open then - return true - end - local meta = minetest_get_meta(pos) - local pn = player:get_player_name() - return meta:get_string("doors_owner") == pn - end - - local on_rightclick - -- Disable on_rightclick if this is a redstone-only door - if not def.only_redstone_can_open then - on_rightclick = function(pos, node, clicker) - if check_player_priv(pos, clicker) then - on_open_close(pos, 1, name.."_t_1", name.."_b_2", name.."_t_2") - end - end - end - - minetest.register_node(name.."_b_1", { - tiles = {"blank.png", tt[2].."^[transformFXR90", tb[2], tb[2].."^[transformFX", tb[1], tb[1].."^[transformFX"}, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, - paramtype = "light", - paramtype2 = "facedir", - sunlight_propagates = true, - is_ground_content = false, - drop = "", - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = def.node_box_bottom - }, - selection_box = { - type = "fixed", - fixed = def.selection_box_bottom - }, - groups = def.groups, - _mcl_hardness = def._mcl_hardness, - _mcl_blast_resistance = def._mcl_blast_resistance, - sounds = def.sounds, - - after_destruct = function(bottom, oldnode) - local meta_bottom = minetest_get_meta(bottom) - if meta_bottom:get_int("rotation") == 1 then - meta_bottom:set_int("rotation", 0) - else - minetest.add_item(bottom, name) - local top = { x = bottom.x, y = bottom.y + 1, z = bottom.z } - if minetest.get_node(bottom).name ~= name.."_b_2" and minetest.get_node(top).name == name.."_t_1" then - minetest.remove_node(top) - end - end - end, - - on_rightclick = on_rightclick, - - mesecons = { effector = { - action_on = on_mesecons_signal_open, - }}, - - on_rotate = function(bottom, node, user, mode, param2) - if mode == screwdriver.ROTATE_FACE then - local meta_bottom = minetest_get_meta(bottom) - meta_bottom:set_int("rotation", 1) - node.param2 = screwdriver.rotate.facedir(bottom, node, mode) - minetest.swap_node(bottom, node) - - local top = {x=bottom.x,y=bottom.y+1,z=bottom.z} - local meta_top = minetest_get_meta(top) - meta_top:set_int("rotation", 1) - node.name = name .."_t_1" - minetest.swap_node(top, node) - - return true - end - return false - end, - - can_dig = check_player_priv, - }) - - if def.only_redstone_can_open then - on_rightclick = nil - else - on_rightclick = function(pos, node, clicker) - if check_player_priv(pos, clicker) then - on_open_close(pos, -1, name.."_b_1", name.."_t_2", name.."_b_2") - end - end - end - - minetest.register_node(name.."_t_1", { - tiles = {tt[2].."^[transformR90", "blank.png", tt[2], tt[2].."^[transformFX", tt[1], tt[1].."^[transformFX"}, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, - paramtype = "light", - paramtype2 = "facedir", - sunlight_propagates = true, - is_ground_content = false, - drop = "", - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = def.node_box_top - }, - selection_box = { - type = "fixed", - fixed = def.selection_box_top - }, - groups = def.groups, - _mcl_hardness = def._mcl_hardness, - _mcl_blast_resistance = def._mcl_blast_resistance, - sounds = def.sounds, - - after_destruct = function(top, oldnode) - local meta_top = minetest_get_meta(top) - if meta_top:get_int("rotation") == 1 then - meta_top:set_int("rotation", 0) - else - local bottom = { x = top.x, y = top.y - 1, z = top.z } - if minetest.get_node(top).name ~= name.."_t_2" and minetest.get_node(bottom).name == name.."_b_1" and oldnode.name == name.."_t_1" then - minetest.dig_node(bottom) - end - end - end, - - on_rightclick = on_rightclick, - - mesecons = { effector = { - action_on = on_mesecons_signal_open_top, - rules = mesecon.rules.flat, - }}, - - on_rotate = function(top, node, user, mode, param2) - if mode == screwdriver.ROTATE_FACE then - local meta_top = minetest_get_meta(top) - meta_top:set_int("rotation", 1) - node.param2 = screwdriver.rotate.facedir(top, node, mode) - minetest.swap_node(top, node) - - local bottom = {x=top.x,y=top.y-1,z=top.z} - local meta_bottom = minetest_get_meta(bottom) - meta_bottom:set_int("rotation", 1) - node.name = name .."_b_1" - minetest.swap_node(bottom, node) - - return true - end - return false - end, - - can_dig = check_player_priv, - }) - - if def.only_redstone_can_open then - on_rightclick = nil - else - on_rightclick = function(pos, node, clicker) - if check_player_priv(pos, clicker) then - on_open_close(pos, 1, name.."_t_2", name.."_b_1", name.."_t_1") - end - end - end - - minetest.register_node(name.."_b_2", { - tiles = {"blank.png", tt[2].."^[transformFXR90", tb[2].."^[transformI", tb[2].."^[transformFX", tb[1].."^[transformFX", tb[1]}, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, - paramtype = "light", - paramtype2 = "facedir", - sunlight_propagates = true, - is_ground_content = false, - drop = "", - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = def.node_box_bottom - }, - selection_box = { - type = "fixed", - fixed = def.selection_box_bottom - }, - groups = def.groups, - _mcl_hardness = def._mcl_hardness, - _mcl_blast_resistance = def._mcl_blast_resistance, - sounds = def.sounds, - - after_destruct = function(bottom, oldnode) - local meta_bottom = minetest_get_meta(bottom) - if meta_bottom:get_int("rotation") == 1 then - meta_bottom:set_int("rotation", 0) - else - local top = { x = bottom.x, y = bottom.y + 1, z = bottom.z } - minetest.add_item(bottom, name) - if minetest.get_node(bottom).name ~= name.."_b_1" and minetest.get_node(top).name == name.."_t_2" then - minetest.remove_node(top) - end - end - end, - - on_rightclick = on_rightclick, - - mesecons = { effector = { - action_off = on_mesecons_signal_close, - }}, - - on_rotate = function(bottom, node, user, mode, param2) - if mode == screwdriver.ROTATE_FACE then - local meta_bottom = minetest_get_meta(bottom) - meta_bottom:set_int("rotation", 1) - node.param2 = screwdriver.rotate.facedir(bottom, node, mode) - minetest.swap_node(bottom, node) - - local top = {x=bottom.x,y=bottom.y+1,z=bottom.z} - local meta_top = minetest_get_meta(top) - meta_top:set_int("rotation", 1) - node.name = name .."_t_2" - minetest.swap_node(top, node) - - return true - end - return false - end, - - can_dig = check_player_priv, - }) - - if def.only_redstone_can_open then - on_rightclick = nil - else - on_rightclick = function(pos, node, clicker) - if check_player_priv(pos, clicker) then - on_open_close(pos, -1, name.."_b_2", name.."_t_1", name.."_b_1") - end - end - end - - minetest.register_node(name.."_t_2", { - tiles = {tt[2].."^[transformR90", "blank.png", tt[2].."^[transformI", tt[2].."^[transformFX", tt[1].."^[transformFX", tt[1]}, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, - paramtype = "light", - paramtype2 = "facedir", - sunlight_propagates = true, - is_ground_content = false, - drop = "", - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = def.node_box_top - }, - selection_box = { - type = "fixed", - fixed = def.selection_box_top - }, - groups = def.groups, - _mcl_hardness = def._mcl_hardness, - _mcl_blast_resistance = def._mcl_blast_resistance, - sounds = def.sounds, - - after_destruct = function(top, oldnode) - local meta_top = minetest_get_meta(top) - if meta_top:get_int("rotation") == 1 then - meta_top:set_int("rotation", 0) - else - local bottom = { x = top.x, y = top.y - 1, z = top.z } - if minetest.get_node(top).name ~= name.."_t_1" and minetest.get_node(bottom).name == name.."_b_2" and oldnode.name == name.."_t_2" then - minetest.dig_node(bottom) - end - end - end, - - on_rightclick = on_rightclick, - - mesecons = { effector = { - action_off = on_mesecons_signal_close_top, - rules = mesecon.rules.flat, - }}, - - on_rotate = function(top, node, user, mode, param2) - if mode == screwdriver.ROTATE_FACE then - local meta_top = minetest_get_meta(top) - meta_top:set_int("rotation", 1) - node.param2 = screwdriver.rotate.facedir(top, node, mode) - minetest.swap_node(top, node) - - local bottom = {x=top.x,y=top.y-1,z=top.z} - local meta_bottom = minetest_get_meta(bottom) - meta_bottom:set_int("rotation", 1) - node.name = name .."_b_2" - minetest.swap_node(bottom, node) - - return true - end - return false - end, - - can_dig = check_player_priv, - }) - - -- Add entry aliases for the Help - if minetest.get_modpath("doc") then - doc.add_entry_alias("craftitems", name, "nodes", name.."_b_1") - doc.add_entry_alias("craftitems", name, "nodes", name.."_b_2") - doc.add_entry_alias("craftitems", name, "nodes", name.."_t_1") - doc.add_entry_alias("craftitems", name, "nodes", name.."_t_2") - end - -end +local S = minetest.get_translator(minetest.get_current_modname()) +local minetest_get_meta = minetest.get_meta + +-- This helper function calls on_place_node callbacks. +local function on_place_node(place_to, newnode, + placer, oldnode, itemstack, pointed_thing) + -- Run script hook + for _, callback in pairs(minetest.registered_on_placenodes) do + -- Deep-copy pos, node and pointed_thing because callback can modify them + local place_to_copy = {x = place_to.x, y = place_to.y, z = place_to.z} + local newnode_copy = + {name = newnode.name, param1 = newnode.param1, param2 = newnode.param2} + local oldnode_copy = + {name = oldnode.name, param1 = oldnode.param1, param2 = oldnode.param2} + local pointed_thing_copy = { + type = pointed_thing.type, + above = vector.new(pointed_thing.above), + under = vector.new(pointed_thing.under), + ref = pointed_thing.ref, + } + callback(place_to_copy, newnode_copy, placer, + oldnode_copy, itemstack, pointed_thing_copy) + end +end + +-- Registers a door +-- name: The name of the door +-- def: a table with the folowing fields: +-- description +-- inventory_image +-- groups +-- tiles_bottom: the tiles of the bottom part of the door {front, side} +-- tiles_top: the tiles of the bottom part of the door {front, side} +-- If the following fields are not defined the default values are used +-- node_box_bottom +-- node_box_top +-- selection_box_bottom +-- selection_box_top +-- only_placer_can_open: if true only the player who placed the door can +-- open it +-- only_redstone_can_open: if true, the door can only be opened by redstone, +-- not by rightclicking it + +function mcl_doors:register_door(name, def) + def.groups.not_in_creative_inventory = 1 + def.groups.dig_by_piston = 1 + def.groups.door = 1 + def.groups.mesecon_ignore_opaque_dig = 1 + + if not def.sound_open then + def.sound_open = "doors_door_open" + end + if not def.sound_close then + def.sound_close = "doors_door_close" + end + + local box = {{-8/16, -8/16, -8/16, 8/16, 8/16, -5/16}} + + if not def.node_box_bottom then + def.node_box_bottom = box + end + if not def.node_box_top then + def.node_box_top = box + end + if not def.selection_box_bottom then + def.selection_box_bottom= box + end + if not def.selection_box_top then + def.selection_box_top = box + end + + local longdesc, usagehelp, tt_help + tt_help = def._tt_help + longdesc = def._doc_items_longdesc + if not longdesc then + if def.only_redstone_can_open then + longdesc = S("This door is a 2-block high barrier which can be opened or closed by hand or by redstone power.") + else + longdesc = S("This door is a 2-block high barrier which can only be opened by redstone power, not by hand.") + end + end + usagehelp = def._doc_items_usagehelp + if not usagehelp then + if def.only_redstone_can_open then + usagehelp = S("To open or close this door, send a redstone signal to its bottom half.") + else + usagehelp = S("To open or close this door, rightclick it or send a redstone signal to its bottom half.") + end + end + if not tt_help then + if def.only_redstone_can_open then + tt_help = S("Openable by redstone power") + else + tt_help = S("Openable by players and redstone power") + end + end + + local craftitem_groups = { mesecon_conductor_craftable = 1, deco_block = 1 } + if def.groups and def.groups.flammable then + craftitem_groups.flammable = def.groups.flammable + end + + minetest.register_craftitem(name, { + description = def.description, + _tt_help = tt_help, + _doc_items_longdesc = longdesc, + _doc_items_usagehelp = usagehelp, + inventory_image = def.inventory_image, + stack_max = 64, + groups = craftitem_groups, + on_place = function(itemstack, placer, pointed_thing) + if not pointed_thing.type == "node" or not placer or not placer:is_player() then + return itemstack + end + local pn = placer:get_player_name() + if minetest.is_protected(pointed_thing.above, pn) and minetest.is_protected(pointed_thing.under, pn) then + return itemstack + end + local ptu = pointed_thing.under + local nu = minetest.get_node(ptu) + -- Pointed thing's rightclick action takes precedence, unless player holds down the sneak key + if minetest.registered_nodes[nu.name] and minetest.registered_nodes[nu.name].on_rightclick and not placer:get_player_control().sneak then + return minetest.registered_nodes[nu.name].on_rightclick(ptu, nu, placer, itemstack) + end + + local pt + if minetest.registered_nodes[nu.name] and minetest.registered_nodes[nu.name].buildable_to then + pt = pointed_thing.under + else + pt = pointed_thing.above + end + local pt2 = {x=pt.x, y=pt.y, z=pt.z} + pt2.y = pt2.y+1 + local ptname = minetest.get_node(pt).name + local pt2name = minetest.get_node(pt2).name + if + (minetest.registered_nodes[ptname] and not minetest.registered_nodes[ptname].buildable_to) or + (minetest.registered_nodes[pt2name] and not minetest.registered_nodes[pt2name].buildable_to) + then + return itemstack + end + + -- get left coordinate for checking if another door is there + local pt_left = {x=pt.x, y=pt.y, z=pt.z} + local p2 = minetest.dir_to_facedir(placer:get_look_dir()) + + if p2 == 0 then + pt_left.x = pt_left.x-1 + elseif p2 == 1 then + pt_left.z = pt_left.z+1 + elseif p2 == 2 then + pt_left.x = pt_left.x+1 + elseif p2 == 3 then + pt_left.z = pt_left.z-1 + end + + local left_node = minetest.get_node(pt_left) + + -- Set door nodes + minetest.set_node(pt, {name=name.."_b_1", param2=p2}) + minetest.set_node(pt2, {name=name.."_t_1", param2=p2}) + + if def.sounds and def.sounds.place then + minetest.sound_play(def.sounds.place, {pos=pt}, true) + end + + if def.only_placer_can_open then + local meta = minetest_get_meta(pt) + meta:set_string("doors_owner", "") + meta = minetest_get_meta(pt2) + meta:set_string("doors_owner", "") + end + + local meta1 = minetest_get_meta(pt) + local meta2 = minetest_get_meta(pt2) + -- save mirror state for the correct door + if left_node.name:sub(1, #name) == name then + meta1:set_int("is_mirrored", 1) + meta2:set_int("is_mirrored", 1) + end + + -- Save open state. 1 = open. 0 = closed + meta1:set_int("is_open", 0) + meta2:set_int("is_open", 0) + + + if not minetest.is_creative_enabled(pn) then + itemstack:take_item() + end + + on_place_node(pt, minetest.get_node(pt), placer, nu, itemstack, pointed_thing) + on_place_node(pt2, minetest.get_node(pt2), placer, minetest.get_node({x=ptu.x,y=ptu.y+1,z=ptu.z}), itemstack, pointed_thing) + + return itemstack + end, + }) + + local tt = def.tiles_top + local tb = def.tiles_bottom + + local function on_open_close(pos, dir, check_name, replace, replace_dir) + local meta1 = minetest_get_meta(pos) + pos.y = pos.y+dir + local meta2 = minetest_get_meta(pos) + + -- if name of other door is not the same as check_name -> return + if not minetest.get_node(pos).name == check_name then + return + end + + -- swap directions if mirrored + local params = {3,0,1,2} + if meta1:get_int("is_open") == 0 and meta2:get_int("is_mirrored") == 0 or meta1:get_int("is_open") == 1 and meta2:get_int("is_mirrored") == 1 then + params = {1,2,3,0} + end + + local p2 = minetest.get_node(pos).param2 + local np2 = params[p2+1] + + minetest.swap_node(pos, {name=replace_dir, param2=np2}) + pos.y = pos.y-dir + minetest.swap_node(pos, {name=replace, param2=np2}) + + local door_switching_sound + if meta1:get_int("is_open") == 1 then + door_switching_sound = def.sound_close + meta1:set_int("is_open", 0) + meta2:set_int("is_open", 0) + else + door_switching_sound = def.sound_open + meta1:set_int("is_open", 1) + meta2:set_int("is_open", 1) + end + minetest.sound_play(door_switching_sound, {pos = pos, gain = 0.5, max_hear_distance = 16}, true) + end + + local function on_mesecons_signal_open(pos, node) + on_open_close(pos, 1, name.."_t_1", name.."_b_2", name.."_t_2") + end + local function on_mesecons_signal_close(pos, node) + if not mesecon.is_powered({x=pos.x,y=pos.y+1,z=pos.z}) then + on_open_close(pos, 1, name.."_t_2", name.."_b_1", name.."_t_1") + end + end + local function on_mesecons_signal_open_top(pos, node) + on_mesecons_signal_open({x=pos.x, y=pos.y-1, z=pos.z}, node) + end + local function on_mesecons_signal_close_top(pos, node) + if not mesecon.is_powered({x=pos.x,y=pos.y-1,z=pos.z}) then + on_mesecons_signal_close({x=pos.x, y=pos.y-1, z=pos.z}, node) + end + end + + local function check_player_priv(pos, player) + if not def.only_placer_can_open then + return true + end + local meta = minetest_get_meta(pos) + local pn = player:get_player_name() + return meta:get_string("doors_owner") == pn + end + + local on_rightclick + -- Disable on_rightclick if this is a redstone-only door + if not def.only_redstone_can_open then + on_rightclick = function(pos, node, clicker) + if check_player_priv(pos, clicker) then + on_open_close(pos, 1, name.."_t_1", name.."_b_2", name.."_t_2") + end + end + end + + minetest.register_node(name.."_b_1", { + tiles = {"blank.png", tt[2].."^[transformFXR90", tb[2], tb[2].."^[transformFX", tb[1], tb[1].."^[transformFX"}, + use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + is_ground_content = false, + drop = "", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = def.node_box_bottom + }, + selection_box = { + type = "fixed", + fixed = def.selection_box_bottom + }, + groups = def.groups, + _mcl_hardness = def._mcl_hardness, + _mcl_blast_resistance = def._mcl_blast_resistance, + sounds = def.sounds, + + after_destruct = function(bottom, oldnode) + local meta_bottom = minetest_get_meta(bottom) + if meta_bottom:get_int("rotation") == 1 then + meta_bottom:set_int("rotation", 0) + else + minetest.add_item(bottom, name) + local top = { x = bottom.x, y = bottom.y + 1, z = bottom.z } + if minetest.get_node(bottom).name ~= name.."_b_2" and minetest.get_node(top).name == name.."_t_1" then + minetest.remove_node(top) + end + end + end, + + on_rightclick = on_rightclick, + + mesecons = { effector = { + action_on = on_mesecons_signal_open, + }}, + + on_rotate = function(bottom, node, user, mode, param2) + if mode == screwdriver.ROTATE_FACE then + local meta_bottom = minetest_get_meta(bottom) + meta_bottom:set_int("rotation", 1) + node.param2 = screwdriver.rotate.facedir(bottom, node, mode) + minetest.swap_node(bottom, node) + + local top = {x=bottom.x,y=bottom.y+1,z=bottom.z} + local meta_top = minetest_get_meta(top) + meta_top:set_int("rotation", 1) + node.name = name .."_t_1" + minetest.swap_node(top, node) + + return true + end + return false + end, + + can_dig = check_player_priv, + }) + + if def.only_redstone_can_open then + on_rightclick = nil + else + on_rightclick = function(pos, node, clicker) + if check_player_priv(pos, clicker) then + on_open_close(pos, -1, name.."_b_1", name.."_t_2", name.."_b_2") + end + end + end + + minetest.register_node(name.."_t_1", { + tiles = {tt[2].."^[transformR90", "blank.png", tt[2], tt[2].."^[transformFX", tt[1], tt[1].."^[transformFX"}, + use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + is_ground_content = false, + drop = "", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = def.node_box_top + }, + selection_box = { + type = "fixed", + fixed = def.selection_box_top + }, + groups = def.groups, + _mcl_hardness = def._mcl_hardness, + _mcl_blast_resistance = def._mcl_blast_resistance, + sounds = def.sounds, + + after_destruct = function(top, oldnode) + local meta_top = minetest_get_meta(top) + if meta_top:get_int("rotation") == 1 then + meta_top:set_int("rotation", 0) + else + local bottom = { x = top.x, y = top.y - 1, z = top.z } + if minetest.get_node(top).name ~= name.."_t_2" and minetest.get_node(bottom).name == name.."_b_1" and oldnode.name == name.."_t_1" then + minetest.dig_node(bottom) + end + end + end, + + on_rightclick = on_rightclick, + + mesecons = { effector = { + action_on = on_mesecons_signal_open_top, + rules = mesecon.rules.flat, + }}, + + on_rotate = function(top, node, user, mode, param2) + if mode == screwdriver.ROTATE_FACE then + local meta_top = minetest_get_meta(top) + meta_top:set_int("rotation", 1) + node.param2 = screwdriver.rotate.facedir(top, node, mode) + minetest.swap_node(top, node) + + local bottom = {x=top.x,y=top.y-1,z=top.z} + local meta_bottom = minetest_get_meta(bottom) + meta_bottom:set_int("rotation", 1) + node.name = name .."_b_1" + minetest.swap_node(bottom, node) + + return true + end + return false + end, + + can_dig = check_player_priv, + }) + + if def.only_redstone_can_open then + on_rightclick = nil + else + on_rightclick = function(pos, node, clicker) + if check_player_priv(pos, clicker) then + on_open_close(pos, 1, name.."_t_2", name.."_b_1", name.."_t_1") + end + end + end + + minetest.register_node(name.."_b_2", { + tiles = {"blank.png", tt[2].."^[transformFXR90", tb[2].."^[transformI", tb[2].."^[transformFX", tb[1].."^[transformFX", tb[1]}, + use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + is_ground_content = false, + drop = "", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = def.node_box_bottom + }, + selection_box = { + type = "fixed", + fixed = def.selection_box_bottom + }, + groups = def.groups, + _mcl_hardness = def._mcl_hardness, + _mcl_blast_resistance = def._mcl_blast_resistance, + sounds = def.sounds, + + after_destruct = function(bottom, oldnode) + local meta_bottom = minetest_get_meta(bottom) + if meta_bottom:get_int("rotation") == 1 then + meta_bottom:set_int("rotation", 0) + else + local top = { x = bottom.x, y = bottom.y + 1, z = bottom.z } + minetest.add_item(bottom, name) + if minetest.get_node(bottom).name ~= name.."_b_1" and minetest.get_node(top).name == name.."_t_2" then + minetest.remove_node(top) + end + end + end, + + on_rightclick = on_rightclick, + + mesecons = { effector = { + action_off = on_mesecons_signal_close, + }}, + + on_rotate = function(bottom, node, user, mode, param2) + if mode == screwdriver.ROTATE_FACE then + local meta_bottom = minetest_get_meta(bottom) + meta_bottom:set_int("rotation", 1) + node.param2 = screwdriver.rotate.facedir(bottom, node, mode) + minetest.swap_node(bottom, node) + + local top = {x=bottom.x,y=bottom.y+1,z=bottom.z} + local meta_top = minetest_get_meta(top) + meta_top:set_int("rotation", 1) + node.name = name .."_t_2" + minetest.swap_node(top, node) + + return true + end + return false + end, + + can_dig = check_player_priv, + }) + + if def.only_redstone_can_open then + on_rightclick = nil + else + on_rightclick = function(pos, node, clicker) + if check_player_priv(pos, clicker) then + on_open_close(pos, -1, name.."_b_2", name.."_t_1", name.."_b_1") + end + end + end + + minetest.register_node(name.."_t_2", { + tiles = {tt[2].."^[transformR90", "blank.png", tt[2].."^[transformI", tt[2].."^[transformFX", tt[1].."^[transformFX", tt[1]}, + use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + is_ground_content = false, + drop = "", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = def.node_box_top + }, + selection_box = { + type = "fixed", + fixed = def.selection_box_top + }, + groups = def.groups, + _mcl_hardness = def._mcl_hardness, + _mcl_blast_resistance = def._mcl_blast_resistance, + sounds = def.sounds, + + after_destruct = function(top, oldnode) + local meta_top = minetest_get_meta(top) + if meta_top:get_int("rotation") == 1 then + meta_top:set_int("rotation", 0) + else + local bottom = { x = top.x, y = top.y - 1, z = top.z } + if minetest.get_node(top).name ~= name.."_t_1" and minetest.get_node(bottom).name == name.."_b_2" and oldnode.name == name.."_t_2" then + minetest.dig_node(bottom) + end + end + end, + + on_rightclick = on_rightclick, + + mesecons = { effector = { + action_off = on_mesecons_signal_close_top, + rules = mesecon.rules.flat, + }}, + + on_rotate = function(top, node, user, mode, param2) + if mode == screwdriver.ROTATE_FACE then + local meta_top = minetest_get_meta(top) + meta_top:set_int("rotation", 1) + node.param2 = screwdriver.rotate.facedir(top, node, mode) + minetest.swap_node(top, node) + + local bottom = {x=top.x,y=top.y-1,z=top.z} + local meta_bottom = minetest_get_meta(bottom) + meta_bottom:set_int("rotation", 1) + node.name = name .."_b_2" + minetest.swap_node(bottom, node) + + return true + end + return false + end, + + can_dig = check_player_priv, + }) + + -- Add entry aliases for the Help + if minetest.get_modpath("doc") then + doc.add_entry_alias("craftitems", name, "nodes", name.."_b_1") + doc.add_entry_alias("craftitems", name, "nodes", name.."_b_2") + doc.add_entry_alias("craftitems", name, "nodes", name.."_t_1") + doc.add_entry_alias("craftitems", name, "nodes", name.."_t_2") + end + +end diff --git a/mods/ITEMS/mcl_doors/api_trapdoors.lua b/mods/ITEMS/mcl_doors/api_trapdoors.lua index 3d2a8e891..5b7a0e5d0 100644 --- a/mods/ITEMS/mcl_doors/api_trapdoors.lua +++ b/mods/ITEMS/mcl_doors/api_trapdoors.lua @@ -1,231 +1,231 @@ -local S = minetest.get_translator(minetest.get_current_modname()) - --- Wrapper around mintest.pointed_thing_to_face_pos. -local function get_fpos(placer, pointed_thing) - local fpos - -- Workaround: minetest.pointed_thing_to_face_pos crashes in MT 0.4.16 if - -- pointed_thing.under and pointed_thing.above are equal - -- FIXME: Remove this when MT got fixed. - if not vector.equals(pointed_thing.under, pointed_thing.above) then - -- The happy case: Everything is normal - local finepos = minetest.pointed_thing_to_face_pos(placer, pointed_thing) - fpos = finepos.y % 1 - else - -- Fallback if both above and under are equal - fpos = 0 - end - return fpos -end - ----- Trapdoor ---- - -local on_rotate -if minetest.get_modpath("screwdriver") then - on_rotate = function(pos, node, user, mode, param2) - -- Flip trapdoor vertically - if mode == screwdriver.ROTATE_AXIS then - local minor = node.param2 - if node.param2 >= 20 then - minor = node.param2 - 20 - if minor == 3 then - minor = 1 - elseif minor == 1 then - minor = 3 - end - node.param2 = minor - else - if minor == 3 then - minor = 1 - elseif minor == 1 then - minor = 3 - end - node.param2 = minor - node.param2 = node.param2 + 20 - end - minetest.set_node(pos, node) - return true - end - end -end - -function mcl_doors:register_trapdoor(name, def) - local groups = table.copy(def.groups) - if groups == nil then - groups = {} - end - groups.mesecon_ignore_opaque_dig = 1 - - if not def.sound_open then - def.sound_open = "doors_door_open" - end - if not def.sound_close then - def.sound_close = "doors_door_close" - end - - local function punch(pos) - local me = minetest.get_node(pos) - local tmp_node - -- Close - if minetest.get_item_group(me.name, "trapdoor") == 2 then - minetest.sound_play(def.sound_close, {pos = pos, gain = 0.3, max_hear_distance = 16}, true) - tmp_node = {name=name, param1=me.param1, param2=me.param2} - -- Open - else - minetest.sound_play(def.sound_open, {pos = pos, gain = 0.3, max_hear_distance = 16}, true) - tmp_node = {name=name.."_open", param1=me.param1, param2=me.param2} - end - minetest.set_node(pos, tmp_node) - end - - local on_rightclick - if not def.only_redstone_can_open then - on_rightclick = function(pos, node, clicker) - punch(pos) - end - end - - -- Default help texts - local longdesc, usagehelp, tt_help - longdesc = def._doc_items_longdesc - if not longdesc then - if def.only_redstone_can_open then - longdesc = S("Trapdoors are horizontal barriers which can be opened or closed and climbed like a ladder when open. They occupy the upper or lower part of a block, depending on how they have been placed. This trapdoor can only be opened or closed by redstone power.") - else - longdesc = S("Trapdoors are horizontal barriers which can be opened or closed and climbed like a ladder when open. They occupy the upper or lower part of a block, depending on how they have been placed. This trapdoor can be opened or closed by hand or redstone power.") - end - end - usagehelp = def._doc_items_usagehelp - if not usagehelp and not def.only_redstone_can_open then - usagehelp = S("To open or close this trapdoor, rightclick it or send a redstone signal to it.") - end - if def.only_redstone_can_open then - tt_help = S("Openable by redstone power") - else - tt_help = S("Openable by players and redstone power") - end - - -- Closed trapdoor - - local tile_front = def.tile_front - local tile_side = def.tile_side - if not tile_side then - tile_side = tile_front - end - local tiles_closed = { - tile_front, - tile_front .. "^[transformFY", - tile_side, tile_side, - tile_side, tile_side, - } - - local groups_closed = groups - groups_closed.trapdoor = 1 - groups_closed.deco_block = 1 - minetest.register_node(name, { - description = def.description, - _tt_help = tt_help, - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usagehelp, - drawtype = "nodebox", - tiles = tiles_closed, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, - inventory_image = def.inventory_image, - wield_image = def.wield_image, - is_ground_content = false, - paramtype = "light", - stack_max = 64, - paramtype2 = "facedir", - sunlight_propagates = true, - groups = groups_closed, - _mcl_hardness = def._mcl_hardness, - _mcl_blast_resistance = def._mcl_blast_resistance, - sounds = def.sounds, - node_box = { - type = "fixed", - fixed = { - {-8/16, -8/16, -8/16, 8/16, -5/16, 8/16},}, - }, - mesecons = {effector = { - action_on = (function(pos, node) - punch(pos) - end), - }}, - on_place = function(itemstack, placer, pointed_thing) - local p0 = pointed_thing.under - local p1 = pointed_thing.above - local param2 = 0 - - local placer_pos = placer:get_pos() - if placer_pos then - param2 = minetest.dir_to_facedir(vector.subtract(p1, placer_pos)) - end - - local fpos = get_fpos(placer, pointed_thing) - - --local origname = itemstack:get_name() - if p0.y - 1 == p1.y or (fpos > 0 and fpos < 0.5) - or (fpos < -0.5 and fpos > -0.999999999) then - param2 = param2 + 20 - if param2 == 21 then - param2 = 23 - elseif param2 == 23 then - param2 = 21 - end - end - return minetest.item_place(itemstack, placer, pointed_thing, param2) - end, - on_rightclick = on_rightclick, - on_rotate = on_rotate, - }) - - -- Open trapdoor - - local groups_open = table.copy(groups) - - local tiles_open = { - tile_side, - tile_side .. "^[transformR180", - tile_side .. "^[transformR270", - tile_side .. "^[transformR90", - tile_front .. "^[transform46", - tile_front .. "^[transformFY", - } - - groups_open.trapdoor = 2 - groups_open.not_in_creative_inventory = 1 - minetest.register_node(name.."_open", { - drawtype = "nodebox", - tiles = tiles_open, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, - is_ground_content = false, - paramtype = "light", - paramtype2 = "facedir", - -- TODO: Implement Minecraft behaviour: Climbable if directly above - -- ladder w/ matching orientation. - -- Current behavour: Always climbable - climbable = true, - sunlight_propagates = true, - pointable = true, - groups = groups_open, - _mcl_hardness = def._mcl_hardness, - _mcl_blast_resistance = def._mcl_blast_resistance, - sounds = def.sounds, - drop = name, - node_box = { - type = "fixed", - fixed = {-0.5, -0.5, 5/16, 0.5, 0.5, 0.5} - }, - on_rightclick = on_rightclick, - mesecons = {effector = { - action_off = (function(pos, node) - punch(pos) - end), - }}, - on_rotate = on_rotate, - }) - - if minetest.get_modpath("doc") then - doc.add_entry_alias("nodes", name, "nodes", name.."_open") - end - -end +local S = minetest.get_translator(minetest.get_current_modname()) + +-- Wrapper around mintest.pointed_thing_to_face_pos. +local function get_fpos(placer, pointed_thing) + local fpos + -- Workaround: minetest.pointed_thing_to_face_pos crashes in MT 0.4.16 if + -- pointed_thing.under and pointed_thing.above are equal + -- FIXME: Remove this when MT got fixed. + if not vector.equals(pointed_thing.under, pointed_thing.above) then + -- The happy case: Everything is normal + local finepos = minetest.pointed_thing_to_face_pos(placer, pointed_thing) + fpos = finepos.y % 1 + else + -- Fallback if both above and under are equal + fpos = 0 + end + return fpos +end + +---- Trapdoor ---- + +local on_rotate +if minetest.get_modpath("screwdriver") then + on_rotate = function(pos, node, user, mode, param2) + -- Flip trapdoor vertically + if mode == screwdriver.ROTATE_AXIS then + local minor = node.param2 + if node.param2 >= 20 then + minor = node.param2 - 20 + if minor == 3 then + minor = 1 + elseif minor == 1 then + minor = 3 + end + node.param2 = minor + else + if minor == 3 then + minor = 1 + elseif minor == 1 then + minor = 3 + end + node.param2 = minor + node.param2 = node.param2 + 20 + end + minetest.set_node(pos, node) + return true + end + end +end + +function mcl_doors:register_trapdoor(name, def) + local groups = table.copy(def.groups) + if groups == nil then + groups = {} + end + groups.mesecon_ignore_opaque_dig = 1 + + if not def.sound_open then + def.sound_open = "doors_door_open" + end + if not def.sound_close then + def.sound_close = "doors_door_close" + end + + local function punch(pos) + local me = minetest.get_node(pos) + local tmp_node + -- Close + if minetest.get_item_group(me.name, "trapdoor") == 2 then + minetest.sound_play(def.sound_close, {pos = pos, gain = 0.3, max_hear_distance = 16}, true) + tmp_node = {name=name, param1=me.param1, param2=me.param2} + -- Open + else + minetest.sound_play(def.sound_open, {pos = pos, gain = 0.3, max_hear_distance = 16}, true) + tmp_node = {name=name.."_open", param1=me.param1, param2=me.param2} + end + minetest.set_node(pos, tmp_node) + end + + local on_rightclick + if not def.only_redstone_can_open then + on_rightclick = function(pos, node, clicker) + punch(pos) + end + end + + -- Default help texts + local longdesc, usagehelp, tt_help + longdesc = def._doc_items_longdesc + if not longdesc then + if def.only_redstone_can_open then + longdesc = S("Trapdoors are horizontal barriers which can be opened or closed and climbed like a ladder when open. They occupy the upper or lower part of a block, depending on how they have been placed. This trapdoor can only be opened or closed by redstone power.") + else + longdesc = S("Trapdoors are horizontal barriers which can be opened or closed and climbed like a ladder when open. They occupy the upper or lower part of a block, depending on how they have been placed. This trapdoor can be opened or closed by hand or redstone power.") + end + end + usagehelp = def._doc_items_usagehelp + if not usagehelp and not def.only_redstone_can_open then + usagehelp = S("To open or close this trapdoor, rightclick it or send a redstone signal to it.") + end + if def.only_redstone_can_open then + tt_help = S("Openable by redstone power") + else + tt_help = S("Openable by players and redstone power") + end + + -- Closed trapdoor + + local tile_front = def.tile_front + local tile_side = def.tile_side + if not tile_side then + tile_side = tile_front + end + local tiles_closed = { + tile_front, + tile_front .. "^[transformFY", + tile_side, tile_side, + tile_side, tile_side, + } + + local groups_closed = groups + groups_closed.trapdoor = 1 + groups_closed.deco_block = 1 + minetest.register_node(name, { + description = def.description, + _tt_help = tt_help, + _doc_items_longdesc = longdesc, + _doc_items_usagehelp = usagehelp, + drawtype = "nodebox", + tiles = tiles_closed, + use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, + inventory_image = def.inventory_image, + wield_image = def.wield_image, + is_ground_content = false, + paramtype = "light", + stack_max = 64, + paramtype2 = "facedir", + sunlight_propagates = true, + groups = groups_closed, + _mcl_hardness = def._mcl_hardness, + _mcl_blast_resistance = def._mcl_blast_resistance, + sounds = def.sounds, + node_box = { + type = "fixed", + fixed = { + {-8/16, -8/16, -8/16, 8/16, -5/16, 8/16},}, + }, + mesecons = {effector = { + action_on = (function(pos, node) + punch(pos) + end), + }}, + on_place = function(itemstack, placer, pointed_thing) + local p0 = pointed_thing.under + local p1 = pointed_thing.above + local param2 = 0 + + local placer_pos = placer:get_pos() + if placer_pos then + param2 = minetest.dir_to_facedir(vector.subtract(p1, placer_pos)) + end + + local fpos = get_fpos(placer, pointed_thing) + + --local origname = itemstack:get_name() + if p0.y - 1 == p1.y or (fpos > 0 and fpos < 0.5) + or (fpos < -0.5 and fpos > -0.999999999) then + param2 = param2 + 20 + if param2 == 21 then + param2 = 23 + elseif param2 == 23 then + param2 = 21 + end + end + return minetest.item_place(itemstack, placer, pointed_thing, param2) + end, + on_rightclick = on_rightclick, + on_rotate = on_rotate, + }) + + -- Open trapdoor + + local groups_open = table.copy(groups) + + local tiles_open = { + tile_side, + tile_side .. "^[transformR180", + tile_side .. "^[transformR270", + tile_side .. "^[transformR90", + tile_front .. "^[transform46", + tile_front .. "^[transformFY", + } + + groups_open.trapdoor = 2 + groups_open.not_in_creative_inventory = 1 + minetest.register_node(name.."_open", { + drawtype = "nodebox", + tiles = tiles_open, + use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, + is_ground_content = false, + paramtype = "light", + paramtype2 = "facedir", + -- TODO: Implement Minecraft behaviour: Climbable if directly above + -- ladder w/ matching orientation. + -- Current behavour: Always climbable + climbable = true, + sunlight_propagates = true, + pointable = true, + groups = groups_open, + _mcl_hardness = def._mcl_hardness, + _mcl_blast_resistance = def._mcl_blast_resistance, + sounds = def.sounds, + drop = name, + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 5/16, 0.5, 0.5, 0.5} + }, + on_rightclick = on_rightclick, + mesecons = {effector = { + action_off = (function(pos, node) + punch(pos) + end), + }}, + on_rotate = on_rotate, + }) + + if minetest.get_modpath("doc") then + doc.add_entry_alias("nodes", name, "nodes", name.."_open") + end + +end diff --git a/mods/ITEMS/mcl_doors/init.lua b/mods/ITEMS/mcl_doors/init.lua index 9e06b513f..a39b33c5e 100644 --- a/mods/ITEMS/mcl_doors/init.lua +++ b/mods/ITEMS/mcl_doors/init.lua @@ -1,9 +1,9 @@ -mcl_doors = {} - -local this = minetest.get_current_modname() -local path = minetest.get_modpath(this) - -dofile(path.."/api_doors.lua") -- Doors API -dofile(path.."/api_trapdoors.lua") -- Trapdoors API -dofile(path.."/register.lua") -- Register builtin doors and trapdoors -dofile(path.."/alias.lua") -- Legacy aliases +mcl_doors = {} + +local this = minetest.get_current_modname() +local path = minetest.get_modpath(this) + +dofile(path.."/api_doors.lua") -- Doors API +dofile(path.."/api_trapdoors.lua") -- Trapdoors API +dofile(path.."/register.lua") -- Register builtin doors and trapdoors +dofile(path.."/alias.lua") -- Legacy aliases diff --git a/mods/ITEMS/mcl_doors/locale/mcl_doors.zh_TW.tr b/mods/ITEMS/mcl_doors/locale/mcl_doors.zh_TW.tr new file mode 100644 index 000000000..62e2761d7 --- /dev/null +++ b/mods/ITEMS/mcl_doors/locale/mcl_doors.zh_TW.tr @@ -0,0 +1,24 @@ +# textdomain: mcl_doors +Wooden doors are 2-block high barriers which can be opened or closed by hand and by a redstone signal.=木門是2格高的障礙物,可以用手和紅石信號來打開或關閉。 +To open or close a wooden door, rightclick it or supply its lower half with a redstone signal.=要打開或關閉一扇木門,請右擊它或在其下半部分提供紅石信號。 +Oak Door=橡木門 +Acacia Door=相思木門 +Birch Door=樺木門 +Dark Oak Door=黑橡木門 +Jungle Door=叢林木門 +Spruce Door=杉木門 +Iron Door=鐵門 +Iron doors are 2-block high barriers which can only be opened or closed by a redstone signal, but not by hand.=鐵門是2格高的障礙物,能通過紅石信號打開或關閉,但不能用手。 +To open or close an iron door, supply its lower half with a redstone signal.=要打開或關閉鐵門,請在其下半部分提供紅石信號。 +Oak Trapdoor=橡木地板門 +Acacia Trapdoor=相思木地板門 +Birch Trapdoor=樺木地板門 +Spruce Trapdoor=杉木地板門 +Dark Oak Trapdoor=黑橡木地板門 +Jungle Trapdoor=叢林木地板門 +Wooden trapdoors are horizontal barriers which can be opened and closed by hand or a redstone signal. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder.=木質地板門是水平的障礙物,可以用手或紅石信號來打開和關閉。它們佔據一個方塊的上部或下部,這取決於它們被放置的方式。當打開時,它們可以像梯子一樣被爬上去。 +To open or close the trapdoor, rightclick it or send a redstone signal to it.=要打開或關閉活板門,請右擊它或向它發送紅石信號。 +Iron Trapdoor=鐵製地板門 +Iron trapdoors are horizontal barriers which can only be opened and closed by redstone signals, but not by hand. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder.=木質地板門是水平的障礙物,能通過紅石信號打開或關閉,但不能用手。它們佔據一個方塊的上部或下部,這取決於它們被放置的方式。當打開時,它們可以像梯子一樣被爬上去。 +Openable by players and redstone power=可以用手和紅石信號來打開 +Openable by redstone power=能通過紅石信號打開 diff --git a/mods/ITEMS/mcl_dye/init.lua b/mods/ITEMS/mcl_dye/init.lua index 09a97e08e..97c8d0c24 100644 --- a/mods/ITEMS/mcl_dye/init.lua +++ b/mods/ITEMS/mcl_dye/init.lua @@ -78,7 +78,7 @@ dyelocal.dyes = { {"dark_green", "dye_dark_green", S("Cactus Green"),{dye=1, craftitem=1, basecolor_green=1, excolor_green=1, unicolor_dark_green=1}}, {"green", "mcl_dye_lime", S("Lime Dye"), {dye=1, craftitem=1, basecolor_green=1, excolor_green=1, unicolor_green=1}}, {"yellow", "dye_yellow", S("Dandelion Yellow"), {dye=1, craftitem=1, basecolor_yellow=1, excolor_yellow=1, unicolor_yellow=1}}, - {"brown", "mcl_dye_brown", S("Cocoa Beans"), {dye=1, craftitem=1, basecolor_brown=1, excolor_orange=1, unicolor_dark_orange=1, compostability=65}}, + {"brown", "mcl_dye_brown", S("Cocoa Beans"), {dye=1, craftitem=1, basecolor_brown=1, excolor_orange=1, unicolor_dark_orange=1, compostability = 65}}, {"orange", "dye_orange", S("Orange Dye"), {dye=1, craftitem=1, basecolor_orange=1, excolor_orange=1, unicolor_orange=1}}, {"red", "dye_red", S("Rose Red"), {dye=1, craftitem=1, basecolor_red=1, excolor_red=1, unicolor_red=1}}, {"magenta", "dye_magenta", S("Magenta Dye"), {dye=1, craftitem=1, basecolor_magenta=1, excolor_red_violet=1,unicolor_red_violet=1}}, diff --git a/mods/ITEMS/mcl_dye/locale/mcl_dye.zh_TW.tr b/mods/ITEMS/mcl_dye/locale/mcl_dye.zh_TW.tr new file mode 100644 index 000000000..23d2face2 --- /dev/null +++ b/mods/ITEMS/mcl_dye/locale/mcl_dye.zh_TW.tr @@ -0,0 +1,25 @@ +# textdomain: mcl_dye +Bone Meal=骨粉 +Light Grey Dye=淺灰色染料 +Grey Dye=灰色染料 +Ink Sac=墨囊 +Purple Dye=紫色染料 +Lapis Lazuli=青金石 +Light Blue Dye=淺藍色染料 +Cyan Dye=青色染料 +Cactus Green=仙人掌綠 +Lime Dye=淺綠色染料 +Dandelion Yellow=蒲公英黃 +Cocoa Beans=可可豆 +Orange Dye=橙色染料 +Rose Red=玫瑰紅 +Magenta Dye=洋紅色染料 +Pink Dye=粉紅色染料 +This item is a dye which is used for dyeing and crafting.=這個物品是一種用於染色和合成的染料。 +Rightclick on a sheep to dye its wool. Other things are dyed by crafting.=右鍵單擊綿羊以染它的毛。其他東西是通過合成染色的。 +Bone meal is a white dye and also useful as a fertilizer to speed up the growth of many plants.=骨粉是一種白色染料,也可作為肥料,加速許多植物的生長。 +Rightclick a sheep to turn its wool white. Rightclick a plant to speed up its growth. Note that not all plants can be fertilized like this. When you rightclick a grass block, tall grass and flowers will grow all over the place.=右鍵點擊一隻羊,使其羊毛變白。右鍵點擊一株植物以加快其生長速度。注意,不是所有的植物都能像這樣施肥。當你右鍵點擊一個草方時,高高的草和花會到處生長。 +Cocoa beans are a brown dye and can be used to plant cocoas.=可可豆是一種棕色染料,也可用於種植可可。 +Rightclick a sheep to turn its wool brown. Rightclick on the side of a jungle tree trunk (Jungle Wood) to plant a young cocoa.=右鍵點擊一隻羊,使其羊毛變成褐色。右鍵點擊叢林木的一側,可以種植一個可可。 +Grows at the side of jungle trees=在叢林木側生長 +Speeds up plant growth=加速植物生長 diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index 21736b630..015cdce0d 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -97,8 +97,9 @@ mcl_enchanting.enchantments.efficiency = { weight = 10, description = S("Increases mining speed."), curse = false, - on_enchant = function(itemstack, level) - mcl_enchanting.update_groupcaps(itemstack) + on_enchant = function() + -- Updating digging speed is handled by update_groupcaps which + -- is called from load_enchantments. end, requires_tool = false, treasure = false, @@ -672,8 +673,8 @@ mcl_enchanting.enchantments.unbreaking = { tool_capabilities.punch_attack_uses = tool_capabilities.punch_attack_uses * (1 + level) itemstack:get_meta():set_tool_capabilities(tool_capabilities) - -- Unbreaking for groupcaps is handled in this function. - mcl_enchanting.update_groupcaps(itemstack) + -- Updating digging durability is handled by update_groupcaps + -- which is called from load_enchantments. end, requires_tool = true, treasure = false, diff --git a/mods/ITEMS/mcl_enchanting/engine.lua b/mods/ITEMS/mcl_enchanting/engine.lua index d6407d0bc..c37eee1da 100644 --- a/mods/ITEMS/mcl_enchanting/engine.lua +++ b/mods/ITEMS/mcl_enchanting/engine.lua @@ -14,10 +14,11 @@ end function mcl_enchanting.unload_enchantments(itemstack) local itemdef = itemstack:get_definition() - if itemdef.tool_capabilities then - itemstack:get_meta():set_tool_capabilities(nil) - end local meta = itemstack:get_meta() + if itemdef.tool_capabilities then + meta:set_tool_capabilities(nil) + meta:set_string("groupcaps_hash", "") + end if meta:get_string("name") == "" then meta:set_string("description", "") meta:set_string("groupcaps_hash", "") @@ -33,6 +34,7 @@ function mcl_enchanting.load_enchantments(itemstack, enchantments) enchantment_def.on_enchant(itemstack, level) end end + mcl_enchanting.update_groupcaps(itemstack) end tt.reload_itemstack_description(itemstack) end @@ -72,8 +74,12 @@ function mcl_enchanting.is_enchanted(itemname) return minetest.get_item_group(itemname, "enchanted") > 0 end +function mcl_enchanting.not_enchantable_on_enchanting_table(itemname) + return mcl_enchanting.get_enchantability(itemname) == -1 +end + function mcl_enchanting.is_enchantable(itemname) - return mcl_enchanting.get_enchantability(itemname) > 0 + return mcl_enchanting.get_enchantability(itemname) > 0 or mcl_enchanting.not_enchantable_on_enchanting_table(itemname) end function mcl_enchanting.can_enchant_freshly(itemname) @@ -246,7 +252,7 @@ local function get_after_use_callback(itemdef) -- If the tool does not have after_use, add wear to the tool as if no -- after_use was registered. return function(itemstack, user, node, digparams) - if not minetest.is_creative_enabled(user) then + if not minetest.is_creative_enabled(user:get_player_name()) then itemstack:add_wear(digparams.wear) end @@ -271,11 +277,10 @@ function mcl_enchanting.initialize() new_def.groups.not_in_craft_guide = 1 new_def.groups.enchanted = 1 - if new_def._mcl_armor_texture and not type(new_def._mcl_armor_texture) == "function" then - new_def._mcl_armor_texture = new_def._mcl_armor_texture .. mcl_enchanting.overlay - end - if new_def._mcl_armor_preview and not type(new_def._mcl_armor_preview) == "function" then - new_def._mcl_armor_preview = new_def._mcl_armor_preview .. mcl_enchanting.overlay + if new_def._mcl_armor_texture then + if type(new_def._mcl_armor_texture) == "string" then + new_def._mcl_armor_texture = new_def._mcl_armor_texture .. mcl_enchanting.overlay + end end new_def._mcl_enchanting_enchanted_tool = new_name @@ -326,7 +331,7 @@ end function mcl_enchanting.generate_random_enchantments(itemstack, enchantment_level, treasure, no_reduced_bonus_chance, ignore_already_enchanted, pr) local itemname = itemstack:get_name() - if not mcl_enchanting.can_enchant_freshly(itemname) and not ignore_already_enchanted then + if (not mcl_enchanting.can_enchant_freshly(itemname) and not ignore_already_enchanted) or mcl_enchanting.not_enchantable_on_enchanting_table(itemname) then return end @@ -452,10 +457,10 @@ function mcl_enchanting.generate_random_table_slots(itemstack, num_bookshelves) end function mcl_enchanting.get_table_slots(player, itemstack, num_bookshelves) - if not mcl_enchanting.can_enchant_freshly(itemstack:get_name()) then + local itemname = itemstack:get_name() + if (not mcl_enchanting.can_enchant_freshly(itemname)) or mcl_enchanting.not_enchantable_on_enchanting_table(itemname) then return {false, false, false} end - local itemname = itemstack:get_name() local meta = player:get_meta() local player_slots = minetest.deserialize(meta:get_string("mcl_enchanting:slots")) or {} local player_bookshelves_slots = player_slots[num_bookshelves] or {} @@ -571,6 +576,7 @@ function mcl_enchanting.handle_formspec_fields(player, formname, fields) minetest.sound_play("mcl_enchanting_enchant", {to_player = name, gain = 5.0}) mcl_enchanting.reset_table_slots(player) mcl_enchanting.show_enchanting_formspec(player) + awards.unlock(player:get_player_name(), "mcl:enchanter") end end diff --git a/mods/ITEMS/mcl_enchanting/groupcaps.lua b/mods/ITEMS/mcl_enchanting/groupcaps.lua index a445b73f2..2a8372772 100644 --- a/mods/ITEMS/mcl_enchanting/groupcaps.lua +++ b/mods/ITEMS/mcl_enchanting/groupcaps.lua @@ -2,10 +2,7 @@ local groupcaps_cache = {} -- Compute a hash value. function compute_hash(value) - -- minetest.get_password_hash is quite fast, even if it uses a - -- cryptographic hashing function (SHA-1). It is written in C++ and it - -- is probably hard to write a faster hashing function in Lua. - return string.sub(minetest.get_password_hash("ryvnf", minetest.serialize(value)), 1, 8) + return string.sub(minetest.sha1(minetest.serialize(value)), 1, 8) end -- Get the groupcaps and hash for an enchanted tool. If this function is called @@ -46,7 +43,7 @@ end -- the tool needs to be updated. function mcl_enchanting.update_groupcaps(itemstack) local name = itemstack:get_name() - if not minetest.registered_tools[name].tool_capabilities then + if not minetest.registered_tools[name] or not minetest.registered_tools[name].tool_capabilities then return end diff --git a/mods/ITEMS/mcl_end/building.lua b/mods/ITEMS/mcl_end/building.lua index 3c8f7f66c..82f6e76e4 100644 --- a/mods/ITEMS/mcl_end/building.lua +++ b/mods/ITEMS/mcl_end/building.lua @@ -29,7 +29,7 @@ minetest.register_node("mcl_end:end_bricks", { groups = {pickaxey=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 9, - _mcl_hardness = 0.8, + _mcl_hardness = 3, }) minetest.register_node("mcl_end:purpur_block", { @@ -166,18 +166,20 @@ minetest.register_node("mcl_end:dragon_egg", { selection_box = { type = "regular", }, - groups = {handy=1, falling_node = 1, deco_block = 1, not_in_creative_inventory = 1, dig_by_piston = 1 }, + groups = {handy = 1, falling_node = 1, deco_block = 1, not_in_creative_inventory = 1, dig_by_piston = 1 }, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 9, _mcl_hardness = 3, - on_punch = function(pos, node) - local max_dist = vector.new(15, 7, 15) - local positions = minetest.find_nodes_in_area(vector.subtract(pos, max_dist), vector.add(pos, max_dist), "air", false) - if #positions > 0 then - local tpos = positions[math.random(#positions)] - minetest.remove_node(pos) - minetest.set_node(tpos, node) - minetest.check_for_falling(tpos) + on_punch = function(pos, node, puncher) + if not minetest.is_protected(pos, puncher:get_player_name()) then + local max_dist = vector.new(15, 7, 15) + local positions = minetest.find_nodes_in_area(vector.subtract(pos, max_dist), vector.add(pos, max_dist), "air", false) + if #positions > 0 then + local tpos = positions[math.random(#positions)] + minetest.remove_node(pos) + minetest.set_node(tpos, node) + minetest.check_for_falling(tpos) + end end end, }) diff --git a/mods/ITEMS/mcl_farming/beetroot.lua b/mods/ITEMS/mcl_farming/beetroot.lua index 187f34eb4..21096042b 100644 --- a/mods/ITEMS/mcl_farming/beetroot.lua +++ b/mods/ITEMS/mcl_farming/beetroot.lua @@ -5,7 +5,7 @@ minetest.register_craftitem("mcl_farming:beetroot_seeds", { _tt_help = S("Grows on farmland"), _doc_items_longdesc = S("Grows into a beetroot plant. Chickens like beetroot seeds."), _doc_items_usagehelp = S("Place the beetroot seeds on farmland (which can be created with a hoe) to plant a beetroot plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it beetroot seeds."), - groups = { craftitem=1, compostability=30 }, + groups = {craftitem = 1, compostability = 30}, inventory_image = "mcl_farming_beetroot_seeds.png", wield_image = "mcl_farming_beetroot_seeds.png", on_place = function(itemstack, placer, pointed_thing) @@ -133,7 +133,7 @@ minetest.register_craftitem("mcl_farming:beetroot_item", { wield_image = "mcl_farming_beetroot.png", on_place = minetest.item_eat(1), on_secondary_use = minetest.item_eat(1), - groups = { food = 2, eatable = 1, compostability=65 }, + groups = {food = 2, eatable = 1, compostability = 65}, _mcl_saturation = 1.2, }) diff --git a/mods/ITEMS/mcl_farming/carrots.lua b/mods/ITEMS/mcl_farming/carrots.lua index bdecdefed..1c3ebcdfa 100644 --- a/mods/ITEMS/mcl_farming/carrots.lua +++ b/mods/ITEMS/mcl_farming/carrots.lua @@ -86,7 +86,7 @@ minetest.register_craftitem("mcl_farming:carrot_item", { _doc_items_longdesc = S("Carrots can be eaten and planted. Pigs and rabbits like carrots."), _doc_items_usagehelp = S("Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant the carrot. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it."), inventory_image = "farming_carrot.png", - groups = { food = 2, eatable = 3, compostability=65 }, + groups = {food = 2, eatable = 3, compostability = 65}, _mcl_saturation = 3.6, on_secondary_use = minetest.item_eat(3), on_place = function(itemstack, placer, pointed_thing) diff --git a/mods/ITEMS/mcl_farming/hoes.lua b/mods/ITEMS/mcl_farming/hoes.lua index ddd1b5a93..0ce884b13 100644 --- a/mods/ITEMS/mcl_farming/hoes.lua +++ b/mods/ITEMS/mcl_farming/hoes.lua @@ -1,299 +1,299 @@ -local S = minetest.get_translator(minetest.get_current_modname()) - -local function create_soil(pos, inv) - if pos == nil then - return false - end - local node = minetest.get_node(pos) - local name = node.name - local above = minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}) - if minetest.get_item_group(name, "cultivatable") == 2 then - if above.name == "air" then - node.name = "mcl_farming:soil" - minetest.set_node(pos, node) - minetest.sound_play("default_dig_crumbly", { pos = pos, gain = 0.5 }, true) - return true - end - elseif minetest.get_item_group(name, "cultivatable") == 1 then - if above.name == "air" then - node.name = "mcl_core:dirt" - minetest.set_node(pos, node) - minetest.sound_play("default_dig_crumbly", { pos = pos, gain = 0.6 }, true) - return true - end - end - return false -end - -local hoe_on_place_function = function(wear_divisor) - return function(itemstack, user, pointed_thing) - -- Call on_rightclick if the pointed node defines it - local node = minetest.get_node(pointed_thing.under) - if user and not user:get_player_control().sneak then - if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then - return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, user, itemstack) or itemstack - end - end - - if minetest.is_protected(pointed_thing.under, user:get_player_name()) then - minetest.record_protection_violation(pointed_thing.under, user:get_player_name()) - return itemstack - end - - if create_soil(pointed_thing.under, user:get_inventory()) then - if not minetest.is_creative_enabled(user:get_player_name()) then - itemstack:add_wear(65535/wear_divisor) - end - return itemstack - end - end -end - -local uses = { - wood = 60, - stone = 132, - iron = 251, - gold = 33, - diamond = 1562, - netherite = 2031, -} - -local hoe_tt = S("Turns block into farmland") -local hoe_longdesc = S("Hoes are essential tools for growing crops. They are used to create farmland in order to plant seeds on it. Hoes can also be used as very weak weapons in a pinch.") -local hoe_usagehelp = S("Use the hoe on a cultivatable block (by rightclicking it) to turn it into farmland. Dirt, grass blocks and grass paths are cultivatable blocks. Using a hoe on coarse dirt turns it into dirt.") - -minetest.register_tool("mcl_farming:hoe_wood", { - description = S("Wood Hoe"), - _tt_help = hoe_tt.."\n"..S("Uses: @1", uses.wood), - _doc_items_longdesc = hoe_longdesc, - _doc_items_usagehelp = hoe_usagehelp, - _doc_items_hidden = false, - inventory_image = "farming_tool_woodhoe.png", - wield_scale = mcl_vars.tool_wield_scale, - on_place = hoe_on_place_function(uses.wood), - groups = { tool=1, hoe=1, enchantability=15 }, - tool_capabilities = { - full_punch_interval = 1, - damage_groups = { fleshy = 1, }, - punch_attack_uses = uses.wood, - }, - _repair_material = "group:wood", - _mcl_toollike_wield = true, - _mcl_diggroups = { - hoey = { speed = 2, level = 1, uses = 60 } - }, -}) - -minetest.register_craft({ - output = "mcl_farming:hoe_wood", - recipe = { - {"group:wood", "group:wood"}, - {"", "mcl_core:stick"}, - {"", "mcl_core:stick"} - } -}) -minetest.register_craft({ - output = "mcl_farming:hoe_wood", - recipe = { - {"group:wood", "group:wood"}, - {"mcl_core:stick", ""}, - {"mcl_core:stick", ""} - } -}) -minetest.register_craft({ - type = "fuel", - recipe = "mcl_farming:hoe_wood", - burntime = 10, -}) - -minetest.register_tool("mcl_farming:hoe_stone", { - description = S("Stone Hoe"), - _tt_help = hoe_tt.."\n"..S("Uses: @1", uses.stone), - _doc_items_longdesc = hoe_longdesc, - _doc_items_usagehelp = hoe_usagehelp, - inventory_image = "farming_tool_stonehoe.png", - wield_scale = mcl_vars.tool_wield_scale, - on_place = hoe_on_place_function(uses.stone), - groups = { tool=1, hoe=1, enchantability=5 }, - tool_capabilities = { - full_punch_interval = 0.5, - damage_groups = { fleshy = 1, }, - punch_attack_uses = uses.stone, - }, - _repair_material = "mcl_core:cobble", - _mcl_toollike_wield = true, - _mcl_diggroups = { - hoey = { speed = 4, level = 3, uses = 132 } - }, -}) - -minetest.register_craft({ - output = "mcl_farming:hoe_stone", - recipe = { - {"mcl_core:cobble", "mcl_core:cobble"}, - {"", "mcl_core:stick"}, - {"", "mcl_core:stick"} - } -}) -minetest.register_craft({ - output = "mcl_farming:hoe_stone", - recipe = { - {"mcl_core:cobble", "mcl_core:cobble"}, - {"mcl_core:stick", ""}, - {"mcl_core:stick", ""} - } -}) - -minetest.register_tool("mcl_farming:hoe_iron", { - description = S("Iron Hoe"), - _tt_help = hoe_tt.."\n"..S("Uses: @1", uses.iron), - _doc_items_longdesc = hoe_longdesc, - _doc_items_usagehelp = hoe_usagehelp, - inventory_image = "farming_tool_steelhoe.png", - wield_scale = mcl_vars.tool_wield_scale, - on_place = hoe_on_place_function(uses.iron), - groups = { tool=1, hoe=1, enchantability=14 }, - tool_capabilities = { - -- 1/3 - full_punch_interval = 0.33333333, - damage_groups = { fleshy = 1, }, - punch_attack_uses = uses.iron, - }, - _repair_material = "mcl_core:iron_ingot", - _mcl_toollike_wield = true, - _mcl_diggroups = { - hoey = { speed = 6, level = 4, uses = 251 } - }, -}) - -minetest.register_craft({ - output = "mcl_farming:hoe_iron", - recipe = { - {"mcl_core:iron_ingot", "mcl_core:iron_ingot"}, - {"", "mcl_core:stick"}, - {"", "mcl_core:stick"} - } -}) -minetest.register_craft({ - output = "mcl_farming:hoe_iron", - recipe = { - {"mcl_core:iron_ingot", "mcl_core:iron_ingot"}, - {"mcl_core:stick", ""}, - {"mcl_core:stick", ""} - } -}) - -minetest.register_craft({ - type = "cooking", - output = "mcl_core:iron_nugget", - recipe = "mcl_farming:hoe_iron", - cooktime = 10, -}) - -minetest.register_tool("mcl_farming:hoe_gold", { - description = S("Golden Hoe"), - _tt_help = hoe_tt.."\n"..S("Uses: @1", uses.gold), - _doc_items_longdesc = hoe_longdesc, - _doc_items_usagehelp = hoe_usagehelp, - inventory_image = "farming_tool_goldhoe.png", - wield_scale = mcl_vars.tool_wield_scale, - on_place = hoe_on_place_function(uses.gold), - groups = { tool=1, hoe=1, enchantability=22 }, - tool_capabilities = { - full_punch_interval = 1, - damage_groups = { fleshy = 1, }, - punch_attack_uses = uses.gold, - }, - _repair_material = "mcl_core:gold_ingot", - _mcl_toollike_wield = true, - _mcl_diggroups = { - hoey = { speed = 12, level = 2, uses = 33 } - }, -}) - -minetest.register_craft({ - output = "mcl_farming:hoe_gold", - recipe = { - {"mcl_core:gold_ingot", "mcl_core:gold_ingot"}, - {"", "mcl_core:stick"}, - {"", "mcl_core:stick"} - } -}) -minetest.register_craft({ - output = "mcl_farming:hoe_gold", - recipe = { - {"mcl_core:gold_ingot", "mcl_core:gold_ingot"}, - {"mcl_core:stick", ""}, - {"mcl_core:stick", ""} - } -}) - - - -minetest.register_craft({ - type = "cooking", - output = "mcl_core:gold_nugget", - recipe = "mcl_farming:hoe_gold", - cooktime = 10, -}) - -minetest.register_tool("mcl_farming:hoe_diamond", { - description = S("Diamond Hoe"), - _tt_help = hoe_tt.."\n"..S("Uses: @1", uses.diamond), - _doc_items_longdesc = hoe_longdesc, - _doc_items_usagehelp = hoe_usagehelp, - inventory_image = "farming_tool_diamondhoe.png", - wield_scale = mcl_vars.tool_wield_scale, - on_place = hoe_on_place_function(uses.diamond), - groups = { tool=1, hoe=1, enchantability=10 }, - tool_capabilities = { - full_punch_interval = 0.25, - damage_groups = { fleshy = 1, }, - punch_attack_uses = uses.diamond, - }, - _repair_material = "mcl_core:diamond", - _mcl_toollike_wield = true, - _mcl_diggroups = { - hoey = { speed = 8, level = 5, uses = 1562 } - }, - _mcl_upgradable = true, - _mcl_upgrade_item = "mcl_farming:hoe_netherite" -}) - -minetest.register_craft({ - output = "mcl_farming:hoe_diamond", - recipe = { - {"mcl_core:diamond", "mcl_core:diamond"}, - {"", "mcl_core:stick"}, - {"", "mcl_core:stick"} - } -}) -minetest.register_craft({ - output = "mcl_farming:hoe_diamond", - recipe = { - {"mcl_core:diamond", "mcl_core:diamond"}, - {"mcl_core:stick", ""}, - {"mcl_core:stick", ""} - } -}) - -minetest.register_tool("mcl_farming:hoe_netherite", { - description = S("Netherite Hoe"), - _tt_help = hoe_tt.."\n"..S("Uses: @1", uses.netherite), - _doc_items_longdesc = hoe_longdesc, - _doc_items_usagehelp = hoe_usagehelp, - inventory_image = "farming_tool_netheritehoe.png", - wield_scale = mcl_vars.tool_wield_scale, - on_place = hoe_on_place_function(uses.netherite), - groups = { tool=1, hoe=1, enchantability=10 }, - tool_capabilities = { - full_punch_interval = 0.25, - damage_groups = { fleshy = 4, }, - punch_attack_uses = uses.netherite, - }, - _repair_material = "mcl_nether:netherite_ingot", - _mcl_toollike_wield = true, - _mcl_diggroups = { - hoey = { speed = 8, level = 5, uses = uses.netherite } - }, -}) +local S = minetest.get_translator(minetest.get_current_modname()) + +local function create_soil(pos, inv) + if pos == nil then + return false + end + local node = minetest.get_node(pos) + local name = node.name + local above = minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}) + if minetest.get_item_group(name, "cultivatable") == 2 then + if above.name == "air" then + node.name = "mcl_farming:soil" + minetest.set_node(pos, node) + minetest.sound_play("default_dig_crumbly", { pos = pos, gain = 0.5 }, true) + return true + end + elseif minetest.get_item_group(name, "cultivatable") == 1 then + if above.name == "air" then + node.name = "mcl_core:dirt" + minetest.set_node(pos, node) + minetest.sound_play("default_dig_crumbly", { pos = pos, gain = 0.6 }, true) + return true + end + end + return false +end + +local hoe_on_place_function = function(wear_divisor) + return function(itemstack, user, pointed_thing) + -- Call on_rightclick if the pointed node defines it + local node = minetest.get_node(pointed_thing.under) + if user and not user:get_player_control().sneak then + if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then + return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, user, itemstack) or itemstack + end + end + + if minetest.is_protected(pointed_thing.under, user:get_player_name()) then + minetest.record_protection_violation(pointed_thing.under, user:get_player_name()) + return itemstack + end + + if create_soil(pointed_thing.under, user:get_inventory()) then + if not minetest.is_creative_enabled(user:get_player_name()) then + itemstack:add_wear(65535/wear_divisor) + end + return itemstack + end + end +end + +local uses = { + wood = 60, + stone = 132, + iron = 251, + gold = 33, + diamond = 1562, + netherite = 2031, +} + +local hoe_tt = S("Turns block into farmland") +local hoe_longdesc = S("Hoes are essential tools for growing crops. They are used to create farmland in order to plant seeds on it. Hoes can also be used as very weak weapons in a pinch.") +local hoe_usagehelp = S("Use the hoe on a cultivatable block (by rightclicking it) to turn it into farmland. Dirt, grass blocks and grass paths are cultivatable blocks. Using a hoe on coarse dirt turns it into dirt.") + +minetest.register_tool("mcl_farming:hoe_wood", { + description = S("Wood Hoe"), + _tt_help = hoe_tt.."\n"..S("Uses: @1", uses.wood), + _doc_items_longdesc = hoe_longdesc, + _doc_items_usagehelp = hoe_usagehelp, + _doc_items_hidden = false, + inventory_image = "farming_tool_woodhoe.png", + wield_scale = mcl_vars.tool_wield_scale, + on_place = hoe_on_place_function(uses.wood), + groups = { tool=1, hoe=1, enchantability=15 }, + tool_capabilities = { + full_punch_interval = 1, + damage_groups = { fleshy = 1, }, + punch_attack_uses = uses.wood, + }, + _repair_material = "group:wood", + _mcl_toollike_wield = true, + _mcl_diggroups = { + hoey = { speed = 2, level = 1, uses = 60 } + }, +}) + +minetest.register_craft({ + output = "mcl_farming:hoe_wood", + recipe = { + {"group:wood", "group:wood"}, + {"", "mcl_core:stick"}, + {"", "mcl_core:stick"} + } +}) +minetest.register_craft({ + output = "mcl_farming:hoe_wood", + recipe = { + {"group:wood", "group:wood"}, + {"mcl_core:stick", ""}, + {"mcl_core:stick", ""} + } +}) +minetest.register_craft({ + type = "fuel", + recipe = "mcl_farming:hoe_wood", + burntime = 10, +}) + +minetest.register_tool("mcl_farming:hoe_stone", { + description = S("Stone Hoe"), + _tt_help = hoe_tt.."\n"..S("Uses: @1", uses.stone), + _doc_items_longdesc = hoe_longdesc, + _doc_items_usagehelp = hoe_usagehelp, + inventory_image = "farming_tool_stonehoe.png", + wield_scale = mcl_vars.tool_wield_scale, + on_place = hoe_on_place_function(uses.stone), + groups = { tool=1, hoe=1, enchantability=5 }, + tool_capabilities = { + full_punch_interval = 0.5, + damage_groups = { fleshy = 1, }, + punch_attack_uses = uses.stone, + }, + _repair_material = "group:cobble", + _mcl_toollike_wield = true, + _mcl_diggroups = { + hoey = { speed = 4, level = 3, uses = 132 } + }, +}) + +minetest.register_craft({ + output = "mcl_farming:hoe_stone", + recipe = { + {"group:cobble", "group:cobble"}, + {"", "mcl_core:stick"}, + {"", "mcl_core:stick"} + } +}) +minetest.register_craft({ + output = "mcl_farming:hoe_stone", + recipe = { + {"group:cobble", "group:cobble"}, + {"mcl_core:stick", ""}, + {"mcl_core:stick", ""} + } +}) + +minetest.register_tool("mcl_farming:hoe_iron", { + description = S("Iron Hoe"), + _tt_help = hoe_tt.."\n"..S("Uses: @1", uses.iron), + _doc_items_longdesc = hoe_longdesc, + _doc_items_usagehelp = hoe_usagehelp, + inventory_image = "farming_tool_steelhoe.png", + wield_scale = mcl_vars.tool_wield_scale, + on_place = hoe_on_place_function(uses.iron), + groups = { tool=1, hoe=1, enchantability=14 }, + tool_capabilities = { + -- 1/3 + full_punch_interval = 0.33333333, + damage_groups = { fleshy = 1, }, + punch_attack_uses = uses.iron, + }, + _repair_material = "mcl_core:iron_ingot", + _mcl_toollike_wield = true, + _mcl_diggroups = { + hoey = { speed = 6, level = 4, uses = 251 } + }, +}) + +minetest.register_craft({ + output = "mcl_farming:hoe_iron", + recipe = { + {"mcl_core:iron_ingot", "mcl_core:iron_ingot"}, + {"", "mcl_core:stick"}, + {"", "mcl_core:stick"} + } +}) +minetest.register_craft({ + output = "mcl_farming:hoe_iron", + recipe = { + {"mcl_core:iron_ingot", "mcl_core:iron_ingot"}, + {"mcl_core:stick", ""}, + {"mcl_core:stick", ""} + } +}) + +minetest.register_craft({ + type = "cooking", + output = "mcl_core:iron_nugget", + recipe = "mcl_farming:hoe_iron", + cooktime = 10, +}) + +minetest.register_tool("mcl_farming:hoe_gold", { + description = S("Golden Hoe"), + _tt_help = hoe_tt.."\n"..S("Uses: @1", uses.gold), + _doc_items_longdesc = hoe_longdesc, + _doc_items_usagehelp = hoe_usagehelp, + inventory_image = "farming_tool_goldhoe.png", + wield_scale = mcl_vars.tool_wield_scale, + on_place = hoe_on_place_function(uses.gold), + groups = { tool=1, hoe=1, enchantability=22 }, + tool_capabilities = { + full_punch_interval = 1, + damage_groups = { fleshy = 1, }, + punch_attack_uses = uses.gold, + }, + _repair_material = "mcl_core:gold_ingot", + _mcl_toollike_wield = true, + _mcl_diggroups = { + hoey = { speed = 12, level = 2, uses = 33 } + }, +}) + +minetest.register_craft({ + output = "mcl_farming:hoe_gold", + recipe = { + {"mcl_core:gold_ingot", "mcl_core:gold_ingot"}, + {"", "mcl_core:stick"}, + {"", "mcl_core:stick"} + } +}) +minetest.register_craft({ + output = "mcl_farming:hoe_gold", + recipe = { + {"mcl_core:gold_ingot", "mcl_core:gold_ingot"}, + {"mcl_core:stick", ""}, + {"mcl_core:stick", ""} + } +}) + + + +minetest.register_craft({ + type = "cooking", + output = "mcl_core:gold_nugget", + recipe = "mcl_farming:hoe_gold", + cooktime = 10, +}) + +minetest.register_tool("mcl_farming:hoe_diamond", { + description = S("Diamond Hoe"), + _tt_help = hoe_tt.."\n"..S("Uses: @1", uses.diamond), + _doc_items_longdesc = hoe_longdesc, + _doc_items_usagehelp = hoe_usagehelp, + inventory_image = "farming_tool_diamondhoe.png", + wield_scale = mcl_vars.tool_wield_scale, + on_place = hoe_on_place_function(uses.diamond), + groups = { tool=1, hoe=1, enchantability=10 }, + tool_capabilities = { + full_punch_interval = 0.25, + damage_groups = { fleshy = 1, }, + punch_attack_uses = uses.diamond, + }, + _repair_material = "mcl_core:diamond", + _mcl_toollike_wield = true, + _mcl_diggroups = { + hoey = { speed = 8, level = 5, uses = 1562 } + }, + _mcl_upgradable = true, + _mcl_upgrade_item = "mcl_farming:hoe_netherite" +}) + +minetest.register_craft({ + output = "mcl_farming:hoe_diamond", + recipe = { + {"mcl_core:diamond", "mcl_core:diamond"}, + {"", "mcl_core:stick"}, + {"", "mcl_core:stick"} + } +}) +minetest.register_craft({ + output = "mcl_farming:hoe_diamond", + recipe = { + {"mcl_core:diamond", "mcl_core:diamond"}, + {"mcl_core:stick", ""}, + {"mcl_core:stick", ""} + } +}) + +minetest.register_tool("mcl_farming:hoe_netherite", { + description = S("Netherite Hoe"), + _tt_help = hoe_tt.."\n"..S("Uses: @1", uses.netherite), + _doc_items_longdesc = hoe_longdesc, + _doc_items_usagehelp = hoe_usagehelp, + inventory_image = "farming_tool_netheritehoe.png", + wield_scale = mcl_vars.tool_wield_scale, + on_place = hoe_on_place_function(uses.netherite), + groups = { tool=1, hoe=1, enchantability=10 }, + tool_capabilities = { + full_punch_interval = 0.25, + damage_groups = { fleshy = 4, }, + punch_attack_uses = uses.netherite, + }, + _repair_material = "mcl_nether:netherite_ingot", + _mcl_toollike_wield = true, + _mcl_diggroups = { + hoey = { speed = 8, level = 5, uses = uses.netherite } + }, +}) diff --git a/mods/ITEMS/mcl_farming/locale/mcl_farming.zh_TW.tr b/mods/ITEMS/mcl_farming/locale/mcl_farming.zh_TW.tr new file mode 100644 index 000000000..7017f7852 --- /dev/null +++ b/mods/ITEMS/mcl_farming/locale/mcl_farming.zh_TW.tr @@ -0,0 +1,99 @@ +# textdomain: mcl_farming +Beetroot Seeds=甜菜種子 +Grows into a beetroot plant. Chickens like beetroot seeds.=長成甜菜根。雞喜歡甜菜種子。 +Place the beetroot seeds on farmland (which can be created with a hoe) to plant a beetroot plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it beetroot seeds.=將甜菜種子放在農田上(可以用鋤頭創造)種植甜菜。它們在陽光下生長,在有水分的農田上生長更快。右鍵點擊一個動物來餵牠甜菜種子。 +Premature Beetroot Plant (Stage 1)=未熟的甜菜植物(第1階段) +Beetroot plants are plants which grow on farmland under sunlight in 4 stages. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=甜菜根植物是在農田裡陽光下生長的植物,分為4個階段。在有水分的農田裡,它們生長得更快一些。它們可以在任何時候被收割,但只有在成熟時才會產生利潤。 +Premature Beetroot Plant=未熟的甜菜 +Premature Beetroot Plant (Stage 2)=未熟的甜菜(第2階段) +Premature Beetroot Plant (Stage 3)=未熟的甜菜(第3階段) +Mature Beetroot Plant=成熟的甜菜 +A mature beetroot plant is a farming plant which is ready to be harvested for a beetroot and some beetroot seeds. It won't grow any further.=成熟的甜菜是一種隨時可以收穫甜菜根和一些甜菜種子的植物。它不會再增長了。 +Beetroot=甜菜根 +Beetroots are both used as food item and a dye ingredient. Pigs like beetroots, too.=甜菜根既用作食品又用作染料成分。豬也喜歡甜菜根。 +Hold it in your hand and right-click to eat it. Rightclick an animal to feed it.=把它拿在手裡,右鍵點擊以吃掉它。右鍵點擊一個動物來餵牠。 +Beetroot Soup=甜菜根湯 +Beetroot soup is a food item.=甜菜根湯是一種食物。 +Premature Carrot Plant=成長中的胡蘿蔔 +Carrot plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=胡蘿蔔是在農田中陽光下生長的植物,分為8個階段,但只有4個階段可以從視覺上區​​分。在水分充足的農田裡,它們生長得更快一些。它們可以在任何時候收割,但只有在成熟時才會有收益。 +Premature Carrot Plant (Stage @1)=成長中的胡蘿蔔(第@1階段) +Mature Carrot Plant=成熟的胡蘿蔔 +Mature carrot plants are ready to be harvested for carrots. They won't grow any further.=成熟的胡蘿蔔是一種隨時可以收穫胡蘿蔔的植物。它不會再增長了。 +Carrot=胡蘿蔔 +Carrots can be eaten and planted. Pigs and rabbits like carrots.=胡蘿蔔既可以吃又可以種植。豬和兔子都喜款胡蘿蔔。 +Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant the carrot. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.=把它拿在手裡,右鍵點擊以吃掉它;把它放置在農田上種植它。在水分充足的農田裡,它們生長得更快一些。右鍵點擊一個動物來餵牠。 +Golden Carrot=金胡蘿蔔 +A golden carrot is a precious food item which can be eaten. It is really, really filling!=金胡蘿蔔是一種可以吃的珍貴食品。它真的非常、非常的有營養! +Hoes are essential tools for growing crops. They are used to create farmland in order to plant seeds on it. Hoes can also be used as very weak weapons in a pinch.=鋤頭是種植農作物的基本工具。它們被用來開闢農田,以便在上面種植種子。在緊要關頭,鋤頭也可以作為非常薄弱的​​武器使用。 +Use the hoe on a cultivatable block (by rightclicking it) to turn it into farmland. Dirt, grass blocks and grass paths are cultivatable blocks. Using a hoe on coarse dirt turns it into dirt.=在可耕地塊上使用鋤頭(通過右鍵點擊),將其變成農田。泥土、草塊和草路都是可耕地塊。在粗泥上使用鋤頭可以將其變成泥土。 +Wood Hoe=木鋤 +Stone Hoe=石鋤 +Iron Hoe=鐵鋤 +Golden Hoe=金鋤 +Diamond Hoe=鑽石鋤 +Melon Seeds=西瓜種子 +Grows into a melon stem which in turn grows melons. Chickens like melon seeds.=長成可長出西瓜的瓜莖。雞喜歡西瓜種子。 +Place the melon seeds on farmland (which can be created with a hoe) to plant a melon stem. Melon stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem will attempt to grow a melon at the side. Rightclick an animal to feed it melon seeds.=將西瓜種子放在農田上(可以用鋤頭打造)以種植西瓜莖。瓜莖在陽光下生長,在水分充足的農田上生長更快。成熟後,莖會試圖在邊上長出一個西瓜。右鍵點擊動物以餵食西瓜種子。 +Melon=西瓜 +A melon is a block which can be grown from melon stems, which in turn are grown from melon seeds. It can be harvested for melon slices.=西瓜是一種方塊,可以從西瓜莖中生長出來,而西瓜莖又是從西瓜種子中生長出來的。它可以收穫西瓜片。 +Premature Melon Stem=成長中的西瓜莖 +Melon stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature melon stems are able to grow melons.=西瓜莖是在農田中陽光下生長的植物,分為8個階段。在水分充足的農田裡,它們生長得更快一些。成熟的西瓜莖能夠長出西瓜。 +Premature Melon Stem (Stage @1)=成長中的西瓜莖(第@1階段) +Mature Melon Stem=成熟的西瓜莖 +A mature melon stem attempts to grow a melon at one of its four adjacent blocks. A melon can only grow on top of farmland, dirt, or a grass block. When a melon is next to a melon stem, the melon stem immediately bends and connects to the melon. While connected, a melon stem can't grow another melon. As soon all melons around the stem have been removed, it loses the connection and is ready to grow another melon.=一個成熟的西瓜莖試圖在其四個相鄰的區塊中的一個長出西瓜。西瓜只能在農田、泥土或草塊上面生長。當西瓜挨著西瓜莖時,西瓜莖會立即彎曲並與該西瓜連接。在連接時,瓜莖不能再長出另一個西瓜。一旦西瓜莖周圍的所有西瓜都被移走,它就失去了連接,並準備好長出另一個西瓜。 +Melon Slice=西瓜片 +This is a food item which can be eaten.=這是一種可以吃的食物 +Premature Potato Plant=成長中的馬鈴薯 +Potato plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=馬鈴薯是在農田中陽光下生長的植物,分為8個階段,但只有4個階段可以從視覺上區​​分。在水分充足的農田裡,它們生長得更快一些。它們可以在任何時候收割,但只有在成熟時才會有收益。 +Premature Potato Plant (Stage @1)=成長中的馬鈴薯(第@1階段) +Mature Potato Plant=成熟的馬鈴薯 +Mature potato plants are ready to be harvested for potatoes. They won't grow any further.=成熟的馬鈴薯是一種隨時可以收穫馬鈴薯的植物。它不會再增長了。 +Potato=馬鈴薯 +Potatoes are food items which can be eaten, cooked in the furnace and planted. Pigs like potatoes.=馬鈴薯是可以食用、在熔爐中烹調和種植的食品。豬喜歡馬鈴薯。 +Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant it. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.=把它拿在手裡,點擊右鍵就可以吃掉它。把它放在農田上面來種植。它在陽光下生長,在有水分的農田上生長得更快。右鍵點擊一個動物來餵牠。 +Baked Potato=烤馬鈴薯 +Baked potatoes are food items which are more filling than the unbaked ones.=烤馬鈴薯是比未烤過的馬鈴薯更有營養的食物。 +Poisonous Potato=毒馬鈴薯 +This potato doesn't look too healthy. You can eat it to restore hunger points, but there's a 60% chance it will poison you briefly.=這個馬鈴薯看起來不是很健康。你可以吃它來恢復飢餓值,但有60%的可能性會讓你短暫中毒。 +Pumpkin Seeds=南瓜種子 +Grows into a pumpkin stem which in turn grows pumpkins. Chickens like pumpkin seeds.=長成可以長出南瓜的南瓜莖。雞喜歡南瓜種子。 +Place the pumpkin seeds on farmland (which can be created with a hoe) to plant a pumpkin stem. Pumpkin stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem attempts to grow a pumpkin next to it. Rightclick an animal to feed it pumpkin seeds.=將南瓜種子放在農田上(可以用鋤頭打造)以種植南瓜莖。南瓜莖在陽光下生長,在水分充足的農田裡生長得更快。成熟後,莖會試圖在它旁邊長出一個南瓜。右鍵點擊動物以給它餵食南瓜種子。 +Premature Pumpkin Stem=成長中的南瓜莖 +Pumpkin stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature pumpkin stems are able to grow pumpkins.=南瓜莖在農田上的生長分為8個階段,在水分充足的農田裡生長得更快。成熟的南瓜莖能夠長出南瓜。 +Premature Pumpkin Stem (Stage @1)=成長中的南瓜莖(第@1階段) +Mature Pumpkin Stem=成熟的南瓜莖 +A mature pumpkin stem attempts to grow a pumpkin at one of its four adjacent blocks. A pumpkin can only grow on top of farmland, dirt or a grass block. When a pumpkin is next to a pumpkin stem, the pumpkin stem immediately bends and connects to the pumpkin. A connected pumpkin stem can't grow another pumpkin. As soon all pumpkins around the stem have been removed, it loses the connection and is ready to grow another pumpkin.=一個成熟的南瓜莖試圖在其四個相鄰的區塊之一長出一個南瓜。南瓜只能生長在農田、泥土或草塊的上面。當南瓜挨著南瓜莖時,南瓜莖會立即彎曲並連接到該南瓜上。連接的南瓜莖不能再長出另一個南瓜。只要南瓜莖周圍的所有南瓜都被移走,它就失去了連接,可以再長出一個南瓜。 +Faceless Pumpkin=南瓜 +A faceless pumpkin is a decorative block. It can be carved with shears to obtain pumpkin seeds.=南瓜是一種裝飾方塊。它可以用剪刀進行雕刻,以獲得南瓜種子。 +Pumpkin=雕刻過的南瓜 +A pumpkin can be worn as a helmet. Pumpkins grow from pumpkin stems, which in turn grow from pumpkin seeds.=南瓜可以作為頭盔佩戴。南瓜由南瓜莖生長,而南瓜莖又由南瓜種子生長。 +Jack o'Lantern=南瓜燈 +A jack o'lantern is a traditional Halloween decoration made from a pumpkin. It glows brightly.=南瓜燈是由南瓜製成的傳統萬聖節裝飾。它發出明亮的光芒。 +Pumpkin Pie=南瓜派 +A pumpkin pie is a tasty food item which can be eaten.=南瓜派是可以吃的美味食品。 +Farmland=農田 +Farmland is used for farming, a necessary surface to plant crops. It is created when a hoe is used on dirt or a similar block. Plants are able to grow on farmland, but slowly. Farmland will become hydrated farmland (on which plants grow faster) when it rains or a water source is nearby. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.=農田用於耕作,是種植農作物的必要表面。它是在泥土類方塊上使用鋤頭時形成的。植物能夠在農田上生長,但速度很慢。當下雨或附近有水源時,農田會變成濕潤的耕地(植物在上面生長更快)。當上面出現固體方塊或活塞臂延伸到上面時,這個方塊會變回泥土。 +Hydrated Farmland=濕潤的耕地 +Hydrated farmland is used in farming, this is where you can plant and grow some plants. It is created when farmland is under rain or near water. Without water, this block will dry out eventually. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.=濕潤的耕地用於耕作,這是你可以種植和生長一些植物的地方。它是在農田被雨水沖刷或靠近水的情況下形成的。如果沒有水,這個方塊最終會變乾。當上面出現固體方塊或活塞臂延伸到上面時,這個方塊會變回泥土。 +Wheat Seeds=小麥種子 +Grows into a wheat plant. Chickens like wheat seeds.=長成小麥。雞喜歡小麥種子。 +Place the wheat seeds on farmland (which can be created with a hoe) to plant a wheat plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it wheat seeds.=將小麥種子放在農田上(可以用鋤頭製造)以種植一株小麥。它們在陽光下生長,在有水的農田裡生長得更快。右鍵點擊一個動物以給它餵食小麥種子。 +Premature Wheat Plant=成長中的小麥 +Premature wheat plants grow on farmland under sunlight in 8 stages. On hydrated farmland, they grow faster. They can be harvested at any time but will only yield a profit when mature.=小麥是在農田中陽光下生長的植物,分為8個階段。在水分充足的農田裡,它們生長得更快一些。它們可以在任何時候收割,但只有在成熟時才會有收益。 +Premature Wheat Plant (Stage @1)=成長中的小麥(第@1階段) +Mature Wheat Plant=成熟的小麥 +Mature wheat plants are ready to be harvested for wheat and wheat seeds. They won't grow any further.=成熟的小麥是一種隨時可以收穫小麥的植物。它不會再增長了。 +Wheat=小麥 +Wheat is used in crafting. Some animals like wheat.=小麥主要用於合成。有些動物喜歡小麥。 +Cookie=餅乾 +Bread=面包 +Hay Bale=乾草捆 +Hay bales are decorative blocks made from wheat.=乾草捆是用小麥製成的裝飾方塊。 +To carve a face into the pumpkin, use the shears on the side you want to carve.=要在南瓜上雕刻,請將剪刀放在你要雕刻的一側。 +Use the “Place” key on an animal to try to feed it wheat.=在動物身上使用「放置」鍵以嘗試給它餵食小麥。 +Grows on farmland=在農田上生長 +Turns block into farmland=把方塊變成農田 +60% chance of poisoning=有60%的可能性會讓你中毒 +Surface for crops=種植農作物的表面 +Can become wet=可以變溼 +Uses: @1=使用:@1 diff --git a/mods/ITEMS/mcl_farming/melon.lua b/mods/ITEMS/mcl_farming/melon.lua index 91df5d919..6bbc507ec 100644 --- a/mods/ITEMS/mcl_farming/melon.lua +++ b/mods/ITEMS/mcl_farming/melon.lua @@ -7,7 +7,7 @@ minetest.register_craftitem("mcl_farming:melon_seeds", { _doc_items_longdesc = S("Grows into a melon stem which in turn grows melons. Chickens like melon seeds."), _doc_items_usagehelp = S("Place the melon seeds on farmland (which can be created with a hoe) to plant a melon stem. Melon stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem will attempt to grow a melon at the side. Rightclick an animal to feed it melon seeds."), stack_max = 64, - groups = { craftitem=1, compostability=30 }, + groups = {craftitem = 1, compostability = 30}, inventory_image = "mcl_farming_melon_seeds.png", on_place = function(itemstack, placer, pointed_thing) return mcl_farming:place_seed(itemstack, placer, pointed_thing, "mcl_farming:melontige_1") @@ -21,7 +21,10 @@ local melon_base_def = { _doc_items_longdesc = S("A melon is a block which can be grown from melon stems, which in turn are grown from melon seeds. It can be harvested for melon slices."), stack_max = 64, tiles = {"farming_melon_top.png", "farming_melon_top.png", "farming_melon_side.png", "farming_melon_side.png", "farming_melon_side.png", "farming_melon_side.png"}, - groups = {handy=1,axey=1, plant=1,building_block=1,enderman_takable=1,dig_by_piston=1, compostability=65}, + groups = { + handy = 1, axey = 1, plant = 1, building_block = 1, dig_by_piston = 1, + enderman_takable = 1, compostability = 65 + }, drop = { max_items = 1, items = { @@ -134,7 +137,7 @@ minetest.register_craftitem("mcl_farming:melon_item", { inventory_image = "farming_melon.png", on_place = minetest.item_eat(2), on_secondary_use = minetest.item_eat(2), - groups = { food = 2, eatable = 2, compostability=50 }, + groups = {food = 2, eatable = 2, compostability = 50}, _mcl_saturation = 1.2, }) diff --git a/mods/ITEMS/mcl_farming/potatoes.lua b/mods/ITEMS/mcl_farming/potatoes.lua index a4f6a4360..78532c0c0 100644 --- a/mods/ITEMS/mcl_farming/potatoes.lua +++ b/mods/ITEMS/mcl_farming/potatoes.lua @@ -91,7 +91,7 @@ minetest.register_craftitem("mcl_farming:potato_item", { _doc_items_longdesc = S("Potatoes are food items which can be eaten, cooked in the furnace and planted. Pigs like potatoes."), _doc_items_usagehelp = S("Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant it. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it."), inventory_image = "farming_potato.png", - groups = { food = 2, eatable = 1, compostability=65 }, + groups = {food = 2, eatable = 1, compostability = 65, smoker_cookable = 1}, _mcl_saturation = 0.6, stack_max = 64, on_secondary_use = minetest.item_eat(1), @@ -112,7 +112,7 @@ minetest.register_craftitem("mcl_farming:potato_item_baked", { inventory_image = "farming_potato_baked.png", on_place = minetest.item_eat(5), on_secondary_use = minetest.item_eat(5), - groups = { food = 2, eatable = 5, compostability = 85 }, + groups = {food = 2, eatable = 5, compostability = 85}, _mcl_saturation = 6.0, }) diff --git a/mods/ITEMS/mcl_farming/pumpkin.lua b/mods/ITEMS/mcl_farming/pumpkin.lua index 72d0057dc..8a3169ae3 100644 --- a/mods/ITEMS/mcl_farming/pumpkin.lua +++ b/mods/ITEMS/mcl_farming/pumpkin.lua @@ -15,7 +15,7 @@ minetest.register_craftitem("mcl_farming:pumpkin_seeds", { _doc_items_usagehelp = S("Place the pumpkin seeds on farmland (which can be created with a hoe) to plant a pumpkin stem. Pumpkin stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem attempts to grow a pumpkin next to it. Rightclick an animal to feed it pumpkin seeds."), stack_max = 64, inventory_image = "mcl_farming_pumpkin_seeds.png", - groups = { craftitem=1, compostability=30 }, + groups = {craftitem=1, compostability = 30}, on_place = function(itemstack, placer, pointed_thing) return mcl_farming:place_seed(itemstack, placer, pointed_thing, "mcl_farming:pumpkin_1") end @@ -99,13 +99,15 @@ local pumpkin_base_def = { stack_max = 64, paramtype2 = "facedir", tiles = {"farming_pumpkin_top.png", "farming_pumpkin_top.png", "farming_pumpkin_side.png"}, - groups = {handy=1,axey=1, plant=1,building_block=1, dig_by_piston=1, enderman_takable=1, compostability=65}, + groups = { + handy = 1, axey = 1, plant = 1, building_block = 1, dig_by_piston = 1, + enderman_takable = 1, compostability = 65 + }, sounds = mcl_sounds.node_sound_wood_defaults(), on_rotate = on_rotate, _mcl_blast_resistance = 1, _mcl_hardness = 1, } -minetest.register_node("mcl_farming:pumpkin", pumpkin_base_def) local pumpkin_face_base_def = table.copy(pumpkin_base_def) pumpkin_face_base_def.description = S("Pumpkin") @@ -118,9 +120,15 @@ 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_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" + +pumpkin_face_base_def.on_construct = function(pos) + -- Attempt to spawn iron golem or snow golem + mobs_mc.check_iron_golem_summon(pos) + mobs_mc.check_snow_golem_summon(pos) +end if minetest.get_modpath("mcl_armor") then local pumpkin_hud = {} @@ -175,12 +183,11 @@ end mcl_farming:add_plant("plant_pumpkin_stem", "mcl_farming:pumpkintige_unconnect", {"mcl_farming:pumpkin_1", "mcl_farming:pumpkin_2", "mcl_farming:pumpkin_3", "mcl_farming:pumpkin_4", "mcl_farming:pumpkin_5", "mcl_farming:pumpkin_6", "mcl_farming:pumpkin_7"}, 30, 5) -- Register actual pumpkin, connected stems and stem-to-pumpkin growth -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) -end) +mcl_farming:add_gourd("mcl_farming:pumpkintige_unconnect", "mcl_farming:pumpkintige_linked", "mcl_farming:pumpkintige_unconnect", stem_def, stem_drop, "mcl_farming:pumpkin", pumpkin_base_def, 30, 15, "mcl_farming_pumpkin_stem_connected.png^[colorize:#FFA800:127") + +-- Steal function to properly disconnect a carved pumpkin +pumpkin_face_base_def.after_destruct = minetest.registered_nodes["mcl_farming:pumpkin"].after_destruct +minetest.register_node("mcl_farming:pumpkin_face", pumpkin_face_base_def) -- Jack o'Lantern minetest.register_node("mcl_farming:pumpkin_face_light", { @@ -196,8 +203,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) + mobs_mc.check_iron_golem_summon(pos) + mobs_mc.check_snow_golem_summon(pos) end, on_rotate = on_rotate, _mcl_blast_resistance = 1, @@ -217,11 +224,6 @@ minetest.register_craft({ recipe = {{"mcl_farming:pumpkin"}} }) -minetest.register_craft({ - output = "mcl_farming:pumpkin_seeds 4", - recipe = {{"mcl_farming:pumpkin_face"}} -}) - minetest.register_craftitem("mcl_farming:pumpkin_pie", { description = S("Pumpkin Pie"), _doc_items_longdesc = S("A pumpkin pie is a tasty food item which can be eaten."), @@ -230,7 +232,7 @@ minetest.register_craftitem("mcl_farming:pumpkin_pie", { wield_image = "mcl_farming_pumpkin_pie.png", on_place = minetest.item_eat(8), on_secondary_use = minetest.item_eat(8), - groups = { food = 2, eatable = 8, compostability=100 }, + groups = {food = 2, eatable = 8, compostability = 100}, _mcl_saturation = 4.8, }) @@ -239,11 +241,6 @@ minetest.register_craft({ output = "mcl_farming:pumpkin_pie", recipe = {"mcl_farming:pumpkin", "mcl_core:sugar", "mcl_throwing:egg"}, }) -minetest.register_craft({ - type = "shapeless", - output = "mcl_farming:pumpkin_pie", - recipe = {"mcl_farming:pumpkin_face", "mcl_core:sugar", "mcl_throwing:egg"}, -}) if minetest.get_modpath("doc") then diff --git a/mods/ITEMS/mcl_farming/shared_functions.lua b/mods/ITEMS/mcl_farming/shared_functions.lua index 8c712f8f2..d1d230e3a 100644 --- a/mods/ITEMS/mcl_farming/shared_functions.lua +++ b/mods/ITEMS/mcl_farming/shared_functions.lua @@ -185,7 +185,7 @@ end - stem_def: Partial node definition of the fully-grown unconnected stem node. Many fields are already defined. You need to add `tiles` and `description` at minimum. Don't define on_construct without good reason - stem_drop: Drop probability table for all stem - gourd_itemstring: Desired itemstring of the full gourd node -- gourd_def: (almost) full definition of the gourd node. This function will add on_construct and after_dig_node to the definition for unconnecting any connected stems +- gourd_def: (almost) full definition of the gourd node. This function will add on_construct and after_destruct to the definition for unconnecting any connected stems - grow_interval: Will attempt to grow a gourd periodically at this interval in seconds - grow_chance: Chance of 1/grow_chance to grow a gourd next to the full unconnected stem after grow_interval has passed. Must be a natural number - connected_stem_texture: Texture of the connected stem @@ -235,8 +235,8 @@ function mcl_farming:add_gourd(full_unconnected_stem, connected_stem_basename, s end -- Register gourd - if not gourd_def.after_dig_node then - function gourd_def.after_dig_node(blockpos, oldnode, oldmetadata, user) + if not gourd_def.after_destruct then + gourd_def.after_destruct = function(blockpos, oldnode) -- Disconnect any connected stems, turning them back to normal stems for n=1, #neighbors do local offset = neighbors[n] diff --git a/mods/ITEMS/mcl_farming/soil.lua b/mods/ITEMS/mcl_farming/soil.lua index 8b31d888f..a6721cc26 100644 --- a/mods/ITEMS/mcl_farming/soil.lua +++ b/mods/ITEMS/mcl_farming/soil.lua @@ -21,7 +21,7 @@ minetest.register_node("mcl_farming:soil", { end, groups = {handy=1,shovely=1, dirtifies_below_solid=1, dirtifier=1, soil=2, soil_sapling=1, deco_block=1 }, sounds = mcl_sounds.node_sound_dirt_defaults(), - _mcl_blast_resistance = 0.5, + _mcl_blast_resistance = 0.6, _mcl_hardness = 0.6, }) diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_pumpkin_face_preview.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_pumpkin_face_preview.png deleted file mode 100644 index a151fcab6c71ab850dea5ed126d9c79f7f5d89b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3-pI!a4o{DYF2d5Z6Q?gMnd!oyKAhjm@EI zI}>z{<*Hn&*Nv1Hx;DYQNLPj@kAbh2fv>>>>>> mcl2/master } +local function shuffle_table(t) + for i = #t, 1, -1 do + local r = math.random(i) + t[i], t[r] = t[r], t[i] + end +end +shuffle_table(adjacents) + +local function has_flammable(pos) + for k,v in pairs(adjacents) do + local p=vector.add(pos,v) + local n=minetest.get_node_or_nil(p) + if n and minetest.get_item_group(n.name, "flammable") ~= 0 then + return p + end + end +end + local smoke_pdef = { amount = 0.009, maxexptime = 4.0, @@ -86,10 +114,13 @@ else eternal_fire_help = S("Eternal fire is a damaging block. Eternal fire can be extinguished by punches and nearby water blocks. Other than (normal) fire, eternal fire does not get extinguished on its own and also continues to burn under rain. Punching eternal fire is safe, but it hurts if you stand inside.") end +<<<<<<< HEAD local function fire_timer(pos) minetest.get_node_timer(pos):start(math.random(15, 45)) end +======= +>>>>>>> mcl2/master local function spawn_fire(pos, age) set_node(pos, {name="mcl_fire:fire", param2 = age}) minetest.check_single_for_falling({x=pos.x, y=pos.y+1, z=pos.z}) @@ -141,6 +172,7 @@ minetest.register_node("mcl_fire:fire", { minetest.sound_play("fire_extinguish_flame", {pos = pos, gain = 0.25, max_hear_distance = 16}, true) end end, +<<<<<<< HEAD on_timer = function(pos) local p=has_flammable(pos) if not p or minetest.get_item_group(minetest.get_node(p).name, "flammable") == -1 then @@ -149,6 +181,8 @@ minetest.register_node("mcl_fire:fire", { end return true --restart timer end, +======= +>>>>>>> mcl2/master drop = "", sounds = {}, -- Turn into eternal fire on special blocks, light Nether portal (if possible), start burning timer @@ -165,7 +199,6 @@ minetest.register_node("mcl_fire:fire", { mcl_portals.light_nether_portal(pos) end - fire_timer(pos) mcl_particles.spawn_smoke(pos, "fire", smoke_pdef) end, on_destruct = function(pos) @@ -203,7 +236,11 @@ minetest.register_node("mcl_fire:eternal_fire", { minetest.sound_play("fire_extinguish_flame", {pos = pos, gain = 0.25, max_hear_distance = 16}, true) end end, +<<<<<<< HEAD -- light Nether portal (if possible) +======= + -- Start burning timer and light Nether portal (if possible) +>>>>>>> mcl2/master on_construct = function(pos) if has_mcl_portals then --Calling directly minetest.get_modpath consumes 4x more compute time mcl_portals.light_nether_portal(pos) @@ -328,6 +365,25 @@ if flame_sound then end) end +-- [...]a fire that is not adjacent to any flammable block does not spread, even to another flammable block within the normal range. +-- https://minecraft.fandom.com/wiki/Fire#Spread + +local function check_aircube(p1,p2) + local nds=minetest.find_nodes_in_area(p1,p2,{"air"}) + shuffle_table(nds) + for k,v in pairs(nds) do + if has_flammable(v) then return v end + end +end + +-- [...] a fire block can turn any air block that is adjacent to a flammable block into a fire block. This can happen at a distance of up to one block downward, one block sideways (including diagonals), and four blocks upward of the original fire block (not the block the fire is on/next to). +local function get_ignitable(pos) + return check_aircube(vector.add(pos,vector.new(-1,-1,-1)),vector.add(pos,vector.new(1,4,1))) +end +-- Fire spreads from a still lava block similarly: any air block one above and up to one block sideways (including diagonals) or two above and two blocks sideways (including diagonals) that is adjacent to a flammable block may be turned into a fire block. +local function get_ignitable_by_lava(pos) + return check_aircube(vector.add(pos,vector.new(-1,1,-1)),vector.add(pos,vector.new(1,1,1))) or check_aircube(vector.add(pos,vector.new(-2,2,-2)),vector.add(pos,vector.new(2,2,2))) or nil +end -- -- ABMs @@ -343,12 +399,13 @@ minetest.register_abm({ chance = 1, catch_up = false, action = function(pos, node, active_object_count, active_object_count_wider) - remove_node(pos) + minetest.remove_node(pos) minetest.sound_play("fire_extinguish_flame", {pos = pos, max_hear_distance = 16, gain = 0.15}, true) end, }) +<<<<<<< HEAD --- Fire spread logic -- A fire that is not adjacent to any flammable block does not spread, even to another flammable block within the normal range. @@ -381,6 +438,8 @@ local function add_fire_particle(pos,f) }) end +======= +>>>>>>> mcl2/master -- Enable the following ABMs according to 'enable fire' setting if not fire_enabled then @@ -392,11 +451,15 @@ if not fire_enabled then interval = 10, chance = 10, catch_up = false, - action = remove_node, + action = minetest.remove_node, }) else -- Fire enabled +<<<<<<< HEAD +======= + -- Fire Spread +>>>>>>> mcl2/master minetest.register_abm({ label = "Ignite flame", nodenames ={"mcl_fire:fire","mcl_fire:eternal_fire"}, @@ -406,18 +469,29 @@ else -- Fire enabled action = function(pos) local p = get_ignitable(pos) if p then +<<<<<<< HEAD add_fire_particle(p,pos) spawn_fire(p) shuffle_adjacents() +======= + spawn_fire(p) + shuffle_table(adjacents) +>>>>>>> mcl2/master end end }) +<<<<<<< HEAD -- Set fire to air nodes minetest.register_abm({ label = "Ignite fire by lava", nodenames = {"group:lava"}, +======= + --lava fire spread + minetest.register_abm({ + label = "Ignite fire by lava", +>>>>>>> mcl2/master nodenames = {"mcl_core:lava_source","mcl_nether:nether_lava_source"}, neighbors = {"air","group:flammable"}, interval = 7, @@ -426,12 +500,16 @@ else -- Fire enabled action = function(pos) local p=get_ignitable_by_lava(pos) if p then +<<<<<<< HEAD add_fire_particle(p,pos) +======= +>>>>>>> mcl2/master spawn_fire(p) end end, }) +<<<<<<< HEAD -- Remove flammable nodes around basic flame minetest.register_abm({ label = "Remove flammable nodes", @@ -457,10 +535,53 @@ else -- Fire enabled spawn_fire(p) fire_timer(p) minetest.check_for_falling(p) +======= + minetest.register_abm({ + label = "Remove fires", + nodenames = {"mcl_fire:fire"}, + interval = 7, + chance = 3, + catch_up = false, + action = function(pos) + local p=has_flammable(pos) + if p then + local n=minetest.get_node_or_nil(p) + if n and minetest.get_item_group(n.name, "flammable") < 1 then + minetest.remove_node(pos) + end + else + minetest.remove_node(pos) +>>>>>>> mcl2/master end end }) + -- Remove flammable nodes around basic flame + minetest.register_abm({ + label = "Remove flammable nodes", + nodenames = {"mcl_fire:fire","mcl_fire:eternal_fire"}, + neighbors = {"group:flammable"}, + interval = 5, + chance = 18, + catch_up = false, + action = function(pos) + local p = has_flammable(pos) + if not p then + return + end + + local nn = minetest.get_node(p).name + local def = minetest.registered_nodes[nn] + local fgroup = minetest.get_item_group(nn, "flammable") + + if def and def._on_burn then + def._on_burn(p) + elseif fgroup ~= -1 then + spawn_fire(p) + minetest.check_for_falling(p) + end + end + }) end -- Set pointed_thing on (normal) fire. diff --git a/mods/ITEMS/mcl_fire/locale/mcl_fire.zh_TW.tr b/mods/ITEMS/mcl_fire/locale/mcl_fire.zh_TW.tr new file mode 100644 index 000000000..74394be6d --- /dev/null +++ b/mods/ITEMS/mcl_fire/locale/mcl_fire.zh_TW.tr @@ -0,0 +1,19 @@ +# textdomain: mcl_fire +Fire Charge=火焰彈 +Fire charges are primarily projectiles which can be launched from dispensers, they will fly in a straight line and burst into a fire on impact. Alternatively, they can be used to ignite fires directly.=火焰彈主要是可以從發射器中發射的投射物,它們會沿直線飛行,並在撞擊時爆裂成火。另外,它們也可以用來直接點燃火焰。 +Put the fire charge into a dispenser and supply it with redstone power to launch it. To ignite a fire directly, simply place the fire charge on the ground, which uses it up.=將火藥放入發射器中,並為其提供紅石動力以發射火藥。要直接點火,只需將火藥放在地上,這樣就能用完。 +Flint and Steel=打火機 +Flint and steel is a tool to start fires and ignite blocks.=燧石和鋼是一種用來起火和點燃木塊的工具。 +Rightclick the surface of a block to attempt to light a fire in front of it or ignite the block. A few blocks have an unique reaction when ignited.=右鍵點擊方塊的表面,可以在它面前點火或點燃方塊。有幾種方塊在被點燃時會有獨特的反應。 +Fire is a damaging and destructive but short-lived kind of block. It will destroy and spread towards near flammable blocks, but fire will disappear when there is nothing to burn left. It will be extinguished by nearby water and rain. Fire can be destroyed safely by punching it, but it is hurtful if you stand directly in it. If a fire is started above netherrack or a magma block, it will immediately turn into an eternal fire.=火是一種具有傷害性和破壞性的方塊,但持續時間很短。它將破壞並向附近的易燃區塊蔓延,但當沒有什麼可燃燒的東西時,火就會消失。它將被附近的水和雨所熄滅。火可以通過打它來安全地摧毀,但如果你直接站在它裡面,它是有傷害的。如果火是在地獄石或岩漿塊上面點燃的,它將立即變成永恆的火。 +Fire is a damaging but non-destructive short-lived kind of block. It will disappear when there is no flammable block around. Fire does not destroy blocks, at least not in this world. It will be extinguished by nearby water and rain. Fire can be destroyed safely by punching it, but it is hurtful if you stand directly in it. If a fire is started above netherrack or a magma block, it will immediately turn into an eternal fire.=火是一種具有傷害性但無破壞性的短命方塊。當周圍沒有可燃方塊的時候,它就會消失。火不會破壞方塊,至少在這個世界上不會。它將被附近的水和雨所熄滅。火可以通過打它來安全地摧毀,但如果你直接站在它裡面,它是有傷害的。如果火是在地獄石或岩漿塊上面點燃的,它將立即變成永恆的火。 +Eternal fire is a damaging block that might create more fire. It will create fire around it when flammable blocks are nearby. Eternal fire can be extinguished by punches and nearby water blocks. Other than (normal) fire, eternal fire does not get extinguished on its own and also continues to burn under rain. Punching eternal fire is safe, but it hurts if you stand inside.=永恆之火是一個具有破壞性的方塊,可能會產生更多的火。當附近有易燃塊方塊時,它將在周圍產生火焰。永恆之火可以被拳頭和附近的水所熄滅。和(普通)火不同,永恆之火不會自行熄滅,而且在雨中也會繼續燃燒。擊打永恆之火是安全的,但如果你站在裡面就會受傷。 +Eternal fire is a damaging block. Eternal fire can be extinguished by punches and nearby water blocks. Other than (normal) fire, eternal fire does not get extinguished on its own and also continues to burn under rain. Punching eternal fire is safe, but it hurts if you stand inside.=永恆之火是一種破壞性的方塊。永恆之火可以被拳頭和附近的水塊所熄滅。和(普通)火不同,永恆之火不會自行熄滅,而且在雨中也會繼續燃燒。擊打永恆之火是安全的,但如果你站在裡面就會受傷。 +@1 has been cooked crisp.=@1 被燒死了 +@1 felt the burn.=@1 被燒死了 +@1 died in the flames.=@1 在火焰中昇天 +@1 died in a fire.=@1 在火焰中昇天 +Fire=火 +Eternal Fire=永恆之火 +Dispenser projectile=發射器投射物 +Starts fires and ignites blocks=點火和點燃方塊 diff --git a/mods/ITEMS/mcl_fishing/init.lua b/mods/ITEMS/mcl_fishing/init.lua index 172b07ac3..dce2a72f6 100644 --- a/mods/ITEMS/mcl_fishing/init.lua +++ b/mods/ITEMS/mcl_fishing/init.lua @@ -111,6 +111,7 @@ local fish = function(itemstack, player, pointed_thing) { itemstring = "mcl_mobs:nametag", }, { itemstring = "mcl_mobitems:saddle", }, { itemstring = "mcl_flowers:waterlily", }, + { itemstring = "mcl_mobitems:nautilus_shell", }, }, stacks_min = 1, stacks_max = 1, @@ -125,6 +126,9 @@ local fish = function(itemstack, player, pointed_thing) local inv = player:get_inventory() if inv:room_for_item("main", item) then inv:add_item("main", item) + if item:get_name() == "mcl_mobitems:leather" then + awards.unlock(player:get_player_name(), "mcl:killCow") + end else minetest.add_item(pos, item) end diff --git a/mods/ITEMS/mcl_fishing/locale/mcl_fishing.zh_TW.tr b/mods/ITEMS/mcl_fishing/locale/mcl_fishing.zh_TW.tr new file mode 100644 index 000000000..a0710f3ab --- /dev/null +++ b/mods/ITEMS/mcl_fishing/locale/mcl_fishing.zh_TW.tr @@ -0,0 +1,18 @@ +# textdomain: mcl_fishing +Fishing Rod=釣竿 +Fishing rods can be used to catch fish.=釣竿是用來取得魚的工具。 +Rightclick to launch the bobber. When it sinks right-click again to reel in an item. Who knows what you're going to catch?=右鍵單擊以啟動浮標。當它下沉時,再次點擊右鍵來釣起一個物品。誰知道你會抓到什麼? +Raw Fish=生鱈魚 +Raw fish is obtained by fishing and is a food item which can be eaten safely. Cooking it improves its nutritional value.=生鱈魚是通過捕魚獲得的,是一種可以安全食用的食品。烹飪可以提高其營養價值。 +Cooked Fish=熟鱈魚 +Mmh, fish! This is a healthy food item.=嗯,魚! 這是一種健康的食品。 +Raw Salmon=生鮭魚 +Raw salmon is obtained by fishing and is a food item which can be eaten safely. Cooking it improves its nutritional value.=生鮭魚是通過捕魚獲得的,是一種可以安全食用的食品。烹飪可以提高其營養價值。 +Cooked Salmon=熟鮭魚 +This is a healthy food item which can be eaten.=這是一種健康的可食用食品。 +Clownfish=熱帶魚 +Clownfish may be obtained by fishing (and luck) and is a food item which can be eaten safely.=熱帶魚可以通過釣魚(和運氣)獲得,是一種可以安全食用的食物。 +Pufferfish=河豚 +Pufferfish are a common species of fish and can be obtained by fishing. They can technically be eaten, but they are very bad for humans. Eating a pufferfish only restores 1 hunger point and will poison you very badly (which drains your health non-fatally) and causes serious food poisoning (which increases your hunger).=河豚是一種常見的魚種,可以通過釣魚獲得。嚴格來說,它們可以被吃掉,但對人類非常不利。吃了河豚只能恢復1點飢餓感,而且會讓你中毒非常嚴重(非致命性地消耗你的健康),並導致嚴重的食物中毒(會增加你的飢餓感)。 +Catches fish in water=在水中取得魚 +Very poisonous=有劇毒 diff --git a/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.zh_TW.tr b/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.zh_TW.tr new file mode 100644 index 000000000..78ee96e8a --- /dev/null +++ b/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.zh_TW.tr @@ -0,0 +1,26 @@ +# textdomain: mcl_flowerpots +Dandelion Flower Pot=蒲公英盆栽 +Poppy Flower Pot=罌粟盆栽 +Blue Orchid Flower Pot=藍色蝴蝶蘭盆栽 +Allium Flower Pot=紫紅球花盆栽 +Azure Bluet Flower Pot=雛草盆栽 +Red Tulip Flower Pot=紅色鬱金香盆栽 +Pink Tulip Flower Pot=粉色鬱金香盆栽 +White Tulip Flower Pot=白色鬱金香盆栽 +Orange Tulip Flower Pot=橙色鬱金香盆栽 +Oxeye Daisy Flower Pot=雛菊盆栽 +Brown Mushroom Flower Pot=棕色蘑菇盆栽 +Red Mushroom Flower Pot=紅色蘑菇盆栽 +Oak Sapling Flower Pot=橡木樹苗盆栽 +Acacia Sapling Flower Pot=相思木樹苗盆栽 +Jungle Sapling Flower Pot=叢林木樹苗盆栽 +Dark Oak Sapling Flower Pot=黑橡木樹苗盆栽 +Spruce Sapling Flower Pot=杉木樹苗盆栽 +Birch Sapling Flower Pot=樺木樹苗盆栽 +Dead Bush Flower Pot=枯灌木盆栽 +Fern Flower Pot=蕨盆栽 +Cactus Flower Pot=仙人掌盆栽 +Flower Pot=花盆 +Flower pots are decorative blocks in which flowers and other small plants can be placed.=花盆是可以放置鮮花和其他小植物的裝飾方塊。 +Just place a plant on the flower pot. Flower pots can hold small flowers (not higher than 1 block), saplings, ferns, dead bushes, mushrooms and cacti. Rightclick a potted plant to retrieve the plant.=只需在花盆上放置一株植物即可。花盆可以放置小花(不高於1格)、樹苗、蕨類植物、枯樹叢、蘑菇和仙人掌。右鍵點擊盆栽即可取回植物。 +Can hold a small flower or plant=放置鮮花和其他小植物 diff --git a/mods/ITEMS/mcl_flowers/init.lua b/mods/ITEMS/mcl_flowers/init.lua index 9c04ebcf5..8bbc1f554 100644 --- a/mods/ITEMS/mcl_flowers/init.lua +++ b/mods/ITEMS/mcl_flowers/init.lua @@ -80,7 +80,17 @@ function mcl_flowers.register_simple_flower(name, def) walkable = false, stack_max = 64, drop = def.drop, +<<<<<<< HEAD groups = {dig_immediate=3,flammable=2,fire_encouragement=60,fire_flammability=100,plant=1,flower=1,place_flowerlike=1,non_mycelium_plant=1,attached_node=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1,enderman_takable=1,deco_block=1, compostability=65}, +======= + groups = { + attached_node = 1, deco_block = 1, dig_by_piston = 1, dig_immediate = 3, + dig_by_water = 1, destroy_by_lava_flow = 1, enderman_takable = 1, + plant = 1, flower = 1, place_flowerlike = 1, non_mycelium_plant = 1, + flammable = 2, fire_encouragement = 60, fire_flammability = 100, + compostability = 65 + }, +>>>>>>> mcl2/master sounds = mcl_sounds.node_sound_leaves_defaults(), node_placement_prediction = "", on_place = on_place_flower, @@ -143,7 +153,16 @@ local def_tallgrass = { walkable = false, buildable_to = true, is_ground_content = true, +<<<<<<< HEAD groups = {handy=1,shearsy=1, flammable=3,fire_encouragement=60,fire_flammability=100,attached_node=1,plant=1,place_flowerlike=2,non_mycelium_plant=1,dig_by_water=1,destroy_by_lava_flow=1,deco_block=1, compostability=30}, +======= + groups = { + handy = 1, shearsy = 1, attached_node = 1, deco_block = 1, + plant = 1, place_flowerlike = 2, non_mycelium_plant = 1, + flammable = 3, fire_encouragement = 60, fire_flammability = 100, + dig_by_water = 1, destroy_by_lava_flow = 1, compostability = 30 + }, +>>>>>>> mcl2/master sounds = mcl_sounds.node_sound_leaves_defaults(), drop = wheat_seed_drop, _mcl_shears_drop = true, @@ -168,6 +187,7 @@ def_fern.selection_box = { type = "fixed", fixed = { -6/16, -0.5, -6/16, 6/16, 5/16, 6/16 }, } +def_fern.groups.compostability = 65 minetest.register_node("mcl_flowers:fern", def_fern) @@ -188,7 +208,15 @@ local function add_large_plant(name, desc, longdesc, bottom_img, top_img, inv_im is_flower = true end - local bottom_groups = {flammable=2, fire_encouragement=60, fire_flammability=100, non_mycelium_plant=1, attached_node=1, dig_by_water=1, destroy_by_lava_flow=1, dig_by_piston=1, plant=1, double_plant=1, deco_block=1} + local bottom_groups = { + attached_node = 1, deco_block = 1, + dig_by_water = 1, destroy_by_lava_flow = 1, dig_by_piston = 1, + flammable = 2, fire_encouragement = 60, fire_flammability = 100, + plant = 1, double_plant = 1, non_mycelium_plant = 1, compostability = 65 + } + if name == "double_grass" then + bottom_groups.compostability = 50 + end if is_flower then bottom_groups.flower = 1 bottom_groups.place_flowerlike = 1 @@ -374,8 +402,8 @@ add_large_plant("sunflower", S("Sunflower"), S("A sunflower is a large plant whi local longdesc_grass = S("Double tallgrass a variant of tall grass and occupies two blocks. It can be harvested for wheat seeds.") local longdesc_fern = S("Large fern is a variant of fern and occupies two blocks. It can be harvested for wheat seeds.") -add_large_plant("double_grass", S("Double Tallgrass"), longdesc_grass, "mcl_flowers_double_plant_grass_bottom.png", "mcl_flowers_double_plant_grass_top.png", "mcl_flowers_double_plant_grass_inv.png", 6/16, 4/16, wheat_seed_drop, {"mcl_flowers:tallgrass 2"}, false, true, nil, fortune_wheat_seed_drop) -add_large_plant("double_fern", S("Large Fern"), longdesc_fern, "mcl_flowers_double_plant_fern_bottom.png", "mcl_flowers_double_plant_fern_top.png", "mcl_flowers_double_plant_fern_inv.png", 5/16, 5/16, wheat_seed_drop, {"mcl_flowers:fern 2"}, false, true, nil, fortune_wheat_seed_drop) +add_large_plant("double_grass", S("Double Tallgrass"), longdesc_grass, "mcl_flowers_double_plant_grass_bottom.png", "mcl_flowers_double_plant_grass_top.png", "mcl_flowers_double_plant_grass_inv.png", 6/16, 4/16, wheat_seed_drop, {"mcl_flowers:tallgrass 2"}, false, true, fortune_wheat_seed_drop) +add_large_plant("double_fern", S("Large Fern"), longdesc_fern, "mcl_flowers_double_plant_fern_bottom.png", "mcl_flowers_double_plant_fern_top.png", "mcl_flowers_double_plant_fern_inv.png", 5/16, 5/16, wheat_seed_drop, {"mcl_flowers:fern 2"}, false, true, fortune_wheat_seed_drop) minetest.register_abm({ label = "Pop out flowers", @@ -418,7 +446,14 @@ minetest.register_node("mcl_flowers:waterlily", { liquids_pointable = true, walkable = true, sunlight_propagates = true, +<<<<<<< HEAD groups = {dig_immediate = 3, plant=1, dig_by_water = 1,destroy_by_lava_flow=1, dig_by_piston = 1, deco_block=1, dig_by_boat=1, compostability=65}, +======= + groups = { + deco_block = 1, plant = 1, compostability = 65, destroy_by_lava_flow = 1, + dig_immediate = 3, dig_by_water = 1, dig_by_piston = 1, dig_by_boat = 1, + }, +>>>>>>> mcl2/master sounds = mcl_sounds.node_sound_leaves_defaults(), node_placement_prediction = "", node_box = { diff --git a/mods/ITEMS/mcl_flowers/locale/mcl_flowers.zh_TW.tr b/mods/ITEMS/mcl_flowers/locale/mcl_flowers.zh_TW.tr new file mode 100644 index 000000000..b8fb0cbe4 --- /dev/null +++ b/mods/ITEMS/mcl_flowers/locale/mcl_flowers.zh_TW.tr @@ -0,0 +1,32 @@ +# textdomain: mcl_flowers +This is a small flower. Small flowers are mainly used for dye production and can also be potted.= +It can only be placed on a block on which it would also survive.= +Poppy=罌粟 +Dandelion=蒲公英 +Oxeye Daisy=雛菊 +Orange Tulip=橙色鬱金香 +Pink Tulip=粉紅色鬱金香 +Red Tulip=紅色鬱金香 +White Tulip=白色鬱金香 +Allium=紫紅球花 +Azure Bluet=藍花美耳草 +Blue Orchid=藍色蝴蝶蘭 +Tall Grass=草 +Tall grass is a small plant which often occurs on the surface of grasslands. It can be harvested for wheat seeds. By using bone meal, tall grass can be turned into double tallgrass which is two blocks high.=草是一種小植物,經常出現在草原的表面。它可以收穫小麥的種子。通過使用骨粉,高草可以變成兩塊高的芒草。 +Fern=蕨 +Ferns are small plants which occur naturally in jungles and taigas. They can be harvested for wheat seeds. By using bone meal, a fern can be turned into a large fern which is two blocks high.=蕨是自然存在於叢林和台地的小型植物。它們可以被收割為小麥種子。通過使用骨粉,可以把蕨變成兩塊高的高蕨。 +(Top Part)=(上部分) +Peony=牡丹花 +A peony is a large plant which occupies two blocks. It is mainly used in dye production.=牡丹花是一種大型植物,共有兩格高。它主要用於染料生產。 +Rose Bush=玫瑰叢 +A rose bush is a large plant which occupies two blocks. It is safe to touch it. Rose bushes are mainly used in dye production.=玫瑰叢是一種大型植物,共有兩格高。觸摸它是安全的。玫瑰叢主要用於染料生產。 +Lilac=紫丁香 +A lilac is a large plant which occupies two blocks. It is mainly used in dye production.=紫丁香是一種大型植物,共有兩格高。它主要用於染料生產。 +Sunflower=向日葵 +A sunflower is a large plant which occupies two blocks. It is mainly used in dye production.=向日葵是一種大型植物,共有兩格高。它主要用於染料生產。 +Double tallgrass a variant of tall grass and occupies two blocks. It can be harvested for wheat seeds.=芒草是草的兩格高變種。可以收割小麥種子。 +Large fern is a variant of fern and occupies two blocks. It can be harvested for wheat seeds.=高蕨是蕨的兩格高變種。可以收割小麥種子。 +Double Tallgrass=芒草 +Large Fern=高蕨 +Lily Pad=荷葉 +A lily pad is a flat plant block which can be walked on. They can be placed on water sources, ice and frosted ice.=荷葉是一種平坦的植物方塊,可以在上面行走。它們可以放在水源、冰面和結霜的冰面上。 diff --git a/mods/ITEMS/mcl_furnaces/init.lua b/mods/ITEMS/mcl_furnaces/init.lua index 81bef41f7..f21c5a714 100644 --- a/mods/ITEMS/mcl_furnaces/init.lua +++ b/mods/ITEMS/mcl_furnaces/init.lua @@ -523,9 +523,9 @@ minetest.register_node("mcl_furnaces:furnace_active", { minetest.register_craft({ output = "mcl_furnaces:furnace", recipe = { - { "mcl_core:cobble", "mcl_core:cobble", "mcl_core:cobble" }, - { "mcl_core:cobble", "", "mcl_core:cobble" }, - { "mcl_core:cobble", "mcl_core:cobble", "mcl_core:cobble" }, + { "group:cobble", "group:cobble", "group:cobble" }, + { "group:cobble", "", "group:cobble" }, + { "group:cobble", "group:cobble", "group:cobble" }, } }) diff --git a/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.zh_TW.tr b/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.zh_TW.tr new file mode 100644 index 000000000..447fb835c --- /dev/null +++ b/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.zh_TW.tr @@ -0,0 +1,9 @@ +# textdomain: mcl_furnaces +Furnace=熔爐 +Furnaces cook or smelt several items, using a furnace fuel, into something else.=熔爐用一種爐子燃料將幾種物品烹飪或熔煉成其他東西。 +Use the furnace to open the furnace menu. Place a furnace fuel in the lower slot and the source material in the upper slot. The furnace will slowly use its fuel to smelt the item. The result will be placed into the output slot at the right side.=使用熔爐打開爐子菜單。將熔爐燃料放在下槽,將源材料放在上槽。熔爐將慢慢地使用它的燃料來熔煉或烹飪物品。其結果將被放入右側的輸出槽中。 +Use the recipe book to see what you can smelt, what you can use as fuel and how long it will burn.=使用合成教學來查看您可以冶煉的東西,可以用作燃料的物品以及可燃燒時間。 +Burning Furnace=燃燒的熔爐 +Recipe book=合成教學 +Inventory=物品欄 +Uses fuel to smelt or cook items=使用燃料來熔煉或烹飪物品 diff --git a/mods/ITEMS/mcl_grindstone/init.lua b/mods/ITEMS/mcl_grindstone/init.lua new file mode 100644 index 000000000..f373070cd --- /dev/null +++ b/mods/ITEMS/mcl_grindstone/init.lua @@ -0,0 +1,39 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +minetest.register_node("mcl_grindstone:grindstone", { + description = S("Grindstone"), + _tt_help = S("Used to disenchant/fix tools"), + _doc_items_longdesc = S("This is currently a decorative block which serves as the weapon smith's work station. In minecraft this is used to disenchant/fix tools howerver this has not yet been implemented"), + tiles = { + "grindstone_top.png", + "grindstone_top.png", + "grindstone_side.png", + "grindstone_side.png", + "grindstone_front.png", + "grindstone_front.png" + }, + drawtype = "nodebox", + paramtype2 = "facedir", + node_box = { + type = "fixed", + -- created with nodebox editor + fixed = { + {-0.25, -0.25, -0.375, 0.25, 0.5, 0.375}, + {-0.375, -0.0625, -0.1875, -0.25, 0.3125, 0.1875}, + {0.25, -0.0625, -0.1875, 0.375, 0.3125, 0.1875}, + {0.25, -0.5, -0.125, 0.375, -0.0625, 0.125}, + {-0.375, -0.5, -0.125, -0.25, -0.0625, 0.125}, + } + }, + groups = {pickaxey = 1, deco_block = 1}, + _mcl_blast_resistance = 6, + _mcl_hardness = 2 +}) + +minetest.register_craft({ + output = "mcl_grindstone:grindstone", + recipe = { + { "mcl_core:stick", "mcl_stairs:slab_stone_rough", "mcl_core:stick"}, + { "group:wood", "", "group:wood"}, + } +}) \ No newline at end of file diff --git a/mods/ITEMS/mcl_grindstone/mod.conf b/mods/ITEMS/mcl_grindstone/mod.conf new file mode 100644 index 000000000..154de013f --- /dev/null +++ b/mods/ITEMS/mcl_grindstone/mod.conf @@ -0,0 +1,3 @@ +name = mcl_grindstone +author = TheRandomLegoBrick +description = Adds a cool looking block for the weaponsmiths jobsite \ No newline at end of file diff --git a/mods/ITEMS/mcl_grindstone/textures/grindstone_front.png b/mods/ITEMS/mcl_grindstone/textures/grindstone_front.png new file mode 100644 index 0000000000000000000000000000000000000000..ec72b0470dec597fb74b9d59468e9e96de59dc8b GIT binary patch literal 420 zcmV;V0bBlwP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0Xa!TK~y+TeNjzL zgFqNX?R0>KPzrUShwuU{Jb){g?mU54@-SS(g)ud1p-3nQVS%r{uLD8j%NOR&oA><; zbJF*{bwrXRd7kh0d#yFLMNvdi6a+yW$20(^vX0O+4Zcb#ZYP)~pggLAbY18BKE*L4 z;qK-d;dvgnK-;z$2?XN9{VjsJBrF!rdc7h?ZCc68vaIW`?RH0H7zrxAya0iba1(T> zs>2Z>36Kyd299AU{)wRjrZRUh*GIvDGCHsb~)Ve_7ql{k!*v!Tk< z^DBa)Bxp5L>I@_Cz09kjAw)e_2r81`xK6kVK=5!d;crq0(81R8%ZqbvXIxxIXW8e~ z52%ds7%pEnZ{*SeZr8QRe*U#Js6BsuzB>aOgTp|w4vc3Tf=Yve*jk@vx O0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0X0cPK~y+TZIUrg z!$1&47lfU7BSV}Jpyw9I5)}mn1r-e~H%ktH=#h|o0Uv;ZhQc8@lCgtuVV*pjjamFP z8jt_(%%2&1uW1^kRGOwmQG{Vg+=Y;M;y8}+CLu|ZJkRU8CiXlJZvhDtMUf=z3oH0( zQI;i_EX>&!2l7BS%QD~hU!LZ|RMkd;>$?ZM?e>oX;NEiiiIwFB6A~R61MCuL#zacZ zW)nG8n#f}uY?GJV4Ltd(zh(n1G=Npy%O=ez}^RWQFs7q?dz zS`Vx08^3sbHtZJe41jz1>2xfw4tf#*~&YBZ{WA^v!I$9#Gf!9l~m(F|s z(9C!8vdl>;mGiV2%(TALp1)igyHoob)1}Fx$uh?+`bsU1bL3tB{IsNJk%u17VFzys znNOVzbMv>jQ<*;r0Q=&#f9R&zUc`Fm|jmdKI;Vst0OB=*5dZ)H literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_heads/init.lua b/mods/ITEMS/mcl_heads/init.lua index 78356de71..c14079393 100644 --- a/mods/ITEMS/mcl_heads/init.lua +++ b/mods/ITEMS/mcl_heads/init.lua @@ -113,7 +113,6 @@ local function addhead(name, texture, desc, longdesc, rangemob, rangefactor) _mcl_armor_mob_range_factor = rangefactor, _mcl_armor_element = "head", _mcl_armor_texture = "mcl_heads_" .. name .. ".png", - _mcl_armor_preview = "mcl_heads_" .. name .. "_preview.png", _mcl_blast_resistance = 1, _mcl_hardness = 1, }) diff --git a/mods/ITEMS/mcl_heads/locale/mcl_heads.zh_TW.tr b/mods/ITEMS/mcl_heads/locale/mcl_heads.zh_TW.tr new file mode 100644 index 000000000..3164d3831 --- /dev/null +++ b/mods/ITEMS/mcl_heads/locale/mcl_heads.zh_TW.tr @@ -0,0 +1,11 @@ +# textdomain: mcl_heads +Zombie Head=殭屍頭 +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%.=殭屍頭是一個小的裝飾方塊,類似於殭屍的頭。它也可以作為頭盔佩戴,可以使殭屍的探測範圍減少50%。 +Creeper Head=苦力怕頭 +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%.=苦力怕頭是一個小的裝飾方塊,類似於苦力怕的頭。它也可以作為頭盔佩戴,可以使苦力怕的探測範圍減少50%。 +Human Head=玩家頭 +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.=玩家頭是一個小的裝飾塊,類似於玩家的頭部。它也可以作為頭盔戴著玩,但不提供任何保護。 +Skeleton Skull=骷髏頭 +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%.=骷髏頭是一個小的裝飾方塊,類似於骷髏的頭。它也可以作為頭盔佩戴,可以使骷髏的探測範圍減少50%。 +Wither Skeleton Skull=凋零骷髏頭 +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_heads/textures/mcl_heads_creeper_preview.png b/mods/ITEMS/mcl_heads/textures/mcl_heads_creeper_preview.png deleted file mode 100644 index 120f0b53e1a9b7294cf8841fab82c3b994e67a88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!VDx|E`RzTNJ#|vgt!9fw3&f!8Rnri4jDo2 zfp(@XyE4k-f+|FQ-vi1qmIV0)GdMiEkp|>gd%8G=R4^tdBnX66;PvBWGWO}|Z9Tx_dNo1R;IO4h2|z3Kw}s@UHx3v IIVCg!09H9GT>t<8 diff --git a/mods/ITEMS/mcl_heads/textures/mcl_heads_skeleton_preview.png b/mods/ITEMS/mcl_heads/textures/mcl_heads_skeleton_preview.png deleted file mode 100644 index 70d6d5cabbb27277c3baebf84e4f444fd3f29227..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!VDx|E`RzTNC^e_gt!9f+S=N_zP|bM=UZ7= zBqt{yby$=M6lE+4@(X5gcy=QV$g%KraSW+oOioA;5DE!PVPH&5baggx_PiLtamb*_ zYo^6)i)P7F%MN-av~_iN3(rtolC$K5K@KAWTOzCeCL;!GpcxFFu6{1-oD!M%0FUEE2gkNVZien-Y|Gw1yx#{jgu&C* K&t;ucLK6V%1TXLa diff --git a/mods/ITEMS/mcl_heads/textures/mcl_heads_wither_skeleton_preview.png b/mods/ITEMS/mcl_heads/textures/mcl_heads_wither_skeleton_preview.png deleted file mode 100644 index dbc9b3629f9ebe4a97ba779b49c154ca44a4677e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!VDx|E`RzTNC^e_gt!7}BO@a-Gc#*zYehvx z9UUF(^1>vbC}T;GUoeBivm0qZj)kX-V@L&KazcWDP)Jw`17l*MtFwW#=fwbyLk3M= zGc9IYG)taZcF-%Kt*g6Rc!uJVoFyj=au^xd5?S>(88KJ`&0z3!^>bP0l+XkK+d3%M diff --git a/mods/ITEMS/mcl_heads/textures/mcl_heads_zombie_preview.png b/mods/ITEMS/mcl_heads/textures/mcl_heads_zombie_preview.png deleted file mode 100644 index ff1e0b26c650e9ccbd3ebd903faaf4c4709e1767..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!VDx|E`RzTNJ#|vgt!7}gAj9v440J2DdA1w z(H+q;>aqdO2DMwGcL3!WOM?7@862M7NCR@rJzX3_Dj1U!5(I=ogi;t7T~&ou4V+J0 zy~%kdz>u@i;7ZV)NeW8uR0RYT)x}*6oCP=}+H@HhUe9IYQgr5?1T=!d)78&qol`;+ E08C^lh5!Hn diff --git a/mods/ITEMS/mcl_hoppers/init.lua b/mods/ITEMS/mcl_hoppers/init.lua index 36a21ad95..87831490f 100644 --- a/mods/ITEMS/mcl_hoppers/init.lua +++ b/mods/ITEMS/mcl_hoppers/init.lua @@ -343,7 +343,7 @@ minetest.register_abm({ local abovenode = minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}) if not minetest.registered_items[abovenode.name] then return end -- Don't bother checking item enties if node above is a container (should save some CPU) - if minetest.registered_items[abovenode.name].groups.container then + if minetest.get_item_group(abovenode.name, "container") ~= 0 then return end local meta = minetest.get_meta(pos) @@ -397,7 +397,7 @@ minetest.register_abm({ -- Suck an item from the container above into the hopper local upnode = minetest.get_node(uppos) if not minetest.registered_nodes[upnode.name] then return end - local g = minetest.registered_nodes[upnode.name].groups.container + local g = minetest.get_item_group(upnode.name, "container") local sucked = mcl_util.move_item_container(uppos, pos) -- Also suck in non-fuel items from furnace fuel slot @@ -442,7 +442,7 @@ minetest.register_abm({ -- Suck an item from the container above into the hopper local abovenode = minetest.get_node(above) if not minetest.registered_nodes[abovenode.name] then return end - local g = minetest.registered_nodes[abovenode.name].groups.container + local g = minetest.get_item_group(abovenode.name, "container") local sucked = mcl_util.move_item_container(above, pos) -- Also suck in non-fuel items from furnace fuel slot @@ -454,7 +454,7 @@ minetest.register_abm({ end -- Move an item from the hopper into the container to which the hopper points to - local g = minetest.registered_nodes[frontnode.name].groups.container + local g = minetest.get_item_group(frontnode.name, "container") if g == 2 or g == 3 or g == 5 or g == 6 then mcl_util.move_item_container(pos, front) elseif g == 4 then diff --git a/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.zh_TW.tr b/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.zh_TW.tr new file mode 100644 index 000000000..f3e8be8ab --- /dev/null +++ b/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.zh_TW.tr @@ -0,0 +1,16 @@ +# textdomain: mcl_hoppers +Hopper=漏斗 +Hoppers are containers with 5 inventory slots. They collect dropped items from above, take items from a container above and attempt to put its items it into an adjacent container. Hoppers can go either downwards or sideways. Hoppers interact with chests, droppers, dispensers, shulker boxes, furnaces and hoppers.=漏斗是有5個物品槽的容器。它們從上面收集掉落的物品,從上面的容器中取出物品,並試圖把它的物品放到鄰近的容器中。漏斗可以向下或向側面移動。漏斗與箱子、投擲器、發射器、界伏盒、熔爐和漏斗相互作用。 +Hoppers interact with containers the following way:=漏斗會對容器做以下事情: +• Furnaces: Hoppers from above will put items into the source slot. Hoppers from below take items from the output slot. They also take items from the fuel slot when they can't be used as a fuel. Sideway hoppers that point to the furnace put items into the fuel slot=• 熔爐:從上面的漏斗會將物品放入源料槽。下方的漏斗從輸出槽中取出物品。當物品不能作為燃料使用時,它們也會從燃料槽中取出物品。指向熔爐的側邊漏斗將物品放入燃料槽。 +• Ender chests: No interaction.=• 終界箱:不會有任何動作。 +• Other containers: Normal interaction.=• 其他容器:正常動作。 +Hoppers can be disabled when supplied with redstone power. Disabled hoppers don't move items.=供給紅石電源時,可以禁用漏斗。被禁用的漏斗不會移動物品。 +To place a hopper vertically, place it on the floor or a ceiling. To place it sideways, place it at the side of a block. Use the hopper to access its inventory.=要垂直放置漏斗,可將其放在地板或天花板上。要想把它放在側面,就把它放在一個方塊的側面。使用漏斗來訪問其庫存。 +Disabled Hopper=被禁用的漏斗 +Side Hopper=側面漏斗 +Disabled Side Hopper=被禁用的側面漏斗 +Inventory=物品欄 +5 inventory slots=5個物品槽 +Collects items from above, moves items to container below=從上面收集物品,並把物品放到下面的容器中 +Can be disabled with redstone power=可被紅石電源禁用 diff --git a/mods/ITEMS/mcl_itemframes/init.lua b/mods/ITEMS/mcl_itemframes/init.lua index eb20719b4..eded95b7f 100644 --- a/mods/ITEMS/mcl_itemframes/init.lua +++ b/mods/ITEMS/mcl_itemframes/init.lua @@ -61,6 +61,7 @@ for v=1, #vari do end, }) +<<<<<<< HEAD minetest.register_entity(var[2], { initial_properties = { visual = "upright_sprite", @@ -81,6 +82,28 @@ for v=1, #vari do return self.id end, }) +======= +minetest.register_entity("mcl_itemframes:map", { + initial_properties = { + visual = "upright_sprite", + visual_size = {x = 1, y = 1}, + pointable = false, + physical = false, + collide_with_objects = false, + textures = {"blank.png"}, + }, + on_activate = function(self, staticdata) + self.id = staticdata + mcl_maps.load_map(self.id, function(texture) + -- will not crash even if self.object is invalid by now + self.object:set_properties({textures = {texture}}) + end) + end, + get_staticdata = function(self) + return self.id + end, +}) +>>>>>>> mcl2/master local facedir = {} @@ -208,6 +231,7 @@ for v=1, #vari do end end +<<<<<<< HEAD return minetest.item_place(itemstack, placer, pointed_thing, minetest.dir_to_facedir(vector.direction(pointed_thing.above, pointed_thing.under))) end, on_construct = function(pos) @@ -312,6 +336,50 @@ for v=1, #vari do end end, }) +======= + return minetest.item_place(itemstack, placer, pointed_thing, minetest.dir_to_facedir(vector.direction(pointed_thing.above, pointed_thing.under))) + end, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("main", 1) + end, + on_rightclick = function(pos, node, clicker, itemstack) + if not itemstack then + return + end + local pname = clicker:get_player_name() + if minetest.is_protected(pos, pname) then + minetest.record_protection_violation(pos, pname) + return + end + local meta = minetest.get_meta(pos) + drop_item(pos, node, meta, clicker) + local inv = meta:get_inventory() + if itemstack:is_empty() then + remove_item_entity(pos, node) + meta:set_string("infotext", "") + inv:set_stack("main", 1, "") + return itemstack + end + local put_itemstack = ItemStack(itemstack) + put_itemstack:set_count(1) + local itemname = put_itemstack:get_name() + if minetest.get_item_group(itemname, "compass") > 0 then + put_itemstack:set_name(mcl_compass.get_compass_itemname(pos, minetest.dir_to_yaw(minetest.facedir_to_dir(node.param2)), put_itemstack)) + end + if minetest.get_item_group(itemname, "clock") > 0 then + minetest.get_node_timer(pos):start(1.0) + end + inv:set_stack("main", 1, put_itemstack) + update_item_entity(pos, node) + -- Add node infotext when item has been named + local imeta = itemstack:get_meta() + local iname = imeta:get_string("name") + if iname then + meta:set_string("infotext", iname) + end +>>>>>>> mcl2/master minetest.register_lbm({ label = "Update legacy item frames", diff --git a/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.zh_TW.tr b/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.zh_TW.tr new file mode 100644 index 000000000..d45c14d74 --- /dev/null +++ b/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.zh_TW.tr @@ -0,0 +1,5 @@ +# textdomain: mcl_itemframes +Item Frame=物品展示框 +Item frames are decorative blocks in which items can be placed.=物品展示框是可以展示物品的裝飾方塊。 +Just place any item on the item frame. Use the item frame again to retrieve the item.=只需將物品放在物品展示框上即可。再次使用物品展示框來提出物品。 +Can hold an item=可以展示物品 diff --git a/mods/ITEMS/mcl_jukebox/locale/mcl_jukebox.zh_TW.tr b/mods/ITEMS/mcl_jukebox/locale/mcl_jukebox.zh_TW.tr new file mode 100644 index 000000000..ba48ae9de --- /dev/null +++ b/mods/ITEMS/mcl_jukebox/locale/mcl_jukebox.zh_TW.tr @@ -0,0 +1,10 @@ +# textdomain: mcl_jukebox +Music Disc=唱片 +A music disc holds a single music track which can be used in a jukebox to play music.=一張唱片可容納單一的音樂曲目,可在唱片機中用於播放音樂。 +Place a music disc into an empty jukebox to play the music. Use the jukebox again to retrieve the music disc. The music can only be heard by you, not by other players.=將唱片放入空的唱片機中播放音樂。再次使用唱片機取出唱片。音樂只能由您自己聽,而不能由其他玩家聽。 +@1—@2= +Jukebox=唱片機 +Jukeboxes play music when they're supplied with a music disc.=唱片機在提供唱片的情况下播放音樂。 +Place a music disc into an empty jukebox to insert the music disc and play music. If the jukebox already has a music disc, you will retrieve this music disc first. The music can only be heard by you, not by other players.=將音樂光盤放入空的點唱機,插入音樂光盤並播放音樂。如果點唱機已經有一張音樂光盤,你要先取回這張音樂光盤。音樂只能被你聽到,不能被其他玩家聽到。 +Now playing: @1—@2=正在播放:@1—@2 +Uses music discs to play music=使用唱片播放音樂 diff --git a/mods/ITEMS/mcl_lanterns/init.lua b/mods/ITEMS/mcl_lanterns/init.lua index 8f99ea151..576dbdcf1 100644 --- a/mods/ITEMS/mcl_lanterns/init.lua +++ b/mods/ITEMS/mcl_lanterns/init.lua @@ -1,5 +1,10 @@ +<<<<<<< HEAD local S = minetest.get_translator(minetest.get_current_modname()) local modpath = minetest.get_modpath(minetest.get_current_modname()) +======= +local S = minetest.get_translator("mcl_lanterns") +local modpath = minetest.get_modpath("mcl_lanterns") +>>>>>>> mcl2/master mcl_lanterns = {} @@ -9,6 +14,84 @@ TODO: - remove the hack arround walmounted nodes ]] +<<<<<<< HEAD +======= +local allowed_non_solid_nodes_floor = { + "mcl_core:ice", + "mcl_nether:soul_sand", + "mcl_mobspawners:spawner", + "mcl_core:barrier", + "mcl_end:chorus_flower", + "mcl_end:chorus_flower_dead", + "mcl_end:end_rod", + "mcl_end:dragon_egg", + "mcl_portals:end_portal_frame_eye", + "mcl_lanterns:chain" +} + +local allowed_non_solid_groups_floor = {"anvil", "wall", "glass", "fence", "fence_gate", "pane"} + +local allowed_non_solid_nodes_ceiling = { + "mcl_core:ice", + "mcl_nether:soul_sand", + "mcl_mobspawners:spawner", + "mcl_core:barrier", + "mcl_end:chorus_flower", + "mcl_end:chorus_flower_dead", + "mcl_end:end_rod", + "mcl_core:grass_path", + "mcl_lanterns:chain" +} + +local allowed_non_solid_groups_ceiling = {"anvil", "wall", "glass", "fence", "fence_gate", "soil", "pane", "end_portal_frame"} + +local function check_placement(node, wdir) + local nn = node.name + local def = minetest.registered_nodes[nn] + + if not def then + return false + else + --wdir: + --0: ceiling + --1: floor + if wdir == 0 then + if def.groups.solid or def.groups.opaque then + return true + else + for _,i in ipairs(allowed_non_solid_nodes_ceiling) do + if nn == i then + return true + end + end + for _,j in ipairs(allowed_non_solid_groups_ceiling) do + if def.groups[j] then + return true + end + end + return false + end + else --assuming wdir == 1 + if def.groups.solid or def.groups.opaque then + return true + else + for _,i in ipairs(allowed_non_solid_nodes_floor) do + if nn == i then + return true + end + end + for _,j in ipairs(allowed_non_solid_groups_floor) do + if def.groups[j] then + return true + end + end + return false + end + end + end +end + +>>>>>>> mcl2/master function mcl_lanterns.register_lantern(name, def) local itemstring_floor = "mcl_lanterns:"..name.."_floor" local itemstring_ceiling = "mcl_lanterns:"..name.."_ceiling" @@ -61,9 +144,21 @@ function mcl_lanterns.register_lantern(name, def) local under = pointed_thing.under local above = pointed_thing.above +<<<<<<< HEAD local wdir = minetest.dir_to_wallmounted(vector.subtract(under, above)) local fakestack = itemstack +======= + local node = minetest.get_node(under) + + local wdir = minetest.dir_to_wallmounted(vector.subtract(under, above)) + local fakestack = itemstack + + if check_placement(node, wdir) == false then + return itemstack + end + +>>>>>>> mcl2/master if wdir == 0 then fakestack:set_name(itemstring_ceiling) elseif wdir == 1 then diff --git a/mods/ITEMS/mcl_lanterns/locale/mcl_lanterns.fr.tr b/mods/ITEMS/mcl_lanterns/locale/mcl_lanterns.fr.tr new file mode 100644 index 000000000..b28822b75 --- /dev/null +++ b/mods/ITEMS/mcl_lanterns/locale/mcl_lanterns.fr.tr @@ -0,0 +1,6 @@ +# textdomain: mcl_lanterns +Lantern=Lanterne +Soul Lantern=Lanterne des âmes +Lanterns are light sources which can be placed on the top or the bottom of most blocks.=Les lanternes sont des blocs lumineux qui peuvent être placés au dessus ou en dessous de la plupart des blocs. +Chain=Chaîne +Chains are metallic decoration blocks.=La chaîne est un bloc de décoration métalique. \ No newline at end of file diff --git a/mods/ITEMS/mcl_lanterns/locale/template.txt b/mods/ITEMS/mcl_lanterns/locale/template.txt new file mode 100644 index 000000000..545118b54 --- /dev/null +++ b/mods/ITEMS/mcl_lanterns/locale/template.txt @@ -0,0 +1,6 @@ +# textdomain: mcl_lanterns +Lantern= +Soul Lantern= +Lanterns are light sources which can be placed on the top or the bottom of most blocks.= +Chain= +Chains are metallic decoration blocks.= \ No newline at end of file diff --git a/mods/ITEMS/mcl_lanterns/mod.conf b/mods/ITEMS/mcl_lanterns/mod.conf index a9828806f..88ad7f1fb 100644 --- a/mods/ITEMS/mcl_lanterns/mod.conf +++ b/mods/ITEMS/mcl_lanterns/mod.conf @@ -1,5 +1,12 @@ name = mcl_lanterns description = Add lanterns and chains to MineClone2 +<<<<<<< HEAD depends = mcl_sounds, mcl_blackstone optional_depends = author = AFCMS +======= +depends = mcl_sounds +optional_depends = +author = AFCMS +title = MineClone2 Lanterns +>>>>>>> mcl2/master diff --git a/mods/ITEMS/mcl_lanterns/register.lua b/mods/ITEMS/mcl_lanterns/register.lua index fcffbdcb8..a3134e305 100644 --- a/mods/ITEMS/mcl_lanterns/register.lua +++ b/mods/ITEMS/mcl_lanterns/register.lua @@ -1,4 +1,8 @@ +<<<<<<< HEAD local S = minetest.get_translator(minetest.get_current_modname()) +======= +local S = minetest.get_translator("mcl_lanterns") +>>>>>>> mcl2/master mcl_lanterns.register_lantern("lantern", { description = S("Lantern"), @@ -8,6 +12,7 @@ mcl_lanterns.register_lantern("lantern", { light_level = 14, }) +<<<<<<< HEAD minetest.register_craft({ output = "mcl_lanterns:lantern_floor", recipe = { @@ -17,6 +22,8 @@ minetest.register_craft({ }, }) +======= +>>>>>>> mcl2/master mcl_lanterns.register_lantern("soul_lantern", { description = S("Soul Lantern"), longdesc = S("Lanterns are light sources which can be placed on the top or the bottom of most blocks."), @@ -26,6 +33,7 @@ mcl_lanterns.register_lantern("soul_lantern", { }) minetest.register_craft({ +<<<<<<< HEAD output = "mcl_lanterns:soul_lantern_floor", recipe = { {"mcl_core:iron_nugget", "mcl_core:iron_nugget", "mcl_core:iron_nugget"}, @@ -34,4 +42,13 @@ minetest.register_craft({ }, }) -minetest.register_alias("mcl_blackstone:soul_lantern", "mcl_lanterns:soul_lantern_floor") \ No newline at end of file +minetest.register_alias("mcl_blackstone:soul_lantern", "mcl_lanterns:soul_lantern_floor") +======= + output = "mcl_lanterns:lantern_floor", + recipe = { + {"mcl_core:iron_nugget", "mcl_core:iron_nugget", "mcl_core:iron_nugget"}, + {"mcl_core:iron_nugget", "mcl_torches:torch" , "mcl_core:iron_nugget"}, + {"mcl_core:iron_nugget", "mcl_core:iron_nugget", "mcl_core:iron_nugget"}, + }, +}) +>>>>>>> mcl2/master diff --git a/mods/ITEMS/mcl_maps/colors.json b/mods/ITEMS/mcl_maps/colors.json index 0aa23f0fc..b6519a9c3 100644 --- a/mods/ITEMS/mcl_maps/colors.json +++ b/mods/ITEMS/mcl_maps/colors.json @@ -1 +1 @@ -{"player.png": [123, 74, 62], "player_back.png": [114, 68, 56], "mcl_skins_player_dummy.png": [125, 125, 125], "mcl_skins_player_1.png": [103, 100, 86], "mcl_skins_button.png": [121, 95, 85], "mcl_skins_character_1.png": [93, 90, 77], "mcl_hunger_bar_saturation.png": [255, 255, 0], "hbhunger_bar_health_poison.png": [148, 120, 24], "mcl_hunger_bar_exhaustion.png": [255, 255, 255], "mcl_hunger_icon_exhaustion.png": [213, 213, 213], "mcl_hunger_bgicon_exhaustion.png": [25, 25, 26], "mcl_hunger_icon_foodpoison.png": [109, 106, 40], "mcl_hunger_bgicon_saturation.png": [24, 24, 26], "hbhunger_bar.png": [200, 103, 0], "hbhunger_bgicon.png": [24, 24, 26], "hbhunger_icon_health_poison.png": [69, 98, 45], "mcl_hunger_bar_foodpoison.png": [116, 132, 88], "hbhunger_icon.png": [175, 132, 97], "mcl_hunger_icon_saturation.png": [157, 140, 64], "mcl_playerplus_end_sky.png": [14, 14, 14], "mobs_mc_llama_decor_purple.png": [98, 50, 98], "mobs_mc_spawn_icon_illusioner.png": [98, 111, 155], "mobs_mc_llama_gray.png": [195, 188, 175], "mobs_mc_spawn_icon_zombie.png": [64, 136, 112], "mobs_mc_llama_decor_blue.png": [50, 50, 249], "mobs_mc_spawn_icon_skeleton.png": [146, 146, 146], "mobs_mc_shulker_blue.png": [89, 100, 126], "mobs_mc_shulker_black.png": [78, 75, 76], "mobs_mc_wolf_collar.png": [186, 186, 186], "mobs_mc_spawn_icon_bat.png": [130, 63, 13], "mobs_mc_parrot_green.png": [47, 208, 62], "mobs_mc_llama_decor_magenta.png": [249, 50, 249], "mobs_mc_rabbit_black.png": [73, 64, 61], "mobs_mc_vindicator.png": [56, 56, 57], "mobs_mc_polarbear.png": [233, 220, 208], "mobs_mc_magmacube.png": [83, 40, 27], "mobs_mc_chicken.png": [198, 182, 176], "mobs_mc_ghast_firing.png": [198, 198, 198], "mobs_mc_spawn_icon_zombie_pigman.png": [202, 160, 135], "mobs_mc_husk.png": [98, 95, 76], "mobs_mc_villager_librarian.png": [176, 171, 163], "mobs_mc_villager_priest.png": [100, 64, 74], "mobs_mc_villager_smith.png": [76, 76, 63], "mobs_mc_horse_armor_gold.png": [143, 110, 59], "mobs_mc_spawn_icon_dragon.png": [98, 47, 89], "mobs_mc_spawn_icon_donkey.png": [152, 132, 100], "mobs_mc_squid.png": [37, 52, 68], "mobs_mc_villager_farmer.png": [81, 80, 67], "mobs_mc_spawn_icon_horse_skeleton.png": [245, 204, 202], "mobs_mc_horse_markings_blackdots.png": [24, 22, 22], "mobs_mc_zombie_farmer.png": [119, 99, 85], "mobs_mc_spawn_icon_vex.png": [145, 185, 185], "mobs_mc_parrot_blue.png": [43, 58, 148], "mobs_mc_spider_eyes.png": [174, 48, 48], "mobs_mc_zombie.png": [78, 110, 105], "mobs_mc_llama_decor_light_blue.png": [104, 168, 194], "mobs_mc_zombie_priest.png": [120, 104, 110], "mobs_mc_llama_decor_black.png": [50, 50, 50], "mobs_mc_horse_white.png": [190, 173, 154], "mobs_mc_spawn_icon_vindicator.png": [102, 103, 104], "mobs_mc_silverfish.png": [179, 164, 144], "mobs_mc_llama_decor_gray.png": [98, 98, 98], "mobs_mc_spawn_icon_guardian.png": [119, 156, 148], "mobs_mc_creeper.png": [98, 107, 71], "mobs_mc_shulker_purple.png": [135, 87, 99], "mobs_mc_spawn_icon_rabbit.png": [156, 126, 84], "mobs_mc_horse_armor_iron.png": [134, 123, 118], "mobs_mc_sheep.png": [182, 161, 149], "mobs_mc_parrot_grey.png": [33, 178, 173], "mobs_mc_wolf_icon_sit.png": [8, 88, 116], "mobs_mc_gold_horse_armor.png": [140, 106, 67], "mobs_mc_spawn_icon_witch.png": [98, 85, 68], "mobs_mc_shulker_green.png": [89, 122, 84], "mobs_mc_bat.png": [87, 63, 54], "mobs_mc_horse_chestnut.png": [126, 78, 58], "mobs_mc_shulker_yellow.png": [175, 128, 69], "mobs_mc_spawn_icon_creeper.png": [115, 125, 53], "mobs_mc_slime.png": [63, 133, 78], "mobs_mc_evoker.png": [44, 48, 43], "mobs_mc_horse_skeleton.png": [163, 156, 141], "mobs_mc_spawn_icon_blaze.png": [142, 76, 49], "mobs_mc_shulker_light_blue.png": [114, 140, 158], "mobs_mc_shulker_gray.png": [106, 104, 109], "mobs_mc_horse_darkbrown.png": [69, 47, 34], "mobs_mc_stray_overlay.png": [63, 59, 65], "mobs_mc_arrow_particle.png": [218, 171, 136], "mobs_mc_spawn_icon_cat.png": [120, 66, 10], "mobs_mc_stray.png": [155, 157, 161], "mobs_mc_trading_formspec_bg.png": [157, 157, 157], "mobs_mc_llama_chest.png": [70, 53, 36], "mobs_mc_spawn_icon_villager.png": [134, 124, 81], "mobs_mc_pig.png": [228, 175, 165], "mobs_mc_spawn_icon_mooshroom.png": [160, 56, 55], "mobs_mc_wolf_angry.png": [187, 179, 176], "mobs_mc_cat_black.png": [206, 181, 154], "mobs_mc_vex_charging.png": [142, 153, 153], "mobs_mc_llama.png": [207, 189, 155], "mobs_mc_mushroom_brown.png": [122, 81, 58], "mobs_mc_spawn_icon_shulker.png": [170, 117, 130], "mobs_mc_wither_half_health.png": [7, 58, 91], "mobs_mc_spawn_icon_guardian_elder.png": [174, 140, 113], "mobs_mc_enderman_eyes.png": [184, 211, 242], "mobs_mc_horse_creamy.png": [146, 111, 75], "mobs_mc_spawn_icon_zombie_villager.png": [95, 110, 68], "mobs_mc_vex.png": [128, 162, 162], "mobs_mc_iron_golem.png": [47, 44, 44], "mobs_mc_cat_ocelot.png": [163, 111, 52], "mobs_mc_llama_decor_green.png": [50, 98, 50], "mobs_mc_cow.png": [94, 68, 55], "mobs_mc_llama_decor_brown.png": [101, 75, 60], "mobs_mc_villager_butcher.png": [82, 83, 71], "mobs_mc_parrot_yellow_blue.png": [98, 187, 205], "mobs_mc_zombie_pigman.png": [164, 129, 117], "mobs_mc_spawn_icon_wolf.png": [231, 218, 207], "mobs_mc_zombie_villager.png": [112, 108, 90], "mobs_mc_sheep_fur.png": [203, 186, 174], "mobs_mc_spawn_icon_horse_zombie.png": [129, 143, 66], "mobs_mc_blaze.png": [84, 63, 50], "mcl_totems_totem.png": [185, 139, 52], "mobs_mc_rabbit_salt.png": [122, 99, 87], "mobs_mc_rabbit_white_splotched.png": [146, 139, 135], "mobs_mc_horse_brown.png": [115, 84, 61], "mobs_mc_ghast.png": [199, 199, 199], "mobs_mc_horse_markings_white.png": [165, 149, 132], "mobs_mc_horse_markings_whitefield.png": [193, 178, 162], "mobs_mc_spawn_icon_endermite.png": [138, 67, 74], "mobs_mc_shulker_magenta.png": [143, 97, 130], "mobs_mc_snowman.png": [211, 217, 221], "mobs_mc_zombie_smith.png": [71, 59, 54], "mobs_mc_spawn_icon_squid.png": [55, 58, 103], "mobs_mc_dragon_fireball.png": [89, 66, 79], "mobs_mc_horse_armor_diamond.png": [78, 110, 129], "mobs_mc_diamond_horse_armor.png": [67, 95, 112], "mobs_mc_rabbit_toast.png": [130, 123, 119], "mobs_mc_llama_white.png": [207, 199, 184], "mobs_mc_llama_creamy.png": [208, 190, 155], "mobs_mc_pig_saddle.png": [82, 63, 45], "mobs_mc_spawn_icon_cave_spider.png": [23, 43, 57], "mobs_mc_shulker_silver.png": [140, 138, 143], "mobs_mc_trading_formspec_disabled.png": [193, 26, 26], "mobs_mc_spider.png": [41, 38, 37], "mobs_mc_wither.png": [33, 33, 33], "mobs_mc_llama_decor_white.png": [249, 249, 249], "mobs_mc_witch.png": [80, 74, 67], "mobs_mc_wolf_icon_roam.png": [6, 124, 36], "mobs_mc_illusionist.png": [56, 68, 114], "mobs_mc_endermite.png": [55, 20, 65], "mobs_mc_spawn_icon_witherskeleton.png": [71, 71, 71], "mobs_mc_llama_decor_light_gray.png": [185, 185, 185], "mobs_mc_llama_decor_cyan.png": [18, 249, 249], "mobs_mc_skeleton.png": [124, 124, 124], "mobs_mc_spawn_icon_llama.png": [230, 221, 178], "mobs_mc_spawn_icon_chicken.png": [170, 160, 156], "mobs_mc_shulker_pink.png": [173, 127, 160], "mobs_mc_spawn_icon_spider.png": [53, 43, 43], "mobs_mc_shulker_red.png": [146, 77, 71], "mobs_mc_shulker_white.png": [184, 181, 186], "mobs_mc_spawn_icon_magmacube.png": [52, 33, 23], "mobs_mc_spawn_icon_ghast.png": [212, 212, 212], "mobs_mc_rabbit_brown.png": [112, 86, 73], "mobs_mc_spawn_icon_pig.png": [242, 200, 188], "mobs_mc_spawn_icon_horse.png": [44, 36, 25], "mobs_mc_cat_siamese.png": [161, 144, 133], "mobs_mc_mushroom_red.png": [176, 51, 49], "mobs_mc_shulker_brown.png": [94, 81, 70], "mobs_mc_guardian.png": [78, 116, 130], "mobs_mc_creeper_charge.png": [121, 219, 255], "mobs_mc_villager.png": [88, 91, 55], "mobs_mc_llama_decor_lime.png": [50, 249, 50], "mobs_mc_llama_brown.png": [136, 97, 52], "mobs_mc_parrot_red_blue.png": [171, 70, 37], "mobs_mc_spawn_icon_husk.png": [174, 174, 128], "mobs_mc_rabbit_gold.png": [151, 130, 96], "mobs_mc_spawn_icon_evoker.png": [92, 103, 86], "mobs_mc_iron_horse_armor.png": [133, 119, 114], "mobs_mc_llama_decor_red.png": [249, 50, 50], "mobs_mc_enderman.png": [3, 10, 10], "mobs_mc_mooshroom_brown.png": [93, 50, 28], "mobs_mc_llama_decor_pink.png": [249, 161, 175], "mobs_mc_enderman_block.png": [46, 42, 38], "mobs_mc_mooshroom.png": [90, 42, 41], "mobs_mc_cat_red.png": [221, 163, 120], "mobs_mc_spit.png": [221, 218, 246], "mobs_mc_shulkerbullet.png": [216, 190, 153], "mobs_mc_horse_markings_whitedots.png": [230, 220, 207], "mobs_mc_mule.png": [108, 75, 51], "mobs_mc_spawn_icon_iron_golem.png": [122, 72, 41], "mobs_mc_zombie_butcher.png": [107, 98, 87], "mobs_mc_llama_decor_yellow.png": [249, 249, 50], "mobs_mc_wolf_tame.png": [179, 159, 154], "mobs_mc_horse_gray.png": [78, 68, 62], "mobs_mc_shulker_lime.png": [106, 132, 88], "mobs_mc_rabbit_caerbannog.png": [186, 179, 174], "mobs_mc_zombie_librarian.png": [106, 104, 104], "mobs_mc_spawn_icon_silverfish.png": [199, 168, 128], "mobs_mc_spawn_icon_stray.png": [118, 116, 118], "mobs_mc_spawn_icon_polarbear.png": [237, 235, 212], "mobs_mc_guardian_elder.png": [141, 141, 125], "mobs_mc_spawn_icon_slime.png": [76, 130, 33], "mobs_mc_cave_spider.png": [14, 28, 38], "mobs_mc_spawn_icon_cow.png": [162, 118, 72], "mobs_mc_wolf.png": [182, 165, 159], "mobs_mc_wither_skeleton.png": [50, 50, 50], "mobs_mc_endergolem.png": [135, 87, 99], "mobs_mc_spawn_icon_mule.png": [115, 82, 47], "mobs_mc_llama_decor_orange.png": [249, 131, 50], "mobs_chicken_egg.png": [199, 157, 106], "mobs_mc_rabbit_white.png": [161, 153, 149], "mobs_mc_horse_black.png": [49, 42, 39], "mobs_mc_dragon.png": [79, 54, 67], "mobs_mc_spawn_icon_parrot.png": [202, 100, 54], "mobs_mc_spawn_icon_snowman.png": [216, 173, 147], "mobs_mc_donkey.png": [91, 78, 68], "mobs_mc_shulker_cyan.png": [89, 114, 128], "mobs_mc_spawn_icon_sheep.png": [209, 185, 175], "mobs_mc_TEMP_wither_projectile.png": [69, 69, 69], "mobs_mc_spawn_icon_enderman.png": [63, 82, 87], "mobs_mc_shulker_orange.png": [156, 90, 67], "mobs_mc_empty.png": [255, 255, 255], "mobs_mc_spawn_icon_wither.png": [102, 102, 102], "mcl_boats_spruce_boat.png": [72, 61, 51], "mcl_boats_jungle_boat.png": [102, 73, 58], "mcl_boats_texture_birch_boat.png": [131, 105, 83], "mcl_boats_texture_oak_boat.png": [103, 82, 65], "mcl_boats_birch_boat.png": [120, 95, 78], "mcl_boats_texture_jungle_boat.png": [109, 78, 60], "mcl_boats_oak_boat.png": [93, 76, 62], "mcl_boats_texture_acacia_boat.png": [136, 90, 64], "mcl_boats_texture_dark_oak_boat.png": [89, 76, 64], "mcl_boats_texture_spruce_boat.png": [74, 61, 50], "mcl_boats_acacia_boat.png": [124, 82, 59], "mcl_boats_dark_oak_boat.png": [89, 76, 64], "mobs_nametag.png": [138, 114, 89], "mobs_blood.png": [27, 27, 29], "mcl_minecarts_rail_golden_curved_powered.png": [89, 71, 57], "mcl_minecarts_rail_golden_crossing.png": [83, 70, 55], "mcl_minecarts_rail_detector_curved_powered.png": [81, 68, 64], "mcl_minecarts_rail_golden_t_junction_powered.png": [82, 69, 59], "mcl_minecarts_rail_golden_t_junction.png": [80, 70, 59], "mcl_minecarts_rail_detector.png": [85, 74, 67], "mcl_minecarts_rail_detector_crossing.png": [77, 69, 65], "default_rail_t_junction.png": [79, 68, 61], "mcl_minecarts_rail_activator_crossing_powered.png": [72, 55, 51], "mcl_minecarts_minecart_hopper.png": [45, 45, 45], "mcl_minecarts_minecart_furnace.png": [66, 65, 64], "mcl_minecarts_minecart_command_block.png": [64, 62, 61], "mcl_minecarts_rail_golden.png": [92, 77, 60], "mcl_minecarts_rail_activator_t_junction_powered.png": [76, 61, 55], "default_rail_curved.png": [76, 67, 60], "mcl_minecarts_rail_activator_t_junction.png": [72, 62, 56], "mcl_minecarts_rail_golden_crossing_powered.png": [86, 70, 54], "mcl_minecarts_rail_detector_crossing_powered.png": [78, 68, 64], "mcl_minecarts_rail_detector_curved.png": [77, 70, 66], "default_rail_crossing.png": [79, 68, 59], "mcl_minecarts_rail_detector_t_junction.png": [74, 66, 61], "mcl_minecarts_minecart.png": [72, 60, 51], "mcl_minecarts_rail_golden_curved.png": [85, 73, 58], "mcl_minecarts_rail_activator.png": [78, 64, 56], "mcl_minecarts_rail_activator_powered.png": [86, 62, 54], "mcl_minecarts_rail_detector_t_junction_powered.png": [76, 66, 61], "mcl_minecarts_minecart_normal.png": [47, 45, 43], "mcl_minecarts_minecart_tnt.png": [75, 52, 52], "mcl_minecarts_rail_detector_powered.png": [87, 74, 67], "mcl_minecarts_rail_golden_powered.png": [94, 77, 60], "mcl_minecarts_rail_activator_crossing.png": [65, 56, 52], "default_rail.png": [83, 70, 61], "mcl_minecarts_rail_activator_curved_powered.png": [75, 55, 52], "mcl_minecarts_rail_activator_curved.png": [66, 56, 53], "mcl_minecarts_minecart_chest.png": [51, 48, 46], "mobs_mc_gameconfig_enderman_cactus_background.png": [44, 71, 27], "mcl_paintings_paintings.png": [104, 99, 89], "mcl_paintings_painting.png": [139, 133, 119], "mcl_particles_lava.png": [250, 150, 64], "mcl_particles_instant_effect.png": [160, 160, 160], "mcl_particles_note.png": [41, 40, 39], "mcl_particles_bubble.png": [147, 174, 195], "mcl_particles_sponge1.png": [241, 238, 226], "mcl_particles_smoke_anim.png": [172, 172, 172], "mcl_particles_crit.png": [165, 165, 165], "mcl_particles_mob_death.png": [198, 198, 198], "mcl_particles_droplet_bottle.png": [203, 203, 203], "mcl_particles_sponge4.png": [241, 238, 226], "mcl_particles_effect.png": [184, 184, 184], "mcl_particles_teleport.png": [86, 22, 128], "mcl_particles_sponge5.png": [241, 238, 226], "mcl_particles_flame.png": [244, 149, 63], "mcl_particles_sponge3.png": [241, 238, 226], "mcl_particles_sponge2.png": [241, 238, 226], "mcl_particles_smoke.png": [174, 174, 174], "lightning_lightning_2.png": [255, 255, 255], "lightning_lightning_3.png": [217, 217, 217], "lightning_lightning_1.png": [223, 223, 223], "weather_pack_rain_raindrop_2.png": [33, 79, 142], "weather_pack_rain_raindrop_3.png": [59, 88, 128], "mcl_particles_nether_dust3.png": [143, 105, 102], "weather_pack_rain_raindrop_1.png": [97, 137, 179], "mcl_particles_nether_dust1.png": [143, 105, 102], "weather_pack_snow_snowflake1.png": [255, 255, 255], "mcl_particles_nether_dust2.png": [143, 105, 102], "weather_pack_snow_snowflake2.png": [255, 255, 255], "mcl_moon_moon_phases.png": [80, 106, 141], "hbarmor_bgicon.png": [27, 27, 29], "hbarmor_bar.png": [175, 172, 165], "hbarmor_icon.png": [135, 131, 126], "mcl_base_textures_background9.png": [179, 179, 179], "object_crosshair.png": [255, 255, 255], "bubble.png": [69, 138, 194], "crosshair.png": [255, 255, 255], "heart.png": [137, 47, 40], "mcl_base_textures_background.png": [179, 179, 179], "crack_anylength.png": [93, 93, 93], "mcl_base_textures_button9_pressed.png": [162, 162, 162], "mcl_base_textures_button9.png": [162, 162, 162], "smoke_puff.png": [255, 255, 255], "mineclone2_logo.png": [75, 74, 69], "mineclone2_icon.png": [58, 74, 44], "awards_template.png": [134, 134, 134], "awards_bg_mining.png": [73, 68, 51], "awards_progress_gray.png": [157, 157, 157], "awards_ui_icon.png": [190, 34, 34], "awards_unknown.png": [134, 134, 134], "awards_progress_green.png": [0, 155, 74], "awards_bg_default.png": [38, 38, 38], "hudbars_bar_breath.png": [159, 161, 255], "hudbars_icon_health.png": [137, 47, 40], "hudbars_bar_health.png": [168, 55, 47], "hudbars_bgicon_breath.png": [0, 0, 0], "hudbars_bgicon_health.png": [27, 27, 29], "hudbars_icon_breath.png": [69, 138, 194], "hudbars_bar_background.png": [71, 71, 71], "mcl_achievements_button.png": [158, 152, 67], "mcl_inventory_hotbar.png": [81, 81, 85], "crafting_inventory_creative_survival.png": [195, 195, 195], "crafting_creative_bg_dark.png": [157, 157, 157], "mcl_inventory_empty_armor_slot_shield.png": [25, 32, 34], "crafting_formspec_bg.png": [9, 9, 9], "mcl_inventory_empty_armor_slot_helmet.png": [25, 32, 34], "mcl_inventory_hotbar_selected.png": [113, 85, 40], "crafting_creative_inactive_down.png": [151, 151, 151], "crafting_creative_active_down.png": [196, 196, 196], "crafting_creative_prev.png": [254, 254, 254], "crafting_creative_marker.png": [0, 0, 0], "mcl_inventory_button9_pressed.png": [162, 162, 162], "crafting_creative_active.png": [202, 202, 202], "mcl_inventory_button9.png": [162, 162, 162], "mcl_inventory_empty_armor_slot_chestplate.png": [0, 0, 0], "mcl_inventory_empty_armor_slot_boots.png": [0, 0, 0], "crafting_creative_bg.png": [207, 207, 207], "crafting_creative_inactive.png": [157, 157, 157], "crafting_creative_next.png": [254, 254, 254], "mcl_inventory_empty_armor_slot_leggings.png": [25, 32, 34], "crafting_inventory_creative.png": [206, 206, 206], "crafting_creative_trash.png": [144, 113, 113], "mcl_formspec_itemslot.png": [157, 157, 157], "mcl_experience_bottle.png": [136, 174, 169], "experience_bar_background.png": [49, 46, 45], "experience_orb.png": [93, 174, 0], "experience_bar.png": [74, 102, 70], "mcl_bossbars_empty.png": [255, 255, 255], "mcl_bossbars.png": [76, 68, 75], "mcl_itemframes_item_frame.png": [123, 90, 63], "mcl_itemframes_itemframe_background.png": [136, 104, 75], "mcl_banners_stripe_middle.png": [255, 255, 255], "mcl_banners_skull.png": [255, 255, 255], "mcl_banners_bricks.png": [255, 255, 255], "mcl_banners_square_bottom_left.png": [255, 255, 255], "mcl_banners_gradient.png": [254, 254, 254], "mcl_banners_cross.png": [255, 255, 255], "mcl_banners_gradient_up.png": [254, 254, 254], "mcl_banners_item_overlay.png": [240, 240, 240], "mcl_banners_stripe_downright.png": [255, 255, 255], "mcl_banners_stripe_downleft.png": [255, 255, 255], "mcl_banners_fallback_wood.png": [102, 88, 74], "mcl_banners_base_inverted.png": [255, 255, 255], "mcl_banners_triangles_top.png": [255, 255, 255], "mcl_banners_banner_base.png": [215, 206, 193], "mcl_banners_curly_border.png": [254, 254, 254], "mcl_banners_thing.png": [253, 253, 253], "mcl_banners_small_stripes.png": [255, 255, 255], "mcl_banners_triangle_bottom.png": [254, 254, 254], "mcl_banners_stripe_right.png": [255, 255, 255], "mcl_banners_straight_cross.png": [255, 255, 255], "mcl_banners_triangle_top.png": [255, 255, 255], "mcl_banners_border.png": [255, 255, 255], "mcl_banners_diagonal_left.png": [255, 255, 255], "mcl_banners_diagonal_right.png": [255, 255, 255], "mcl_banners_base.png": [255, 255, 255], "mcl_banners_half_vertical.png": [255, 255, 255], "mcl_banners_circle.png": [254, 254, 254], "mcl_banners_triangles_bottom.png": [255, 255, 255], "mcl_banners_item_base.png": [103, 89, 75], "mcl_banners_stripe_left.png": [255, 255, 255], "mcl_banners_rhombus.png": [255, 255, 255], "mcl_banners_creeper.png": [255, 255, 255], "mcl_banners_flower.png": [254, 254, 254], "mcl_banners_stripe_bottom.png": [255, 255, 255], "mcl_banners_half_horizontal.png": [255, 255, 255], "mcl_banners_half_horizontal_bottom.png": [255, 255, 255], "mcl_banners_square_top_left.png": [255, 255, 255], "mcl_banners_square_top_right.png": [255, 255, 255], "mcl_banners_stripe_center.png": [255, 255, 255], "mcl_banners_diagonal_up_left.png": [255, 255, 255], "mcl_banners_stripe_top.png": [255, 255, 255], "mcl_banners_diagonal_up_right.png": [255, 255, 255], "mcl_banners_square_bottom_right.png": [255, 255, 255], "mcl_banners_half_vertical_right.png": [255, 255, 255], "mcl_doors_trapdoor_dark_oak.png": [81, 68, 56], "mcl_doors_trapdoor_acacia_side.png": [154, 102, 71], "doors_trapdoor_steel_side.png": [149, 140, 140], "mcl_doors_door_jungle_side_upper.png": [109, 75, 57], "mcl_doors_door_dark_oak_side_lower.png": [103, 90, 75], "mcl_doors_door_iron_lower.png": [157, 152, 151], "mcl_doors_door_acacia_upper.png": [152, 100, 69], "mcl_doors_door_jungle_side_lower.png": [107, 72, 55], "mcl_doors_door_wood_lower.png": [89, 70, 55], "doors_trapdoor_steel.png": [149, 140, 140], "mcl_doors_door_iron_side_upper.png": [155, 149, 148], "mcl_doors_door_acacia_side_upper.png": [133, 80, 53], "mcl_doors_door_jungle.png": [116, 83, 62], "mcl_doors_door_iron_side_lower.png": [157, 152, 151], "mcl_doors_door_birch_upper.png": [179, 158, 139], "mcl_doors_trapdoor_spruce_side.png": [73, 59, 47], "mcl_doors_door_iron_upper.png": [155, 149, 148], "mcl_doors_door_spruce_side_lower.png": [92, 79, 68], "mcl_doors_trapdoor_spruce.png": [71, 57, 46], "mcl_doors_trapdoor_birch_side.png": [147, 116, 89], "doors_trapdoor_side.png": [113, 86, 67], "mcl_doors_door_acacia_lower.png": [153, 101, 70], "mcl_doors_door_dark_oak_side_upper.png": [102, 89, 75], "mcl_doors_door_acacia_side_lower.png": [131, 78, 51], "mcl_doors_door_wood_upper.png": [92, 72, 57], "mcl_doors_trapdoor_birch.png": [173, 151, 132], "mcl_doors_door_dark_oak_upper.png": [83, 71, 59], "mcl_doors_door_acacia.png": [148, 98, 67], "mcl_doors_door_spruce.png": [67, 56, 47], "mcl_doors_door_spruce_lower.png": [71, 58, 48], "mcl_doors_door_birch_side_upper.png": [153, 121, 94], "mcl_doors_trapdoor_dark_oak_side.png": [85, 72, 60], "mcl_doors_door_wood_side_upper.png": [84, 65, 51], "mcl_doors_door_birch.png": [172, 147, 124], "mcl_doors_door_birch_lower.png": [165, 140, 119], "mcl_doors_trapdoor_jungle.png": [103, 70, 52], "doors_item_steel.png": [148, 144, 143], "doors_trapdoor.png": [98, 75, 59], "mcl_doors_door_jungle_lower.png": [116, 82, 61], "doors_item_wood.png": [88, 67, 53], "mcl_doors_door_jungle_upper.png": [113, 79, 59], "mcl_doors_door_spruce_upper.png": [71, 58, 47], "mcl_doors_door_dark_oak_lower.png": [84, 71, 59], "mcl_doors_door_dark_oak.png": [82, 69, 57], "mcl_doors_door_wood_side_lower.png": [132, 102, 81], "mcl_doors_trapdoor_jungle_side.png": [121, 87, 62], "mcl_doors_door_spruce_side_upper.png": [92, 79, 68], "mcl_doors_door_birch_side_lower.png": [152, 119, 92], "mcl_doors_trapdoor_acacia.png": [148, 96, 66], "mcl_fishing_clownfish_raw.png": [205, 127, 81], "mcl_fishing_fish_raw.png": [70, 112, 154], "mcl_fishing_salmon_raw.png": [112, 105, 102], "mcl_fishing_fish_cooked.png": [93, 84, 94], "mcl_fishing_bobber.png": [171, 117, 119], "mcl_fishing_pufferfish_raw.png": [219, 165, 77], "mcl_fishing_fishing_rod.png": [134, 116, 103], "mcl_fishing_salmon_cooked.png": [97, 91, 89], "mcl_stairs_diorite_smooth_slab.png": [156, 153, 151], "mcl_stairs_iron_block_slab.png": [166, 159, 159], "mcl_stairs_andesite_smooth_slab.png": [106, 113, 108], "mcl_stairs_gold_block_slab.png": [191, 146, 56], "mcl_stairs_granite_smooth_slab.png": [150, 121, 109], "mcl_stairs_lapis_block_slab.png": [49, 89, 158], "mcl_fireworks_rocket.png": [155, 84, 71], "mcl_bows_arrow_inv.png": [144, 129, 121], "mcl_bows_arrow_overlay.png": [193, 191, 186], "mcl_bows_bow_1.png": [112, 95, 79], "mcl_bows_bow_0.png": [111, 94, 79], "mcl_bows_bow_2.png": [115, 98, 82], "mcl_bows_bow.png": [114, 95, 78], "mcl_bows_arrow.png": [133, 116, 108], "mcl_bows_arrow_front.png": [178, 175, 168], "mcl_bows_arrow_back.png": [218, 216, 213], "mcl_ocean_dead_bubble_coral.png": [118, 108, 126], "mcl_ocean_tube_coral.png": [57, 88, 209], "mcl_ocean_sea_pickle_2_anim.png": [95, 122, 51], "mcl_ocean_dead_horn_coral_fan.png": [150, 143, 123], "mcl_ocean_dead_bubble_coral_block.png": [114, 105, 122], "mcl_ocean_sea_pickle_3_off.png": [68, 99, 36], "mcl_ocean_dead_horn_coral_block.png": [152, 146, 125], "mcl_ocean_bubble_coral_block.png": [143, 76, 195], "mcl_ocean_horn_coral.png": [233, 195, 69], "mcl_ocean_dead_tube_coral_block.png": [99, 104, 127], "mcl_ocean_sea_pickle_item.png": [93, 120, 50], "mcl_ocean_kelp_item.png": [42, 105, 55], "mcl_ocean_dried_kelp_side.png": [71, 80, 67], "mcl_ocean_dead_tube_coral.png": [99, 105, 128], "mcl_ocean_fire_coral_block.png": [198, 74, 62], "mcl_ocean_bubble_coral.png": [149, 77, 200], "mcl_ocean_prismarine_bricks.png": [104, 112, 115], "mcl_ocean_brain_coral.png": [206, 87, 153], "mcl_ocean_dried_kelp_top.png": [56, 71, 57], "mcl_ocean_brain_coral_block.png": [200, 85, 148], "mcl_ocean_prismarine_dark.png": [77, 89, 97], "mcl_ocean_dead_fire_coral_block.png": [127, 102, 100], "mcl_ocean_prismarine_shard.png": [122, 144, 135], "mcl_ocean_sea_pickle_2_off.png": [70, 100, 36], "mcl_ocean_sea_pickle_4_anim.png": [85, 113, 46], "mcl_ocean_dead_brain_coral.png": [134, 117, 127], "mcl_ocean_tube_coral_fan.png": [59, 85, 203], "mcl_ocean_sea_pickle_4_off.png": [68, 98, 36], "mcl_ocean_sea_pickle_1_anim.png": [106, 132, 57], "mcl_ocean_fire_coral.png": [208, 78, 65], "mcl_ocean_sea_pickle_3_anim.png": [89, 116, 48], "mcl_ocean_dead_fire_coral_fan.png": [140, 113, 110], "mcl_ocean_prismarine_crystals.png": [182, 193, 190], "mcl_ocean_prismarine_anim.png": [104, 123, 122], "mcl_ocean_horn_coral_fan.png": [230, 189, 68], "mcl_ocean_dead_tube_coral_fan.png": [98, 103, 125], "mcl_ocean_sea_pickle_1_off.png": [72, 103, 37], "mcl_ocean_dead_horn_coral.png": [154, 148, 127], "mcl_ocean_dead_fire_coral.png": [133, 107, 105], "mcl_ocean_bubble_coral_fan.png": [141, 75, 192], "mcl_ocean_horn_coral_block.png": [232, 193, 69], "mcl_ocean_brain_coral_fan.png": [206, 87, 154], "mcl_ocean_sea_lantern.png": [133, 144, 145], "mcl_ocean_seagrass.png": [48, 125, 60], "mcl_ocean_dead_brain_coral_fan.png": [134, 117, 127], "mcl_ocean_dried_kelp.png": [36, 57, 40], "mcl_ocean_dead_bubble_coral_fan.png": [113, 104, 120], "mcl_ocean_dried_kelp_bottom.png": [56, 71, 57], "mcl_ocean_kelp_plant.png": [42, 105, 55], "mcl_ocean_tube_coral_block.png": [58, 88, 207], "mcl_ocean_dead_brain_coral_block.png": [130, 114, 123], "mcl_ocean_fire_coral_fan.png": [205, 77, 64], "mcl_portals_endframe_bottom.png": [109, 99, 87], "mcl_portals_particle3.png": [146, 0, 201], "mcl_portals_particle2.png": [146, 0, 201], "mcl_portals_endframe_top.png": [95, 85, 74], "mcl_portals_particle4.png": [146, 0, 201], "mcl_portals_endframe_eye.png": [135, 36, 18], "mcl_portals_end_portal.png": [14, 14, 14], "mcl_particles_nether_portal.png": [206, 0, 206], "mcl_portals_particle5.png": [189, 11, 213], "mcl_portals_endframe_side.png": [110, 99, 86], "mcl_portals_particle1.png": [173, 28, 229], "mcl_portals_portal.png": [74, 24, 172], "mcl_particles_nether_portal_t.png": [159, 0, 223], "cake_side.png": [201, 170, 155], "cake_inner.png": [185, 129, 99], "cake_bottom.png": [160, 86, 51], "cake_top.png": [241, 228, 226], "cake.png": [216, 187, 176], "mcl_cocoas_cocoa_top_stage_2.png": [138, 68, 52], "mcl_cocoas_cocoa_stage_1.png": [172, 121, 69], "mcl_cocoas_cocoa_stage_2.png": [132, 65, 50], "mcl_cocoas_cocoa_stage_0.png": [65, 77, 39], "mcl_fences_fence_red_nether_brick.png": [68, 17, 0], "mcl_fences_fence_gate_red_nether_brick.png": [64, 15, 0], "mcl_fences_fence_gate_nether_brick.png": [50, 25, 26], "mcl_mobitems_spider_eye.png": [154, 69, 60], "mcl_mobitems_leather.png": [105, 75, 45], "mcl_mobitems_feather.png": [206, 185, 183], "mcl_mobitems_string.png": [202, 186, 166], "mcl_mobitems_rabbit_foot.png": [124, 107, 97], "mcl_mobitems_saddle.png": [93, 72, 50], "mcl_mobitems_bone.png": [182, 162, 139], "mcl_mobitems_shulker_shell.png": [118, 68, 83], "mcl_mobitems_blaze_rod.png": [143, 64, 28], "mcl_mobitems_beef_raw.png": [147, 63, 54], "mcl_mobitems_rabbit_stew.png": [127, 98, 79], "mcl_mobitems_rotten_flesh.png": [110, 68, 45], "mcl_mobitems_chicken_raw.png": [217, 178, 149], "mcl_mobitems_ghast_tear.png": [148, 160, 166], "mcl_mobitems_porkchop_raw.png": [160, 72, 69], "mcl_mobitems_rabbit_hide.png": [108, 85, 73], "mcl_mobitems_slimeball.png": [75, 134, 82], "mcl_mobitems_magma_cream.png": [102, 54, 34], "default_gunpowder.png": [48, 41, 36], "mcl_mobitems_chicken_cooked.png": [187, 145, 106], "mcl_mobitems_beef_cooked.png": [112, 70, 49], "mcl_mobitems_rabbit_cooked.png": [188, 155, 131], "mcl_mobitems_blaze_powder.png": [86, 50, 34], "mcl_mobitems_rabbit_raw.png": [217, 177, 157], "mcl_mobitems_carrot_on_a_stick.png": [133, 113, 93], "mcl_mobitems_mutton_cooked.png": [144, 104, 77], "mcl_mobitems_nether_star.png": [234, 189, 123], "mcl_mobitems_porkchop_cooked.png": [116, 72, 48], "mcl_mobitems_mutton_raw.png": [175, 77, 77], "mcl_mobitems_bucket_milk.png": [180, 175, 166], "mcl_farming_wheat_stage_0.png": [53, 101, 46], "farming_carrot.png": [147, 106, 63], "farming_potato_poison.png": [121, 93, 55], "farming_cookie.png": [144, 100, 61], "mcl_farming_melon_seeds.png": [100, 72, 61], "mcl_farming_potatoes_stage_1.png": [69, 113, 61], "mcl_farming_melon_stem_disconnected.png": [96, 96, 96], "farming_carrot_4.png": [93, 105, 58], "mcl_farming_wheat_stage_5.png": [101, 142, 66], "farming_tool_woodhoe.png": [120, 101, 86], "mcl_farming_potatoes_stage_0.png": [73, 119, 65], "farming_carrot_1.png": [75, 112, 61], "farming_carrot_3.png": [70, 107, 57], "farming_melon.png": [153, 84, 62], "mcl_farming_pumpkin_seeds.png": [132, 120, 87], "farming_wheat_harvested.png": [178, 134, 80], "farming_pumpkin_side.png": [186, 100, 42], "mcl_farming_pumpkin_face.png": [181, 94, 40], "mcl_farming_wheat_stage_4.png": [86, 129, 65], "mcl_farming_farmland_wet.png": [69, 55, 46], "mcl_farming_beetroot_0.png": [56, 122, 75], "mcl_farming_pumpkin_stem_connected.png": [94, 94, 94], "mcl_farming_farmland_dry.png": [101, 80, 68], "farming_tool_diamondhoe.png": [101, 104, 104], "mcl_farming_beetroot_1.png": [54, 118, 72], "mcl_farming_beetroot_2.png": [54, 119, 73], "mcl_farming_wheat_stage_7.png": [165, 116, 75], "mcl_farming_beetroot.png": [113, 69, 66], "mcl_farming_wheat_stage_6.png": [145, 145, 69], "mcl_farming_wheat_stage_3.png": [64, 113, 52], "mcl_farming_pumpkin_stem_disconnected.png": [96, 96, 96], "mcl_farming_hayblock_top.png": [154, 116, 81], "farming_pumpkin_face_light.png": [189, 100, 45], "farming_potato_baked.png": [118, 84, 45], "farming_melon_side.png": [68, 95, 37], "farming_potato.png": [107, 74, 39], "mcl_farming_wheat_stage_1.png": [49, 97, 45], "farming_pumpkin_top.png": [172, 87, 40], "farming_bread.png": [177, 133, 94], "mcl_farming_beetroot_soup.png": [120, 70, 63], "farming_melon_top.png": [58, 80, 33], "mcl_farming_potatoes_stage_3.png": [82, 106, 57], "farming_tool_stonehoe.png": [133, 122, 111], "mcl_farming_beetroot_seeds.png": [107, 104, 88], "farming_tool_goldhoe.png": [162, 131, 70], "farming_carrot_gold.png": [140, 122, 48], "farming_carrot_2.png": [72, 108, 58], "farming_pumpkin_face.png": [161, 79, 37], "mcl_farming_melon_stem_connected.png": [94, 94, 94], "mcl_farming_pumpkin_pie.png": [172, 98, 45], "mcl_farming_pumpkin_face_preview.png": [166, 81, 38], "mcl_farming_wheat_stage_2.png": [49, 97, 45], "farming_tool_steelhoe.png": [123, 112, 102], "mcl_farming_potatoes_stage_2.png": [72, 116, 62], "mcl_farming_beetroot_3.png": [73, 105, 71], "mcl_farming_wheat_seeds.png": [102, 87, 55], "mcl_farming_hayblock_side.png": [135, 99, 71], "mcl_end_purpur_block.png": [161, 111, 175], "mcl_end_chorus_flower_dead.png": [82, 79, 118], "mcl_end_end_stone.png": [221, 214, 130], "mcl_end_endframe_side.png": [110, 99, 86], "mcl_end_purpur_pillar.png": [157, 108, 171], "mcl_end_chorus_fruit.png": [87, 89, 121], "mcl_end_endframe_eye.png": [135, 36, 18], "mcl_end_chorus_fruit_popped.png": [70, 67, 110], "mcl_end_end_rod_top.png": [123, 75, 97], "mcl_end_endframe_top.png": [95, 85, 74], "mcl_end_purpur_pillar_top.png": [159, 110, 173], "mcl_end_chorus_flower.png": [92, 92, 125], "mcl_end_crystal_item.png": [170, 140, 162], "mcl_end_end_bricks.png": [194, 187, 123], "mcl_end_dragon_egg.png": [55, 34, 32], "mcl_end_ender_eye.png": [130, 33, 17], "mcl_end_chorus_plant.png": [78, 73, 115], "mcl_end_end_rod_bottom.png": [122, 74, 96], "mcl_end_crystal_beam.png": [251, 251, 251], "mcl_end_end_rod_side.png": [242, 202, 177], "mcl_clock_clock_18.png": [152, 123, 81], "mcl_clock_clock_03.png": [160, 129, 88], "mcl_clock_clock_49.png": [155, 122, 79], "mcl_clock_clock_34.png": [140, 115, 76], "mcl_clock_clock_01.png": [161, 129, 88], "mcl_clock_clock_32.png": [141, 116, 77], "mcl_clock_clock_27.png": [142, 117, 78], "mcl_clock_clock_42.png": [147, 119, 79], "mcl_clock_clock_25.png": [145, 119, 78], "mcl_clock_clock_56.png": [160, 126, 81], "mcl_clock_clock_22.png": [146, 119, 79], "mcl_clock_clock_31.png": [141, 116, 76], "mcl_clock_clock_57.png": [161, 127, 83], "mcl_clock_clock_58.png": [157, 127, 86], "mcl_clock_clock_39.png": [146, 119, 79], "mcl_clock_clock_59.png": [160, 128, 86], "mcl_clock_clock_16.png": [157, 125, 80], "mcl_clock_clock_38.png": [141, 117, 78], "mcl_clock_clock_53.png": [158, 124, 80], "mcl_clock_clock_43.png": [149, 121, 80], "mcl_clock_clock_09.png": [161, 127, 81], "mcl_clock_clock_33.png": [141, 116, 76], "mcl_clock_clock_07.png": [162, 128, 83], "mcl_clock_clock_23.png": [148, 121, 80], "mcl_clock_clock_51.png": [156, 123, 80], "mcl_clock_clock_10.png": [158, 127, 85], "mcl_clock_clock_55.png": [160, 126, 81], "mcl_clock_clock_46.png": [152, 122, 81], "mcl_clock_clock_26.png": [142, 117, 79], "mcl_clock_clock_06.png": [157, 127, 86], "mcl_clock_clock_00.png": [162, 129, 87], "mcl_clock_clock_28.png": [141, 116, 77], "mcl_clock_clock_44.png": [150, 120, 79], "mcl_clock_clock_08.png": [160, 127, 81], "mcl_clock_clock_19.png": [152, 122, 80], "mcl_clock_clock_12.png": [159, 127, 83], "mcl_clock_clock_45.png": [153, 123, 81], "mcl_clock_clock_24.png": [147, 120, 80], "mcl_clock_clock_15.png": [157, 125, 81], "mcl_clock_clock_20.png": [150, 121, 79], "mcl_clock_clock_61.png": [160, 129, 88], "mcl_clock_clock_02.png": [159, 129, 89], "mcl_clock_clock_40.png": [147, 120, 79], "mcl_clock_clock_37.png": [143, 118, 79], "mcl_clock_clock_48.png": [155, 123, 79], "mcl_clock_clock_13.png": [159, 126, 82], "mcl_clock_clock_17.png": [156, 125, 81], "mcl_clock_clock_52.png": [156, 123, 80], "mcl_clock_clock_54.png": [156, 125, 84], "mcl_clock_clock_04.png": [159, 128, 87], "mcl_clock_clock_47.png": [154, 122, 80], "mcl_clock_clock_62.png": [159, 129, 89], "mcl_clock_clock_41.png": [147, 120, 79], "mcl_clock_clock_35.png": [140, 115, 76], "mcl_clock_clock_60.png": [159, 128, 87], "mcl_clock_clock_50.png": [155, 123, 80], "mcl_clock_clock_29.png": [142, 117, 78], "mcl_clock_clock_21.png": [150, 122, 81], "mcl_clock_clock_30.png": [140, 115, 76], "mcl_clock_clock_14.png": [157, 125, 81], "mcl_clock_clock_05.png": [160, 128, 85], "mcl_clock_clock_36.png": [141, 116, 77], "mcl_clock_clock_63.png": [161, 129, 88], "mcl_clock_clock_11.png": [160, 127, 82], "mcl_compass_compass_02.png": [116, 107, 104], "mcl_compass_compass_06.png": [117, 107, 104], "mcl_compass_compass_04.png": [117, 106, 104], "mcl_compass_compass_19.png": [116, 106, 103], "mcl_compass_compass_16.png": [114, 106, 104], "mcl_compass_compass_26.png": [117, 107, 104], "mcl_compass_compass_25.png": [117, 107, 105], "mcl_compass_compass_24.png": [117, 107, 105], "mcl_compass_compass_17.png": [115, 106, 104], "mcl_compass_compass_23.png": [117, 107, 105], "mcl_compass_compass_01.png": [115, 107, 104], "mcl_compass_compass_28.png": [116, 107, 104], "mcl_compass_compass_05.png": [117, 106, 104], "mcl_compass_compass_09.png": [117, 107, 104], "mcl_compass_compass_10.png": [117, 107, 105], "mcl_compass_compass_14.png": [116, 107, 105], "mcl_compass_compass_18.png": [117, 107, 104], "mcl_compass_compass_13.png": [117, 106, 104], "mcl_compass_compass_08.png": [117, 107, 104], "mcl_compass_compass_21.png": [117, 107, 104], "mcl_compass_compass_27.png": [117, 106, 104], "mcl_compass_compass_30.png": [116, 107, 104], "mcl_compass_compass_15.png": [115, 106, 104], "mcl_compass_compass_29.png": [115, 106, 104], "mcl_compass_compass_03.png": [116, 106, 104], "mcl_compass_compass_07.png": [117, 107, 104], "mcl_compass_compass_22.png": [117, 107, 105], "mcl_compass_compass_12.png": [117, 106, 104], "mcl_compass_compass_00.png": [114, 107, 104], "mcl_compass_compass_20.png": [116, 106, 104], "mcl_compass_compass_31.png": [115, 107, 104], "mcl_compass_compass_11.png": [117, 106, 104], "mcl_jukebox_record_wait.png": [39, 42, 55], "mcl_jukebox_record_cat.png": [40, 45, 51], "mcl_jukebox_record_mellohi.png": [46, 44, 59], "mcl_jukebox_record_13.png": [51, 47, 51], "mcl_jukebox_record_ward.png": [39, 43, 51], "mcl_jukebox_record_chirp.png": [49, 40, 50], "mcl_jukebox_record_blocks.png": [47, 37, 49], "mcl_jukebox_record_11.png": [41, 40, 52], "mcl_jukebox_record_mall.png": [42, 41, 62], "mcl_jukebox_top.png": [72, 56, 44], "mcl_jukebox_record_strad.png": [45, 45, 57], "mcl_jukebox_record_far.png": [47, 48, 52], "mcl_jukebox_side.png": [94, 74, 57], "mcl_jukebox_record_stal.png": [39, 38, 49], "mcl_fences_fence_acacia.png": [152, 99, 68], "mcl_fences_fence_gate_mask.png": [255, 126, 126], "mcl_fences_fence_gate_spruce.png": [85, 69, 56], "mcl_fences_fence_big_oak.png": [83, 71, 59], "mcl_fences_fence_spruce.png": [84, 67, 54], "mcl_fences_fence_gate_birch.png": [153, 121, 94], "mcl_fences_fence_gate_acacia.png": [155, 102, 70], "mcl_fences_fence_gate_big_oak.png": [85, 73, 61], "mcl_fences_fence_oak.png": [108, 83, 64], "mcl_fences_fence_gate_oak.png": [111, 85, 66], "mcl_fences_fence_jungle.png": [115, 80, 60], "mcl_fences_fence_nether_brick.png": [49, 24, 24], "mcl_fences_fence_birch.png": [151, 119, 93], "mcl_fences_fence_gate_jungle.png": [117, 82, 61], "mcl_fences_fence_mask.png": [255, 126, 126], "mcl_core_leaves_birch.png": [28, 57, 28], "default_mossycobble.png": [100, 105, 94], "default_flint.png": [70, 67, 64], "mcl_core_bowl.png": [78, 61, 47], "mcl_core_bone_block_top.png": [220, 201, 170], "default_acacia_tree.png": [105, 91, 74], "default_steel_block.png": [159, 151, 151], "mcl_core_stonebrick_mossy.png": [81, 101, 76], "default_diamond_block.png": [92, 160, 200], "default_leaves.png": [39, 79, 38], "mcl_core_web.png": [202, 189, 167], "mcl_core_reeds.png": [57, 100, 52], "default_gold_ingot.png": [179, 133, 47], "mcl_core_grass_path_side.png": [113, 89, 62], "mcl_core_red_sand.png": [224, 137, 111], "default_apple.png": [137, 57, 44], "mcl_core_log_birch_top.png": [155, 130, 112], "default_coal_block.png": [51, 49, 51], "mcl_core_andesite_smooth.png": [107, 113, 109], "mcl_core_apple_golden.png": [176, 138, 51], "mcl_core_diorite.png": [153, 149, 146], "mcl_core_granite_smooth.png": [150, 121, 110], "mcl_core_bedrock.png": [91, 77, 66], "mcl_core_planks_spruce.png": [81, 65, 54], "mcl_core_sapling_big_oak.png": [69, 92, 80], "mcl_core_emerald_ore.png": [115, 122, 103], "mcl_core_sandstone_smooth.png": [202, 155, 121], "mcl_core_glass_light_blue.png": [101, 153, 215], "default_brick.png": [139, 87, 75], "mcl_core_redstone_ore.png": [128, 91, 88], "mcl_core_cactus_top.png": [77, 99, 49], "mcl_core_frosted_ice_1.png": [147, 198, 227], "mcl_core_sapling_spruce.png": [55, 72, 53], "mcl_core_stripped_acacia_top.png": [149, 92, 58], "mcl_core_log_spruce_top.png": [97, 71, 57], "mcl_core_glass_lime.png": [126, 203, 24], "mcl_core_lapis_ore.png": [111, 113, 125], "default_junglesapling.png": [64, 88, 39], "default_clay_brick.png": [127, 57, 48], "default_gold_block.png": [192, 147, 59], "default_water_source_animated.png": [37, 98, 129], "mcl_core_glass_yellow.png": [228, 228, 50], "default_acacia_sapling.png": [109, 92, 59], "mcl_core_stripped_acacia_side.png": [155, 96, 61], "mcl_core_sandstone_carved.png": [199, 152, 119], "mcl_core_glass_blue.png": [50, 75, 178], "mcl_core_red_sandstone_normal.png": [198, 120, 104], "mcl_core_glass_gray.png": [75, 75, 75], "mcl_core_leaves_spruce.png": [38, 74, 47], "mcl_core_glass_pink.png": [241, 126, 164], "mcl_core_lapis_block.png": [50, 92, 162], "mcl_core_glass_purple.png": [126, 62, 178], "mcl_core_iron_nugget.png": [156, 151, 145], "default_papyrus.png": [82, 114, 57], "default_dry_grass.png": [100, 94, 54], "mcl_core_stripped_dark_oak_top.png": [91, 78, 68], "mcl_core_glass_silver.png": [153, 153, 153], "mcl_core_andesite.png": [104, 110, 107], "mcl_core_frosted_ice_3.png": [165, 209, 233], "mcl_core_sugar.png": [215, 215, 215], "default_acacia_wood.png": [152, 100, 69], "mcl_core_glass_black.png": [24, 24, 24], "mcl_core_iron_ore.png": [134, 123, 117], "mcl_core_stripped_birch_side.png": [163, 130, 104], "default_clay.png": [124, 124, 124], "mcl_core_stripped_jungle_side.png": [140, 98, 76], "mcl_core_glass_red.png": [153, 50, 50], "mcl_core_grass_block_top.png": [141, 130, 113], "mcl_core_planks_birch.png": [145, 113, 89], "mcl_core_glass_white.png": [254, 254, 254], "mcl_core_stripped_oak_side.png": [119, 94, 71], "mcl_core_glass_cyan.png": [75, 126, 153], "mcl_core_cactus_side.png": [88, 110, 56], "default_ladder.png": [83, 64, 50], "default_dry_grass_side.png": [91, 93, 52], "mcl_core_stripped_jungle_top.png": [143, 101, 78], "mcl_core_ice_packed.png": [165, 211, 231], "mcl_core_frosted_ice_2.png": [153, 202, 229], "default_dry_shrub.png": [118, 88, 69], "mcl_core_red_sandstone_carved.png": [202, 122, 104], "default_tree.png": [95, 75, 57], "default_clay_lump.png": [111, 111, 111], "mcl_core_red_sandstone_top.png": [212, 126, 108], "mcl_core_dirt_podzol_side.png": [101, 79, 63], "mcl_core_red_sandstone_smooth.png": [207, 124, 106], "default_jungletree_top.png": [125, 87, 67], "mcl_core_coal_ore.png": [109, 101, 99], "default_jungleleaves.png": [29, 84, 30], "mcl_core_vine.png": [21, 61, 21], "default_snow.png": [221, 229, 234], "mcl_core_leaves_big_oak.png": [21, 69, 28], "mcl_core_void.png": [59, 59, 59], "default_tree_top.png": [135, 104, 74], "mcl_core_gold_ore.png": [132, 119, 103], "default_steel_ingot.png": [142, 137, 131], "default_sapling.png": [62, 90, 45], "mcl_core_log_birch.png": [194, 184, 174], "mcl_core_stripped_spruce_top.png": [111, 81, 64], "default_water_flowing_animated.png": [38, 101, 129], "mcl_core_emerald_block.png": [44, 138, 39], "default_jungletree.png": [86, 58, 45], "mcl_core_grass_side_snowed.png": [162, 154, 150], "default_stone_brick.png": [97, 89, 86], "default_lava_flowing_animated.png": [177, 42, 16], "mcl_core_stripped_spruce_side.png": [104, 78, 63], "default_coal_lump.png": [41, 39, 41], "default_sand.png": [220, 170, 127], "mcl_core_glass_green.png": [101, 126, 50], "mcl_core_glass_orange.png": [215, 126, 50], "default_acacia_tree_top.png": [130, 84, 55], "mcl_core_stripped_oak_top.png": [139, 108, 78], "mcl_core_grass_block_side_overlay.png": [153, 142, 123], "default_lava_source_animated.png": [180, 45, 17], "mcl_core_cactus_bottom.png": [169, 168, 116], "mcl_core_sandstone_bottom.png": [202, 155, 121], "default_paper.png": [213, 184, 154], "mcl_core_diamond_ore.png": [122, 124, 126], "default_ice.png": [145, 197, 226], "mcl_core_dirt_podzol_top.png": [85, 63, 42], "mcl_core_slime.png": [93, 157, 86], "mcl_core_gold_nugget.png": [213, 169, 74], "default_stick.png": [88, 70, 57], "mcl_core_emerald.png": [59, 160, 52], "default_diamond.png": [109, 179, 217], "mcl_core_mycelium_top.png": [108, 89, 117], "mcl_core_bone_block_side.png": [226, 207, 174], "mcl_core_diorite_smooth.png": [157, 154, 152], "default_obsidian.png": [13, 9, 25], "mcl_core_planks_big_oak.png": [87, 74, 62], "mcl_core_log_spruce.png": [66, 51, 44], "mcl_core_glass_magenta.png": [178, 75, 215], "mcl_core_granite.png": [153, 121, 110], "mcl_core_log_big_oak_top.png": [83, 70, 62], "default_cobble.png": [113, 106, 104], "mcl_core_red_sandstone_bottom.png": [207, 124, 106], "mcl_core_barrier.png": [138, 46, 38], "mcl_core_stripped_dark_oak_side.png": [86, 73, 63], "mcl_core_mycelium_side.png": [107, 84, 87], "mcl_core_stonebrick_cracked.png": [94, 87, 83], "mcl_core_charcoal.png": [40, 35, 32], "mcl_core_glass_brown.png": [101, 75, 50], "mcl_core_stonebrick_carved.png": [97, 90, 85], "default_wood.png": [113, 87, 67], "default_dirt.png": [108, 83, 70], "mcl_core_log_big_oak.png": [74, 62, 55], "default_junglewood.png": [113, 78, 59], "mcl_core_frosted_ice_0.png": [140, 193, 224], "mcl_core_sandstone_normal.png": [195, 149, 117], "default_gravel.png": [112, 105, 99], "mcl_core_sandstone_top.png": [201, 154, 121], "default_glass.png": [213, 223, 235], "default_stone.png": [130, 122, 118], "mcl_core_sapling_birch.png": [78, 110, 74], "mcl_core_coarse_dirt.png": [117, 92, 76], "default_acacia_leaves.png": [110, 89, 45], "mcl_core_stripped_birch_top.png": [157, 126, 102], "mcl_core_grass_path_top.png": [125, 101, 50], "mcl_throwing_ender_pearl.png": [78, 19, 26], "mcl_throwing_egg.png": [199, 157, 106], "mcl_throwing_snowball.png": [191, 200, 203], "mcl_flowers_tulip_red.png": [82, 57, 43], "mcl_flowers_double_plant_rose_top.png": [81, 69, 45], "mcl_flowers_double_plant_sunflower_front.png": [203, 157, 61], "mcl_flowers_tulip_white.png": [106, 122, 95], "mcl_flowers_double_plant_grass_top.png": [156, 145, 125], "mcl_flowers_azure_bluet.png": [97, 114, 98], "mcl_flowers_oxeye_daisy.png": [130, 139, 110], "mcl_flowers_poppy.png": [96, 59, 43], "mcl_flowers_double_plant_paeonia_top.png": [90, 84, 81], "mcl_flowers_double_plant_rose_bottom.png": [78, 63, 41], "mcl_flowers_tallgrass.png": [151, 141, 122], "mcl_flowers_double_plant_sunflower_bottom.png": [45, 76, 40], "mcl_flowers_fern.png": [143, 132, 115], "flowers_tulip.png": [106, 84, 51], "mcl_flowers_double_plant_syringa_bottom.png": [63, 77, 60], "mcl_flowers_double_plant_fern_bottom.png": [140, 130, 113], "flowers_dandelion_yellow.png": [111, 111, 55], "mcl_flowers_double_plant_paeonia_bottom.png": [82, 83, 73], "mcl_flowers_double_plant_sunflower_back.png": [174, 146, 57], "mcl_flowers_allium.png": [120, 116, 144], "flowers_waterlily.png": [28, 81, 29], "mcl_flowers_tulip_pink.png": [100, 99, 90], "mcl_flowers_double_plant_sunflower_top.png": [48, 81, 44], "mcl_flowers_double_plant_syringa_top.png": [95, 90, 98], "mcl_flowers_double_plant_grass_bottom.png": [151, 140, 121], "mcl_flowers_double_plant_grass_inv.png": [48, 95, 43], "mcl_flowers_fern_inv.png": [43, 86, 39], "mcl_flowers_double_plant_fern_top.png": [148, 138, 119], "mcl_flowers_tallgrass_inv.png": [47, 92, 41], "mcl_flowers_double_plant_fern_inv.png": [45, 89, 40], "mcl_flowers_blue_orchid.png": [46, 91, 86], "mcl_armor_leggings_iron.png": [132, 128, 123], "mcl_armor_inv_leggings_iron.png": [130, 125, 120], "mcl_armor_chestplate_chain_preview.png": [124, 98, 90], "mcl_armor_inv_helmet_gold.png": [178, 134, 51], "mcl_armor_leggings_chain.png": [64, 66, 69], "mcl_armor_helmet_chain_preview.png": [154, 150, 143], "mcl_armor_chestplate_diamond_preview.png": [102, 140, 160], "mcl_armor_inv_boots_iron.png": [134, 129, 124], "mcl_armor_boots_gold_preview.png": [178, 133, 42], "mcl_armor_leggings_diamond_preview.png": [80, 118, 138], "mcl_armor_inv_chestplate_chain.png": [128, 105, 96], "mcl_armor_helmet_diamond_preview.png": [101, 134, 152], "mcl_armor_boots_leather_preview.png": [129, 119, 101], "mcl_armor_inv_chestplate_gold.png": [171, 128, 55], "mcl_armor_inv_helmet_diamond.png": [109, 130, 142], "mcl_armor_leggings_leather_preview.png": [141, 134, 114], "mcl_armor_boots_leather.png": [122, 111, 93], "mcl_armor_inv_chestplate_diamond.png": [106, 146, 168], "mcl_armor_helmet_diamond.png": [70, 85, 93], "mcl_armor_chestplate_iron_preview.png": [143, 134, 123], "mcl_armor_inv_chestplate_leather.png": [143, 136, 118], "mcl_armor_boots_diamond.png": [87, 132, 157], "mcl_armor_leggings_diamond.png": [78, 102, 115], "mcl_armor_leggings_gold_preview.png": [185, 156, 108], "mcl_armor_chestplate_gold.png": [157, 117, 55], "mcl_armor_inv_helmet_chain.png": [140, 137, 132], "mcl_armor_boots_chain_preview.png": [78, 78, 79], "mcl_armor_inv_leggings_chain.png": [81, 81, 82], "mcl_armor_inv_helmet_iron.png": [143, 138, 133], "mcl_armor_helmet_leather.png": [130, 121, 102], "mcl_armor_chestplate_diamond.png": [110, 157, 183], "mcl_armor_leggings_leather.png": [119, 108, 91], "mcl_armor_leggings_iron_preview.png": [127, 122, 117], "mcl_armor_inv_boots_gold.png": [187, 142, 46], "mcl_armor_chestplate_leather.png": [139, 132, 112], "mcl_armor_boots_iron.png": [118, 113, 109], "mcl_armor_elytra.png": [75, 121, 147], "mcl_armor_helmet_chain.png": [127, 124, 121], "mcl_armor_helmet_gold_preview.png": [181, 138, 54], "mcl_armor_boots_iron_preview.png": [118, 113, 108], "mcl_armor_helmet_iron.png": [153, 149, 144], "mcl_armor_inv_boots_leather.png": [130, 121, 103], "mcl_armor_leggings_chain_preview.png": [54, 56, 61], "mcl_armor_helmet_iron_preview.png": [143, 138, 132], "mcl_armor_helmet_leather_preview.png": [119, 109, 91], "mcl_armor_chestplate_leather_preview.png": [144, 138, 118], "mcl_armor_leggings_gold.png": [182, 158, 126], "mcl_armor_inv_leggings_gold.png": [175, 145, 97], "mcl_armor_chestplate_iron.png": [130, 120, 112], "mcl_armor_inv_elytra.png": [76, 122, 148], "mcl_armor_boots_chain.png": [88, 88, 88], "mcl_armor_helmet_gold.png": [178, 136, 56], "mcl_armor_inv_boots_diamond.png": [75, 121, 147], "mcl_armor_inv_chestplate_iron.png": [135, 125, 115], "mcl_armor_inv_leggings_diamond.png": [75, 93, 103], "mcl_armor_inv_leggings_leather.png": [126, 116, 98], "mcl_armor_inv_helmet_leather.png": [140, 132, 114], "mcl_armor_inv_boots_chain.png": [69, 69, 72], "mcl_armor_chestplate_gold_preview.png": [169, 127, 56], "mcl_armor_chestplate_chain.png": [119, 98, 93], "mcl_armor_boots_gold.png": [160, 118, 42], "mcl_armor_boots_diamond_preview.png": [89, 141, 169], "mcl_walls_cobble_wall_top.png": [120, 114, 112], "mcl_walls_cobble_mossy_wall_top.png": [53, 97, 61], "mcl_walls_cobble_wall_side.png": [109, 103, 101], "mcl_walls_cobble_mossy_wall_side.png": [86, 98, 83], "mcl_hoppers_item.png": [44, 44, 44], "mcl_hoppers_hopper_top.png": [43, 43, 43], "mcl_hoppers_hopper_outside.png": [44, 43, 43], "mcl_hoppers_hopper_inside.png": [50, 50, 50], "mcl_stairs_stone_slab_top.png": [127, 118, 114], "mcl_stairs_stone_slab_side.png": [127, 117, 113], "mcl_stairs_turntexture.png": [255, 0, 255], "mcl_brewing_bottle_bg.png": [204, 204, 204], "mcl_brewing_bubble_sprite.png": [167, 167, 167], "mcl_brewing_side.png": [175, 156, 160], "mcl_brewing_inventory.png": [168, 168, 168], "mcl_brewing_bubbles_active.png": [186, 186, 186], "mcl_brewing_fuel_bg.png": [200, 200, 200], "mcl_brewing_potion_bg.png": [204, 204, 204], "mcl_brewing_bubbles.png": [154, 154, 154], "mcl_brewing_top.png": [139, 130, 126], "mcl_brewing_base.png": [130, 122, 118], "mcl_brewing_burner.png": [183, 183, 183], "mcl_brewing_burner_active.png": [212, 161, 132], "xpanes_top_glass_cyan.png": [76, 127, 153], "xpanes_top_glass_brown.png": [102, 76, 51], "xpanes_top_glass_magenta.png": [178, 75, 215], "xpanes_top_glass_light_blue.png": [102, 153, 216], "xpanes_top_glass_blue.png": [51, 76, 178], "xpanes_top_glass_gray.png": [76, 76, 76], "xpanes_top_glass_silver.png": [153, 153, 153], "xpanes_top_iron.png": [155, 146, 146], "xpanes_top_glass_black.png": [25, 25, 25], "xpanes_top_glass_white.png": [255, 255, 255], "xpanes_top_glass_lime.png": [127, 204, 25], "xpanes_top_glass_orange.png": [216, 127, 51], "xpanes_top_glass_purple.png": [127, 63, 178], "xpanes_top_glass_red.png": [153, 51, 51], "xpanes_top_glass_natural.png": [222, 222, 239], "xpanes_top_glass_green.png": [102, 127, 51], "xpanes_top_glass_pink.png": [241, 126, 164], "xpanes_pane_iron.png": [160, 152, 152], "xpanes_top_glass_yellow.png": [229, 229, 51], "hardened_clay_stained_pink.png": [164, 79, 76], "mcl_colorblocks_glazed_terracotta_yellow.png": [232, 199, 99], "mcl_colorblocks_glazed_terracotta_orange.png": [170, 146, 81], "mcl_colorblocks_concrete_powder_lime.png": [125, 186, 42], "mcl_colorblocks_concrete_brown.png": [98, 60, 32], "mcl_colorblocks_concrete_magenta.png": [171, 49, 162], "mcl_colorblocks_glazed_terracotta_magenta.png": [210, 108, 215], "mcl_colorblocks_concrete_silver.png": [128, 129, 118], "mcl_colorblocks_glazed_terracotta_grey.png": [90, 90, 90], "mcl_colorblocks_concrete_powder_blue.png": [72, 75, 169], "mcl_colorblocks_concrete_yellow.png": [241, 177, 21], "mcl_colorblocks_concrete_red.png": [146, 34, 34], "mcl_colorblocks_glazed_terracotta_lime.png": [152, 211, 72], "mcl_colorblocks_concrete_black.png": [8, 10, 15], "mcl_colorblocks_glazed_terracotta_silver.png": [134, 151, 151], "hardened_clay_stained_white.png": [213, 197, 184], "mcl_colorblocks_glazed_terracotta_green.png": [111, 135, 50], "mcl_colorblocks_glazed_terracotta_blue.png": [34, 65, 117], "mcl_colorblocks_concrete_powder_red.png": [172, 57, 52], "mcl_colorblocks_concrete_powder_cyan.png": [38, 150, 159], "hardened_clay_stained_purple.png": [81, 71, 123], "hardened_clay_stained_brown.png": [96, 69, 61], "hardened_clay_stained_grey.png": [110, 92, 85], "mcl_colorblocks_concrete_lime.png": [96, 171, 25], "hardened_clay_stained_blue.png": [68, 91, 143], "mcl_colorblocks_concrete_powder_white.png": [224, 225, 225], "hardened_clay_stained_yellow.png": [177, 128, 51], "hardened_clay_stained_light_blue.png": [91, 128, 171], "hardened_clay.png": [143, 104, 87], "mcl_colorblocks_concrete_cyan.png": [21, 123, 140], "mcl_colorblocks_glazed_terracotta_brown.png": [108, 88, 64], "mcl_colorblocks_concrete_grey.png": [56, 59, 64], "mcl_colorblocks_concrete_powder_magenta.png": [196, 94, 189], "mcl_colorblocks_concrete_powder_black.png": [22, 26, 30], "mcl_colorblocks_concrete_pink.png": [213, 103, 144], "mcl_colorblocks_concrete_powder_orange.png": [227, 141, 38], "mcl_colorblocks_glazed_terracotta_cyan.png": [90, 131, 136], "mcl_colorblocks_glazed_terracotta_red.png": [184, 67, 53], "mcl_colorblocks_concrete_green.png": [75, 94, 37], "mcl_colorblocks_concrete_blue.png": [46, 48, 147], "mcl_colorblocks_glazed_terracotta_light_blue.png": [99, 162, 204], "hardened_clay_stained_orange.png": [156, 95, 69], "mcl_colorblocks_concrete_powder_silver.png": [160, 160, 155], "mcl_colorblocks_concrete_powder_pink.png": [224, 148, 176], "hardened_clay_stained_silver.png": [149, 129, 117], "hardened_clay_stained_red.png": [159, 81, 66], "hardened_clay_stained_magenta.png": [150, 80, 85], "mcl_colorblocks_glazed_terracotta_black.png": [38, 22, 22], "mcl_colorblocks_concrete_white.png": [208, 214, 215], "hardened_clay_stained_green.png": [74, 101, 63], "hardened_clay_stained_lime.png": [105, 134, 73], "mcl_colorblocks_concrete_powder_green.png": [104, 127, 45], "mcl_colorblocks_concrete_light_blue.png": [37, 140, 200], "mcl_colorblocks_concrete_powder_brown.png": [128, 86, 54], "mcl_colorblocks_concrete_purple.png": [103, 32, 159], "hardened_clay_stained_cyan.png": [71, 107, 123], "mcl_colorblocks_concrete_powder_purple.png": [138, 58, 180], "mcl_colorblocks_concrete_powder_yellow.png": [230, 198, 54], "mcl_colorblocks_concrete_powder_light_blue.png": [75, 181, 212], "mcl_colorblocks_glazed_terracotta_pink.png": [251, 138, 170], "mcl_colorblocks_glazed_terracotta_purple.png": [112, 49, 152], "mcl_colorblocks_concrete_orange.png": [226, 101, 1], "mcl_colorblocks_concrete_powder_grey.png": [91, 98, 103], "hardened_clay_stained_black.png": [69, 52, 46], "mcl_colorblocks_glazed_terracotta_white.png": [188, 211, 202], "fire_basic_flame_animated.png": [206, 98, 34], "mcl_burning_hud_flame_animated.png": [206, 98, 34], "mcl_fire_fire_charge.png": [95, 58, 41], "mcl_burning_entity_flame_animated.png": [206, 98, 34], "mcl_fire_flint_and_steel.png": [96, 95, 93], "fire_basic_flame.png": [207, 100, 36], "dye_red.png": [113, 74, 47], "dye_yellow.png": [123, 91, 49], "dye_violet.png": [107, 76, 57], "dye_dark_green.png": [99, 81, 47], "mcl_dye_blue.png": [58, 101, 173], "dye_cyan.png": [104, 89, 60], "mcl_dye_lime.png": [107, 91, 53], "dye_pink.png": [120, 81, 61], "mcl_dye_light_blue.png": [103, 88, 70], "dye_dark_grey.png": [108, 81, 52], "mcl_dye_white.png": [205, 193, 166], "dye_grey.png": [113, 86, 58], "dye_magenta.png": [111, 79, 59], "dye_orange.png": [122, 85, 48], "mcl_dye_brown.png": [104, 75, 56], "mcl_dye_black.png": [56, 56, 64], "default_river_water_flowing_animated.png": [38, 123, 130], "default_river_water_source_animated.png": [37, 120, 130], "3d_armor_stand_item.png": [134, 114, 98], "mob_spawner.png": [40, 40, 40], "mcl_nether_quartz_chiseled_side.png": [194, 186, 183], "mcl_nether_quartz_pillar_top.png": [195, 188, 185], "mcl_nether_nether_wart.png": [190, 79, 75], "mcl_nether_nether_wart_stage_1.png": [86, 54, 51], "mcl_nether_quartz_ore.png": [133, 64, 53], "mcl_nether_soul_sand.png": [90, 70, 51], "mcl_nether_nether_wart_block.png": [175, 76, 73], "mcl_nether_nether_wart_stage_0.png": [53, 41, 38], "mcl_nether_quartz_block_bottom.png": [198, 191, 187], "mcl_nether_quartz_block_top.png": [198, 190, 187], "mcl_nether_quartz.png": [152, 149, 147], "mcl_nether_quartz_pillar_side.png": [195, 188, 184], "mcl_nether_netherbrick.png": [58, 24, 20], "mcl_nether_glowstone.png": [202, 154, 96], "mcl_nether_netherrack.png": [130, 50, 39], "mcl_nether_red_nether_brick.png": [69, 17, 5], "mcl_nether_quartz_chiseled_top.png": [197, 189, 186], "mcl_nether_glowstone_dust.png": [209, 137, 67], "mcl_nether_nether_wart_stage_2.png": [106, 57, 53], "mcl_nether_quartz_block_side.png": [198, 190, 187], "mcl_nether_nether_brick.png": [49, 23, 24], "mcl_nether_magma.png": [85, 33, 27], "mcl_cauldrons_cauldron_inner.png": [24, 24, 24], "mcl_cauldrons_cauldron_top.png": [54, 54, 54], "mcl_cauldrons_cauldron_bottom.png": [50, 37, 38], "mcl_cauldrons_cauldron.png": [47, 47, 47], "mcl_cauldrons_cauldron_side.png": [43, 43, 43], "mcl_beds_bed_side_bottom_magenta.png": [127, 48, 89], "mcl_beds_bed_blue.png": [73, 78, 105], "mcl_beds_bed_side_top_r_black.png": [99, 86, 75], "mcl_beds_bed_side_bottom_r_magenta.png": [132, 46, 94], "mcl_beds_bed_side_top_brown.png": [98, 76, 59], "mcl_beds_bed_lime.png": [96, 135, 66], "mcl_beds_bed_side_top_green.png": [98, 76, 59], "mcl_beds_bed_light_blue.png": [100, 107, 142], "mcl_beds_bed_pink.png": [184, 105, 115], "mcl_beds_bed_side_bottom_black.png": [66, 56, 47], "mcl_beds_bed_top_bottom_green.png": [57, 110, 29], "mcl_beds_bed_side_top_blue.png": [98, 76, 59], "mcl_beds_bed_top_top_pink.png": [217, 138, 147], "mcl_beds_bed_side_bottom_light_blue.png": [90, 94, 129], "mcl_beds_bed_side_bottom_blue.png": [63, 65, 90], "mcl_beds_bed_top_top_red.png": [173, 90, 83], "mcl_beds_bed_side_top_grey.png": [98, 76, 59], "mcl_beds_bed_top_top_white.png": [198, 190, 183], "mcl_beds_bed_top_top_black.png": [107, 100, 92], "mcl_beds_bed_top_bottom_brown.png": [101, 69, 38], "mcl_beds_bed_top_bottom_pink.png": [232, 105, 135], "mcl_beds_bed_side_bottom_r_pink.png": [183, 95, 106], "mcl_beds_bed_side_bottom_r_green.png": [73, 97, 42], "mcl_beds_bed_side_bottom_r_grey.png": [86, 77, 69], "mcl_beds_bed_side_top_r_white.png": [158, 145, 134], "mcl_beds_bed_side_bottom_orange.png": [143, 84, 28], "mcl_beds_bed_side_bottom_purple.png": [105, 36, 112], "mcl_beds_bed_side_bottom_r_light_blue.png": [90, 97, 136], "mcl_beds_bed_side_top_r_magenta.png": [140, 81, 103], "mcl_beds_bed_side_bottom_r_yellow.png": [150, 131, 25], "mcl_beds_bed_side_top_r_pink.png": [176, 111, 113], "mcl_beds_bed_top_top_blue.png": [105, 112, 137], "mcl_beds_bed_side_bottom_green.png": [74, 94, 43], "mcl_beds_bed_side_bottom_r_blue.png": [61, 66, 95], "mcl_beds_bed_top_top_grey.png": [129, 121, 113], "mcl_beds_bed_black.png": [76, 68, 61], "mcl_beds_bed_top_top_silver.png": [159, 151, 143], "mcl_beds_bed_white.png": [173, 165, 158], "mcl_beds_bed_top_top_cyan.png": [105, 144, 135], "mcl_beds_bed_top_bottom_orange.png": [184, 91, 0], "mcl_beds_bed_side_top_silver.png": [98, 76, 59], "mcl_beds_bed_top_top_brown.png": [143, 118, 93], "mcl_beds_bed_side_top_r_light_blue.png": [115, 111, 132], "mcl_beds_bed_side_bottom_r_lime.png": [86, 129, 53], "mcl_beds_bed_red.png": [139, 58, 51], "mcl_beds_bed_top_bottom_lime.png": [79, 163, 47], "mcl_beds_bed_side_top_r_brown.png": [121, 97, 75], "mcl_beds_bed_side_bottom_r_silver.png": [119, 109, 102], "mcl_beds_bed_yellow.png": [154, 138, 41], "mcl_beds_bed_side_top_yellow.png": [98, 76, 59], "mcl_beds_bed_top_bottom_black.png": [37, 37, 37], "mcl_beds_bed_brown.png": [110, 85, 61], "mcl_beds_bed_side_top_orange.png": [98, 76, 59], "mcl_beds_bed_side_top_red.png": [98, 76, 59], "mcl_beds_bed_top_top_purple.png": [148, 79, 161], "mcl_beds_bed_side_bottom_pink.png": [177, 93, 102], "mcl_beds_bed_side_top_r_grey.png": [112, 99, 88], "mcl_beds_bed_side_top_r_blue.png": [97, 91, 104], "mcl_beds_bed_side_top_purple.png": [98, 76, 59], "mcl_beds_bed_side_top_cyan.png": [98, 76, 59], "mcl_beds_bed_top_bottom_blue.png": [32, 60, 119], "mcl_beds_bed_side_bottom_yellow.png": [143, 125, 28], "mcl_beds_bed_side_top_black.png": [98, 76, 59], "mcl_beds_bed_top_top_orange.png": [188, 130, 72], "mcl_beds_bed_top_bottom_silver.png": [129, 129, 129], "mcl_beds_bed_top_top_green.png": [117, 140, 88], "mcl_beds_bed_cyan.png": [73, 111, 103], "mcl_beds_bed_top_bottom_red.png": [157, 20, 20], "mcl_beds_bed_top_bottom_purple.png": [111, 0, 163], "mcl_beds_bed_side_top_r_silver.png": [133, 120, 109], "mcl_beds_bed_side_bottom_grey.png": [86, 76, 67], "mcl_beds_bed_grey.png": [96, 88, 81], "mcl_beds_bed_side_top_r_yellow.png": [151, 132, 62], "mcl_beds_bed_side_top_r_green.png": [103, 111, 72], "mcl_beds_bed_side_bottom_brown.png": [100, 73, 48], "mcl_beds_bed_magenta.png": [138, 60, 104], "mcl_beds_bed_side_bottom_r_red.png": [134, 44, 37], "mcl_beds_bed_side_bottom_r_brown.png": [101, 73, 47], "mcl_beds_bed_side_top_lime.png": [98, 76, 59], "mcl_beds_bed_side_top_light_blue.png": [98, 76, 59], "mcl_beds_bed_side_bottom_red.png": [129, 47, 38], "mcl_beds_bed_bottom_top.png": [48, 38, 29], "mcl_beds_bed_top_bottom_grey.png": [76, 76, 76], "mcl_beds_bed_side_bottom_r_orange.png": [150, 86, 25], "mcl_beds_bed_side_bottom_r_black.png": [64, 54, 47], "mcl_beds_bed_top_bottom_cyan.png": [32, 119, 114], "mcl_beds_bed_side_bottom_silver.png": [116, 106, 97], "mcl_beds_bed_side_top_magenta.png": [98, 76, 59], "mcl_beds_bed_top_bottom_white.png": [201, 201, 201], "mcl_beds_bed_side_top_r_orange.png": [151, 105, 62], "mcl_beds_bed_top_bottom_magenta.png": [154, 23, 118], "mcl_beds_bed_side_top_r_lime.png": [110, 131, 80], "mcl_beds_bed_top_top_magenta.png": [172, 92, 137], "mcl_beds_bed_bottom_bottom.png": [48, 38, 29], "mcl_beds_bed_side_top_r_purple.png": [125, 73, 119], "mcl_beds_bed_side_top_r_cyan.png": [97, 113, 103], "mcl_beds_bed_side_top_white.png": [98, 76, 59], "mcl_beds_bed_side_bottom_r_cyan.png": [61, 101, 93], "mcl_beds_bed_side_bottom_cyan.png": [63, 97, 89], "mcl_beds_bed_side_bottom_white.png": [161, 151, 142], "mcl_beds_bed_top_bottom_yellow.png": [184, 169, 0], "mcl_beds_bed_top_bottom_light_blue.png": [82, 113, 182], "mcl_beds_bed_top_top_lime.png": [130, 169, 98], "mcl_beds_bed_silver.png": [109, 100, 93], "mcl_beds_bed_purple.png": [115, 47, 128], "mcl_beds_bed_side_top_r_red.png": [141, 80, 69], "mcl_beds_bed_top_top_light_blue.png": [132, 141, 174], "mcl_beds_bed_side_bottom_r_purple.png": [107, 32, 120], "mcl_beds_bed_side_bottom_r_white.png": [161, 151, 144], "mcl_beds_bed_orange.png": [154, 96, 41], "mcl_beds_bed_top_bottom_gray.png": [57, 57, 57], "mcl_beds_bed_side_bottom_lime.png": [85, 122, 53], "mcl_beds_bed_green.png": [85, 107, 56], "mcl_beds_bed_top_top_yellow.png": [188, 172, 72], "mcl_beds_bed_side_top_pink.png": [98, 76, 59], "mcl_sponges_sponge_wet_river_water.png": [157, 141, 104], "mcl_sponges_sponge.png": [210, 177, 118], "mcl_sponges_sponge_wet.png": [156, 134, 92], "farming_mushroom_red.png": [169, 59, 58], "mcl_mushrooms_mushroom_block_inside.png": [218, 175, 136], "mcl_mushrooms_mushroom_block_skin_brown.png": [131, 86, 68], "mcl_mushrooms_mushroom_block_skin_stem.png": [204, 183, 149], "mcl_mushrooms_mushroom_block_skin_red.png": [137, 39, 25], "farming_mushroom_brown.png": [121, 81, 59], "farming_mushroom_stew.png": [134, 97, 67], "default_tool_goldsword.png": [194, 154, 70], "default_tool_steelsword.png": [134, 130, 125], "default_tool_woodsword.png": [100, 82, 68], "default_tool_goldshovel.png": [167, 133, 64], "default_tool_steelpick.png": [137, 128, 119], "default_tool_woodshovel.png": [108, 90, 76], "default_tool_goldpick.png": [172, 139, 73], "default_tool_woodaxe.png": [110, 92, 77], "default_tool_diamondsword.png": [105, 133, 149], "default_tool_steelshovel.png": [125, 115, 107], "default_tool_stonesword.png": [133, 125, 118], "default_tool_woodpick.png": [110, 91, 76], "default_tool_shears.png": [139, 132, 124], "default_tool_goldaxe.png": [160, 128, 66], "default_tool_stoneshovel.png": [126, 116, 107], "default_tool_diamondaxe.png": [103, 110, 113], "default_tool_diamondshovel.png": [106, 125, 134], "default_tool_steelaxe.png": [129, 119, 110], "default_tool_stoneaxe.png": [126, 115, 104], "default_tool_diamondpick.png": [92, 105, 111], "default_tool_stonepick.png": [126, 114, 104], "mcl_chests_ender_chest_right.png": [73, 67, 64], "mcl_chests_chest_trapped_right.png": [98, 78, 62], "default_chest_front.png": [85, 70, 58], "mcl_chests_blue_shulker_box_top.png": [67, 85, 119], "mcl_chests_chest_left.png": [99, 78, 63], "mcl_chests_dark_green_shulker_box_top.png": [67, 111, 70], "mcl_chests_chest_back.png": [92, 75, 61], "mcl_chests_ender_chest_bottom.png": [61, 55, 55], "mcl_chests_ender.png": [70, 62, 58], "mcl_chests_brown_shulker_box_top.png": [73, 63, 55], "mcl_chests_chest_trapped_back.png": [92, 75, 61], "mcl_chests_chest_trapped_side_big.png": [96, 77, 62], "mcl_chests_magenta_shulker_box_top.png": [128, 81, 124], "mcl_chests_ender_chest_back.png": [72, 66, 64], "mcl_chests_chest_trapped_bottom.png": [118, 91, 70], "mcl_chests_chest_trapped_front.png": [86, 68, 57], "default_chest_side_big.png": [96, 77, 62], "mcl_chests_green_shulker_box_top.png": [88, 122, 75], "mcl_chests_pink_shulker_box_top.png": [163, 116, 158], "mcl_chests_trapped.png": [95, 76, 61], "mcl_chests_blank.png": [255, 255, 255], "mcl_chests_normal_double.png": [98, 78, 62], "mcl_chests_chest_trapped_top.png": [88, 73, 61], "mcl_chests_normal.png": [95, 76, 61], "default_chest_front_big.png": [93, 75, 61], "mcl_chests_ender_chest_front.png": [76, 69, 65], "mcl_chests_white_shulker_box_top.png": [176, 178, 187], "mcl_chests_cyan_shulker_box_top.png": [67, 101, 121], "mcl_chests_chest_trapped_top_big.png": [100, 80, 65], "default_chest_top_big.png": [100, 80, 65], "mcl_chests_grey_shulker_box_top.png": [126, 129, 138], "mcl_chests_red_shulker_box_top.png": [132, 58, 57], "mcl_chests_trapped_double.png": [98, 78, 62], "mcl_chests_violet_shulker_box_top.png": [120, 71, 88], "mcl_chests_chest_trapped_front_big.png": [94, 75, 61], "mcl_chests_lightblue_shulker_box_top.png": [96, 130, 155], "mcl_chests_dark_grey_shulker_box_top.png": [87, 90, 99], "mcl_chests_black_shulker_box_top.png": [56, 57, 62], "mcl_chests_chest_right.png": [98, 78, 62], "mcl_chests_yellow_shulker_box_top.png": [165, 116, 53], "mcl_chests_chest_bottom.png": [118, 91, 70], "default_chest_top.png": [88, 73, 61], "mcl_chests_ender_chest_top.png": [70, 64, 61], "mcl_chests_ender_chest_left.png": [73, 67, 64], "mcl_chests_chest_trapped_left.png": [99, 78, 63], "mcl_chests_orange_shulker_box_top.png": [143, 74, 51], "screwdriver.png": [132, 119, 108], "_un.png": [0, 0, 0], "_at.png": [0, 0, 0], "_s_.png": [0, 0, 0], "_sz.png": [0, 0, 0], "_q.png": [0, 0, 0], "_1.png": [0, 0, 0], "_h_.png": [0, 0, 0], "_o_tilde.png": [0, 0, 0], "_q_.png": [0, 0, 0], "_ae.png": [0, 0, 0], "_e_circumflex_.png": [0, 0, 0], "_ex.png": [0, 0, 0], "_e_.png": [0, 0, 0], "_qo.png": [0, 0, 0], "_z_.png": [0, 0, 0], "_ps.png": [0, 0, 0], "_pound.png": [0, 0, 0], "_div.png": [0, 0, 0], "_l_.png": [0, 0, 0], "_pilcrow.png": [0, 0, 0], "_3_sup.png": [0, 0, 0], "_e_acute.png": [0, 0, 0], "_9.png": [0, 0, 0], "_e_grave_.png": [0, 0, 0], "_u_acute.png": [0, 0, 0], "_a_sup.png": [0, 0, 0], "_sr.png": [0, 0, 0], "_v.png": [0, 0, 0], "_ue_.png": [0, 0, 0], "_t_.png": [0, 0, 0], "_cl.png": [0, 0, 0], "_n_tilde_.png": [0, 0, 0], "_p_.png": [0, 0, 0], "_c.png": [0, 0, 0], "_a.png": [0, 0, 0], "_a_circumflex_.png": [0, 0, 0], "_8.png": [0, 0, 0], "_s.png": [0, 0, 0], "_o_.png": [0, 0, 0], "_1_4.png": [0, 0, 0], "_e_grave.png": [0, 0, 0], "_o_dash.png": [0, 0, 0], "_5.png": [0, 0, 0], "_d_dash_.png": [0, 0, 0], "_i_grave.png": [0, 0, 0], "_vb.png": [0, 0, 0], "_sp.png": [255, 255, 255], "_a_acute_.png": [0, 0, 0], "_as.png": [0, 0, 0], "_y_acute.png": [0, 0, 0], "_3_4.png": [0, 0, 0], "_6.png": [0, 0, 0], "_7.png": [0, 0, 0], "_tl.png": [0, 0, 0], "_t.png": [0, 0, 0], "_y.png": [0, 0, 0], "_ca.png": [0, 0, 0], "_e.png": [0, 0, 0], "_hs.png": [0, 0, 0], "_copyright.png": [0, 0, 0], "_l.png": [0, 0, 0], "_h.png": [0, 0, 0], "_u_circumflex_.png": [0, 0, 0], "_i_acute_.png": [0, 0, 0], "_ha.png": [0, 0, 0], "_y_diaresis.png": [0, 0, 0], "_gt.png": [0, 0, 0], "_b.png": [0, 0, 0], "_degree.png": [0, 0, 0], "_a_tilde_.png": [0, 0, 0], "_u_.png": [0, 0, 0], "_o_sup.png": [0, 0, 0], "_m_.png": [0, 0, 0], "_c_.png": [0, 0, 0], "_cr.png": [0, 0, 0], "_3.png": [0, 0, 0], "_currency.png": [0, 0, 0], "_f.png": [0, 0, 0], "_cedille.png": [0, 0, 0], "_u_grave_.png": [0, 0, 0], "_dt.png": [0, 0, 0], "_am.png": [0, 0, 0], "_c_cedille_.png": [0, 0, 0], "_u_acute_.png": [0, 0, 0], "_bl.png": [0, 0, 0], "_registered.png": [0, 0, 0], "_i_acute.png": [0, 0, 0], "_lt.png": [0, 0, 0], "_e_acute_.png": [0, 0, 0], "_paragraph.png": [0, 0, 0], "_i_grave_.png": [0, 0, 0], "_o.png": [0, 0, 0], "_1_sup.png": [0, 0, 0], "mcl_signs_sign.png": [114, 89, 69], "_yen.png": [0, 0, 0], "_b_.png": [0, 0, 0], "_macron.png": [0, 0, 0], "_qu_inv.png": [0, 0, 0], "_o_dash_.png": [0, 0, 0], "_guill_right.png": [0, 0, 0], "_p.png": [0, 0, 0], "_thorn_.png": [0, 0, 0], "_2_sup.png": [0, 0, 0], "_pr.png": [0, 0, 0], "default_sign.png": [145, 115, 88], "_times_dot.png": [0, 0, 0], "_acute.png": [0, 0, 0], "_g_.png": [0, 0, 0], "_o_acute_.png": [0, 0, 0], "_a_tilde.png": [0, 0, 0], "_j.png": [0, 0, 0], "_k.png": [0, 0, 0], "_co.png": [0, 0, 0], "_dv.png": [0, 0, 0], "_o_circumflex.png": [0, 0, 0], "_a_ring.png": [0, 0, 0], "_br.png": [0, 0, 0], "_d.png": [0, 0, 0], "_ap.png": [0, 0, 0], "_sl.png": [0, 0, 0], "_mn.png": [0, 0, 0], "_m.png": [0, 0, 0], "_ae_lig.png": [0, 0, 0], "_thorn.png": [0, 0, 0], "_2.png": [0, 0, 0], "_gr.png": [0, 0, 0], "_i.png": [0, 0, 0], "_y_acute_.png": [0, 0, 0], "_diaresis.png": [0, 0, 0], "_oe.png": [0, 0, 0], "_mu.png": [0, 0, 0], "_guill_left.png": [0, 0, 0], "_times_cross.png": [0, 0, 0], "_ae_.png": [0, 0, 0], "_w.png": [0, 0, 0], "_u.png": [0, 0, 0], "_broken_bar.png": [0, 0, 0], "_4.png": [0, 0, 0], "_plus_minus.png": [0, 0, 0], "_1_2.png": [0, 0, 0], "_u_circumflex.png": [0, 0, 0], "_w_.png": [0, 0, 0], "_x_.png": [0, 0, 0], "_e_circumflex.png": [0, 0, 0], "_g.png": [0, 0, 0], "_o_tilde_.png": [0, 0, 0], "_ae_lig_.png": [0, 0, 0], "_v_.png": [0, 0, 0], "_dl.png": [0, 0, 0], "_a_grave.png": [0, 0, 0], "_re.png": [0, 0, 0], "_a_acute.png": [0, 0, 0], "_qu.png": [0, 0, 0], "_oe_.png": [0, 0, 0], "_n_tilde.png": [0, 0, 0], "_eq.png": [0, 0, 0], "_d_.png": [0, 0, 0], "_sm.png": [0, 0, 0], "_y_.png": [0, 0, 0], "_not.png": [0, 0, 0], "_n.png": [0, 0, 0], "_j_.png": [0, 0, 0], "_k_.png": [0, 0, 0], "_0.png": [0, 0, 0], "_o_grave_.png": [0, 0, 0], "_r_.png": [0, 0, 0], "_r.png": [0, 0, 0], "_u_grave.png": [0, 0, 0], "_ee_.png": [0, 0, 0], "_c_cedille.png": [0, 0, 0], "_ex_inv.png": [0, 0, 0], "_cm.png": [0, 0, 0], "_o_grave.png": [0, 0, 0], "_x.png": [0, 0, 0], "_i_.png": [0, 0, 0], "_n_.png": [0, 0, 0], "_rc.png": [0, 0, 0], "_a_.png": [0, 0, 0], "_a_grave_.png": [0, 0, 0], "_ee.png": [0, 0, 0], "_o_acute.png": [0, 0, 0], "_a_ring_.png": [0, 0, 0], "_i_circumflex_.png": [0, 0, 0], "_cent.png": [0, 0, 0], "_d_dash.png": [0, 0, 0], "_f_.png": [0, 0, 0], "_o_circumflex_.png": [0, 0, 0], "_ue.png": [0, 0, 0], "_a_circumflex.png": [0, 0, 0], "_i_circumflex.png": [0, 0, 0], "_z.png": [0, 0, 0], "gui_furnace_arrow_fg.png": [239, 239, 239], "default_furnace_front.png": [105, 95, 91], "default_furnace_fire_bg.png": [139, 139, 139], "default_furnace_top.png": [148, 138, 133], "default_furnace_fire_fg.png": [179, 115, 70], "default_furnace_side.png": [117, 107, 102], "gui_furnace_arrow_bg.png": [139, 139, 139], "default_furnace_front_active.png": [119, 95, 85], "default_furnace_bottom.png": [148, 138, 133], "default_torch_on_floor.png": [115, 82, 59], "default_torch_on_floor_animated.png": [116, 84, 61], "default_tnt_bottom.png": [161, 54, 58], "mcl_tnt_blink.png": [255, 255, 255], "default_tnt_top.png": [125, 54, 57], "default_tnt_side.png": [178, 105, 98], "mcl_heads_skeleton.png": [125, 125, 125], "mcl_heads_skeleton_node.png": [124, 124, 124], "mcl_heads_creeper_node.png": [98, 107, 71], "mcl_heads_zombie.png": [66, 104, 69], "mcl_heads_creeper.png": [92, 110, 68], "mcl_heads_steve_node.png": [115, 70, 58], "mcl_heads_skeleton_preview.png": [128, 127, 127], "mcl_heads_steve_preview.png": [117, 83, 66], "mcl_heads_zombie_node.png": [78, 110, 105], "mcl_heads_steve.png": [108, 76, 59], "mcl_heads_wither_skeleton_node.png": [50, 50, 50], "mcl_heads_zombie_preview.png": [66, 103, 68], "mcl_heads_creeper_preview.png": [88, 110, 65], "mcl_heads_wither_skeleton.png": [50, 50, 50], "mcl_heads_wither_skeleton_preview.png": [50, 50, 50], "mcl_flowerpots_cactus.png": [109, 83, 52], "mcl_flowerpots_flowerpot_inventory.png": [121, 54, 45], "mcl_flowerpots_flowerpot.png": [120, 55, 47], "bucket_lava.png": [166, 127, 113], "bucket_river_water.png": [139, 152, 155], "bucket_water.png": [139, 147, 155], "bucket.png": [147, 143, 139], "mcl_anvils_anvil_top_damaged_1.png": [48, 48, 48], "mcl_anvils_anvil_top_damaged_2.png": [46, 46, 46], "mcl_anvils_anvil_top_damaged_0.png": [50, 50, 50], "mcl_anvils_anvil_side.png": [45, 45, 45], "mcl_anvils_inventory.png": [157, 157, 157], "mcl_anvils_anvil_base.png": [40, 40, 40], "mcl_maps_map_filled.png": [213, 176, 148], "mcl_maps_map_empty.png": [217, 187, 157], "mcl_maps_map_filled_markings.png": [183, 183, 183], "mcl_dispensers_dispenser_front_vertical.png": [115, 104, 99], "mcl_dispensers_dispenser_front_horizontal.png": [105, 96, 92], "jeija_wall_lever.png": [95, 80, 69], "mesecons_delayer_front_locked_off.png": [97, 85, 77], "mesecons_delayer_locked_on.png": [114, 100, 95], "mesecons_delayer_sides_locked_off.png": [95, 80, 73], "mesecons_delayer_sides_on.png": [106, 71, 63], "mesecons_delayer_item.png": [100, 87, 82], "mesecons_delayer_end_locked_off.png": [97, 85, 77], "mesecons_delayer_end_locked_on.png": [101, 85, 78], "mesecons_delayer_ends_off.png": [99, 86, 80], "mesecons_delayer_front_locked_on.png": [101, 85, 77], "mesecons_delayer_ends_on.png": [105, 87, 81], "mesecons_delayer_sides_locked_on.png": [104, 81, 74], "mesecons_delayer_locked_off.png": [110, 99, 95], "mesecons_delayer_sides_off.png": [90, 69, 61], "mesecons_delayer_off.png": [112, 100, 96], "mesecons_delayer_on.png": [116, 101, 97], "redstone_redstone_dust_line0.png": [168, 168, 168], "redstone_redstone_dust.png": [81, 0, 0], "redstone_redstone_dust_dot.png": [168, 168, 168], "redstone_redstone_dust_line1.png": [173, 173, 173], "jeija_commandblock_off.png": [110, 99, 96], "jeija_commandblock_on.png": [110, 99, 96], "redstone_redstone_block.png": [128, 8, 9], "jeija_torches_on.png": [102, 68, 56], "jeija_torches_off.png": [90, 66, 54], "mesecons_button_wield_mask.png": [255, 126, 126], "mcl_droppers_dropper_front_vertical.png": [118, 108, 103], "mcl_droppers_dropper_front_horizontal.png": [110, 101, 96], "mesecons_noteblock.png": [104, 81, 63], "jeija_solar_panel_inverted.png": [100, 107, 117], "jeija_solar_panel.png": [124, 113, 101], "jeija_solar_panel_side.png": [60, 47, 36], "mcl_observers_observer_top.png": [139, 128, 123], "mcl_observers_observer_front.png": [95, 80, 84], "mcl_observers_observer_back_lit.png": [75, 67, 65], "mcl_observers_observer_back.png": [72, 67, 64], "mcl_observers_observer_side.png": [111, 103, 99], "mesecons_piston_pusher_front_sticky.png": [97, 81, 63], "mesecons_piston_pusher_top.png": [106, 83, 65], "mesecons_piston_back.png": [110, 101, 98], "mesecons_piston_on_front.png": [111, 101, 98], "mesecons_piston_pusher_back.png": [106, 83, 65], "mesecons_piston_bottom.png": [120, 107, 100], "mesecons_piston_pusher_right.png": [106, 83, 65], "mesecons_piston_pusher_bottom.png": [106, 83, 65], "mesecons_piston_pusher_front.png": [106, 83, 65], "mesecons_piston_pusher_left.png": [106, 83, 65], "jeija_lightstone_gray_on.png": [97, 56, 37], "jeija_lightstone_gray_off.png": [64, 49, 43], "mcl_comparators_sides_on.png": [105, 87, 81], "mcl_comparators_comp.png": [61, 20, 20], "mcl_comparators_on.png": [116, 102, 98], "mcl_comparators_sides_comp.png": [99, 88, 83], "mcl_comparators_off.png": [113, 102, 98], "mcl_comparators_ends_comp.png": [99, 88, 83], "mcl_comparators_ends_sub.png": [105, 88, 83], "mcl_comparators_ends_off.png": [96, 80, 74], "mcl_comparators_ends_on.png": [105, 81, 75], "mcl_comparators_sub.png": [112, 25, 25], "mcl_comparators_item.png": [98, 83, 79], "mcl_comparators_sides_off.png": [99, 86, 80], "mcl_comparators_sides_sub.png": [105, 88, 83], "default_book.png": [103, 67, 44], "default_bookshelf.png": [84, 67, 54], "mcl_books_book_written.png": [110, 74, 44], "mcl_books_book_bg.png": [203, 180, 151], "mcl_books_button9_pressed.png": [145, 112, 86], "mcl_books_button9.png": [145, 112, 86], "mcl_books_book_writable.png": [151, 122, 108], "mcl_books_bookshelf_top.png": [109, 84, 65], "wool_dark_grey.png": [96, 87, 87], "wool_grey.png": [143, 134, 134], "wool_magenta.png": [140, 85, 125], "wool_black.png": [45, 42, 42], "wool_orange.png": [188, 106, 45], "wool_blue.png": [43, 73, 125], "wool_yellow.png": [201, 163, 69], "wool_pink.png": [171, 91, 108], "wool_dark_green.png": [53, 91, 51], "wool_brown.png": [86, 57, 43], "wool_red.png": [132, 42, 45], "mcl_wool_light_blue.png": [91, 130, 180], "wool_cyan.png": [30, 94, 113], "mcl_wool_lime.png": [107, 151, 76], "wool_white.png": [212, 199, 182], "wool_violet.png": [77, 57, 102], "mcl_potions_melon_speckled.png": [170, 97, 62], "mcl_potions_effect_swift.png": [106, 96, 85], "mcl_potions_spider_eye_fermented.png": [143, 97, 62], "mcl_potions_splash_bottle.png": [168, 156, 183], "mcl_potions_effect_water_breathing.png": [59, 69, 100], "mcl_potions_effect_leaping.png": [100, 91, 86], "mcl_potions_effect_weak.png": [127, 126, 126], "mcl_potions_dragon_breath.png": [171, 137, 163], "mcl_potions_effect_food_poisoning.png": [112, 123, 89], "hudbars_icon_regenerate.png": [195, 77, 114], "mcl_potions_effect_fire_proof.png": [112, 68, 68], "mcl_potions_splash_overlay.png": [202, 202, 202], "mcl_potions_effect_invisible.png": [96, 103, 95], "hbhunger_icon_regen_poison.png": [147, 111, 115], "mcl_potions_effect_slow.png": [78, 81, 85], "mcl_potions_lingering_bottle.png": [181, 159, 192], "mcl_potions_potion_overlay.png": [201, 201, 201], "mcl_potions_effect_regenerating.png": [133, 90, 83], "mcl_potions_arrow_inv.png": [171, 165, 160], "mcl_potions_effect_night_vision.png": [86, 99, 74], "mcl_potions_potion_bottle.png": [156, 172, 203], "mcl_potions_effect_poisoned.png": [78, 110, 80], "mcl_potions_effect_strong.png": [100, 82, 97], "crafting_workbench_front.png": [120, 93, 72], "gui_crafting_arrow.png": [139, 139, 139], "crafting_workbench_side.png": [120, 93, 72], "crafting_workbench_top.png": [152, 121, 93], "mcl_enchanting_glyph_11.png": [209, 209, 231], "mcl_enchanting_glyph_14.png": [209, 209, 231], "mcl_enchanting_glyph_6.png": [209, 209, 231], "mcl_enchanting_glyph_8.png": [209, 209, 231], "mcl_enchanting_glyph_9.png": [209, 209, 231], "mcl_enchanting_glyph_3.png": [209, 209, 231], "mcl_enchanting_number_1_off.png": [255, 255, 255], "mcl_enchanting_number_3_off.png": [255, 255, 255], "mcl_enchanting_number_3.png": [151, 47, 40], "mcl_enchanting_book_open.png": [153, 123, 99], "mcl_enchanting_button_off.png": [255, 255, 255], "mcl_enchanting_glyph_2.png": [209, 209, 231], "mcl_enchanting_glyph_1.png": [209, 209, 231], "mcl_enchanting_button.png": [255, 255, 255], "mcl_enchanting_table_side.png": [66, 58, 55], "mcl_enchanting_book_closed.png": [112, 78, 55], "mcl_enchanting_table_bottom.png": [58, 51, 52], "mcl_enchanting_glyph_15.png": [209, 209, 231], "mcl_enchanting_number_2_off.png": [255, 255, 255], "mcl_enchanting_glyph_5.png": [209, 209, 231], "mcl_enchanting_number_1.png": [149, 45, 39], "mcl_enchanting_glyph_7.png": [209, 209, 231], "mcl_enchanting_table_top.png": [88, 86, 84], "mcl_enchanting_number_2.png": [149, 46, 39], "mcl_enchanting_glyph_16.png": [209, 209, 231], "mcl_enchanting_button_hovered.png": [255, 255, 255], "mcl_enchanting_book_enchanted.png": [122, 69, 46], "mcl_enchanting_glyph_4.png": [209, 209, 231], "mcl_enchanting_glyph_10.png": [209, 209, 231], "mcl_enchanting_glyph_13.png": [209, 209, 231], "mcl_enchanting_glyph_17.png": [209, 209, 231], "mcl_enchanting_glyph_18.png": [209, 209, 231], "mcl_enchanting_lapis_background.png": [255, 255, 255], "mcl_enchanting_button_background.png": [229, 202, 171], "mcl_enchanting_glyph_12.png": [209, 209, 231], "doc_basics_gameplay_mtg_2.png": [151, 168, 207], "doc_basics_liquids_renewable_1.png": [139, 146, 159], "doc_basics_players_sam.png": [95, 133, 106], "doc_basics_players_flat.png": [127, 155, 130], "doc_basics_craft_shapeless_2.png": [52, 52, 48], "doc_basics_build.png": [84, 84, 55], "doc_basics_pointing.png": [66, 104, 32], "doc_basics_nodes.png": [108, 104, 94], "doc_basics_craft_groups_2.png": [65, 58, 52], "doc_basics_craft_groups_1.png": [57, 57, 58], "doc_basics_inventory.png": [47, 47, 45], "doc_basics_minimap_radar.png": [73, 164, 128], "doc_basics_sneak.png": [70, 69, 69], "doc_basics_camera_behind.png": [108, 144, 135], "doc_basics_craft_repair.png": [47, 46, 45], "doc_basics_hotbar_relations.png": [85, 84, 69], "doc_basics_gameplay_lott.png": [119, 122, 112], "doc_basics_tools_mining.png": [64, 62, 59], "doc_basics_players_lott.png": [180, 193, 224], "doc_basics_gameplay_outback.png": [146, 114, 109], "doc_basics_gameplay_pixture.png": [94, 120, 57], "doc_basics_craft_grid.png": [46, 46, 46], "doc_basics_craft_groups_3.png": [61, 58, 55], "doc_basics_camera_front.png": [99, 133, 110], "doc_basics_minimap_map.png": [149, 169, 183], "doc_basics_gameplay_mtg_1.png": [136, 117, 86], "doc_basics_gameplay_xtraores_xtension.png": [95, 15, 86], "doc_basics_light_torch.png": [25, 43, 14], "doc_basics_minimap_round.png": [160, 175, 189], "doc_basics_light_test.png": [133, 113, 69], "doc_basics_liquids_nonrenewable.png": [64, 87, 87], "doc_basics_gameplay_hades.png": [81, 70, 62], "doc_basics_gameplay_moontest.png": [75, 74, 79], "doc_basics_liquids_range.png": [146, 166, 179], "doc_basics_inventory_detail.png": [43, 41, 39], "doc_basics_camera_ego.png": [111, 147, 139], "doc_basics_tools.png": [46, 45, 42], "doc_basics_liquids_renewable_2.png": [136, 148, 166], "doc_basics_items_dropped.png": [195, 185, 147], "doc_basics_liquids_types.png": [146, 164, 171], "doc_basics_gameplay_carbone_ng.png": [121, 118, 89], "doc_basics_craft_shaped.png": [55, 52, 50], "doc_basics_hotbar.png": [141, 175, 226], "doc_basics_craft_shapeless_1.png": [52, 52, 48], "doc_button_icon_lores.png": [19, 143, 183], "doc_awards_icon_generic.png": [14, 125, 162], "inventory_plus_doc_inventory_plus.png": [19, 143, 183], "doc_button_icon_hires.png": [30, 149, 188], "doc_identifier_identifier.png": [172, 151, 139], "doc_identifier_identifier_liquid.png": [125, 147, 190], "craftguide_clear_icon.png": [254, 254, 254], "craftguide_book.png": [84, 117, 39], "mcl_craftguide_fuel.png": [187, 121, 75], "craftguide_prev_icon.png": [255, 255, 255], "craftguide_zoomout_icon.png": [255, 255, 255], "craftguide_search_icon.png": [254, 254, 254], "craftguide_arrow.png": [139, 139, 139], "craftguide_zoomin_icon.png": [255, 255, 255], "craftguide_shapeless.png": [130, 130, 130], "craftguide_next_icon.png": [255, 255, 255]} \ No newline at end of file +{"player.png": [123, 74, 62], "player_back.png": [114, 68, 56], "mcl_skins_button.png": [121, 95, 85], "mcl_skins_character_1.png": [93, 90, 77], "mcl_hunger_bar_saturation.png": [255, 255, 0], "hbhunger_bar_health_poison.png": [148, 120, 24], "mcl_hunger_bar_exhaustion.png": [255, 255, 255], "mcl_hunger_icon_exhaustion.png": [213, 213, 213], "mcl_hunger_bgicon_exhaustion.png": [25, 25, 26], "mcl_hunger_icon_foodpoison.png": [109, 106, 40], "mcl_hunger_bgicon_saturation.png": [24, 24, 26], "hbhunger_bar.png": [200, 103, 0], "hbhunger_bgicon.png": [24, 24, 26], "hbhunger_icon_health_poison.png": [69, 98, 45], "mcl_hunger_bar_foodpoison.png": [116, 132, 88], "hbhunger_icon.png": [175, 132, 97], "mcl_hunger_icon_saturation.png": [157, 140, 64], "mcl_playerplus_end_sky.png": [14, 14, 14], "mobs_mc_llama_decor_purple.png": [108, 72, 115], "mobs_mc_spawn_icon_illusioner.png": [98, 111, 155], "mobs_mc_llama_gray.png": [195, 188, 175], "mobs_mc_spawn_icon_zombie.png": [64, 136, 112], "mobs_mc_llama_decor_blue.png": [117, 121, 156], "mobs_mc_spawn_icon_skeleton.png": [146, 146, 146], "mobs_mc_shulker_blue.png": [89, 100, 126], "mobs_mc_shulker_black.png": [78, 75, 76], "mobs_mc_wolf_collar.png": [186, 186, 186], "mobs_mc_spawn_icon_bat.png": [130, 63, 13], "mobs_mc_villager_weaponsmith.png": [75, 74, 62], "mobs_mc_parrot_green.png": [47, 208, 62], "mobs_mc_llama_decor_magenta.png": [186, 84, 131], "mobs_mc_rabbit_black.png": [73, 64, 61], "mobs_mc_vindicator.png": [56, 56, 57], "mobs_mc_polarbear.png": [233, 220, 208], "mobs_mc_magmacube.png": [83, 40, 27], "mobs_mc_chicken.png": [198, 182, 176], "mobs_mc_villager_toolsmith.png": [78, 76, 64], "mobs_mc_ghast_firing.png": [198, 198, 198], "mobs_mc_spawn_icon_zombie_pigman.png": [202, 160, 135], "mobs_mc_husk.png": [98, 95, 76], "mobs_mc_villager_librarian.png": [167, 161, 151], "mobs_mc_villager_priest.png": [119, 112, 98], "mobs_mc_villager_fletcher.png": [84, 86, 52], "mobs_mc_villager_smith.png": [76, 76, 63], "mobs_mc_spawn_icon_dragon.png": [98, 47, 89], "mobs_mc_spawn_icon_donkey.png": [152, 132, 100], "mobs_mc_squid.png": [37, 52, 68], "mobs_mc_villager_farmer.png": [94, 87, 70], "mobs_mc_spawn_icon_horse_skeleton.png": [245, 204, 202], "mobs_mc_villager_sheperd.png": [97, 98, 66], "mobs_mc_horse_markings_blackdots.png": [24, 22, 22], "mobs_mc_zombie_farmer.png": [119, 99, 85], "mobs_mc_spawn_icon_vex.png": [145, 185, 185], "mobs_mc_villager_armorer.png": [86, 87, 55], "mobs_mc_parrot_blue.png": [43, 58, 148], "mobs_mc_spider_eyes.png": [174, 48, 48], "mobs_mc_zombie.png": [78, 110, 105], "mobs_mc_llama_decor_light_blue.png": [116, 200, 250], "mobs_mc_zombie_priest.png": [120, 104, 110], "mobs_mc_llama_decor_black.png": [12, 8, 24], "mobs_mc_horse_white.png": [190, 173, 154], "mobs_mc_spawn_icon_vindicator.png": [102, 103, 104], "mobs_mc_silverfish.png": [179, 164, 144], "mobs_mc_llama_decor_gray.png": [110, 110, 110], "mobs_mc_spawn_icon_guardian.png": [119, 156, 148], "mobs_mc_creeper.png": [98, 107, 71], "mobs_mc_shulker_purple.png": [135, 87, 99], "mobs_mc_spawn_icon_rabbit.png": [156, 126, 84], "mobs_mc_sheep.png": [182, 161, 149], "mobs_mc_parrot_grey.png": [33, 178, 173], "mobs_mc_wolf_icon_sit.png": [8, 88, 116], "mobs_mc_gold_horse_armor.png": [140, 106, 67], "mobs_mc_spawn_icon_witch.png": [98, 85, 68], "mobs_mc_shulker_green.png": [89, 122, 84], "mobs_mc_bat.png": [87, 63, 54], "mobs_mc_villager_cartographer.png": [164, 157, 145], "mobs_mc_horse_chestnut.png": [126, 78, 58], "mobs_mc_shulker_yellow.png": [175, 128, 69], "mobs_mc_spawn_icon_creeper.png": [115, 125, 53], "mobs_mc_slime.png": [63, 133, 78], "mobs_mc_evoker.png": [44, 48, 43], "mobs_mc_horse_skeleton.png": [163, 156, 141], "mobs_mc_spawn_icon_blaze.png": [142, 76, 49], "mobs_mc_shulker_light_blue.png": [114, 140, 158], "mobs_mc_shulker_gray.png": [106, 104, 109], "mobs_mc_horse_darkbrown.png": [69, 47, 34], "mobs_mc_stray_overlay.png": [63, 59, 65], "mobs_mc_arrow_particle.png": [218, 171, 136], "mobs_mc_spawn_icon_cat.png": [120, 66, 10], "mobs_mc_stray.png": [155, 157, 161], "mobs_mc_villager_nitwit.png": [91, 93, 60], "mobs_mc_trading_formspec_bg.png": [157, 157, 157], "mobs_mc_spawn_icon_villager.png": [134, 124, 81], "mobs_mc_pig.png": [228, 175, 165], "mobs_mc_spawn_icon_mooshroom.png": [160, 56, 55], "mobs_mc_wolf_angry.png": [187, 179, 176], "mobs_mc_cat_black.png": [206, 181, 154], "mobs_mc_vex_charging.png": [142, 153, 153], "mobs_mc_llama.png": [207, 189, 155], "mobs_mc_mushroom_brown.png": [122, 81, 58], "mobs_mc_spawn_icon_shulker.png": [170, 117, 130], "mobs_mc_wither_half_health.png": [7, 58, 91], "mobs_mc_spawn_icon_guardian_elder.png": [174, 140, 113], "mobs_mc_enderman_eyes.png": [184, 211, 242], "mobs_mc_horse_creamy.png": [146, 111, 75], "mobs_mc_spawn_icon_zombie_villager.png": [95, 110, 68], "mobs_mc_vex.png": [128, 162, 162], "mobs_mc_iron_golem.png": [47, 44, 44], "mobs_mc_cat_ocelot.png": [163, 111, 52], "mobs_mc_llama_decor_green.png": [51, 84, 27], "mobs_mc_cow.png": [94, 68, 55], "mobs_mc_llama_decor_brown.png": [85, 58, 46], "mobs_mc_villager_butcher.png": [95, 92, 79], "mobs_mc_parrot_yellow_blue.png": [98, 187, 205], "mobs_mc_zombie_pigman.png": [164, 129, 117], "mobs_mc_spawn_icon_wolf.png": [231, 218, 207], "mobs_mc_zombie_villager.png": [112, 108, 90], "mobs_mc_sheep_fur.png": [203, 186, 174], "mobs_mc_spawn_icon_horse_zombie.png": [129, 143, 66], "mobs_mc_blaze.png": [84, 63, 50], "mobs_mc_rabbit_salt.png": [122, 99, 87], "mobs_mc_rabbit_white_splotched.png": [146, 139, 135], "mobs_mc_horse_brown.png": [115, 84, 61], "mobs_mc_ghast.png": [199, 199, 199], "mobs_mc_horse_markings_white.png": [165, 149, 132], "mobs_mc_horse_markings_whitefield.png": [193, 178, 162], "mobs_mc_spawn_icon_endermite.png": [138, 67, 74], "mobs_mc_shulker_magenta.png": [143, 97, 130], "mobs_mc_snowman.png": [211, 217, 221], "mobs_mc_zombie_smith.png": [71, 59, 54], "mobs_mc_spawn_icon_squid.png": [55, 58, 103], "mobs_mc_dragon_fireball.png": [89, 66, 79], "mobs_mc_diamond_horse_armor.png": [67, 95, 112], "mobs_mc_rabbit_toast.png": [130, 123, 119], "mobs_mc_llama_white.png": [207, 199, 184], "mobs_mc_llama_creamy.png": [208, 190, 155], "mobs_mc_pig_saddle.png": [82, 63, 45], "mobs_mc_spawn_icon_cave_spider.png": [23, 43, 57], "mobs_mc_shulker_silver.png": [140, 138, 143], "mobs_mc_trading_formspec_disabled.png": [193, 26, 26], "mobs_mc_spider.png": [41, 38, 37], "mobs_mc_wither.png": [33, 33, 33], "mobs_mc_llama_decor_white.png": [231, 231, 231], "mobs_mc_witch.png": [80, 74, 67], "mobs_mc_wolf_icon_roam.png": [6, 124, 36], "mobs_mc_illusionist.png": [56, 68, 114], "mobs_mc_endermite.png": [55, 20, 65], "mobs_mc_spawn_icon_witherskeleton.png": [71, 71, 71], "mobs_mc_llama_decor_light_gray.png": [201, 201, 201], "mobs_mc_llama_decor_cyan.png": [20, 157, 160], "mobs_mc_skeleton.png": [124, 124, 124], "mobs_mc_spawn_icon_llama.png": [230, 221, 178], "mobs_mc_spawn_icon_chicken.png": [170, 160, 156], "mobs_mc_shulker_pink.png": [173, 127, 160], "mobs_mc_spawn_icon_spider.png": [53, 43, 43], "mobs_mc_shulker_red.png": [146, 77, 71], "mobs_mc_shulker_white.png": [184, 181, 186], "mobs_mc_spawn_icon_magmacube.png": [52, 33, 23], "mobs_mc_spawn_icon_ghast.png": [212, 212, 212], "mobs_mc_rabbit_brown.png": [112, 86, 73], "mobs_mc_spawn_icon_pig.png": [242, 200, 188], "mobs_mc_spawn_icon_horse.png": [44, 36, 25], "mobs_mc_cat_siamese.png": [161, 144, 133], "mobs_mc_mushroom_red.png": [176, 51, 49], "mobs_mc_shulker_brown.png": [94, 81, 70], "mobs_mc_villager_leatherworker.png": [96, 93, 58], "mobs_mc_guardian.png": [78, 116, 130], "mobs_mc_creeper_charge.png": [121, 219, 255], "mobs_mc_villager.png": [88, 91, 55], "mobs_mc_llama_decor_lime.png": [170, 214, 67], "mobs_mc_llama_brown.png": [136, 97, 52], "mobs_mc_enderman_cactus_background.png": [44, 71, 27], "mobs_mc_parrot_red_blue.png": [171, 70, 37], "mobs_mc_spawn_icon_husk.png": [174, 174, 128], "mobs_mc_rabbit_gold.png": [151, 130, 96], "mobs_mc_spawn_icon_evoker.png": [92, 103, 86], "mobs_mc_iron_horse_armor.png": [133, 119, 114], "mobs_mc_llama_decor_red.png": [215, 58, 50], "mobs_mc_enderman.png": [3, 10, 10], "mobs_mc_mooshroom_brown.png": [93, 50, 28], "mobs_mc_llama_decor_pink.png": [207, 140, 182], "mobs_mc_enderman_block.png": [46, 42, 38], "mobs_mc_mooshroom.png": [90, 42, 41], "mobs_mc_cat_red.png": [221, 163, 120], "mobs_mc_shulkerbullet.png": [216, 190, 153], "mobs_mc_horse_markings_whitedots.png": [230, 220, 207], "mobs_mc_mule.png": [108, 75, 51], "mobs_mc_spawn_icon_iron_golem.png": [122, 72, 41], "mobs_mc_zombie_butcher.png": [107, 98, 87], "mobs_mc_llama_decor_yellow.png": [218, 187, 8], "mobs_mc_wolf_tame.png": [179, 159, 154], "mobs_mc_horse_gray.png": [78, 68, 62], "mobs_mc_shulker_lime.png": [106, 132, 88], "mobs_mc_rabbit_caerbannog.png": [186, 179, 174], "mobs_mc_zombie_librarian.png": [106, 104, 104], "mobs_mc_spawn_icon_silverfish.png": [199, 168, 128], "mobs_mc_spawn_icon_stray.png": [118, 116, 118], "mobs_mc_spawn_icon_polarbear.png": [237, 235, 212], "mobs_mc_guardian_elder.png": [141, 141, 125], "mobs_mc_spawn_icon_slime.png": [76, 130, 33], "mobs_mc_cave_spider.png": [14, 28, 38], "mobs_mc_spawn_icon_cow.png": [162, 118, 72], "mobs_mc_wolf.png": [182, 165, 159], "mobs_mc_wither_skeleton.png": [50, 50, 50], "mobs_mc_endergolem.png": [135, 87, 99], "mobs_mc_spawn_icon_mule.png": [115, 82, 47], "mobs_mc_llama_decor_orange.png": [151, 80, 27], "mobs_chicken_egg.png": [199, 157, 106], "mobs_mc_rabbit_white.png": [161, 153, 149], "mobs_mc_horse_black.png": [49, 42, 39], "mobs_mc_dragon.png": [79, 54, 67], "mobs_mc_villager_fisherman.png": [98, 92, 58], "mobs_mc_spawn_icon_parrot.png": [202, 100, 54], "mobs_mc_spawn_icon_snowman.png": [216, 173, 147], "mobs_mc_donkey.png": [91, 78, 68], "mobs_mc_shulker_cyan.png": [89, 114, 128], "mobs_mc_spawn_icon_sheep.png": [209, 185, 175], "mobs_mc_TEMP_wither_projectile.png": [69, 69, 69], "mobs_mc_spawn_icon_enderman.png": [63, 82, 87], "mobs_mc_shulker_orange.png": [156, 90, 67], "mobs_mc_empty.png": [255, 255, 255], "mobs_mc_spawn_icon_wither.png": [102, 102, 102], "mcl_boats_spruce_boat.png": [72, 61, 51], "mcl_boats_jungle_boat.png": [102, 73, 58], "mcl_boats_texture_birch_boat.png": [131, 105, 83], "mcl_boats_texture_oak_boat.png": [103, 82, 65], "mcl_boats_birch_boat.png": [120, 95, 78], "mcl_boats_texture_jungle_boat.png": [109, 78, 60], "mcl_boats_oak_boat.png": [93, 76, 62], "mcl_boats_texture_acacia_boat.png": [136, 90, 64], "mcl_boats_obsidian_boat.png": [17, 15, 27], "mcl_boats_texture_obsidian_boat.png": [13, 10, 26], "mcl_boats_texture_dark_oak_boat.png": [89, 76, 64], "mcl_boats_texture_spruce_boat.png": [74, 61, 50], "mcl_boats_acacia_boat.png": [124, 82, 59], "mcl_boats_dark_oak_boat.png": [89, 76, 64], "mobs_nametag.png": [138, 114, 89], "mobs_blood.png": [27, 27, 29], "mcl_minecarts_rail_golden_curved_powered.png": [89, 71, 57], "mcl_minecarts_rail_golden_crossing.png": [83, 70, 55], "mcl_minecarts_rail_detector_curved_powered.png": [81, 68, 64], "mcl_minecarts_rail_golden_t_junction_powered.png": [82, 69, 59], "mcl_minecarts_rail_golden_t_junction.png": [80, 70, 59], "mcl_minecarts_rail_detector.png": [85, 74, 67], "mcl_minecarts_rail_detector_crossing.png": [77, 69, 65], "default_rail_t_junction.png": [79, 68, 61], "mcl_minecarts_rail_activator_crossing_powered.png": [72, 55, 51], "mcl_minecarts_minecart_hopper.png": [45, 45, 45], "mcl_minecarts_minecart_furnace.png": [66, 65, 64], "mcl_minecarts_minecart_command_block.png": [64, 62, 61], "mcl_minecarts_rail_golden.png": [92, 77, 60], "mcl_minecarts_rail_activator_t_junction_powered.png": [76, 61, 55], "default_rail_curved.png": [76, 67, 60], "mcl_minecarts_rail_activator_t_junction.png": [72, 62, 56], "mcl_minecarts_rail_golden_crossing_powered.png": [86, 70, 54], "mcl_minecarts_rail_detector_crossing_powered.png": [78, 68, 64], "mcl_minecarts_rail_detector_curved.png": [77, 70, 66], "default_rail_crossing.png": [79, 68, 59], "mcl_minecarts_rail_detector_t_junction.png": [74, 66, 61], "mcl_minecarts_minecart.png": [72, 60, 51], "mcl_minecarts_rail_golden_curved.png": [85, 73, 58], "mcl_minecarts_rail_activator.png": [78, 64, 56], "mcl_minecarts_rail_activator_powered.png": [86, 62, 54], "mcl_minecarts_rail_detector_t_junction_powered.png": [76, 66, 61], "mcl_minecarts_minecart_normal.png": [47, 45, 43], "mcl_minecarts_minecart_tnt.png": [75, 52, 52], "mcl_minecarts_rail_detector_powered.png": [87, 74, 67], "mcl_minecarts_rail_golden_powered.png": [94, 77, 60], "mcl_minecarts_rail_activator_crossing.png": [65, 56, 52], "default_rail.png": [83, 70, 61], "mcl_minecarts_rail_activator_curved_powered.png": [75, 55, 52], "mcl_minecarts_rail_activator_curved.png": [66, 56, 53], "mcl_minecarts_minecart_chest.png": [51, 48, 46], "mcl_paintings_paintings.png": [104, 99, 89], "mcl_paintings_painting.png": [139, 133, 119], "mcl_particles_totem4.png": [255, 255, 255], "mcl_particles_lava.png": [250, 150, 64], "mcl_particles_bonemeal.png": [185, 185, 185], "mcl_particles_instant_effect.png": [160, 160, 160], "mcl_particles_note.png": [41, 40, 39], "mcl_particles_bubble.png": [147, 174, 195], "mcl_particles_sponge1.png": [241, 238, 226], "mcl_particles_smoke_anim.png": [172, 172, 172], "mcl_particles_crit.png": [165, 165, 165], "mcl_particles_totem2.png": [255, 255, 255], "mcl_particles_mob_death.png": [198, 198, 198], "mcl_particles_droplet_bottle.png": [203, 203, 203], "mcl_particles_sponge4.png": [241, 238, 226], "mcl_particles_effect.png": [184, 184, 184], "mcl_particles_teleport.png": [86, 22, 128], "mcl_particles_sponge5.png": [241, 238, 226], "mcl_particles_flame.png": [244, 149, 63], "mcl_particles_sponge3.png": [241, 238, 226], "mcl_particles_sponge2.png": [241, 238, 226], "mcl_particles_totem1.png": [255, 255, 255], "mcl_particles_smoke.png": [174, 174, 174], "mcl_particles_totem3.png": [255, 255, 255], "lightning_lightning_2.png": [255, 255, 255], "lightning_lightning_3.png": [217, 217, 217], "lightning_lightning_1.png": [223, 223, 223], "weather_pack_rain_raindrop_2.png": [33, 79, 142], "weather_pack_rain_raindrop_3.png": [59, 88, 128], "mcl_particles_nether_dust3.png": [143, 105, 102], "weather_pack_rain_raindrop_1.png": [97, 137, 179], "mcl_particles_nether_dust1.png": [143, 105, 102], "weather_pack_snow_snowflake1.png": [255, 255, 255], "mcl_particles_nether_dust2.png": [143, 105, 102], "weather_pack_snow_snowflake2.png": [255, 255, 255], "mcl_moon_moon_phases.png": [80, 106, 141], "hbarmor_bgicon.png": [27, 27, 29], "hbarmor_bar.png": [175, 172, 165], "hbarmor_icon.png": [135, 131, 126], "mcl_base_textures_background9.png": [179, 179, 179], "object_crosshair.png": [255, 255, 255], "bubble.png": [69, 138, 194], "crosshair.png": [255, 255, 255], "heart.png": [137, 47, 40], "mcl_base_textures_background.png": [179, 179, 179], "crack_anylength.png": [93, 93, 93], "mcl_base_textures_button9_pressed.png": [162, 162, 162], "mcl_base_textures_button9.png": [162, 162, 162], "smoke_puff.png": [255, 255, 255], "credits_bg.png": [94, 72, 60], "mineclone2_logo.png": [75, 74, 69], "mineclone2_icon.png": [58, 74, 44], "awards_template.png": [134, 134, 134], "awards_bg_mining.png": [73, 68, 51], "awards_progress_gray.png": [157, 157, 157], "awards_ui_icon.png": [190, 34, 34], "awards_unknown.png": [134, 134, 134], "awards_progress_green.png": [0, 155, 74], "awards_bg_default.png": [38, 38, 38], "hudbars_bar_breath.png": [159, 161, 255], "hudbars_icon_health.png": [137, 47, 40], "hudbars_bar_health.png": [168, 55, 47], "hudbars_bgicon_breath.png": [0, 0, 0], "hudbars_bgicon_health.png": [27, 27, 29], "hudbars_icon_breath.png": [69, 138, 194], "hudbars_bar_background.png": [71, 71, 71], "mcl_achievements_button.png": [158, 152, 67], "mcl_inventory_hotbar.png": [81, 81, 85], "crafting_inventory_creative_survival.png": [195, 195, 195], "crafting_creative_bg_dark.png": [157, 157, 157], "mcl_inventory_empty_armor_slot_shield.png": [25, 32, 34], "crafting_formspec_bg.png": [9, 9, 9], "mcl_inventory_empty_armor_slot_helmet.png": [25, 32, 34], "mcl_inventory_hotbar_selected.png": [113, 85, 40], "crafting_creative_inactive_down.png": [151, 151, 151], "crafting_creative_active_down.png": [196, 196, 196], "crafting_creative_prev.png": [254, 254, 254], "crafting_creative_marker.png": [0, 0, 0], "mcl_inventory_button9_pressed.png": [162, 162, 162], "crafting_creative_active.png": [202, 202, 202], "mcl_inventory_button9.png": [162, 162, 162], "mcl_inventory_empty_armor_slot_chestplate.png": [0, 0, 0], "mcl_inventory_empty_armor_slot_boots.png": [0, 0, 0], "crafting_creative_bg.png": [207, 207, 207], "crafting_creative_inactive.png": [157, 157, 157], "crafting_creative_next.png": [254, 254, 254], "mcl_inventory_empty_armor_slot_leggings.png": [25, 32, 34], "crafting_inventory_creative.png": [206, 206, 206], "crafting_creative_trash.png": [144, 113, 113], "mcl_formspec_itemslot.png": [157, 157, 157], "mcl_wear_bar.png": [255, 255, 255], "mcl_offhand_slot.png": [92, 92, 94], "mcl_experience_bottle.png": [136, 174, 169], "mcl_experience_bar.png": [74, 102, 70], "mcl_experience_orb.png": [93, 174, 0], "mcl_experience_bar_background.png": [49, 46, 45], "mcl_bossbars_empty.png": [255, 255, 255], "mcl_bossbars.png": [76, 68, 75], "blast_furnace_front_on.png": [98, 88, 83], "blast_furnace_top.png": [126, 115, 110], "blast_furnace_side.png": [99, 92, 89], "blast_furnace_front.png": [93, 88, 85], "mcl_itemframes_item_frame.png": [123, 90, 63], "mcl_itemframes_itemframe_background.png": [136, 104, 75], "mcl_banners_stripe_middle.png": [255, 255, 255], "mcl_banners_skull.png": [255, 255, 255], "mcl_banners_bricks.png": [255, 255, 255], "mcl_banners_square_bottom_left.png": [255, 255, 255], "mcl_banners_gradient.png": [254, 254, 254], "mcl_banners_cross.png": [255, 255, 255], "mcl_banners_gradient_up.png": [254, 254, 254], "mcl_banners_item_overlay.png": [240, 240, 240], "mcl_banners_stripe_downright.png": [255, 255, 255], "mcl_banners_stripe_downleft.png": [255, 255, 255], "mcl_banners_fallback_wood.png": [102, 88, 74], "mcl_banners_base_inverted.png": [255, 255, 255], "mcl_banners_triangles_top.png": [255, 255, 255], "mcl_banners_banner_base.png": [215, 206, 193], "mcl_banners_curly_border.png": [254, 254, 254], "mcl_banners_thing.png": [253, 253, 253], "mcl_banners_small_stripes.png": [255, 255, 255], "mcl_banners_triangle_bottom.png": [254, 254, 254], "mcl_banners_stripe_right.png": [255, 255, 255], "mcl_banners_straight_cross.png": [255, 255, 255], "mcl_banners_triangle_top.png": [255, 255, 255], "mcl_banners_border.png": [255, 255, 255], "mcl_banners_diagonal_left.png": [255, 255, 255], "mcl_banners_diagonal_right.png": [255, 255, 255], "mcl_banners_base.png": [255, 255, 255], "mcl_banners_half_vertical.png": [255, 255, 255], "mcl_banners_circle.png": [254, 254, 254], "mcl_banners_triangles_bottom.png": [255, 255, 255], "mcl_banners_item_base.png": [103, 89, 75], "mcl_banners_stripe_left.png": [255, 255, 255], "mcl_banners_rhombus.png": [255, 255, 255], "mcl_banners_creeper.png": [255, 255, 255], "mcl_banners_flower.png": [254, 254, 254], "mcl_banners_stripe_bottom.png": [255, 255, 255], "mcl_banners_half_horizontal.png": [255, 255, 255], "mcl_banners_half_horizontal_bottom.png": [255, 255, 255], "mcl_banners_square_top_left.png": [255, 255, 255], "mcl_banners_square_top_right.png": [255, 255, 255], "mcl_banners_stripe_center.png": [255, 255, 255], "mcl_banners_diagonal_up_left.png": [255, 255, 255], "mcl_banners_stripe_top.png": [255, 255, 255], "mcl_banners_diagonal_up_right.png": [255, 255, 255], "mcl_banners_square_bottom_right.png": [255, 255, 255], "mcl_banners_half_vertical_right.png": [255, 255, 255], "mcl_doors_trapdoor_dark_oak.png": [81, 68, 56], "mcl_doors_trapdoor_acacia_side.png": [154, 102, 71], "doors_trapdoor_steel_side.png": [149, 140, 140], "mcl_doors_door_jungle_side_upper.png": [109, 75, 57], "mcl_doors_door_dark_oak_side_lower.png": [103, 90, 75], "mcl_doors_door_iron_lower.png": [157, 152, 151], "mcl_doors_door_acacia_upper.png": [152, 100, 69], "mcl_doors_door_jungle_side_lower.png": [107, 72, 55], "mcl_doors_door_wood_lower.png": [89, 70, 55], "doors_trapdoor_steel.png": [149, 140, 140], "mcl_doors_door_iron_side_upper.png": [155, 149, 148], "mcl_doors_door_acacia_side_upper.png": [133, 80, 53], "mcl_doors_door_jungle.png": [116, 83, 62], "mcl_doors_door_iron_side_lower.png": [157, 152, 151], "mcl_doors_door_birch_upper.png": [179, 158, 139], "mcl_doors_trapdoor_spruce_side.png": [73, 59, 47], "mcl_doors_door_iron_upper.png": [155, 149, 148], "mcl_doors_door_spruce_side_lower.png": [92, 79, 68], "mcl_doors_trapdoor_spruce.png": [71, 57, 46], "mcl_doors_trapdoor_birch_side.png": [147, 116, 89], "doors_trapdoor_side.png": [113, 86, 67], "mcl_doors_door_acacia_lower.png": [153, 101, 70], "mcl_doors_door_dark_oak_side_upper.png": [102, 89, 75], "mcl_doors_door_acacia_side_lower.png": [131, 78, 51], "mcl_doors_door_wood_upper.png": [92, 72, 57], "mcl_doors_trapdoor_birch.png": [173, 151, 132], "mcl_doors_door_dark_oak_upper.png": [83, 71, 59], "mcl_doors_door_acacia.png": [148, 98, 67], "mcl_doors_door_spruce.png": [67, 56, 47], "mcl_doors_door_spruce_lower.png": [71, 58, 48], "mcl_doors_door_birch_side_upper.png": [153, 121, 94], "mcl_doors_trapdoor_dark_oak_side.png": [85, 72, 60], "mcl_doors_door_wood_side_upper.png": [84, 65, 51], "mcl_doors_door_birch.png": [172, 147, 124], "mcl_doors_door_birch_lower.png": [165, 140, 119], "mcl_doors_trapdoor_jungle.png": [103, 70, 52], "doors_item_steel.png": [148, 144, 143], "doors_trapdoor.png": [98, 75, 59], "mcl_doors_door_jungle_lower.png": [116, 82, 61], "doors_item_wood.png": [88, 67, 53], "mcl_doors_door_jungle_upper.png": [113, 79, 59], "mcl_doors_door_spruce_upper.png": [71, 58, 47], "mcl_doors_door_dark_oak_lower.png": [84, 71, 59], "mcl_doors_door_dark_oak.png": [82, 69, 57], "mcl_doors_door_wood_side_lower.png": [132, 102, 81], "mcl_doors_trapdoor_jungle_side.png": [121, 87, 62], "mcl_doors_door_spruce_side_upper.png": [92, 79, 68], "mcl_doors_door_birch_side_lower.png": [152, 119, 92], "mcl_doors_trapdoor_acacia.png": [148, 96, 66], "mcl_fishing_clownfish_raw.png": [205, 127, 81], "mcl_fishing_fish_raw.png": [70, 112, 154], "mcl_fishing_salmon_raw.png": [112, 105, 102], "mcl_fishing_fish_cooked.png": [93, 84, 94], "mcl_fishing_bobber.png": [171, 117, 119], "mcl_fishing_pufferfish_raw.png": [219, 165, 77], "mcl_fishing_fishing_rod.png": [134, 116, 103], "mcl_fishing_salmon_cooked.png": [97, 91, 89], "mcl_barrels_barrel_top_open.png": [58, 43, 35], "mcl_barrels_barrel_bottom.png": [78, 61, 47], "mcl_barrels_barrel_side.png": [70, 57, 47], "mcl_barrels_barrel_top.png": [79, 61, 48], "mcl_stairs_diorite_smooth_slab.png": [156, 153, 151], "mcl_stairs_iron_block_slab.png": [166, 159, 159], "mcl_stairs_andesite_smooth_slab.png": [106, 113, 108], "mcl_stairs_gold_block_slab.png": [191, 146, 56], "mcl_stairs_granite_smooth_slab.png": [150, 121, 109], "mcl_stairs_lapis_block_slab.png": [49, 89, 158], "lantern_top.png": [65, 66, 70], "mcl_blackstone_basalt_smooth.png": [87, 86, 86], "mcl_blackstone_basalt_top_polished.png": [77, 76, 76], "mcl_backstone_quartz_bricks.png": [189, 184, 181], "soul_fire_basic_flame_animated.png": [75, 161, 161], "mcl_blackstone_basalt_side_polished.png": [64, 63, 63], "soul_torch_on_floor_animated.png": [94, 96, 84], "mcl_blackstone_chiseled_polished.png": [40, 38, 43], "lantern_bottom.png": [78, 138, 137], "lantern.png": [69, 121, 121], "soul_mcl_burning_hud_flame_animated.png": [75, 161, 161], "mcl_blackstone_basalt_side.png": [60, 59, 59], "mcl_blackstone_basalt_top.png": [68, 68, 68], "mcl_blackstone_polished.png": [43, 41, 46], "mcl_blackstone_polished_bricks.png": [41, 38, 43], "mcl_blackstone_soul_soil.png": [91, 71, 52], "soul_mcl_burning_entity_flame_animated.png": [75, 161, 161], "mcl_blackstone_chain.png": [33, 33, 33], "soul_fire_basic_flame.png": [76, 164, 164], "mcl_blackstone.png": [30, 29, 31], "soul_torch_on_floor.png": [92, 94, 83], "mcl_nether_nether_wart_block_blue.png": [72, 95, 175], "mcl_blackstone_gilded_side.png": [184, 140, 50], "mcl_fireworks_rocket.png": [155, 84, 71], "mcl_bows_arrow_inv.png": [144, 129, 121], "mcl_bows_crossbow_0.png": [95, 77, 61], "mcl_bows_rocket.png": [188, 86, 83], "mcl_bows_firework_white.png": [222, 222, 222], "mcl_bows_firework_green.png": [156, 238, 141], "mcl_bows_firework_blue.png": [141, 174, 238], "mcl_bows_firework_red.png": [238, 141, 141], "mcl_bows_arrow_overlay.png": [184, 181, 175], "mcl_bows_bow_1.png": [112, 95, 79], "mcl_bows_bow_0.png": [111, 94, 79], "mcl_bows_crossbow_2.png": [100, 82, 66], "mcl_bows_bow_2.png": [115, 98, 82], "mcl_bows_rocket_particle.png": [215, 215, 215], "mcl_bows_crossbow_3.png": [103, 87, 73], "mcl_bows_bow.png": [114, 95, 78], "mcl_bows_arrow.png": [133, 116, 108], "mcl_bows_crossbow.png": [94, 76, 60], "mcl_bows_crossbow_1.png": [97, 79, 62], "mcl_bows_arrow_front.png": [178, 175, 168], "mcl_bows_arrow_back.png": [218, 216, 213], "mcl_bows_firework_yellow.png": [238, 218, 141], "mcl_ocean_dead_bubble_coral.png": [118, 108, 126], "mcl_ocean_tube_coral.png": [57, 88, 209], "mcl_ocean_sea_pickle_2_anim.png": [95, 122, 51], "mcl_ocean_dead_horn_coral_fan.png": [150, 143, 123], "mcl_ocean_dead_bubble_coral_block.png": [114, 105, 122], "mcl_ocean_sea_pickle_3_off.png": [68, 99, 36], "mcl_ocean_dead_horn_coral_block.png": [152, 146, 125], "mcl_ocean_bubble_coral_block.png": [143, 76, 195], "mcl_ocean_horn_coral.png": [233, 195, 69], "mcl_ocean_dead_tube_coral_block.png": [99, 104, 127], "mcl_ocean_sea_pickle_item.png": [93, 120, 50], "mcl_ocean_kelp_item.png": [42, 105, 55], "mcl_ocean_dried_kelp_side.png": [71, 80, 67], "mcl_ocean_dead_tube_coral.png": [99, 105, 128], "mcl_ocean_fire_coral_block.png": [198, 74, 62], "mcl_ocean_bubble_coral.png": [149, 77, 200], "mcl_ocean_prismarine_bricks.png": [104, 112, 115], "mcl_ocean_brain_coral.png": [206, 87, 153], "mcl_ocean_dried_kelp_top.png": [56, 71, 57], "mcl_ocean_brain_coral_block.png": [200, 85, 148], "mcl_ocean_prismarine_dark.png": [77, 89, 97], "mcl_ocean_dead_fire_coral_block.png": [127, 102, 100], "mcl_ocean_prismarine_shard.png": [122, 144, 135], "mcl_ocean_sea_pickle_2_off.png": [70, 100, 36], "mcl_ocean_sea_pickle_4_anim.png": [85, 113, 46], "mcl_ocean_dead_brain_coral.png": [134, 117, 127], "mcl_ocean_tube_coral_fan.png": [59, 85, 203], "mcl_ocean_sea_pickle_4_off.png": [68, 98, 36], "mcl_ocean_sea_pickle_1_anim.png": [106, 132, 57], "mcl_ocean_fire_coral.png": [208, 78, 65], "mcl_ocean_sea_pickle_3_anim.png": [89, 116, 48], "mcl_ocean_dead_fire_coral_fan.png": [140, 113, 110], "mcl_ocean_prismarine_crystals.png": [182, 193, 190], "mcl_ocean_prismarine_anim.png": [104, 123, 122], "mcl_ocean_horn_coral_fan.png": [230, 189, 68], "mcl_ocean_dead_tube_coral_fan.png": [98, 103, 125], "mcl_ocean_sea_pickle_1_off.png": [72, 103, 37], "mcl_ocean_dead_horn_coral.png": [154, 148, 127], "mcl_ocean_dead_fire_coral.png": [133, 107, 105], "mcl_ocean_bubble_coral_fan.png": [141, 75, 192], "mcl_ocean_horn_coral_block.png": [232, 193, 69], "mcl_ocean_brain_coral_fan.png": [206, 87, 154], "mcl_ocean_sea_lantern.png": [133, 144, 145], "mcl_ocean_seagrass.png": [48, 125, 60], "mcl_ocean_dead_brain_coral_fan.png": [134, 117, 127], "mcl_ocean_dried_kelp.png": [36, 57, 40], "mcl_ocean_dead_bubble_coral_fan.png": [113, 104, 120], "mcl_ocean_dried_kelp_bottom.png": [56, 71, 57], "mcl_ocean_kelp_plant.png": [42, 105, 55], "mcl_ocean_tube_coral_block.png": [58, 88, 207], "mcl_ocean_dead_brain_coral_block.png": [130, 114, 123], "mcl_ocean_fire_coral_fan.png": [205, 77, 64], "mcl_portals_endframe_bottom.png": [109, 99, 87], "mcl_portals_particle3.png": [146, 0, 201], "mcl_portals_particle2.png": [146, 0, 201], "mcl_portals_endframe_top.png": [95, 85, 74], "mcl_portals_particle4.png": [146, 0, 201], "mcl_portals_endframe_eye.png": [135, 36, 18], "mcl_portals_end_portal.png": [14, 14, 14], "mcl_particles_nether_portal.png": [206, 0, 206], "mcl_portals_particle5.png": [189, 11, 213], "mcl_portals_endframe_side.png": [110, 99, 86], "mcl_portals_particle1.png": [173, 28, 229], "mcl_portals_portal.png": [74, 24, 172], "mcl_particles_nether_portal_t.png": [159, 0, 223], "cake_side.png": [201, 170, 155], "cake_inner.png": [185, 129, 99], "cake_bottom.png": [160, 86, 51], "cake_top.png": [241, 228, 226], "cake.png": [216, 187, 176], "mcl_cocoas_cocoa_top_stage_2.png": [138, 68, 52], "mcl_cocoas_cocoa_stage_1.png": [172, 121, 69], "mcl_cocoas_cocoa_stage_2.png": [132, 65, 50], "mcl_cocoas_cocoa_stage_0.png": [65, 77, 39], "mcl_fences_fence_red_nether_brick.png": [68, 17, 0], "mcl_fences_fence_gate_red_nether_brick.png": [64, 15, 0], "mcl_fences_fence_gate_nether_brick.png": [50, 25, 26], "mcl_mobitems_spider_eye.png": [154, 69, 60], "mcl_mobitems_leather.png": [105, 75, 45], "mcl_mobitems_feather.png": [206, 185, 183], "mcl_mobitems_string.png": [202, 186, 166], "mcl_mobitems_rabbit_foot.png": [124, 107, 97], "mcl_mobitems_saddle.png": [93, 72, 50], "mcl_mobitems_bone.png": [182, 162, 139], "mcl_mobitems_horse_armor_iron.png": [134, 123, 118], "mcl_mobitems_shulker_shell.png": [118, 68, 83], "mcl_mobitems_blaze_rod.png": [143, 64, 28], "mcl_mobitems_beef_raw.png": [147, 63, 54], "mcl_mobitems_rabbit_stew.png": [127, 98, 79], "mcl_mobitems_rotten_flesh.png": [110, 68, 45], "mcl_mobitems_horse_armor_diamond.png": [78, 110, 129], "mcl_mobitems_chicken_raw.png": [217, 178, 149], "mcl_mobitems_ghast_tear.png": [148, 160, 166], "mcl_mobitems_porkchop_raw.png": [160, 72, 69], "mcl_mobitems_horse_armor_gold.png": [143, 110, 59], "mcl_mobitems_rabbit_hide.png": [108, 85, 73], "mcl_mobitems_slimeball.png": [75, 134, 82], "mcl_mobitems_magma_cream.png": [102, 54, 34], "default_gunpowder.png": [48, 41, 36], "mcl_mobitems_chicken_cooked.png": [187, 145, 106], "mcl_mobitems_beef_cooked.png": [112, 70, 49], "mcl_mobitems_rabbit_cooked.png": [188, 155, 131], "mcl_mobitems_blaze_powder.png": [86, 50, 34], "mcl_mobitems_rabbit_raw.png": [217, 177, 157], "mcl_mobitems_carrot_on_a_stick.png": [133, 113, 93], "mcl_mobitems_mutton_cooked.png": [144, 104, 77], "mcl_mobitems_nether_star.png": [234, 189, 123], "mcl_mobitems_porkchop_cooked.png": [116, 72, 48], "mcl_mobitems_mutton_raw.png": [175, 77, 77], "mcl_mobitems_bucket_milk.png": [180, 175, 166], "mcl_farming_wheat_stage_0.png": [53, 101, 46], "farming_carrot.png": [147, 106, 63], "farming_potato_poison.png": [121, 93, 55], "mcl_farming_pumpkin_hud.png": [0, 0, 0], "farming_cookie.png": [144, 100, 61], "mcl_farming_melon_seeds.png": [100, 72, 61], "mcl_farming_potatoes_stage_1.png": [69, 113, 61], "mcl_farming_melon_stem_disconnected.png": [96, 96, 96], "farming_carrot_4.png": [93, 105, 58], "mcl_farming_wheat_stage_5.png": [101, 142, 66], "farming_tool_woodhoe.png": [120, 101, 86], "mcl_farming_potatoes_stage_0.png": [73, 119, 65], "farming_carrot_1.png": [75, 112, 61], "farming_carrot_3.png": [70, 107, 57], "farming_melon.png": [153, 84, 62], "mcl_farming_pumpkin_seeds.png": [132, 120, 87], "farming_wheat_harvested.png": [178, 134, 80], "farming_pumpkin_side.png": [186, 100, 42], "mcl_farming_pumpkin_face.png": [181, 94, 40], "mcl_farming_wheat_stage_4.png": [86, 129, 65], "mcl_farming_farmland_wet.png": [69, 55, 46], "mcl_farming_beetroot_0.png": [56, 122, 75], "mcl_farming_pumpkin_stem_connected.png": [94, 94, 94], "mcl_farming_farmland_dry.png": [101, 80, 68], "farming_tool_diamondhoe.png": [101, 104, 104], "mcl_farming_beetroot_1.png": [54, 118, 72], "mcl_farming_beetroot_2.png": [54, 119, 73], "mcl_farming_wheat_stage_7.png": [165, 116, 75], "mcl_farming_beetroot.png": [113, 69, 66], "mcl_farming_wheat_stage_6.png": [145, 145, 69], "mcl_farming_wheat_stage_3.png": [64, 113, 52], "mcl_farming_pumpkin_stem_disconnected.png": [96, 96, 96], "mcl_farming_hayblock_top.png": [154, 116, 81], "farming_pumpkin_face_light.png": [189, 100, 45], "farming_potato_baked.png": [118, 84, 45], "farming_melon_side.png": [68, 95, 37], "farming_potato.png": [107, 74, 39], "mcl_farming_wheat_stage_1.png": [49, 97, 45], "farming_pumpkin_top.png": [172, 87, 40], "farming_bread.png": [177, 133, 94], "mcl_farming_beetroot_soup.png": [120, 70, 63], "farming_melon_top.png": [58, 80, 33], "mcl_farming_potatoes_stage_3.png": [82, 106, 57], "farming_tool_stonehoe.png": [133, 122, 111], "mcl_farming_beetroot_seeds.png": [107, 104, 88], "farming_tool_goldhoe.png": [162, 131, 70], "farming_carrot_gold.png": [140, 122, 48], "farming_carrot_2.png": [72, 108, 58], "farming_pumpkin_face.png": [161, 79, 37], "mcl_farming_melon_stem_connected.png": [94, 94, 94], "mcl_farming_pumpkin_pie.png": [172, 98, 45], "mcl_farming_wheat_stage_2.png": [49, 97, 45], "farming_tool_steelhoe.png": [123, 112, 102], "mcl_farming_potatoes_stage_2.png": [72, 116, 62], "mcl_farming_beetroot_3.png": [73, 105, 71], "mcl_farming_wheat_seeds.png": [102, 87, 55], "mcl_farming_hayblock_side.png": [135, 99, 71], "mcl_raw_ores_raw_iron_block.png": [194, 172, 156], "mcl_raw_ores_raw_gold_block.png": [208, 166, 77], "mcl_raw_ores_raw_gold.png": [195, 152, 64], "mcl_raw_ores_raw_iron.png": [182, 160, 145], "mcl_end_purpur_block.png": [161, 111, 175], "mcl_end_chorus_flower_dead.png": [82, 79, 118], "mcl_end_end_stone.png": [221, 214, 130], "mcl_end_endframe_side.png": [110, 99, 86], "mcl_end_purpur_pillar.png": [157, 108, 171], "mcl_end_chorus_fruit.png": [87, 89, 121], "mcl_end_endframe_eye.png": [135, 36, 18], "mcl_end_chorus_fruit_popped.png": [70, 67, 110], "mcl_end_end_rod_top.png": [123, 75, 97], "mcl_end_endframe_top.png": [95, 85, 74], "mcl_end_purpur_pillar_top.png": [159, 110, 173], "mcl_end_chorus_flower.png": [92, 92, 125], "mcl_end_crystal_item.png": [170, 140, 162], "mcl_end_end_bricks.png": [194, 187, 123], "mcl_end_dragon_egg.png": [55, 34, 32], "mcl_end_ender_eye.png": [130, 33, 17], "mcl_end_chorus_plant.png": [78, 73, 115], "mcl_end_end_rod_bottom.png": [122, 74, 96], "mcl_end_crystal_beam.png": [195, 81, 183], "mcl_end_end_rod_side.png": [242, 202, 177], "mcl_cracked_deepslate_tiles.png": [47, 46, 46], "mcl_cracked_deepslate_bricks.png": [60, 58, 58], "mcl_deepslate_iron_ore.png": [88, 82, 79], "mcl_deepslate_bricks.png": [62, 61, 60], "mcl_deepslate_tuff.png": [98, 81, 69], "mcl_deepslate_gold_ore.png": [87, 78, 64], "mcl_chiseled_deepslate.png": [44, 43, 43], "mcl_deepslate_diamond_ore.png": [74, 92, 100], "mcl_deepslate_lapis_ore.png": [63, 74, 90], "mcl_cobbled_deepslate.png": [78, 76, 75], "mcl_deepslate_tiles.png": [49, 47, 47], "mcl_deepslate.png": [70, 68, 67], "mcl_deepslate_redstone_ore.png": [89, 61, 60], "mcl_deepslate_emerald_ore.png": [63, 81, 71], "mcl_deepslate_top.png": [75, 73, 72], "mcl_polished_deepslate.png": [68, 66, 66], "mcl_deepslate_copper_ore.png": [82, 70, 67], "mcl_deepslate_coal_ore.png": [63, 60, 59], "mcl_clock_clock_18.png": [152, 123, 81], "mcl_clock_clock_03.png": [160, 129, 88], "mcl_clock_clock_49.png": [155, 122, 79], "mcl_clock_clock_34.png": [140, 115, 76], "mcl_clock_clock_01.png": [161, 129, 88], "mcl_clock_clock_32.png": [141, 116, 77], "mcl_clock_clock_27.png": [142, 117, 78], "mcl_clock_clock_42.png": [147, 119, 79], "mcl_clock_clock_25.png": [145, 119, 78], "mcl_clock_clock_56.png": [160, 126, 81], "mcl_clock_clock_22.png": [146, 119, 79], "mcl_clock_clock_31.png": [141, 116, 76], "mcl_clock_clock_57.png": [161, 127, 83], "mcl_clock_clock_58.png": [157, 127, 86], "mcl_clock_clock_39.png": [146, 119, 79], "mcl_clock_clock_59.png": [160, 128, 86], "mcl_clock_clock_16.png": [157, 125, 80], "mcl_clock_clock_38.png": [141, 117, 78], "mcl_clock_clock_53.png": [158, 124, 80], "mcl_clock_clock_43.png": [149, 121, 80], "mcl_clock_clock_09.png": [161, 127, 81], "mcl_clock_clock_33.png": [141, 116, 76], "mcl_clock_clock_07.png": [162, 128, 83], "mcl_clock_clock_23.png": [148, 121, 80], "mcl_clock_clock_51.png": [156, 123, 80], "mcl_clock_clock_10.png": [158, 127, 85], "mcl_clock_clock_55.png": [160, 126, 81], "mcl_clock_clock_46.png": [152, 122, 81], "mcl_clock_clock_26.png": [142, 117, 79], "mcl_clock_clock_06.png": [157, 127, 86], "mcl_clock_clock_00.png": [162, 129, 87], "mcl_clock_clock_28.png": [141, 116, 77], "mcl_clock_clock_44.png": [150, 120, 79], "mcl_clock_clock_08.png": [160, 127, 81], "mcl_clock_clock_19.png": [152, 122, 80], "mcl_clock_clock_12.png": [159, 127, 83], "mcl_clock_clock_45.png": [153, 123, 81], "mcl_clock_clock_24.png": [147, 120, 80], "mcl_clock_clock_15.png": [157, 125, 81], "mcl_clock_clock_20.png": [150, 121, 79], "mcl_clock_clock_61.png": [160, 129, 88], "mcl_clock_clock_02.png": [159, 129, 89], "mcl_clock_clock_40.png": [147, 120, 79], "mcl_clock_clock_37.png": [143, 118, 79], "mcl_clock_clock_48.png": [155, 123, 79], "mcl_clock_clock_13.png": [159, 126, 82], "mcl_clock_clock_17.png": [156, 125, 81], "mcl_clock_clock_52.png": [156, 123, 80], "mcl_clock_clock_54.png": [156, 125, 84], "mcl_clock_clock_04.png": [159, 128, 87], "mcl_clock_clock_47.png": [154, 122, 80], "mcl_clock_clock_62.png": [159, 129, 89], "mcl_clock_clock_41.png": [147, 120, 79], "mcl_clock_clock_35.png": [140, 115, 76], "mcl_clock_clock_60.png": [159, 128, 87], "mcl_clock_clock_50.png": [155, 123, 80], "mcl_clock_clock_29.png": [142, 117, 78], "mcl_clock_clock_21.png": [150, 122, 81], "mcl_clock_clock_30.png": [140, 115, 76], "mcl_clock_clock_14.png": [157, 125, 81], "mcl_clock_clock_05.png": [160, 128, 85], "mcl_clock_clock_36.png": [141, 116, 77], "mcl_clock_clock_63.png": [161, 129, 88], "mcl_clock_clock_11.png": [160, 127, 82], "lodestone_side3.png": [83, 73, 69], "mcl_compass_compass_02.png": [116, 107, 104], "lodestone_bottom.png": [81, 72, 69], "mcl_compass_compass_06.png": [117, 107, 104], "mcl_compass_compass_04.png": [117, 106, 104], "mcl_compass_compass_19.png": [116, 106, 103], "mcl_compass_compass_16.png": [114, 106, 104], "lodestone_side1.png": [83, 73, 69], "mcl_compass_compass_26.png": [117, 107, 104], "lodestone_side4.png": [85, 75, 70], "mcl_compass_compass_25.png": [117, 107, 105], "mcl_compass_compass_24.png": [117, 107, 105], "mcl_compass_compass_17.png": [115, 106, 104], "lodestone_top.png": [78, 69, 66], "mcl_compass_compass_23.png": [117, 107, 105], "mcl_compass_compass_01.png": [115, 107, 104], "mcl_compass_compass_28.png": [116, 107, 104], "mcl_compass_compass_05.png": [117, 106, 104], "mcl_compass_compass_09.png": [117, 107, 104], "mcl_compass_compass_10.png": [117, 107, 105], "lodestone_side2.png": [82, 72, 68], "mcl_compass_compass_14.png": [116, 107, 105], "mcl_compass_compass_18.png": [117, 107, 104], "mcl_compass_compass_13.png": [117, 106, 104], "mcl_compass_compass_08.png": [117, 107, 104], "mcl_compass_compass_21.png": [117, 107, 104], "mcl_compass_compass_27.png": [117, 106, 104], "mcl_compass_compass_30.png": [116, 107, 104], "mcl_compass_compass_15.png": [115, 106, 104], "mcl_compass_compass_29.png": [115, 106, 104], "mcl_compass_compass_03.png": [116, 106, 104], "mcl_compass_compass_07.png": [117, 107, 104], "mcl_compass_compass_22.png": [117, 107, 105], "mcl_compass_compass_12.png": [117, 106, 104], "mcl_compass_compass_00.png": [114, 107, 104], "mcl_compass_compass_20.png": [116, 106, 104], "mcl_compass_compass_31.png": [115, 107, 104], "mcl_compass_compass_11.png": [117, 106, 104], "mcl_jukebox_record_wait.png": [39, 42, 55], "mcl_jukebox_record_cat.png": [40, 45, 51], "mcl_jukebox_record_mellohi.png": [46, 44, 59], "mcl_jukebox_record_13.png": [51, 47, 51], "mcl_jukebox_record_ward.png": [39, 43, 51], "mcl_jukebox_record_chirp.png": [49, 40, 50], "mcl_jukebox_record_blocks.png": [47, 37, 49], "mcl_jukebox_record_11.png": [41, 40, 52], "mcl_jukebox_record_mall.png": [42, 41, 62], "mcl_jukebox_top.png": [72, 56, 44], "mcl_jukebox_record_strad.png": [45, 45, 57], "mcl_jukebox_record_far.png": [47, 48, 52], "mcl_jukebox_side.png": [94, 74, 57], "mcl_jukebox_record_stal.png": [39, 38, 49], "loom_front.png": [127, 101, 84], "loom_side1.png": [130, 102, 80], "loom_bottom1.png": [163, 130, 100], "loom_top1.png": [186, 160, 137], "loom_bottom.png": [111, 84, 69], "loom_front1.png": [148, 123, 102], "loom_top.png": [134, 111, 97], "loom_side.png": [121, 91, 72], "mcl_fences_fence_acacia.png": [152, 99, 68], "mcl_fences_fence_gate_mask.png": [255, 126, 126], "mcl_fences_fence_gate_spruce.png": [85, 69, 56], "mcl_fences_fence_big_oak.png": [83, 71, 59], "mcl_fences_fence_spruce.png": [84, 67, 54], "mcl_fences_fence_gate_birch.png": [153, 121, 94], "mcl_fences_fence_gate_acacia.png": [155, 102, 70], "mcl_fences_fence_gate_big_oak.png": [85, 73, 61], "mcl_fences_fence_oak.png": [108, 83, 64], "mcl_fences_fence_gate_oak.png": [111, 85, 66], "mcl_fences_fence_jungle.png": [115, 80, 60], "mcl_fences_fence_nether_brick.png": [49, 24, 24], "mcl_fences_fence_birch.png": [151, 119, 93], "mcl_fences_fence_gate_jungle.png": [117, 82, 61], "mcl_fences_fence_mask.png": [255, 126, 126], "mcl_composter_bottom.png": [141, 111, 87], "mcl_composter_side.png": [117, 92, 74], "mcl_composter_ready.png": [109, 107, 74], "mcl_composter_compost.png": [75, 76, 41], "mcl_composter_top.png": [157, 129, 103], "mcl_core_leaves_birch.png": [28, 57, 28], "default_mossycobble.png": [100, 105, 94], "default_flint.png": [70, 67, 64], "mcl_core_bowl.png": [78, 61, 47], "mcl_core_glass_lime_detail.png": [126, 203, 24], "mcl_core_bone_block_top.png": [220, 201, 170], "default_acacia_tree.png": [105, 91, 74], "default_steel_block.png": [159, 151, 151], "mcl_core_stonebrick_mossy.png": [81, 101, 76], "default_diamond_block.png": [92, 160, 200], "mcl_core_glass_brown_detail.png": [101, 75, 50], "mcl_core_glass_blue_detail.png": [50, 75, 178], "default_leaves.png": [39, 79, 38], "mcl_core_web.png": [202, 189, 167], "mcl_core_reeds.png": [57, 100, 52], "default_gold_ingot.png": [179, 133, 47], "mcl_core_grass_path_side.png": [113, 89, 62], "mcl_core_red_sand.png": [224, 137, 111], "mcl_core_glass_black_detail.png": [24, 24, 24], "default_apple.png": [137, 57, 44], "mcl_core_log_birch_top.png": [155, 130, 112], "default_coal_block.png": [51, 49, 51], "mcl_core_andesite_smooth.png": [107, 113, 109], "mcl_core_apple_golden.png": [176, 138, 51], "mcl_core_diorite.png": [153, 149, 146], "mcl_core_granite_smooth.png": [150, 121, 110], "mcl_core_bedrock.png": [91, 77, 66], "mcl_core_planks_spruce.png": [81, 65, 54], "mcl_core_sapling_big_oak.png": [69, 92, 80], "mcl_core_emerald_ore.png": [115, 122, 103], "mcl_core_sandstone_smooth.png": [202, 155, 121], "mcl_core_glass_light_blue.png": [101, 153, 215], "default_brick.png": [139, 87, 75], "mcl_core_redstone_ore.png": [128, 91, 88], "mcl_core_cactus_top.png": [77, 99, 49], "mcl_core_frosted_ice_1.png": [147, 198, 227], "mcl_core_glass_white_detail.png": [254, 254, 254], "mcl_core_sapling_spruce.png": [55, 72, 53], "mcl_core_stripped_acacia_top.png": [157, 98, 62], "mcl_core_log_spruce_top.png": [97, 71, 57], "mcl_core_glass_lime.png": [126, 203, 24], "mcl_core_lapis_ore.png": [111, 113, 125], "default_junglesapling.png": [64, 88, 39], "default_clay_brick.png": [127, 57, 48], "default_gold_block.png": [192, 147, 59], "mcl_core_glass_green_detail.png": [101, 126, 50], "mcl_core_glass_pink_detail.png": [241, 126, 164], "default_water_source_animated.png": [37, 98, 129], "mcl_core_glass_orange_detail.png": [215, 126, 50], "mcl_core_glass_yellow.png": [228, 228, 50], "default_acacia_sapling.png": [109, 92, 59], "mcl_core_stripped_acacia_side.png": [151, 90, 57], "mcl_core_sandstone_carved.png": [199, 152, 119], "mcl_core_glass_blue.png": [50, 75, 178], "mcl_core_glass_gray_detail.png": [75, 75, 75], "mcl_core_red_sandstone_normal.png": [198, 120, 104], "mcl_core_glass_red_detail.png": [153, 50, 50], "mcl_core_glass_gray.png": [75, 75, 75], "mcl_core_leaves_spruce.png": [38, 74, 47], "mcl_core_glass_pink.png": [241, 126, 164], "mcl_core_lapis_block.png": [50, 92, 162], "mcl_core_glass_purple.png": [126, 62, 178], "mcl_core_iron_nugget.png": [156, 151, 145], "default_dry_grass.png": [100, 94, 54], "mcl_core_stripped_dark_oak_top.png": [90, 78, 68], "mcl_core_glass_silver.png": [153, 153, 153], "mcl_core_andesite.png": [104, 110, 107], "mcl_core_frosted_ice_3.png": [165, 209, 233], "mcl_core_sugar.png": [215, 215, 215], "default_acacia_wood.png": [152, 100, 69], "mcl_core_glass_black.png": [24, 24, 24], "mcl_core_iron_ore.png": [134, 123, 117], "mcl_core_stripped_birch_side.png": [179, 143, 115], "default_clay.png": [124, 124, 124], "mcl_core_stripped_jungle_side.png": [175, 117, 86], "mcl_core_glass_red.png": [153, 50, 50], "mcl_core_grass_block_top.png": [141, 130, 113], "mcl_core_planks_birch.png": [145, 113, 89], "mcl_core_glass_white.png": [254, 254, 254], "mcl_core_stripped_oak_side.png": [162, 122, 84], "mcl_core_glass_cyan.png": [75, 126, 153], "mcl_core_cactus_side.png": [88, 110, 56], "default_ladder.png": [83, 64, 50], "mcl_core_glass_silver_detail.png": [153, 153, 153], "default_dry_grass_side.png": [91, 93, 52], "mcl_core_glass_light_blue_detail.png": [101, 153, 215], "mcl_core_stripped_jungle_top.png": [170, 113, 83], "mcl_core_ice_packed.png": [165, 211, 231], "mcl_core_frosted_ice_2.png": [153, 202, 229], "default_dry_shrub.png": [118, 88, 69], "mcl_core_red_sandstone_carved.png": [202, 122, 104], "default_tree.png": [95, 75, 57], "default_clay_lump.png": [111, 111, 111], "mcl_core_red_sandstone_top.png": [212, 126, 108], "mcl_core_dirt_podzol_side.png": [101, 79, 63], "mcl_core_red_sandstone_smooth.png": [207, 124, 106], "default_jungletree_top.png": [125, 87, 67], "mcl_core_coal_ore.png": [109, 101, 99], "default_jungleleaves.png": [29, 84, 30], "mcl_core_vine.png": [21, 61, 21], "default_snow.png": [221, 229, 234], "mcl_core_leaves_big_oak.png": [21, 69, 28], "mcl_core_void.png": [59, 59, 59], "default_tree_top.png": [135, 104, 74], "mcl_core_gold_ore.png": [132, 119, 103], "default_steel_ingot.png": [142, 137, 131], "default_sapling.png": [62, 90, 45], "mcl_core_log_birch.png": [194, 184, 174], "mcl_core_glass_cyan_detail.png": [75, 126, 153], "mcl_core_glass_yellow_detail.png": [228, 228, 50], "mcl_core_stripped_spruce_top.png": [107, 79, 64], "default_water_flowing_animated.png": [38, 101, 129], "mcl_core_emerald_block.png": [44, 138, 39], "default_jungletree.png": [86, 58, 45], "mcl_core_grass_side_snowed.png": [162, 154, 150], "default_stone_brick.png": [97, 89, 86], "default_lava_flowing_animated.png": [177, 42, 16], "mcl_core_stripped_spruce_side.png": [109, 81, 67], "default_coal_lump.png": [41, 39, 41], "mcl_core_glass_purple_detail.png": [126, 62, 178], "default_sand.png": [220, 170, 127], "mcl_core_glass_green.png": [101, 126, 50], "mcl_core_glass_orange.png": [215, 126, 50], "default_acacia_tree_top.png": [130, 84, 55], "mcl_core_stripped_oak_top.png": [153, 115, 80], "mcl_core_grass_block_side_overlay.png": [153, 142, 123], "default_lava_source_animated.png": [180, 45, 17], "mcl_core_cactus_bottom.png": [169, 168, 116], "mcl_core_sandstone_bottom.png": [202, 155, 121], "default_paper.png": [213, 184, 154], "mcl_core_diamond_ore.png": [122, 124, 126], "default_ice.png": [145, 197, 226], "mcl_core_dirt_podzol_top.png": [85, 63, 42], "mcl_core_slime.png": [93, 157, 86], "mcl_core_gold_nugget.png": [213, 169, 74], "default_stick.png": [88, 70, 57], "mcl_core_emerald.png": [59, 160, 52], "default_diamond.png": [109, 179, 217], "mcl_core_mycelium_top.png": [108, 89, 117], "mcl_core_bone_block_side.png": [226, 207, 174], "mcl_core_diorite_smooth.png": [157, 154, 152], "default_obsidian.png": [13, 9, 25], "mcl_core_planks_big_oak.png": [87, 74, 62], "mcl_core_log_spruce.png": [66, 51, 44], "mcl_core_glass_magenta.png": [178, 75, 215], "mcl_core_granite.png": [153, 121, 110], "mcl_core_log_big_oak_top.png": [83, 70, 62], "default_cobble.png": [113, 106, 104], "mcl_core_red_sandstone_bottom.png": [207, 124, 106], "mcl_core_barrier.png": [138, 46, 38], "mcl_core_glass_magenta_detail.png": [178, 75, 215], "mcl_core_stripped_dark_oak_side.png": [91, 78, 70], "mcl_core_mycelium_side.png": [107, 84, 87], "mcl_core_stonebrick_cracked.png": [94, 87, 83], "mcl_core_charcoal.png": [40, 35, 32], "mcl_core_glass_brown.png": [101, 75, 50], "default_glass_detail.png": [244, 244, 250], "mcl_core_papyrus.png": [105, 105, 105], "mcl_core_stonebrick_carved.png": [97, 90, 85], "default_wood.png": [113, 87, 67], "default_dirt.png": [108, 83, 70], "mcl_core_log_big_oak.png": [74, 62, 55], "default_junglewood.png": [113, 78, 59], "mcl_core_frosted_ice_0.png": [140, 193, 224], "mcl_core_sandstone_normal.png": [195, 149, 117], "default_gravel.png": [112, 105, 99], "mcl_core_sandstone_top.png": [201, 154, 121], "default_glass.png": [213, 223, 235], "default_stone.png": [130, 122, 118], "mcl_core_sapling_birch.png": [78, 110, 74], "mcl_core_coarse_dirt.png": [117, 92, 76], "default_acacia_leaves.png": [110, 89, 45], "mcl_core_stripped_birch_top.png": [170, 135, 108], "mcl_core_grass_path_top.png": [125, 101, 50], "mcl_lanterns_chain.png": [40, 40, 40], "mcl_lanterns_soul_lantern.png": [50, 67, 68], "mcl_lanterns_lantern.png": [72, 59, 48], "mcl_lanterns_chain_inv.png": [40, 40, 40], "mcl_lanterns_lantern_inv.png": [98, 75, 53], "mcl_lanterns_soul_lantern_inv.png": [59, 90, 91], "mcl_throwing_ender_pearl.png": [78, 19, 26], "mcl_throwing_egg.png": [199, 157, 106], "mcl_throwing_snowball.png": [191, 200, 203], "mcl_flowers_tulip_red.png": [82, 57, 43], "mcl_flowers_double_plant_rose_top.png": [81, 69, 45], "mcl_flowers_double_plant_sunflower_front.png": [203, 157, 61], "mcl_flowers_tulip_white.png": [106, 122, 95], "mcl_flowers_double_plant_grass_top.png": [156, 145, 125], "mcl_flowers_azure_bluet.png": [97, 114, 98], "mcl_flowers_oxeye_daisy.png": [130, 139, 110], "mcl_flowers_poppy.png": [96, 59, 43], "mcl_flowers_double_plant_paeonia_top.png": [90, 84, 81], "mcl_flowers_double_plant_rose_bottom.png": [78, 63, 41], "mcl_flowers_tallgrass.png": [151, 141, 122], "mcl_flowers_double_plant_sunflower_bottom.png": [45, 76, 40], "mcl_flowers_fern.png": [143, 132, 115], "flowers_tulip.png": [106, 84, 51], "mcl_flowers_double_plant_syringa_bottom.png": [63, 77, 60], "mcl_flowers_double_plant_fern_bottom.png": [140, 130, 113], "flowers_dandelion_yellow.png": [111, 111, 55], "mcl_flowers_double_plant_paeonia_bottom.png": [82, 83, 73], "mcl_flowers_double_plant_sunflower_back.png": [174, 146, 57], "mcl_flowers_allium.png": [120, 116, 144], "flowers_waterlily.png": [28, 81, 29], "mcl_flowers_tulip_pink.png": [100, 99, 90], "mcl_flowers_double_plant_sunflower_top.png": [48, 81, 44], "mcl_flowers_double_plant_syringa_top.png": [95, 90, 98], "mcl_flowers_double_plant_grass_bottom.png": [151, 140, 121], "mcl_flowers_double_plant_grass_inv.png": [48, 95, 43], "mcl_flowers_fern_inv.png": [43, 86, 39], "mcl_flowers_double_plant_fern_top.png": [148, 138, 119], "mcl_flowers_tallgrass_inv.png": [47, 92, 41], "mcl_flowers_double_plant_fern_inv.png": [45, 89, 40], "mcl_flowers_blue_orchid.png": [46, 91, 86], "mcl_armor_leggings_iron.png": [132, 128, 123], "mcl_armor_inv_leggings_iron.png": [130, 125, 120], "mcl_armor_inv_helmet_gold.png": [178, 134, 51], "mcl_armor_leggings_chain.png": [64, 66, 69], "mcl_armor_inv_boots_iron.png": [134, 129, 124], "mcl_armor_inv_chestplate_chain.png": [128, 105, 96], "mcl_armor_inv_chestplate_gold.png": [171, 128, 55], "mcl_armor_inv_helmet_diamond.png": [109, 130, 142], "mcl_armor_boots_leather.png": [122, 111, 93], "mcl_armor_inv_chestplate_diamond.png": [106, 146, 168], "mcl_armor_helmet_diamond.png": [70, 85, 93], "mcl_armor_inv_chestplate_leather.png": [143, 136, 118], "mcl_armor_boots_diamond.png": [87, 132, 157], "mcl_armor_leggings_diamond.png": [78, 102, 115], "mcl_armor_chestplate_gold.png": [157, 117, 55], "mcl_armor_inv_helmet_chain.png": [140, 137, 132], "mcl_armor_inv_leggings_chain.png": [81, 81, 82], "mcl_armor_inv_helmet_iron.png": [143, 138, 133], "mcl_armor_helmet_leather.png": [130, 121, 102], "mcl_armor_chestplate_diamond.png": [110, 157, 183], "mcl_armor_leggings_leather.png": [119, 108, 91], "mcl_armor_inv_boots_gold.png": [152, 113, 44], "mcl_armor_chestplate_leather.png": [139, 132, 112], "mcl_armor_boots_iron.png": [118, 113, 109], "mcl_armor_elytra.png": [75, 121, 147], "mcl_armor_helmet_chain.png": [127, 124, 121], "mcl_armor_helmet_iron.png": [153, 149, 144], "mcl_armor_inv_boots_leather.png": [130, 121, 103], "mcl_armor_leggings_gold.png": [182, 158, 126], "mcl_armor_inv_leggings_gold.png": [175, 145, 97], "mcl_armor_chestplate_iron.png": [130, 120, 112], "mcl_armor_inv_elytra.png": [76, 122, 148], "mcl_armor_boots_chain.png": [88, 88, 88], "mcl_armor_helmet_gold.png": [178, 136, 56], "mcl_armor_inv_boots_diamond.png": [75, 121, 147], "mcl_armor_inv_chestplate_iron.png": [135, 125, 115], "mcl_armor_inv_leggings_diamond.png": [75, 93, 103], "mcl_armor_inv_leggings_leather.png": [126, 116, 98], "mcl_armor_inv_helmet_leather.png": [140, 132, 114], "mcl_armor_inv_boots_chain.png": [69, 69, 72], "mcl_armor_chestplate_chain.png": [119, 98, 93], "mcl_armor_boots_gold.png": [160, 118, 42], "cartography_table_side2.png": [91, 76, 62], "cartography_table_side1.png": [81, 65, 51], "cartography_table_side3.png": [85, 62, 47], "cartography_table_top.png": [111, 95, 80], "mcl_walls_cobble_wall_top.png": [120, 114, 112], "mcl_walls_cobble_mossy_wall_top.png": [53, 97, 61], "mcl_walls_cobble_wall_side.png": [109, 103, 101], "mcl_walls_cobble_mossy_wall_side.png": [86, 98, 83], "mcl_hoppers_item.png": [44, 44, 44], "mcl_hoppers_hopper_top.png": [43, 43, 43], "mcl_hoppers_hopper_outside.png": [44, 43, 43], "mcl_hoppers_hopper_inside.png": [50, 50, 50], "mcl_stairs_stone_slab_top.png": [127, 118, 114], "mcl_stairs_stone_slab_side.png": [127, 117, 113], "mcl_stairs_turntexture.png": [255, 0, 255], "mcl_shield_pattern_stripe_downleft.png": [255, 255, 255], "mcl_shield_pattern_diagonal_right.png": [255, 255, 255], "mcl_shield_pattern_stripe_center.png": [255, 255, 255], "mcl_shield_pattern_half_vertical_right.png": [255, 255, 255], "mcl_shield_pattern_straight_cross.png": [255, 255, 255], "mcl_shield_pattern_stripe_bottom.png": [255, 255, 255], "mcl_shield_pattern_stripe_right.png": [255, 255, 255], "mcl_shield_pattern_circle.png": [239, 239, 239], "mcl_shield_pattern_diagonal_left.png": [255, 255, 255], "mcl_shield_pattern_stripe_top.png": [255, 255, 255], "mcl_shield_pattern_diagonal_up_left.png": [255, 255, 255], "mcl_shield_pattern_creeper.png": [255, 255, 255], "mcl_shield_pattern_triangle_top.png": [255, 255, 255], "mcl_shield_item_overlay.png": [255, 255, 255], "mcl_shield_pattern_square_top_left.png": [255, 255, 255], "mcl_shield_pattern_flower.png": [255, 255, 255], "mcl_shield_pattern_half_horizontal.png": [255, 255, 255], "mcl_shield_pattern_stripe_middle.png": [255, 255, 255], "mcl_shield_pattern_half_vertical.png": [255, 255, 255], "mcl_shield_pattern_triangles_top.png": [255, 255, 255], "mcl_shield_pattern_stripe_downright.png": [255, 255, 255], "mcl_shield_pattern_skull.png": [247, 247, 247], "mcl_shield.png": [76, 61, 49], "mcl_shield_pattern_base.png": [255, 255, 255], "mcl_shield_pattern_gradient_up.png": [254, 254, 254], "mcl_shield_pattern_small_stripes.png": [255, 255, 255], "mcl_shield_pattern_square_bottom_left.png": [255, 255, 255], "mcl_shield_pattern_diagonal_up_right.png": [255, 255, 255], "mcl_shield_pattern_triangles_bottom.png": [255, 255, 255], "mcl_shield_pattern_curly_border.png": [255, 255, 255], "mcl_shield_pattern_cross.png": [255, 255, 255], "mcl_shield_pattern_stripe_left.png": [255, 255, 255], "mcl_shield_pattern_gradient.png": [254, 254, 254], "mcl_shield_pattern_square_bottom_right.png": [255, 255, 255], "mcl_shield_pattern_triangle_bottom.png": [255, 255, 255], "mcl_shield_pattern_half_horizontal_bottom.png": [255, 255, 255], "mcl_shield_pattern_bricks.png": [255, 255, 255], "mcl_shield_pattern_thing.png": [255, 255, 255], "mcl_shield_pattern_square_top_right.png": [255, 255, 255], "mcl_shield_pattern_rhombus.png": [255, 255, 255], "mcl_shield_pattern_border.png": [255, 255, 255], "mcl_shield_hud.png": [74, 58, 44], "mcl_shield_base_nopattern.png": [72, 59, 49], "mcl_brewing_bottle_bg.png": [204, 204, 204], "mcl_brewing_bubble_sprite.png": [167, 167, 167], "mcl_brewing_side.png": [175, 156, 160], "mcl_brewing_inventory.png": [168, 168, 168], "mcl_brewing_bubbles_active.png": [186, 186, 186], "mcl_brewing_fuel_bg.png": [200, 200, 200], "mcl_brewing_potion_bg.png": [204, 204, 204], "mcl_brewing_bubbles.png": [154, 154, 154], "mcl_brewing_top.png": [139, 130, 126], "mcl_brewing_base.png": [130, 122, 118], "mcl_brewing_burner.png": [183, 183, 183], "mcl_brewing_burner_active.png": [212, 161, 132], "fletching_table_front.png": [141, 115, 95], "fletching_table_side.png": [150, 117, 95], "fletching_table_top.png": [158, 129, 104], "xpanes_top_glass_cyan.png": [76, 127, 153], "xpanes_top_glass_brown.png": [102, 76, 51], "xpanes_top_glass_magenta.png": [178, 75, 215], "xpanes_top_glass_light_blue.png": [102, 153, 216], "xpanes_top_glass_blue.png": [51, 76, 178], "xpanes_top_glass_gray.png": [76, 76, 76], "xpanes_top_glass_silver.png": [153, 153, 153], "xpanes_top_iron.png": [155, 146, 146], "xpanes_top_glass_black.png": [25, 25, 25], "xpanes_top_glass_white.png": [255, 255, 255], "xpanes_top_glass_lime.png": [127, 204, 25], "xpanes_top_glass_orange.png": [216, 127, 51], "xpanes_top_glass_purple.png": [127, 63, 178], "xpanes_top_glass_red.png": [153, 51, 51], "xpanes_top_glass_natural.png": [222, 222, 239], "xpanes_top_glass_green.png": [102, 127, 51], "xpanes_top_glass_pink.png": [241, 126, 164], "xpanes_pane_iron.png": [160, 152, 152], "xpanes_top_glass_yellow.png": [229, 229, 51], "hardened_clay_stained_pink.png": [164, 79, 76], "mcl_colorblocks_glazed_terracotta_yellow.png": [232, 199, 99], "mcl_colorblocks_glazed_terracotta_orange.png": [170, 146, 81], "mcl_colorblocks_concrete_powder_lime.png": [125, 186, 42], "mcl_colorblocks_concrete_brown.png": [98, 60, 32], "mcl_colorblocks_concrete_magenta.png": [171, 49, 162], "mcl_colorblocks_glazed_terracotta_magenta.png": [210, 108, 215], "mcl_colorblocks_concrete_silver.png": [128, 129, 118], "mcl_colorblocks_glazed_terracotta_grey.png": [90, 90, 90], "mcl_colorblocks_concrete_powder_blue.png": [72, 75, 169], "mcl_colorblocks_concrete_yellow.png": [241, 177, 21], "mcl_colorblocks_concrete_red.png": [146, 34, 34], "mcl_colorblocks_glazed_terracotta_lime.png": [152, 211, 72], "mcl_colorblocks_concrete_black.png": [8, 10, 15], "mcl_colorblocks_glazed_terracotta_silver.png": [134, 151, 151], "hardened_clay_stained_white.png": [213, 197, 184], "mcl_colorblocks_glazed_terracotta_green.png": [111, 135, 50], "mcl_colorblocks_glazed_terracotta_blue.png": [34, 65, 117], "mcl_colorblocks_concrete_powder_red.png": [172, 57, 52], "mcl_colorblocks_concrete_powder_cyan.png": [38, 150, 159], "hardened_clay_stained_purple.png": [81, 71, 123], "hardened_clay_stained_brown.png": [96, 69, 61], "hardened_clay_stained_grey.png": [110, 92, 85], "mcl_colorblocks_concrete_lime.png": [96, 171, 25], "hardened_clay_stained_blue.png": [68, 91, 143], "mcl_colorblocks_concrete_powder_white.png": [224, 225, 225], "hardened_clay_stained_yellow.png": [177, 128, 51], "hardened_clay_stained_light_blue.png": [91, 128, 171], "hardened_clay.png": [143, 104, 87], "mcl_colorblocks_concrete_cyan.png": [21, 123, 140], "mcl_colorblocks_glazed_terracotta_brown.png": [108, 88, 64], "mcl_colorblocks_concrete_grey.png": [56, 59, 64], "mcl_colorblocks_concrete_powder_magenta.png": [196, 94, 189], "mcl_colorblocks_concrete_powder_black.png": [22, 26, 30], "mcl_colorblocks_concrete_pink.png": [213, 103, 144], "mcl_colorblocks_concrete_powder_orange.png": [227, 141, 38], "mcl_colorblocks_glazed_terracotta_cyan.png": [90, 131, 136], "mcl_colorblocks_glazed_terracotta_red.png": [184, 67, 53], "mcl_colorblocks_concrete_green.png": [75, 94, 37], "mcl_colorblocks_concrete_blue.png": [46, 48, 147], "mcl_colorblocks_glazed_terracotta_light_blue.png": [99, 162, 204], "hardened_clay_stained_orange.png": [156, 95, 69], "mcl_colorblocks_concrete_powder_silver.png": [160, 160, 155], "mcl_colorblocks_concrete_powder_pink.png": [224, 148, 176], "hardened_clay_stained_silver.png": [149, 129, 117], "hardened_clay_stained_red.png": [159, 81, 66], "hardened_clay_stained_magenta.png": [150, 80, 85], "mcl_colorblocks_glazed_terracotta_black.png": [38, 22, 22], "mcl_colorblocks_concrete_white.png": [208, 214, 215], "hardened_clay_stained_green.png": [74, 101, 63], "hardened_clay_stained_lime.png": [105, 134, 73], "mcl_colorblocks_concrete_powder_green.png": [104, 127, 45], "mcl_colorblocks_concrete_light_blue.png": [37, 140, 200], "mcl_colorblocks_concrete_powder_brown.png": [128, 86, 54], "mcl_colorblocks_concrete_purple.png": [103, 32, 159], "hardened_clay_stained_cyan.png": [71, 107, 123], "mcl_colorblocks_concrete_powder_purple.png": [138, 58, 180], "mcl_colorblocks_concrete_powder_yellow.png": [230, 198, 54], "mcl_colorblocks_concrete_powder_light_blue.png": [75, 181, 212], "mcl_colorblocks_glazed_terracotta_pink.png": [251, 138, 170], "mcl_colorblocks_glazed_terracotta_purple.png": [112, 49, 152], "mcl_colorblocks_concrete_orange.png": [226, 101, 1], "mcl_colorblocks_concrete_powder_grey.png": [91, 98, 103], "hardened_clay_stained_black.png": [69, 52, 46], "mcl_colorblocks_glazed_terracotta_white.png": [188, 211, 202], "fire_basic_flame_animated.png": [206, 98, 34], "mcl_burning_hud_flame_animated.png": [206, 98, 34], "mcl_fire_fire_charge.png": [95, 58, 41], "mcl_burning_entity_flame_animated.png": [206, 98, 34], "mcl_fire_flint_and_steel.png": [96, 95, 93], "fire_basic_flame.png": [207, 100, 36], "dye_red.png": [113, 74, 47], "dye_yellow.png": [123, 91, 49], "dye_violet.png": [107, 76, 57], "dye_dark_green.png": [99, 81, 47], "mcl_dye_blue.png": [58, 101, 173], "dye_cyan.png": [104, 89, 60], "mcl_dye_lime.png": [107, 91, 53], "dye_pink.png": [120, 81, 61], "mcl_dye_light_blue.png": [103, 88, 70], "dye_dark_grey.png": [108, 81, 52], "mcl_dye_white.png": [205, 193, 166], "dye_grey.png": [113, 86, 58], "dye_magenta.png": [111, 79, 59], "dye_orange.png": [122, 85, 48], "mcl_dye_brown.png": [104, 75, 56], "mcl_dye_black.png": [56, 56, 64], "default_river_water_flowing_animated.png": [38, 123, 130], "default_river_water_source_animated.png": [37, 120, 130], "3d_armor_stand_item.png": [134, 114, 98], "smoker_front_on.png": [105, 81, 68], "smoker_bottom.png": [115, 102, 97], "smoker_side.png": [105, 91, 82], "smoker_front.png": [93, 80, 71], "smoker_top.png": [110, 99, 95], "mob_spawner.png": [40, 40, 40], "mcl_nether_quartz_chiseled_side.png": [194, 186, 183], "mcl_nether_quartz_pillar_top.png": [195, 188, 185], "mcl_nether_nether_wart.png": [190, 79, 75], "mcl_nether_nether_wart_stage_1.png": [86, 54, 51], "mcl_nether_quartz_ore.png": [133, 64, 53], "mcl_nether_soul_sand.png": [90, 70, 51], "mcl_nether_nether_wart_block.png": [175, 76, 73], "mcl_nether_nether_wart_stage_0.png": [53, 41, 38], "mcl_nether_quartz_block_bottom.png": [198, 191, 187], "mcl_nether_quartz_block_top.png": [198, 190, 187], "mcl_nether_quartz.png": [152, 149, 147], "mcl_nether_quartz_pillar_side.png": [195, 188, 184], "mcl_nether_netherbrick.png": [58, 24, 20], "mcl_nether_glowstone.png": [202, 154, 96], "mcl_nether_netherrack.png": [130, 50, 39], "mcl_nether_red_nether_brick.png": [69, 17, 5], "mcl_nether_quartz_chiseled_top.png": [197, 189, 186], "mcl_nether_glowstone_dust.png": [209, 137, 67], "mcl_nether_nether_wart_stage_2.png": [106, 57, 53], "mcl_nether_quartz_block_side.png": [198, 190, 187], "mcl_nether_nether_brick.png": [49, 23, 24], "mcl_nether_magma.png": [85, 33, 27], "mcl_cauldrons_cauldron_inner.png": [24, 24, 24], "mcl_cauldrons_cauldron_top.png": [54, 54, 54], "mcl_cauldrons_cauldron_bottom.png": [50, 37, 38], "mcl_cauldrons_cauldron.png": [47, 47, 47], "mcl_cauldrons_cauldron_side.png": [43, 43, 43], "mcl_beds_bed_side_bottom_magenta.png": [127, 48, 89], "mcl_beds_bed_blue.png": [73, 78, 105], "mcl_beds_bed_side_top_r_black.png": [99, 86, 75], "mcl_beds_bed_side_bottom_r_magenta.png": [132, 46, 94], "mcl_beds_bed_side_top_brown.png": [98, 76, 59], "respawn_anchor_side2.png": [100, 76, 77], "mcl_beds_bed_lime.png": [96, 135, 66], "mcl_beds_bed_side_top_green.png": [98, 76, 59], "mcl_beds_bed_light_blue.png": [100, 107, 142], "mcl_beds_bed_pink.png": [184, 105, 115], "mcl_beds_bed_side_bottom_black.png": [66, 56, 47], "mcl_beds_bed_top_bottom_green.png": [57, 110, 29], "mcl_beds_bed_side_top_blue.png": [98, 76, 59], "mcl_beds_bed_top_top_pink.png": [217, 138, 147], "mcl_beds_bed_side_bottom_light_blue.png": [90, 94, 129], "mcl_beds_bed_side_bottom_blue.png": [63, 65, 90], "mcl_beds_bed_top_top_red.png": [173, 90, 83], "mcl_beds_bed_side_top_grey.png": [98, 76, 59], "respawn_anchor_bottom.png": [45, 26, 54], "mcl_beds_bed_top_top_white.png": [198, 190, 183], "mcl_beds_bed_top_top_black.png": [107, 100, 92], "mcl_beds_bed_top_bottom_brown.png": [101, 69, 38], "mcl_beds_bed_top_bottom_pink.png": [232, 105, 135], "mcl_beds_bed_side_bottom_r_pink.png": [183, 95, 106], "respawn_anchor_side4.png": [110, 87, 85], "mcl_beds_bed_side_bottom_r_green.png": [73, 97, 42], "mcl_beds_bed_side_bottom_r_grey.png": [86, 77, 69], "mcl_beds_bed_side_top_r_white.png": [158, 145, 134], "mcl_beds_bed_side_bottom_orange.png": [143, 84, 28], "mcl_beds_bed_side_bottom_purple.png": [105, 36, 112], "mcl_beds_bed_side_bottom_r_light_blue.png": [90, 97, 136], "mcl_beds_bed_side_top_r_magenta.png": [140, 81, 103], "mcl_beds_bed_side_bottom_r_yellow.png": [150, 131, 25], "mcl_beds_bed_side_top_r_pink.png": [176, 111, 113], "mcl_beds_bed_top_top_blue.png": [105, 112, 137], "portal.png": [102, 61, 130], "mcl_beds_bed_side_bottom_green.png": [74, 94, 43], "mcl_beds_bed_side_bottom_r_blue.png": [61, 66, 95], "mcl_beds_bed_top_top_grey.png": [129, 121, 113], "mcl_beds_bed_black.png": [76, 68, 61], "mcl_beds_bed_top_top_silver.png": [159, 151, 143], "mcl_beds_bed_white.png": [173, 165, 158], "mcl_beds_bed_top_top_cyan.png": [105, 144, 135], "mcl_beds_bed_top_bottom_orange.png": [184, 91, 0], "mcl_beds_bed_side_top_silver.png": [98, 76, 59], "mcl_beds_bed_top_top_brown.png": [143, 118, 93], "mcl_beds_bed_side_top_r_light_blue.png": [115, 111, 132], "mcl_beds_bed_side_bottom_r_lime.png": [86, 129, 53], "mcl_beds_bed_red.png": [139, 58, 51], "mcl_beds_bed_top_bottom_lime.png": [79, 163, 47], "mcl_beds_bed_side_top_r_brown.png": [121, 97, 75], "respawn_anchor_top_off.png": [80, 61, 74], "mcl_beds_bed_side_bottom_r_silver.png": [119, 109, 102], "mcl_beds_bed_yellow.png": [154, 138, 41], "mcl_beds_bed_side_top_yellow.png": [98, 76, 59], "mcl_beds_bed_top_bottom_black.png": [37, 37, 37], "mcl_beds_bed_brown.png": [110, 85, 61], "mcl_beds_bed_side_top_orange.png": [98, 76, 59], "mcl_beds_bed_side_top_red.png": [98, 76, 59], "mcl_beds_bed_top_top_purple.png": [148, 79, 161], "mcl_beds_bed_side_bottom_pink.png": [177, 93, 102], "mcl_beds_bed_side_top_r_grey.png": [112, 99, 88], "respawn_anchor_side1.png": [95, 71, 76], "mcl_beds_bed_side_top_r_blue.png": [97, 91, 104], "mcl_beds_bed_side_top_purple.png": [98, 76, 59], "mcl_beds_bed_side_top_cyan.png": [98, 76, 59], "mcl_beds_bed_top_bottom_blue.png": [32, 60, 119], "mcl_beds_bed_side_bottom_yellow.png": [143, 125, 28], "mcl_beds_bed_side_top_black.png": [98, 76, 59], "mcl_beds_bed_top_top_orange.png": [188, 130, 72], "mcl_beds_bed_top_bottom_silver.png": [129, 129, 129], "mcl_beds_bed_top_top_green.png": [117, 140, 88], "mcl_beds_bed_cyan.png": [73, 111, 103], "mcl_beds_bed_top_bottom_red.png": [157, 20, 20], "mcl_beds_bed_top_bottom_purple.png": [111, 0, 163], "mcl_beds_bed_side_top_r_silver.png": [133, 120, 109], "mcl_beds_bed_side_bottom_grey.png": [86, 76, 67], "mcl_beds_bed_grey.png": [96, 88, 81], "mcl_beds_bed_side_top_r_yellow.png": [151, 132, 62], "respawn_anchor_side0.png": [81, 64, 73], "mcl_beds_bed_side_top_r_green.png": [103, 111, 72], "mcl_beds_bed_side_bottom_brown.png": [100, 73, 48], "mcl_beds_bed_magenta.png": [138, 60, 104], "mcl_beds_bed_side_bottom_r_red.png": [134, 44, 37], "mcl_beds_bed_side_bottom_r_brown.png": [101, 73, 47], "mcl_beds_bed_side_top_lime.png": [98, 76, 59], "mcl_beds_bed_side_top_light_blue.png": [98, 76, 59], "mcl_beds_bed_side_bottom_red.png": [129, 47, 38], "mcl_beds_bed_bottom_top.png": [48, 38, 29], "mcl_beds_bed_top_bottom_grey.png": [76, 76, 76], "mcl_beds_bed_side_bottom_r_orange.png": [150, 86, 25], "mcl_beds_bed_side_bottom_r_black.png": [64, 54, 47], "mcl_beds_bed_top_bottom_cyan.png": [32, 119, 114], "mcl_beds_bed_side_bottom_silver.png": [116, 106, 97], "mcl_beds_bed_side_top_magenta.png": [98, 76, 59], "mcl_beds_bed_top_bottom_white.png": [201, 201, 201], "mcl_beds_bed_side_top_r_orange.png": [151, 105, 62], "mcl_beds_bed_top_bottom_magenta.png": [154, 23, 118], "mcl_beds_bed_side_top_r_lime.png": [110, 131, 80], "mcl_beds_bed_top_top_magenta.png": [172, 92, 137], "mcl_beds_bed_bottom_bottom.png": [48, 38, 29], "mcl_beds_bed_side_top_r_purple.png": [125, 73, 119], "mcl_beds_bed_side_top_r_cyan.png": [97, 113, 103], "mcl_beds_bed_side_top_white.png": [98, 76, 59], "mcl_beds_bed_side_bottom_r_cyan.png": [61, 101, 93], "mcl_beds_bed_side_bottom_cyan.png": [63, 97, 89], "mcl_beds_bed_side_bottom_white.png": [161, 151, 142], "mcl_beds_bed_top_bottom_yellow.png": [184, 169, 0], "respawn_anchor_side3.png": [104, 80, 79], "mcl_beds_bed_top_bottom_light_blue.png": [82, 113, 182], "mcl_beds_bed_top_top_lime.png": [130, 169, 98], "mcl_beds_bed_silver.png": [109, 100, 93], "mcl_beds_bed_purple.png": [115, 47, 128], "mcl_beds_bed_side_top_r_red.png": [141, 80, 69], "mcl_beds_bed_top_top_light_blue.png": [132, 141, 174], "mcl_beds_bed_side_bottom_r_purple.png": [107, 32, 120], "mcl_beds_bed_side_bottom_r_white.png": [161, 151, 144], "mcl_beds_bed_orange.png": [154, 96, 41], "mcl_beds_bed_top_bottom_gray.png": [57, 57, 57], "mcl_beds_bed_side_bottom_lime.png": [85, 122, 53], "mcl_beds_bed_green.png": [85, 107, 56], "mcl_beds_bed_top_top_yellow.png": [188, 172, 72], "mcl_beds_bed_side_top_pink.png": [98, 76, 59], "mcl_sponges_sponge_wet_river_water.png": [157, 141, 104], "mcl_sponges_sponge.png": [210, 177, 118], "mcl_sponges_sponge_wet.png": [156, 134, 92], "mcl_copper_exposed_cut.png": [129, 92, 82], "mcl_copper_raw.png": [133, 68, 50], "mcl_copper_block_cut.png": [148, 77, 57], "mcl_copper_oxidized_cut.png": [91, 110, 110], "mcl_copper_block.png": [147, 77, 56], "mcl_copper_oxidized.png": [90, 108, 110], "mcl_copper_block_raw.png": [168, 90, 68], "mcl_copper_ingot.png": [157, 82, 61], "mcl_copper_weathered.png": [103, 102, 100], "mcl_copper_weathered_cut.png": [107, 103, 100], "mcl_copper_anti_oxidation_particle.png": [251, 250, 247], "mcl_copper_ore.png": [127, 66, 48], "mcl_copper_exposed.png": [128, 92, 83], "farming_mushroom_red.png": [169, 59, 58], "mcl_mushrooms_mushroom_block_inside.png": [218, 175, 136], "mcl_mushrooms_mushroom_block_skin_brown.png": [131, 86, 68], "mcl_mushrooms_mushroom_block_skin_stem.png": [204, 183, 149], "mcl_mushrooms_mushroom_block_skin_red.png": [137, 39, 25], "farming_mushroom_brown.png": [121, 81, 59], "farming_mushroom_stew.png": [134, 97, 67], "mcl_bells_bell_top.png": [207, 203, 82], "mcl_bells_bell_side.png": [214, 204, 84], "mcl_bells_bell.png": [188, 143, 54], "mcl_bells_bell_bottom.png": [117, 114, 39], "default_tool_goldsword.png": [194, 154, 70], "default_tool_steelsword.png": [134, 130, 125], "default_tool_woodsword.png": [100, 82, 68], "default_tool_goldshovel.png": [167, 133, 64], "default_tool_steelpick.png": [137, 128, 119], "default_tool_woodshovel.png": [108, 90, 76], "default_tool_goldpick.png": [172, 139, 73], "default_tool_woodaxe.png": [110, 92, 77], "default_tool_diamondsword.png": [105, 133, 149], "default_tool_steelshovel.png": [125, 115, 107], "default_tool_stonesword.png": [133, 125, 118], "default_tool_woodpick.png": [110, 91, 76], "default_tool_shears.png": [139, 132, 124], "default_tool_goldaxe.png": [160, 128, 66], "default_tool_stoneshovel.png": [126, 116, 107], "default_tool_diamondaxe.png": [103, 110, 113], "default_tool_diamondshovel.png": [106, 125, 134], "default_tool_steelaxe.png": [129, 119, 110], "default_tool_stoneaxe.png": [126, 115, 104], "default_tool_diamondpick.png": [92, 105, 111], "default_tool_stonepick.png": [126, 114, 104], "mcl_chests_ender_chest_right.png": [73, 67, 64], "mcl_chests_chest_trapped_right.png": [98, 78, 62], "default_chest_front.png": [85, 70, 58], "mcl_chests_blue_shulker_box_top.png": [67, 85, 119], "mcl_chests_chest_left.png": [99, 78, 63], "mcl_chests_dark_green_shulker_box_top.png": [67, 111, 70], "mcl_chests_chest_back.png": [92, 75, 61], "mcl_chests_ender_chest_bottom.png": [61, 55, 55], "mcl_chests_ender.png": [70, 62, 58], "mcl_chests_brown_shulker_box_top.png": [73, 63, 55], "mcl_chests_chest_trapped_back.png": [92, 75, 61], "mcl_chests_chest_trapped_side_big.png": [96, 77, 62], "mcl_chests_magenta_shulker_box_top.png": [128, 81, 124], "mcl_chests_noise.png": [192, 186, 189], "mcl_chests_ender_chest_back.png": [72, 66, 64], "mcl_chests_chest_trapped_bottom.png": [118, 91, 70], "mcl_chests_chest_trapped_front.png": [86, 68, 57], "default_chest_side_big.png": [96, 77, 62], "mcl_chests_green_shulker_box_top.png": [88, 122, 75], "mcl_chests_noise_double.png": [191, 189, 189], "mcl_chests_pink_shulker_box_top.png": [163, 116, 158], "mcl_chests_trapped.png": [95, 76, 61], "mcl_chests_blank.png": [255, 255, 255], "mcl_chests_normal_double.png": [98, 78, 62], "mcl_chests_chest_trapped_top.png": [88, 73, 61], "mcl_chests_normal.png": [95, 76, 61], "default_chest_front_big.png": [93, 75, 61], "mcl_chests_ender_chest_front.png": [76, 69, 65], "mcl_chests_white_shulker_box_top.png": [176, 178, 187], "mcl_chests_cyan_shulker_box_top.png": [67, 101, 121], "mcl_chests_ender_present.png": [123, 76, 93], "mcl_chests_chest_trapped_top_big.png": [100, 80, 65], "default_chest_top_big.png": [100, 80, 65], "mcl_chests_grey_shulker_box_top.png": [126, 129, 138], "mcl_chests_normal_present.png": [181, 46, 19], "mcl_chests_red_shulker_box_top.png": [132, 58, 57], "mcl_chests_trapped_double.png": [98, 78, 62], "mcl_chests_violet_shulker_box_top.png": [120, 71, 88], "mcl_chests_chest_trapped_front_big.png": [94, 75, 61], "mcl_chests_lightblue_shulker_box_top.png": [96, 130, 155], "mcl_chests_dark_grey_shulker_box_top.png": [87, 90, 99], "mcl_chests_black_shulker_box_top.png": [56, 57, 62], "mcl_chests_chest_right.png": [98, 78, 62], "mcl_chests_yellow_shulker_box_top.png": [165, 116, 53], "mcl_chests_trapped_present.png": [73, 100, 151], "mcl_chests_chest_bottom.png": [118, 91, 70], "default_chest_top.png": [88, 73, 61], "mcl_chests_trapped_double_present.png": [143, 77, 22], "mcl_chests_normal_double_present.png": [72, 90, 12], "mcl_chests_ender_chest_top.png": [70, 64, 61], "mcl_chests_ender_chest_left.png": [73, 67, 64], "mcl_chests_chest_trapped_left.png": [99, 78, 63], "mcl_chests_orange_shulker_box_top.png": [143, 74, 51], "screwdriver.png": [132, 119, 108], "_un.png": [0, 0, 0], "_at.png": [0, 0, 0], "_s_.png": [0, 0, 0], "_sz.png": [0, 0, 0], "_q.png": [0, 0, 0], "_1.png": [0, 0, 0], "_h_.png": [0, 0, 0], "_o_tilde.png": [0, 0, 0], "_q_.png": [0, 0, 0], "_ae.png": [0, 0, 0], "_e_circumflex_.png": [0, 0, 0], "_ex.png": [0, 0, 0], "_e_.png": [0, 0, 0], "_qo.png": [0, 0, 0], "_z_.png": [0, 0, 0], "_ps.png": [0, 0, 0], "_pound.png": [0, 0, 0], "_div.png": [0, 0, 0], "_l_.png": [0, 0, 0], "_pilcrow.png": [0, 0, 0], "_3_sup.png": [0, 0, 0], "_e_acute.png": [0, 0, 0], "_9.png": [0, 0, 0], "_e_grave_.png": [0, 0, 0], "_u_acute.png": [0, 0, 0], "_a_sup.png": [0, 0, 0], "_sr.png": [0, 0, 0], "_v.png": [0, 0, 0], "_ue_.png": [0, 0, 0], "_t_.png": [0, 0, 0], "_cl.png": [0, 0, 0], "_n_tilde_.png": [0, 0, 0], "_p_.png": [0, 0, 0], "_c.png": [0, 0, 0], "_a.png": [0, 0, 0], "_a_circumflex_.png": [0, 0, 0], "_8.png": [0, 0, 0], "_s.png": [0, 0, 0], "_o_.png": [0, 0, 0], "_1_4.png": [0, 0, 0], "_e_grave.png": [0, 0, 0], "_o_dash.png": [0, 0, 0], "_5.png": [0, 0, 0], "_d_dash_.png": [0, 0, 0], "_i_grave.png": [0, 0, 0], "_vb.png": [0, 0, 0], "_sp.png": [255, 255, 255], "_a_acute_.png": [0, 0, 0], "_as.png": [0, 0, 0], "_y_acute.png": [0, 0, 0], "_3_4.png": [0, 0, 0], "_6.png": [0, 0, 0], "_7.png": [0, 0, 0], "_tl.png": [0, 0, 0], "_t.png": [0, 0, 0], "_y.png": [0, 0, 0], "_ca.png": [0, 0, 0], "_e.png": [0, 0, 0], "_hs.png": [0, 0, 0], "_copyright.png": [0, 0, 0], "_l.png": [0, 0, 0], "_h.png": [0, 0, 0], "_u_circumflex_.png": [0, 0, 0], "_i_acute_.png": [0, 0, 0], "_ha.png": [0, 0, 0], "_y_diaresis.png": [0, 0, 0], "_gt.png": [0, 0, 0], "_b.png": [0, 0, 0], "_degree.png": [0, 0, 0], "_a_tilde_.png": [0, 0, 0], "_u_.png": [0, 0, 0], "_o_sup.png": [0, 0, 0], "_m_.png": [0, 0, 0], "_c_.png": [0, 0, 0], "_cr.png": [0, 0, 0], "_3.png": [0, 0, 0], "_currency.png": [0, 0, 0], "_f.png": [0, 0, 0], "_cedille.png": [0, 0, 0], "_u_grave_.png": [0, 0, 0], "_dt.png": [0, 0, 0], "_am.png": [0, 0, 0], "_c_cedille_.png": [0, 0, 0], "_u_acute_.png": [0, 0, 0], "_bl.png": [0, 0, 0], "_registered.png": [0, 0, 0], "_i_acute.png": [0, 0, 0], "_lt.png": [0, 0, 0], "_e_acute_.png": [0, 0, 0], "_paragraph.png": [0, 0, 0], "_i_grave_.png": [0, 0, 0], "_o.png": [0, 0, 0], "_1_sup.png": [0, 0, 0], "mcl_signs_sign.png": [114, 89, 69], "_yen.png": [0, 0, 0], "_b_.png": [0, 0, 0], "_macron.png": [0, 0, 0], "_qu_inv.png": [0, 0, 0], "_o_dash_.png": [0, 0, 0], "_guill_right.png": [0, 0, 0], "_p.png": [0, 0, 0], "_thorn_.png": [0, 0, 0], "_2_sup.png": [0, 0, 0], "_pr.png": [0, 0, 0], "default_sign.png": [145, 115, 88], "_times_dot.png": [0, 0, 0], "_acute.png": [0, 0, 0], "_g_.png": [0, 0, 0], "_o_acute_.png": [0, 0, 0], "_a_tilde.png": [0, 0, 0], "_j.png": [0, 0, 0], "_k.png": [0, 0, 0], "_co.png": [0, 0, 0], "_dv.png": [0, 0, 0], "_o_circumflex.png": [0, 0, 0], "_a_ring.png": [0, 0, 0], "_br.png": [0, 0, 0], "_d.png": [0, 0, 0], "_ap.png": [0, 0, 0], "_sl.png": [0, 0, 0], "_mn.png": [0, 0, 0], "_m.png": [0, 0, 0], "_ae_lig.png": [0, 0, 0], "_thorn.png": [0, 0, 0], "_2.png": [0, 0, 0], "_gr.png": [0, 0, 0], "_i.png": [0, 0, 0], "_y_acute_.png": [0, 0, 0], "_diaresis.png": [0, 0, 0], "_oe.png": [0, 0, 0], "_mu.png": [0, 0, 0], "_guill_left.png": [0, 0, 0], "_times_cross.png": [0, 0, 0], "_ae_.png": [0, 0, 0], "_w.png": [0, 0, 0], "_u.png": [0, 0, 0], "_broken_bar.png": [0, 0, 0], "_4.png": [0, 0, 0], "_plus_minus.png": [0, 0, 0], "_1_2.png": [0, 0, 0], "_u_circumflex.png": [0, 0, 0], "_w_.png": [0, 0, 0], "_x_.png": [0, 0, 0], "_e_circumflex.png": [0, 0, 0], "_g.png": [0, 0, 0], "_o_tilde_.png": [0, 0, 0], "_ae_lig_.png": [0, 0, 0], "_v_.png": [0, 0, 0], "_dl.png": [0, 0, 0], "_a_grave.png": [0, 0, 0], "_re.png": [0, 0, 0], "_a_acute.png": [0, 0, 0], "_qu.png": [0, 0, 0], "_oe_.png": [0, 0, 0], "_n_tilde.png": [0, 0, 0], "_eq.png": [0, 0, 0], "_d_.png": [0, 0, 0], "_sm.png": [0, 0, 0], "_y_.png": [0, 0, 0], "_not.png": [0, 0, 0], "_n.png": [0, 0, 0], "_j_.png": [0, 0, 0], "_k_.png": [0, 0, 0], "_0.png": [0, 0, 0], "_o_grave_.png": [0, 0, 0], "_r_.png": [0, 0, 0], "_r.png": [0, 0, 0], "_u_grave.png": [0, 0, 0], "_ee_.png": [0, 0, 0], "_c_cedille.png": [0, 0, 0], "_ex_inv.png": [0, 0, 0], "_cm.png": [0, 0, 0], "_o_grave.png": [0, 0, 0], "_x.png": [0, 0, 0], "_i_.png": [0, 0, 0], "_n_.png": [0, 0, 0], "_rc.png": [0, 0, 0], "_a_.png": [0, 0, 0], "_a_grave_.png": [0, 0, 0], "_ee.png": [0, 0, 0], "_o_acute.png": [0, 0, 0], "_a_ring_.png": [0, 0, 0], "_i_circumflex_.png": [0, 0, 0], "_cent.png": [0, 0, 0], "_d_dash.png": [0, 0, 0], "_f_.png": [0, 0, 0], "_o_circumflex_.png": [0, 0, 0], "_ue.png": [0, 0, 0], "_a_circumflex.png": [0, 0, 0], "_i_circumflex.png": [0, 0, 0], "_z.png": [0, 0, 0], "gui_furnace_arrow_fg.png": [239, 239, 239], "default_furnace_front.png": [105, 95, 91], "default_furnace_fire_bg.png": [139, 139, 139], "default_furnace_top.png": [148, 138, 133], "default_furnace_fire_fg.png": [179, 115, 70], "default_furnace_side.png": [117, 107, 102], "gui_furnace_arrow_bg.png": [139, 139, 139], "default_furnace_front_active.png": [119, 95, 85], "default_furnace_bottom.png": [148, 138, 133], "default_torch_on_floor.png": [115, 82, 59], "default_torch_on_floor_animated.png": [116, 84, 61], "default_tnt_bottom.png": [161, 54, 58], "mcl_tnt_blink.png": [255, 255, 255], "default_tnt_top.png": [125, 54, 57], "default_tnt_side.png": [178, 105, 98], "mcl_heads_skeleton.png": [125, 125, 125], "mcl_heads_skeleton_node.png": [124, 124, 124], "mcl_heads_creeper_node.png": [98, 107, 71], "mcl_heads_zombie.png": [66, 104, 69], "mcl_heads_creeper.png": [92, 110, 68], "mcl_heads_steve_node.png": [115, 70, 58], "mcl_heads_zombie_node.png": [78, 110, 105], "mcl_heads_steve.png": [108, 76, 59], "mcl_heads_wither_skeleton_node.png": [50, 50, 50], "mcl_heads_wither_skeleton.png": [50, 50, 50], "mcl_flowerpots_cactus.png": [109, 83, 52], "mcl_flowerpots_flowerpot_inventory.png": [121, 54, 45], "mcl_flowerpots_flowerpot.png": [120, 55, 47], "bucket_lava.png": [166, 127, 113], "bucket_river_water.png": [139, 152, 155], "bucket_water.png": [139, 147, 155], "bucket.png": [147, 143, 139], "mcl_totems_totem.png": [185, 139, 52], "mcl_anvils_anvil_top_damaged_1.png": [50, 50, 50], "mcl_anvils_anvil_top_damaged_2.png": [48, 48, 48], "mcl_anvils_anvil_top_damaged_0.png": [52, 52, 52], "mcl_anvils_anvil_side.png": [45, 45, 45], "mcl_anvils_inventory.png": [157, 157, 157], "mcl_anvils_anvil_base.png": [40, 40, 40], "mcl_maps_player_arrow.png": [95, 95, 95], "mcl_maps_map_filled.png": [213, 176, 148], "mcl_maps_player_dot.png": [105, 105, 105], "mcl_maps_map_empty.png": [217, 187, 157], "mcl_maps_map_filled_markings.png": [183, 183, 183], "mcl_maps_map_background.png": [224, 196, 166], "mcl_dispensers_dispenser_front_vertical.png": [115, 104, 99], "mcl_dispensers_dispenser_front_horizontal.png": [105, 96, 92], "jeija_wall_lever.png": [95, 80, 69], "mesecons_delayer_front_locked_off.png": [97, 85, 77], "mesecons_delayer_locked_on.png": [114, 100, 95], "mesecons_delayer_sides_locked_off.png": [95, 80, 73], "mesecons_delayer_sides_on.png": [106, 71, 63], "mesecons_delayer_item.png": [100, 87, 82], "mesecons_delayer_end_locked_off.png": [97, 85, 77], "mesecons_delayer_end_locked_on.png": [101, 85, 78], "mesecons_delayer_ends_off.png": [99, 86, 80], "mesecons_delayer_front_locked_on.png": [101, 85, 77], "mesecons_delayer_ends_on.png": [105, 87, 81], "mesecons_delayer_sides_locked_on.png": [104, 81, 74], "mesecons_delayer_locked_off.png": [110, 99, 95], "mesecons_delayer_sides_off.png": [90, 69, 61], "mesecons_delayer_off.png": [112, 100, 96], "mesecons_delayer_on.png": [116, 101, 97], "redstone_redstone_dust_line0.png": [168, 168, 168], "redstone_redstone_dust.png": [81, 0, 0], "redstone_redstone_dust_dot.png": [168, 168, 168], "redstone_redstone_dust_line1.png": [173, 173, 173], "jeija_commandblock_off.png": [110, 99, 96], "jeija_commandblock_on.png": [110, 99, 96], "redstone_redstone_block.png": [128, 8, 9], "jeija_torches_on.png": [102, 68, 56], "jeija_torches_off.png": [90, 66, 54], "mesecons_button_wield_mask.png": [255, 126, 126], "mcl_droppers_dropper_front_vertical.png": [118, 108, 103], "mcl_droppers_dropper_front_horizontal.png": [110, 101, 96], "mesecons_noteblock.png": [104, 81, 63], "jeija_solar_panel_inverted.png": [100, 107, 117], "jeija_solar_panel.png": [124, 113, 101], "jeija_solar_panel_side.png": [60, 47, 36], "mcl_observers_observer_top.png": [139, 128, 123], "mcl_observers_observer_front.png": [95, 80, 84], "mcl_observers_observer_back_lit.png": [75, 67, 65], "mcl_observers_observer_back.png": [72, 67, 64], "mcl_observers_observer_side.png": [111, 103, 99], "mesecons_piston_pusher_front_sticky.png": [97, 81, 63], "mesecons_piston_pusher_top.png": [106, 83, 65], "mesecons_piston_back.png": [110, 101, 98], "mesecons_piston_on_front.png": [111, 101, 98], "mesecons_piston_pusher_back.png": [106, 83, 65], "mesecons_piston_bottom.png": [120, 107, 100], "mesecons_piston_pusher_right.png": [106, 83, 65], "mesecons_piston_pusher_bottom.png": [106, 83, 65], "mesecons_piston_pusher_front.png": [106, 83, 65], "mesecons_piston_pusher_left.png": [106, 83, 65], "jeija_lightstone_gray_on.png": [97, 56, 37], "jeija_lightstone_gray_off.png": [64, 49, 43], "mcl_target_target_side.png": [177, 117, 94], "mcl_target_target_top.png": [177, 117, 94], "mcl_comparators_sides_on.png": [105, 87, 81], "mcl_comparators_comp.png": [61, 20, 20], "mcl_comparators_on.png": [116, 102, 98], "mcl_comparators_sides_comp.png": [99, 88, 83], "mcl_comparators_off.png": [113, 102, 98], "mcl_comparators_ends_comp.png": [99, 88, 83], "mcl_comparators_ends_sub.png": [105, 88, 83], "mcl_comparators_ends_off.png": [96, 80, 74], "mcl_comparators_ends_on.png": [105, 81, 75], "mcl_comparators_sub.png": [112, 25, 25], "mcl_comparators_item.png": [98, 83, 79], "mcl_comparators_sides_off.png": [99, 86, 80], "mcl_comparators_sides_sub.png": [105, 88, 83], "default_book.png": [103, 67, 44], "default_bookshelf.png": [84, 67, 54], "mcl_books_book_written.png": [110, 74, 44], "mcl_books_book_bg.png": [203, 180, 151], "mcl_books_button9_pressed.png": [145, 112, 86], "mcl_books_button9.png": [145, 112, 86], "mcl_books_book_writable.png": [151, 122, 108], "mcl_books_bookshelf_top.png": [109, 84, 65], "wool_dark_grey.png": [96, 87, 87], "wool_grey.png": [143, 134, 134], "wool_magenta.png": [140, 85, 125], "wool_black.png": [45, 42, 42], "wool_orange.png": [188, 106, 45], "wool_blue.png": [43, 73, 125], "wool_yellow.png": [201, 163, 69], "wool_pink.png": [171, 91, 108], "wool_dark_green.png": [53, 91, 51], "wool_brown.png": [86, 57, 43], "wool_red.png": [132, 42, 45], "mcl_wool_light_blue.png": [91, 130, 180], "wool_cyan.png": [30, 94, 113], "mcl_wool_lime.png": [107, 151, 76], "wool_white.png": [212, 199, 182], "wool_violet.png": [77, 57, 102], "mcl_potions_melon_speckled.png": [170, 97, 62], "mcl_potions_effect_swift.png": [106, 96, 85], "mcl_potions_spider_eye_fermented.png": [143, 97, 62], "mcl_potions_splash_bottle.png": [168, 156, 183], "mcl_potions_effect_water_breathing.png": [59, 69, 100], "mcl_potions_effect_leaping.png": [100, 91, 86], "mcl_potions_effect_weak.png": [127, 126, 126], "mcl_potions_dragon_breath.png": [171, 137, 163], "mcl_potions_effect_food_poisoning.png": [112, 123, 89], "hudbars_icon_regenerate.png": [195, 77, 114], "mcl_potions_effect_fire_proof.png": [112, 68, 68], "mcl_potions_splash_overlay.png": [202, 202, 202], "mcl_potions_effect_invisible.png": [96, 103, 95], "hbhunger_icon_regen_poison.png": [147, 111, 115], "mcl_potions_effect_slow.png": [78, 81, 85], "mcl_potions_lingering_bottle.png": [181, 159, 192], "mcl_potions_potion_overlay.png": [201, 201, 201], "mcl_potions_effect_regenerating.png": [133, 90, 83], "mcl_potions_arrow_inv.png": [171, 165, 160], "mcl_potions_effect_night_vision.png": [86, 99, 74], "mcl_potions_potion_bottle.png": [156, 172, 203], "mcl_potions_effect_poisoned.png": [78, 110, 80], "mcl_potions_effect_strong.png": [100, 82, 97], "crafting_workbench_front.png": [120, 93, 72], "gui_crafting_arrow.png": [139, 139, 139], "crafting_workbench_side.png": [120, 93, 72], "crafting_workbench_top.png": [152, 121, 93], "mcl_amethyst_amethyst_bud_small.png": [176, 131, 203], "mcl_amethyst_amethyst_block.png": [139, 84, 172], "mcl_amethyst_amethyst_cluster.png": [161, 111, 190], "mcl_amethyst_calcite_block.png": [189, 193, 207], "mcl_amethyst_amethyst_shard.png": [163, 113, 192], "mcl_amethyst_amethyst_bud_medium.png": [184, 140, 209], "mcl_amethyst_amethyst_bud_large.png": [173, 127, 201], "mcl_amethyst_tinted_glass.png": [125, 67, 160], "mcl_amethyst_amethyst_cluster_block.png": [180, 136, 206], "mcl_amethyst_budding_amethyst.png": [134, 77, 167], "mcl_enchanting_glyph_11.png": [209, 209, 231], "mcl_enchanting_glyph_14.png": [209, 209, 231], "mcl_enchanting_glyph_6.png": [209, 209, 231], "mcl_enchanting_glyph_8.png": [209, 209, 231], "mcl_enchanting_glyph_9.png": [209, 209, 231], "mcl_enchanting_glyph_3.png": [209, 209, 231], "mcl_enchanting_number_1_off.png": [255, 255, 255], "mcl_enchanting_number_3_off.png": [255, 255, 255], "mcl_enchanting_number_3.png": [151, 47, 40], "mcl_enchanting_book_open.png": [153, 123, 99], "mcl_enchanting_button_off.png": [255, 255, 255], "mcl_enchanting_glyph_2.png": [209, 209, 231], "mcl_enchanting_glyph_1.png": [209, 209, 231], "mcl_enchanting_button.png": [255, 255, 255], "mcl_enchanting_table_side.png": [66, 58, 55], "mcl_enchanting_book_closed.png": [112, 78, 55], "mcl_enchanting_table_bottom.png": [58, 51, 52], "mcl_enchanting_glyph_15.png": [209, 209, 231], "mcl_enchanting_number_2_off.png": [255, 255, 255], "mcl_enchanting_glyph_5.png": [209, 209, 231], "mcl_enchanting_number_1.png": [149, 45, 39], "mcl_enchanting_glyph_7.png": [209, 209, 231], "mcl_enchanting_table_top.png": [88, 86, 84], "mcl_enchanting_number_2.png": [149, 46, 39], "mcl_enchanting_glyph_16.png": [209, 209, 231], "mcl_enchanting_button_hovered.png": [255, 255, 255], "mcl_enchanting_book_enchanted.png": [122, 69, 46], "mcl_enchanting_glyph_4.png": [209, 209, 231], "mcl_enchanting_glyph_10.png": [209, 209, 231], "mcl_enchanting_glyph_13.png": [209, 209, 231], "mcl_enchanting_glyph_17.png": [209, 209, 231], "mcl_enchanting_glyph_18.png": [209, 209, 231], "mcl_enchanting_lapis_background.png": [255, 255, 255], "mcl_enchanting_button_background.png": [229, 202, 171], "mcl_enchanting_glyph_12.png": [209, 209, 231], "doc_basics_gameplay_mtg_2.png": [151, 168, 207], "doc_basics_liquids_renewable_1.png": [139, 146, 159], "doc_basics_players_sam.png": [95, 133, 106], "doc_basics_players_flat.png": [127, 155, 130], "doc_basics_craft_shapeless_2.png": [52, 52, 48], "doc_basics_build.png": [84, 84, 55], "doc_basics_pointing.png": [66, 104, 32], "doc_basics_nodes.png": [108, 104, 94], "doc_basics_craft_groups_2.png": [65, 58, 52], "doc_basics_craft_groups_1.png": [57, 57, 58], "doc_basics_inventory.png": [47, 47, 45], "doc_basics_minimap_radar.png": [73, 164, 128], "doc_basics_sneak.png": [70, 69, 69], "doc_basics_camera_behind.png": [108, 144, 135], "doc_basics_craft_repair.png": [47, 46, 45], "doc_basics_hotbar_relations.png": [85, 84, 69], "doc_basics_gameplay_lott.png": [119, 122, 112], "doc_basics_tools_mining.png": [64, 62, 59], "doc_basics_players_lott.png": [180, 193, 224], "doc_basics_gameplay_outback.png": [146, 114, 109], "doc_basics_gameplay_pixture.png": [94, 120, 57], "doc_basics_craft_grid.png": [46, 46, 46], "doc_basics_craft_groups_3.png": [61, 58, 55], "doc_basics_camera_front.png": [99, 133, 110], "doc_basics_minimap_map.png": [149, 169, 183], "doc_basics_gameplay_mtg_1.png": [136, 117, 86], "doc_basics_gameplay_xtraores_xtension.png": [95, 15, 86], "doc_basics_light_torch.png": [25, 43, 14], "doc_basics_minimap_round.png": [160, 175, 189], "doc_basics_light_test.png": [133, 113, 69], "doc_basics_liquids_nonrenewable.png": [64, 87, 87], "doc_basics_gameplay_hades.png": [81, 70, 62], "doc_basics_gameplay_moontest.png": [75, 74, 79], "doc_basics_liquids_range.png": [146, 166, 179], "doc_basics_inventory_detail.png": [43, 41, 39], "doc_basics_camera_ego.png": [111, 147, 139], "doc_basics_tools.png": [46, 45, 42], "doc_basics_liquids_renewable_2.png": [136, 148, 166], "doc_basics_items_dropped.png": [195, 185, 147], "doc_basics_liquids_types.png": [146, 164, 171], "doc_basics_gameplay_carbone_ng.png": [121, 118, 89], "doc_basics_craft_shaped.png": [55, 52, 50], "doc_basics_hotbar.png": [141, 175, 226], "doc_basics_craft_shapeless_1.png": [52, 52, 48], "doc_button_icon_lores.png": [19, 143, 183], "doc_awards_icon_generic.png": [14, 125, 162], "inventory_plus_doc_inventory_plus.png": [19, 143, 183], "doc_button_icon_hires.png": [30, 149, 188], "doc_identifier_identifier.png": [172, 151, 139], "doc_identifier_identifier_liquid.png": [125, 147, 190], "craftguide_furnace.png": [119, 95, 85], "craftguide_clear_icon.png": [254, 254, 254], "craftguide_book.png": [84, 117, 39], "mcl_craftguide_fuel.png": [187, 121, 75], "craftguide_prev_icon.png": [255, 255, 255], "craftguide_zoomout_icon.png": [255, 255, 255], "craftguide_search_icon.png": [254, 254, 254], "craftguide_arrow.png": [139, 139, 139], "craftguide_zoomin_icon.png": [255, 255, 255], "craftguide_shapeless.png": [130, 130, 130], "craftguide_next_icon.png": [255, 255, 255]} \ No newline at end of file diff --git a/mods/ITEMS/mcl_maps/init.lua b/mods/ITEMS/mcl_maps/init.lua index 0c88fc1d6..21ab28e52 100644 --- a/mods/ITEMS/mcl_maps/init.lua +++ b/mods/ITEMS/mcl_maps/init.lua @@ -147,10 +147,15 @@ function mcl_maps.create_map(pos) return itemstack end +<<<<<<< HEAD --local loading_maps = {} function mcl_maps.load_map(id, callback) if id == "" or creating_maps[id] then--or loading_maps[id] then +======= +function mcl_maps.load_map(id, callback) + if id == "" or creating_maps[id] then +>>>>>>> mcl2/master return end @@ -158,6 +163,7 @@ function mcl_maps.load_map(id, callback) local texture = "mcl_maps_map_texture_" .. id .. ".tga" if not loaded_maps[id] then +<<<<<<< HEAD --loading_maps[id] = true if not minetest.features.dynamic_add_media_table then -- minetest.dynamic_add_media() blocks in @@ -181,6 +187,28 @@ function mcl_maps.load_map(id, callback) if callback then callback(texture) end return texture end +======= + if not minetest.features.dynamic_add_media_table then + -- minetest.dynamic_add_media() blocks in + -- Minetest 5.3 and 5.4 until media loads + loaded_maps[id] = true + dynamic_add_media(map_textures_path .. texture, function() end) + if callback then callback(texture) end + else + -- minetest.dynamic_add_media() never blocks + -- in Minetest 5.5, callback runs after load + dynamic_add_media(map_textures_path .. texture, function() + loaded_maps[id] = true + if callback then callback(texture) end + end) + end + end + + if loaded_maps[id] then + if callback then callback(texture) end + return texture + end +>>>>>>> mcl2/master end function mcl_maps.load_map_item(itemstack) diff --git a/mods/ITEMS/mcl_maps/locale/mcl_maps.zh_TW.tr b/mods/ITEMS/mcl_maps/locale/mcl_maps.zh_TW.tr new file mode 100644 index 000000000..62206306c --- /dev/null +++ b/mods/ITEMS/mcl_maps/locale/mcl_maps.zh_TW.tr @@ -0,0 +1,10 @@ +# textdomain: mcl_maps +Empty Map=空地圖 +Empty maps are not useful as maps, but they can be stacked and turned to maps which can be used.=空的地圖作為地圖是沒有用的,但它們可以被疊加,並變成可以使用的地圖。 +Rightclick to start using the map (which can't be stacked anymore).=右鍵單擊以開始使用地圖(該地圖無法再堆疊)。 +Map=地圖 +Maps show your surroundings as you explore the world.=當您探索世界時,地圖會顯示您的周圍環境。 +Hold the map in any of the hotbar slots. This allows you to access the minimap by pressing the minimap key (see controls settings).=在任何一個熱鍵槽中放置地圖。這允許你通過按小地圖鍵來訪問小地圖(見控制設置)。 +In Creative Mode, you don't need this item; the minimap is always available.=在創造模式下,您不需要此項目; 小地圖始終可用。 +Enables minimap=啓用小地圖 +Use the minimap key to show the map.=使用小地圖鍵來顯示小地圖。 diff --git a/mods/ITEMS/mcl_mobitems/init.lua b/mods/ITEMS/mcl_mobitems/init.lua index 736fe77bd..50536d3da 100644 --- a/mods/ITEMS/mcl_mobitems/init.lua +++ b/mods/ITEMS/mcl_mobitems/init.lua @@ -1,3 +1,4 @@ +<<<<<<< HEAD local S = minetest.get_translator(minetest.get_current_modname()) minetest.register_craftitem("mcl_mobitems:rotten_flesh", { @@ -445,3 +446,512 @@ minetest.register_on_item_eat(function (hp_change, replace_with_item, itemstack, end end ) +======= +local S = minetest.get_translator(minetest.get_current_modname()) + +minetest.register_craftitem("mcl_mobitems:rotten_flesh", { + description = S("Rotten Flesh"), + _tt_help = minetest.colorize(mcl_colors.YELLOW, S("80% chance of food poisoning")), + _doc_items_longdesc = S("Yuck! This piece of flesh clearly has seen better days. If you're really desperate, you can eat it to restore a few hunger points, but there's a 80% chance it causes food poisoning, which increases your hunger for a while."), + inventory_image = "mcl_mobitems_rotten_flesh.png", + wield_image = "mcl_mobitems_rotten_flesh.png", + on_place = minetest.item_eat(4), + on_secondary_use = minetest.item_eat(4), + groups = { food = 2, eatable = 4 }, + _mcl_saturation = 0.8, + stack_max = 64, +}) + +minetest.register_craftitem("mcl_mobitems:mutton", { + description = S("Raw Mutton"), + _doc_items_longdesc = S("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", + wield_image = "mcl_mobitems_mutton_raw.png", + on_place = minetest.item_eat(2), + on_secondary_use = minetest.item_eat(2), + groups = { food = 2, eatable = 2, smoker_cookable = 1 }, + _mcl_saturation = 1.2, + stack_max = 64, +}) + +minetest.register_craftitem("mcl_mobitems:cooked_mutton", { + description = S("Cooked Mutton"), + _doc_items_longdesc = S("Cooked mutton is the cooked flesh from a sheep and is used as food."), + inventory_image = "mcl_mobitems_mutton_cooked.png", + wield_image = "mcl_mobitems_mutton_cooked.png", + on_place = minetest.item_eat(6), + on_secondary_use = minetest.item_eat(6), + groups = { food = 2, eatable = 6 }, + _mcl_saturation = 9.6, + stack_max = 64, +}) + +minetest.register_craftitem("mcl_mobitems:beef", { + description = S("Raw Beef"), + _doc_items_longdesc = S("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", + wield_image = "mcl_mobitems_beef_raw.png", + on_place = minetest.item_eat(3), + on_secondary_use = minetest.item_eat(3), + groups = { food = 2, eatable = 3, smoker_cookable = 1 }, + _mcl_saturation = 1.8, + stack_max = 64, +}) + +minetest.register_craftitem("mcl_mobitems:cooked_beef", { + description = S("Steak"), + _doc_items_longdesc = S("Steak is cooked beef from cows and can be eaten."), + inventory_image = "mcl_mobitems_beef_cooked.png", + wield_image = "mcl_mobitems_beef_cooked.png", + on_place = minetest.item_eat(8), + on_secondary_use = minetest.item_eat(8), + groups = { food = 2, eatable = 8 }, + _mcl_saturation = 12.8, + stack_max = 64, +}) + +minetest.register_craftitem("mcl_mobitems:chicken", { + description = S("Raw Chicken"), + _tt_help = minetest.colorize(mcl_colors.YELLOW, S("30% chance of food poisoning")), + _doc_items_longdesc = S("Raw chicken is a food item which is not safe to consume. You can eat it to restore a few hunger points, but there's a 30% chance to suffer from food poisoning, which increases your hunger rate for a while. Cooking raw chicken will make it safe to eat and increases its nutritional value."), + inventory_image = "mcl_mobitems_chicken_raw.png", + wield_image = "mcl_mobitems_chicken_raw.png", + on_place = minetest.item_eat(2), + on_secondary_use = minetest.item_eat(2), + groups = { food = 2, eatable = 2, smoker_cookable = 1 }, + _mcl_saturation = 1.2, + stack_max = 64, +}) + +minetest.register_craftitem("mcl_mobitems:cooked_chicken", { + description = S("Cooked Chicken"), + _doc_items_longdesc = S("A cooked chicken is a healthy food item which can be eaten."), + inventory_image = "mcl_mobitems_chicken_cooked.png", + wield_image = "mcl_mobitems_chicken_cooked.png", + on_place = minetest.item_eat(6), + on_secondary_use = minetest.item_eat(6), + groups = { food = 2, eatable = 6 }, + _mcl_saturation = 7.2, + stack_max = 64, +}) + +minetest.register_craftitem("mcl_mobitems:porkchop", { + description = S("Raw Porkchop"), + _doc_items_longdesc = S("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", + wield_image = "mcl_mobitems_porkchop_raw.png", + on_place = minetest.item_eat(3), + on_secondary_use = minetest.item_eat(3), + groups = { food = 2, eatable = 3, smoker_cookable = 1 }, + _mcl_saturation = 1.8, + stack_max = 64, +}) + +minetest.register_craftitem("mcl_mobitems:cooked_porkchop", { + description = S("Cooked Porkchop"), + _doc_items_longdesc = S("Cooked porkchop is the cooked flesh of a pig and is used as food."), + inventory_image = "mcl_mobitems_porkchop_cooked.png", + wield_image = "mcl_mobitems_porkchop_cooked.png", + on_place = minetest.item_eat(8), + on_secondary_use = minetest.item_eat(8), + groups = { food = 2, eatable = 8 }, + _mcl_saturation = 12.8, + stack_max = 64, +}) + +minetest.register_craftitem("mcl_mobitems:rabbit", { + description = S("Raw Rabbit"), + _doc_items_longdesc = S("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", + wield_image = "mcl_mobitems_rabbit_raw.png", + on_place = minetest.item_eat(3), + on_secondary_use = minetest.item_eat(3), + groups = { food = 2, eatable = 3, smoker_cookable = 1 }, + _mcl_saturation = 1.8, + stack_max = 64, +}) + +minetest.register_craftitem("mcl_mobitems:cooked_rabbit", { + description = S("Cooked Rabbit"), + _doc_items_longdesc = S("This is a food item which can be eaten."), + inventory_image = "mcl_mobitems_rabbit_cooked.png", + wield_image = "mcl_mobitems_rabbit_cooked.png", + on_place = minetest.item_eat(5), + on_secondary_use = minetest.item_eat(5), + groups = { food = 2, eatable = 5 }, + _mcl_saturation = 6.0, + stack_max = 64, +}) + +-- Reset food poisoning and status effects +local function drink_milk(itemstack, player, pointed_thing) + local bucket = minetest.do_item_eat(0, "mcl_buckets:bucket_empty", itemstack, player, pointed_thing) + -- Check if we were allowed to drink this (eat delay check) + if mcl_hunger.active and (bucket:get_name() ~= "mcl_mobitems:milk_bucket" or minetest.is_creative_enabled(player:get_player_name())) then + mcl_hunger.stop_poison(player) + end + mcl_potions._reset_player_effects(player) + return bucket +end + +minetest.register_craftitem("mcl_mobitems:milk_bucket", { + description = S("Milk"), + _tt_help = minetest.colorize(mcl_colors.GREEN, S("Removes all status effects")), + _doc_items_longdesc = S("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."), + _doc_items_usagehelp = S("Use the placement key to drink the milk."), + inventory_image = "mcl_mobitems_bucket_milk.png", + wield_image = "mcl_mobitems_bucket_milk.png", + on_place = drink_milk, + on_secondary_use = drink_milk, + stack_max = 1, + groups = { food = 3, can_eat_when_full = 1 }, +}) + +minetest.register_craftitem("mcl_mobitems:spider_eye", { + description = S("Spider Eye"), + _tt_help = minetest.colorize(mcl_colors.YELLOW, S("Poisonous")), + _doc_items_longdesc = S("Spider eyes are used mainly in crafting. If you're really desperate, you can eat a spider eye, but it will poison you briefly."), + inventory_image = "mcl_mobitems_spider_eye.png", + wield_image = "mcl_mobitems_spider_eye.png", + on_place = minetest.item_eat(2), + on_secondary_use = minetest.item_eat(2), + groups = { food = 2, eatable = 2, brewitem = 1 }, + _mcl_saturation = 3.2, + stack_max = 64, +}) + +minetest.register_craftitem("mcl_mobitems:bone", { + description = S("Bone"), + _doc_items_longdesc = S("Bones can be used to tame wolves so they will protect you. They are also useful as a crafting ingredient."), + _doc_items_usagehelp = S("Wield the bone near wolves to attract them. Use the “Place” key on the wolf to give it a bone and tame it. You can then give commands to the tamed wolf by using the “Place” key on it."), + inventory_image = "mcl_mobitems_bone.png", + stack_max = 64, + groups = { craftitem=1 }, + _mcl_toollike_wield = true, +}) + +minetest.register_craftitem("mcl_mobitems:string",{ + description = S("String"), + _doc_items_longdesc = S("Strings are used in crafting."), + inventory_image = "mcl_mobitems_string.png", + stack_max = 64, + groups = { craftitem = 1 }, +}) + +minetest.register_craftitem("mcl_mobitems:blaze_rod", { + description = S("Blaze Rod"), + _doc_items_longdesc = S("This is a crafting component dropped from dead blazes."), + wield_image = "mcl_mobitems_blaze_rod.png", + inventory_image = "mcl_mobitems_blaze_rod.png", + groups = { craftitem = 1 }, + stack_max = 64, +}) + +minetest.register_craftitem("mcl_mobitems:blaze_powder", { + description = S("Blaze Powder"), + _doc_items_longdesc = S("This item is mainly used for crafting."), + wield_image = "mcl_mobitems_blaze_powder.png", + inventory_image = "mcl_mobitems_blaze_powder.png", + groups = { craftitem = 1, brewitem = 1 }, + stack_max = 64, +}) + +minetest.register_craftitem("mcl_mobitems:magma_cream", { + description = S("Magma Cream"), + _doc_items_longdesc = S("Magma cream is a crafting component."), + wield_image = "mcl_mobitems_magma_cream.png", + inventory_image = "mcl_mobitems_magma_cream.png", + groups = { craftitem = 1, brewitem = 1 }, + stack_max = 64, +}) + +minetest.register_craftitem("mcl_mobitems:ghast_tear", { + description = S("Ghast Tear"), + _doc_items_longdesc = S("Place this item in an item frame as decoration."), + wield_image = "mcl_mobitems_ghast_tear.png", + inventory_image = "mcl_mobitems_ghast_tear.png", + groups = { brewitem = 1 }, + stack_max = 64, +}) + +minetest.register_craftitem("mcl_mobitems:nether_star", { + description = S("Nether Star"), + _doc_items_longdesc = S("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."), + wield_image = "mcl_mobitems_nether_star.png", + inventory_image = "mcl_mobitems_nether_star.png", + -- TODO: Reveal item when it's useful + groups = { craftitem = 1, not_in_creative_inventory = 1 }, + stack_max = 64, +}) + +minetest.register_craftitem("mcl_mobitems:leather", { + description = S("Leather"), + _doc_items_longdesc = S("Leather is a versatile crafting component."), + wield_image = "mcl_mobitems_leather.png", + inventory_image = "mcl_mobitems_leather.png", + groups = { craftitem = 1 }, + stack_max = 64, +}) + +minetest.register_craftitem("mcl_mobitems:feather", { + description = S("Feather"), + _doc_items_longdesc = S("Feathers are used in crafting and are dropped from chickens."), + wield_image = "mcl_mobitems_feather.png", + inventory_image = "mcl_mobitems_feather.png", + groups = { craftitem = 1 }, + stack_max = 64, +}) + +minetest.register_craftitem("mcl_mobitems:rabbit_hide", { + description = S("Rabbit Hide"), + _doc_items_longdesc = S("Rabbit hide is used to create leather."), + wield_image = "mcl_mobitems_rabbit_hide.png", + inventory_image = "mcl_mobitems_rabbit_hide.png", + groups = { craftitem = 1 }, + stack_max = 64, +}) + +minetest.register_craftitem("mcl_mobitems:rabbit_foot", { + description = S("Rabbit's Foot"), + _doc_items_longdesc = S("Must be your lucky day! Place this item in an item frame for decoration."), + wield_image = "mcl_mobitems_rabbit_foot.png", + inventory_image = "mcl_mobitems_rabbit_foot.png", + groups = { brewitem = 1 }, + stack_max = 64, +}) + +minetest.register_craftitem("mcl_mobitems:saddle", { + description = S("Saddle"), + _tt_help = S("Can be placed on animals to ride them"), + _doc_items_longdesc = S("Saddles can be put on some animals in order to mount them."), + _doc_items_usagehelp = S("Use the placement key with the saddle in your hand to try to put on the saddle. Saddles fit on horses, mules, donkeys and pigs. Horses, mules and donkeys need to be tamed first, otherwise they'll reject the saddle. Saddled animals can be mounted by using the placement key on them again."), + wield_image = "mcl_mobitems_saddle.png", + inventory_image = "mcl_mobitems_saddle.png", + groups = { transport = 1 }, + stack_max = 1, +}) + +minetest.register_craftitem("mcl_mobitems:rabbit_stew", { + description = S("Rabbit Stew"), + _doc_items_longdesc = S("Rabbit stew is a very nutricious food item."), + wield_image = "mcl_mobitems_rabbit_stew.png", + inventory_image = "mcl_mobitems_rabbit_stew.png", + stack_max = 1, + on_place = minetest.item_eat(10, "mcl_core:bowl"), + on_secondary_use = minetest.item_eat(10, "mcl_core:bowl"), + groups = { food = 3, eatable = 10 }, + _mcl_saturation = 12.0, +}) + +minetest.register_craftitem("mcl_mobitems:shulker_shell", { + description = S("Shulker Shell"), + _doc_items_longdesc = S("Shulker shells are used in crafting. They are dropped from dead shulkers."), + inventory_image = "mcl_mobitems_shulker_shell.png", + groups = { craftitem = 1 }, +}) + +minetest.register_craftitem("mcl_mobitems:slimeball", { + description = S("Slimeball"), + _doc_items_longdesc = S("Slimeballs are used in crafting. They are dropped from slimes."), + inventory_image = "mcl_mobitems_slimeball.png", + groups = { craftitem = 1 }, +}) + +minetest.register_craftitem("mcl_mobitems:gunpowder", { + description = S("Gunpowder"), + _doc_items_longdesc = doc.sub.items.temp.craftitem, + inventory_image = "default_gunpowder.png", + stack_max = 64, + groups = { craftitem=1, brewitem = 1 }, +}) + +minetest.register_tool("mcl_mobitems:carrot_on_a_stick", { + description = S("Carrot on a Stick"), + _tt_help = S("Lets you ride a saddled pig"), + _doc_items_longdesc = S("A carrot on a stick can be used on saddled pigs to ride them."), + _doc_items_usagehelp = S("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."), + wield_image = "mcl_mobitems_carrot_on_a_stick.png", + inventory_image = "mcl_mobitems_carrot_on_a_stick.png", + groups = { transport = 1 }, + _mcl_toollike_wield = true, +}) + +minetest.register_craftitem("mcl_mobitems:nautilus_shell", { + description = S("Nautilus Shell"), + _tt_help = S("Used to craft a conduit"), + _doc_items_longdesc = S("The Nautilus Shell is used to craft a conduit. They can be obtained by fishing or killing a drowned that is wielding a shell."), + inventory_image = "mcl_mobitems_nautilus_shell.png", + groups = { craftitem=1 }, + stack_max = 64, +}) + +minetest.register_craftitem("mcl_mobitems:heart_of_the_sea", { + description = S("Heart of the Sea"), + _tt_help = S("Used to craft a conduit"), + _doc_items_longdesc = S("The Heart of the Sea is used to craft a conduit. They can be obtained by finding them in a buried treasure chest."), + inventory_image = "mcl_mobitems_heart_of_the_sea.png", + groups = { craftitem=1 }, + stack_max = 64, +}) + +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 +----------- + +minetest.register_craft({ + output = "mcl_mobitems:leather", + recipe = { + { "mcl_mobitems:rabbit_hide", "mcl_mobitems:rabbit_hide" }, + { "mcl_mobitems:rabbit_hide", "mcl_mobitems:rabbit_hide" }, + } +}) + +minetest.register_craft({ + output = "mcl_mobitems:blaze_powder 2", + recipe = {{"mcl_mobitems:blaze_rod"}}, +}) + +minetest.register_craft({ + output = "mcl_mobitems:rabbit_stew", + recipe = { + { "", "mcl_mobitems:cooked_rabbit", "", }, + { "group:mushroom", "mcl_farming:potato_item_baked", "mcl_farming:carrot_item", }, + { "", "mcl_core:bowl", "", }, + }, +}) + +minetest.register_craft({ + output = "mcl_mobitems:rabbit_stew", + recipe = { + { "", "mcl_mobitems:cooked_rabbit", "", }, + { "mcl_farming:carrot_item", "mcl_farming:potato_item_baked", "group:mushroom", }, + { "", "mcl_core:bowl", "", }, + }, +}) + +minetest.register_craft({ + output = "mcl_mobitems:carrot_on_a_stick", + recipe = { + { "mcl_fishing:fishing_rod", "", }, + { "", "mcl_farming:carrot_item" }, + }, +}) + +minetest.register_craft({ + output = "mcl_mobitems:carrot_on_a_stick", + recipe = { + { "", "mcl_fishing:fishing_rod", }, + { "mcl_farming:carrot_item", "" }, + }, +}) + +minetest.register_craft({ + type = "shapeless", + output = "mcl_mobitems:magma_cream", + recipe = {"mcl_mobitems:blaze_powder", "mcl_mobitems:slimeball"}, +}) + +minetest.register_craft({ + type = "cooking", + output = "mcl_mobitems:cooked_mutton", + recipe = "mcl_mobitems:mutton", + cooktime = 10, +}) + +minetest.register_craft({ + type = "cooking", + output = "mcl_mobitems:cooked_rabbit", + recipe = "mcl_mobitems:rabbit", + cooktime = 10, +}) + +minetest.register_craft({ + type = "cooking", + output = "mcl_mobitems:cooked_chicken", + recipe = "mcl_mobitems:chicken", + cooktime = 10, +}) + +minetest.register_craft({ + type = "cooking", + output = "mcl_mobitems:cooked_beef", + recipe = "mcl_mobitems:beef", + cooktime = 10, +}) + +minetest.register_craft({ + type = "cooking", + output = "mcl_mobitems:cooked_porkchop", + recipe = "mcl_mobitems:porkchop", + cooktime = 10, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "mcl_mobitems:blaze_rod", + burntime = 120, +}) + +minetest.register_craft({ + output = "mcl_mobitems:slimeball 9", + recipe = {{"mcl_core:slimeblock"}}, +}) + +minetest.register_craft({ + output = "mcl_core:slimeblock", + recipe = {{"mcl_mobitems:slimeball","mcl_mobitems:slimeball","mcl_mobitems:slimeball",}, + {"mcl_mobitems:slimeball","mcl_mobitems:slimeball","mcl_mobitems:slimeball",}, + {"mcl_mobitems:slimeball","mcl_mobitems:slimeball","mcl_mobitems:slimeball",}}, +}) + +minetest.register_on_item_eat(function (hp_change, replace_with_item, itemstack, user, pointed_thing) -- poisoning with spider eye + if itemstack:get_name() == "mcl_mobitems:spider_eye" then + mcl_potions.poison_func(user, 1, 4) + end +end) +>>>>>>> mcl2/master diff --git a/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.de.tr b/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.de.tr index 2fd938f2f..f9a0aaf50 100644 --- a/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.de.tr +++ b/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.de.tr @@ -93,3 +93,10 @@ 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. +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..9b149788a 100644 --- a/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.es.tr +++ b/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.es.tr @@ -93,10 +93,15 @@ 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. - +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 ##### Milk is very refreshing and can be obtained by using a bucket on a cow. Drinking it will cure all forms of poisoning, but restores no hunger points.=La leche es muy refrescante y se puede obtener usando un cubo en una vaca. Beberlo curará todas las formas de envenenamiento, pero no restaura los puntos de hambre. - diff --git a/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.fr.tr b/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.fr.tr index f5654bec7..8c7fa2d15 100644 --- a/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.fr.tr +++ b/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.fr.tr @@ -91,4 +91,16 @@ 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-la 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 +<<<<<<< HEAD +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-la 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. +======= +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. + +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. +>>>>>>> mcl2/master diff --git a/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.ru.tr b/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.ru.tr index 25008d7ae..9d825b620 100644 --- a/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.ru.tr +++ b/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.ru.tr @@ -67,4 +67,17 @@ Gunpowder=Порох Carrot on a Stick=Удочка с морковью Lets you ride a saddled pig=Позволяет вам ездить на осёдланной свинье A carrot on a stick can be used on saddled pigs to ride them.=Удочку с морковью можно использовать, чтобы оседлать свинью и поехать на ней. +<<<<<<< HEAD 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.=Поместите это на осёдланную свинью, чтобы сесть на неё. Теперь вы можете ехать на ней, как на лошади. Свиньи также идут вперёд, когда вы просто держите удочку с морковью. +======= + +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.=Поместите это на осёдланную свинью, чтобы закрепиться на ней. Теперь вы можете ехать на ней, как на лошади. Свиньи также идут вперёд, когда вы просто держите удочку с морковью. + +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.=Поместите это на лошадь, чтобы одеть лошадь в доспехи. Ослики и мулы не могут носить лошадиные доспехи. +>>>>>>> mcl2/master diff --git a/mods/ITEMS/mcl_mobitems/locale/template.txt b/mods/ITEMS/mcl_mobitems/locale/template.txt index ce5bbcabe..690ae3fac 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.= +Nautilus Shell= +Used to craft a conduit= +The Nautilus Shell is used to craft a conduit. They can be obtained by fishing or killing a drowned that is wielding a shell.= +Heart of the Sea= +The Heart of the Sea is used to craft a conduit. They can be obtained by finding them in a buried treasure chest.= + +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/textures/mcl_mobitems_diamond_horse_armor.png b/mods/ITEMS/mcl_mobitems/textures/mcl_mobitems_diamond_horse_armor.png new file mode 100644 index 0000000000000000000000000000000000000000..121be08de6a6bd33d8301c3b713a24528a81a92c GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv3GfMV1=9cj|BqjHLq|tv{*|8= zR`#lDI+Bu-%F4>Y(+|4V&NDSNO}SN*3RK5b666=mz)&{%tObx4;pyTSQo)#ffTby6 zfd)t7j25;g$wTWp9TVC*qg+)w6c;WG(Kw;7anJ5mi-Q6tEKL6O?$paxhqlu^-G1Wk z3eMTC#n+Ww6%J>%l`iMFVdQ&MBb@0DKTd A=Kufz literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_mobitems/textures/mcl_mobitems_gold_horse_armor.png b/mods/ITEMS/mcl_mobitems/textures/mcl_mobitems_gold_horse_armor.png new file mode 100644 index 0000000000000000000000000000000000000000..f6b4fdfb9355417bd2525a04122eddd017c39042 GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa3-AeX1=9cj|KHW4mEcjcq(bS+ za?`fBnZ7m|%F4>7rlwy~c18hJFqH)P1v4;|O+IS@6(_TrBE9+BAdIMLO z#{CMi&^y-o{#ahnn(fh-CZ9~uxXRaMGQoG_?aWni^-Fg1a~L@v;tp=($f>Ni@Vt9w zSz?EBInSh&jw!h+N8{!$@oap)>TZ>4w2Rq;FIzeVG$(s7T>Gc?=t;Ng-y>WGsa_Vh zpW28NzT3C_{-%9SJAPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0ZmCnK~y+TW1ti; zLTL;jYT^DL$^?VgCw5|0iy;Wpm|0l}=HI#VnBn=0Hw;$}9{}^w4MO37H0#(pFnD>` zFqjx=G3-Bdn&I$~^H5m`02zdA2oscsYqqs91Z&0xKx&Y^2R8r)9PLcOG%nj=UV#Cy zQ;=;J7ZYaq_U#A5wjD>n3P1p+Y1d>E21C<^@n#z`Y_bVbOE`boGCbZ7_hY@%QKV@Tf!y z5DHvawjo#EfFAJ`2*_8+n)5CCZe0c6b}fYSv`Y#d-d41hF(0J3Hfz%T#? iUPwBaixO+sUCajXXPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0l7&;K~y+TW1ti; zLTL<;@8$L%%4C?hZ5K{;EKnK_U>d7h%E5dn0E>m%8}QkbcYOwnKmik!1_O|0kVZRR z5r+Rf2n^zb#8)4@@Cm9E4&VmBG=nrCgBxv=8O+Obz~UfzWUqk$iVKc(&IQxf&E;T? zFu=<2oq_So8z>JIfCC3+JIDZ#W*7h&vi{X0C=UYA0~93?L7I=&b}|Taa)J3E&80JD zGHgEmfMG^K90R+w0azRvFoOssG0_G?GXn;00TBi{CmRM4TXP0cLuH1w>$fxfls92m zyK*hVsjCkep4>f-Jvt+;E&i_!kNSV{=-&S?Ze0Z90|_brU!L3hA0!7=h84g~1St%W zQGz>Pqbe6ngTi6v?JEq+kDkD4J4zVv`q?rFDyT7ti=sy5gvqT847t_+#rXL!0udYr zAaLdJlg2+U-!`bK$}%wi{>Jd-Hv_|yiE|+?VdG*@xb}b{s4|1$_v050CvV?vgla=| z0o0jruL!0_GQ50^i2oPg85oiaQb5fAFqdHD1+XF3khGup;1*cy^QOaK@4W=_B}9e6 mVlaR;U|;}O3?KrOfdK%uzO7f>V*3mL0000>>>>>> mcl2/master sounds = mcl_sounds.node_sound_wood_defaults(), is_ground_content = true, _mcl_blast_resistance = 0.2, @@ -51,7 +58,11 @@ local function register_mushroom(color, species_id, template, d_cap, d_stem, d_s stem_full.tiles = { "mcl_mushrooms_mushroom_block_skin_stem.png" } stem_full.groups.huge_mushroom = species_id stem_full.groups.huge_mushroom_stem = 2 +<<<<<<< HEAD stem_full.groups.compostability=65 +======= + stem_full.groups.compostability = 65 +>>>>>>> mcl2/master minetest.register_node("mcl_mushrooms:"..color.."_mushroom_block_stem_full", stem_full) -- Stem @@ -61,7 +72,11 @@ local function register_mushroom(color, species_id, template, d_cap, d_stem, d_s stem.tiles = { "mcl_mushrooms_mushroom_block_inside.png", "mcl_mushrooms_mushroom_block_inside.png", "mcl_mushrooms_mushroom_block_skin_stem.png" } stem.groups.huge_mushroom = species_id stem.groups.huge_mushroom_stem = 1 +<<<<<<< HEAD stem.groups.compostability=65 +======= + stem.groups.compostability = 65 +>>>>>>> mcl2/master minetest.register_node("mcl_mushrooms:"..color.."_mushroom_block_stem", stem) -- Mushroom block (cap) diff --git a/mods/ITEMS/mcl_mushrooms/locale/mcl_mushrooms.zh_TW.tr b/mods/ITEMS/mcl_mushrooms/locale/mcl_mushrooms.zh_TW.tr new file mode 100644 index 000000000..f4c6ba192 --- /dev/null +++ b/mods/ITEMS/mcl_mushrooms/locale/mcl_mushrooms.zh_TW.tr @@ -0,0 +1,24 @@ +# textdomain: mcl_mushrooms +This decorative block is like a huge mushroom stem, but with the stem texture on all sides.=這個裝飾塊就像一個巨大的蘑菇莖,但四面都有莖的紋理。 +Huge red mushroom blocks are the cap parts of huge red mushrooms. It consists of a red skin and can have pores on each of its sides.=紅色蘑菇方塊是巨大的紅蘑菇的菌蓋部分。它由紅色的皮膚組成,每一面都可以有毛孔。 +The stem part of a huge red mushroom.= +Huge Red Mushroom Block=紅色蘑菇方塊 +Huge Red Mushroom Stem=紅色蘑菇柄 +Huge Red Mushroom All-Faces Stem=紅色蘑菇(全紋理)柄 +Huge brown mushroom blocks are the cap parts of huge brown mushrooms. It consists of a brown skin and can have pores on each of its sides.= +The stem part of a huge brown mushroom.= +Huge Brown Mushroom Block=棕色蘑菇方塊 +Huge Brown Mushroom Stem=棕色蘑菇柄 +Huge Brown Mushroom All-Faces Stem=棕色蘑菇(全紋理)柄 +Brown mushrooms are fungi which grow and spread in darkness, but are sensitive to light. They are inedible as such, but they can be used to craft food items.=棕色蘑菇是在黑暗中生長和傳播的真菌,但對光線敏感。它們本身不能食用,但可以用來製作食品。 +Red mushrooms are fungi which grow and spread in darkness, but are sensitive to light. They are inedible as such, but they can be used to craft food items.=紅色蘑菇是在黑暗中生長和傳播的真菌,但對光線敏感。它們本身不能食用,但可以用來製作食品。 +A single mushroom of this species will slowly spread over time towards a random solid opaque block with a light level of 12 or lower in a 3×3×3 cube around the mushroom. It stops spreading when there are 5 or more mushrooms of the same species within an area of 9×3×9 blocks around the mushroom.=這個品種的單個蘑菇會隨著時間的推移,慢慢地向蘑菇周圍3×3×3立方體中光照度為12或更低的隨機固體不透明方塊擴散。當蘑菇周圍9×3×9塊的區域內有5個或更多相同種類的蘑菇時,它就會停止擴散。 +Mushrooms will eventually uproot at a light level of 12 or higher. On mycelium or podzol, they survive and spread at any light level.=蘑菇最終會在12或更高的光照水平下連根拔起。在菌絲體或灰壤上,它們在任何光照水平下都能生存和傳播。 +This mushroom can be placed on mycelium and podzol at any light level. It can also be placed on blocks which are both solid and opaque, as long as the light level at daytime is not higher than 12.=這種蘑菇可以放置在任何光照水平的菌絲和莢膜上。只要白天的光照度不高於12,它也可以放在既堅固又不透明的木塊上。 +Brown Mushroom=棕色蘑菇 +Red Mushroom=紅色蘑菇 +Mushroom Stew=蘑菇湯 +Mushroom stew is a healthy soup which can be consumed to restore some hunger points.=蘑菇湯是一種健康的湯,食用後可以恢復一些飢餓值。 +By placing huge mushroom blocks of the same species next to each other, the sides that touch each other will turn into pores permanently.=通過將同一物種的巨大蘑菇塊放在一起,相互接觸的側面將永久地變成毛孔。 +Grows on podzol, mycelium and other blocks=在灰壤,菌絲體和其他方塊上生長 +Spreads in darkness=在黑暗中擴散 diff --git a/mods/ITEMS/mcl_mushrooms/small.lua b/mods/ITEMS/mcl_mushrooms/small.lua index 6fdc80c16..27b6d232b 100644 --- a/mods/ITEMS/mcl_mushrooms/small.lua +++ b/mods/ITEMS/mcl_mushrooms/small.lua @@ -38,7 +38,15 @@ minetest.register_node("mcl_mushrooms:mushroom_brown", { sunlight_propagates = true, paramtype = "light", walkable = false, +<<<<<<< HEAD groups = {dig_immediate=3,mushroom=1,attached_node=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1,enderman_takable=1,deco_block=1, compostability=65}, +======= + groups = { + attached_node = 1, deco_block = 1, destroy_by_lava_flow = 1, + dig_immediate = 3, dig_by_water = 1, dig_by_piston = 1, + mushroom = 1, enderman_takable = 1, compostability = 65 + }, +>>>>>>> mcl2/master sounds = mcl_sounds.node_sound_leaves_defaults(), light_source = 1, selection_box = { @@ -62,7 +70,15 @@ minetest.register_node("mcl_mushrooms:mushroom_red", { sunlight_propagates = true, paramtype = "light", walkable = false, +<<<<<<< HEAD groups = {dig_immediate=3,mushroom=1,attached_node=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1,enderman_takable=1,deco_block=1, compostability=65}, +======= + groups = { + attached_node = 1, deco_block = 1, destroy_by_lava_flow = 1, + dig_immediate = 3, dig_by_water = 1, dig_by_piston = 1, + mushroom = 1, enderman_takable = 1, compostability = 65 + }, +>>>>>>> mcl2/master sounds = mcl_sounds.node_sound_leaves_defaults(), selection_box = { type = "fixed", diff --git a/mods/ITEMS/mcl_nether/init.lua b/mods/ITEMS/mcl_nether/init.lua index d5201e682..4e8e7fde3 100644 --- a/mods/ITEMS/mcl_nether/init.lua +++ b/mods/ITEMS/mcl_nether/init.lua @@ -59,7 +59,11 @@ minetest.register_node("mcl_nether:ancient_debris", { tiles = {"mcl_nether_ancient_debris_top.png", "mcl_nether_ancient_debris_side.png"}, is_ground_content = true, groups = {pickaxey=4, building_block=1, material_stone=1, xp=0}, +<<<<<<< HEAD drop = 'mcl_nether:ancient_debris', +======= + drop = "mcl_nether:ancient_debris", +>>>>>>> mcl2/master sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 1200, _mcl_hardness = 30, @@ -73,11 +77,20 @@ minetest.register_node("mcl_nether:netheriteblock", { tiles = {"mcl_nether_netheriteblock.png"}, is_ground_content = true, groups = {pickaxey=4, building_block=1, material_stone=1, xp = 0}, +<<<<<<< HEAD drop = 'mcl_nether:netheriteblock', sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 1200, _mcl_hardness = 50, _mcl_silk_touch_drop = true +======= + drop = "mcl_nether:netheriteblock", + sounds = mcl_sounds.node_sound_stone_defaults(), + _mcl_blast_resistance = 1200, + _mcl_hardness = 50, + _mcl_silk_touch_drop = true, + _mcl_fortune_drop = mcl_core.fortune_drop_ore +>>>>>>> mcl2/master }) -- For eternal fire on top of netherrack and magma blocks @@ -135,7 +148,8 @@ minetest.register_node("mcl_nether:magma", { sounds = mcl_sounds.node_sound_stone_defaults(), -- From walkover mod on_walk_over = function(loc, nodeiamon, player) - if player and player:get_player_control().sneak or minetest.global_exists("mcl_potions") and mcl_potions.player_has_effect(player, "fire_proof") then + local armor_feet = player:get_inventory():get_stack("armor", 5) + if player and player:get_player_control().sneak or (minetest.global_exists("mcl_enchanting") and mcl_enchanting.has_enchantment(armor_feet, "frost_walker")) or (minetest.global_exists("mcl_potions") and mcl_potions.player_has_effect(player, "fire_proof")) then return end -- Hurt players standing on top of this block @@ -158,7 +172,7 @@ minetest.register_node("mcl_nether:soul_sand", { stack_max = 64, tiles = {"mcl_nether_soul_sand.png"}, is_ground_content = true, - groups = {handy=1,shovely=1, building_block=1,soil_nether_wart=1, material_sand=1}, + groups = {handy = 1, shovely = 1, building_block = 1, soil_nether_wart = 1, material_sand = 1, soul_block = 1 }, collision_box = { type = "fixed", fixed = { -0.5, -0.5, -0.5, 0.5, 0.5 - 2/16, 0.5 }, @@ -201,7 +215,11 @@ minetest.register_node("mcl_nether:nether_wart_block", { stack_max = 64, tiles = {"mcl_nether_nether_wart_block.png"}, is_ground_content = false, +<<<<<<< HEAD groups = {handy=1, hoey=1, building_block=1, compostability=85}, +======= + groups = {handy=1, hoey=1, building_block=1, compostability = 85}, +>>>>>>> mcl2/master sounds = mcl_sounds.node_sound_leaves_defaults( { footstep={name="default_dirt_footstep", gain=0.7}, @@ -390,27 +408,45 @@ minetest.register_craft({ minetest.register_craft({ output = "mcl_nether:netherite_ingot", recipe = { +<<<<<<< HEAD {'mcl_nether:netherite_scrap', 'mcl_nether:netherite_scrap', 'mcl_nether:netherite_scrap'}, {'mcl_nether:netherite_scrap', 'mcl_core:gold_ingot', 'mcl_core:gold_ingot'}, {'mcl_core:gold_ingot', 'mcl_core:gold_ingot', ''}, +======= + {"mcl_nether:netherite_scrap", "mcl_nether:netherite_scrap", "mcl_nether:netherite_scrap"}, + {"mcl_nether:netherite_scrap", "mcl_core:gold_ingot", "mcl_core:gold_ingot"}, + {"mcl_core:gold_ingot", "mcl_core:gold_ingot", ""}, +>>>>>>> mcl2/master } }) minetest.register_craft({ output = "mcl_nether:netheriteblock", recipe = { +<<<<<<< HEAD {'mcl_nether:netherite_ingot', 'mcl_nether:netherite_ingot', 'mcl_nether:netherite_ingot'}, {'mcl_nether:netherite_ingot', 'mcl_nether:netherite_ingot', 'mcl_nether:netherite_ingot'}, {'mcl_nether:netherite_ingot', 'mcl_nether:netherite_ingot', 'mcl_nether:netherite_ingot'} +======= + {"mcl_nether:netherite_ingot", "mcl_nether:netherite_ingot", "mcl_nether:netherite_ingot"}, + {"mcl_nether:netherite_ingot", "mcl_nether:netherite_ingot", "mcl_nether:netherite_ingot"}, + {"mcl_nether:netherite_ingot", "mcl_nether:netherite_ingot", "mcl_nether:netherite_ingot"} +>>>>>>> mcl2/master } }) minetest.register_craft({ output = "mcl_nether:netherite_ingot 9", recipe = { +<<<<<<< HEAD {'mcl_nether:netheriteblock', '', ''}, {'', '', ''}, {'', '', ''} +======= + {"mcl_nether:netheriteblock", "", ""}, + {"", "", ""}, + {"", "", ""} +>>>>>>> mcl2/master } }) diff --git a/mods/ITEMS/mcl_nether/nether_wart.lua b/mods/ITEMS/mcl_nether/nether_wart.lua index e7452a211..e9ec6a407 100644 --- a/mods/ITEMS/mcl_nether/nether_wart.lua +++ b/mods/ITEMS/mcl_nether/nether_wart.lua @@ -117,6 +117,7 @@ minetest.register_craftitem("mcl_nether:nether_wart_item", { _doc_items_usagehelp = S("Place this item on soul sand to plant it and watch it grow."), inventory_image = "mcl_nether_nether_wart.png", wield_image = "mcl_nether_nether_wart.png", + groups = {craftitem = 1, brewitem = 1, compostability = 30}, on_place = function(itemstack, placer, pointed_thing) if pointed_thing.type ~= "node" then return itemstack @@ -150,7 +151,10 @@ minetest.register_craftitem("mcl_nether:nether_wart_item", { end end end, +<<<<<<< HEAD groups = { craftitem = 1, brewitem=1, compostability=30 }, +======= +>>>>>>> mcl2/master }) local names = {"mcl_nether:nether_wart_0", "mcl_nether:nether_wart_1", "mcl_nether:nether_wart_2"} diff --git a/mods/ITEMS/mcl_ocean/kelp.lua b/mods/ITEMS/mcl_ocean/kelp.lua index fbdb12448..d94bcbbef 100644 --- a/mods/ITEMS/mcl_ocean/kelp.lua +++ b/mods/ITEMS/mcl_ocean/kelp.lua @@ -741,7 +741,11 @@ minetest.register_craftitem("mcl_ocean:kelp", { inventory_image = "mcl_ocean_kelp_item.png", wield_image = "mcl_ocean_kelp_item.png", on_place = kelp.kelp_on_place, +<<<<<<< HEAD groups = { deco_block = 1, compostability=30 }, +======= + groups = {deco_block = 1, compostability = 30}, +>>>>>>> mcl2/master }) if mod_doc then @@ -756,7 +760,11 @@ minetest.register_craftitem("mcl_ocean:dried_kelp", { _doc_items_longdesc = S("Dried kelp is a food item."), inventory_image = "mcl_ocean_dried_kelp.png", wield_image = "mcl_ocean_dried_kelp.png", +<<<<<<< HEAD groups = { food = 2, eatable = 1, compostability=30 }, +======= + groups = {food = 2, eatable = 1, compostability = 30}, +>>>>>>> mcl2/master on_place = minetest.item_eat(1), on_secondary_use = minetest.item_eat(1), _mcl_saturation = 0.6, @@ -773,13 +781,20 @@ minetest.register_node("mcl_ocean:dried_kelp_block", { description = S("Dried Kelp Block"), _doc_items_longdesc = S("A decorative block that serves as a great furnace fuel."), tiles = { "mcl_ocean_dried_kelp_top.png", "mcl_ocean_dried_kelp_bottom.png", "mcl_ocean_dried_kelp_side.png" }, +<<<<<<< HEAD groups = { handy = 1, hoey = 1, building_block = 1, flammable = 2, fire_encouragement = 30, fire_flammability = 60, compostability=50 }, +======= + groups = { + handy = 1, hoey = 1, building_block = 1, compostability = 50, + flammable = 2, fire_encouragement = 30, fire_flammability = 60 + }, +>>>>>>> mcl2/master sounds = mcl_sounds.node_sound_leaves_defaults(), paramtype2 = "facedir", on_place = mcl_util.rotate_axis, on_rotate = on_rotate, _mcl_hardness = 0.5, - _mcl_blast_resistance = 12.5, + _mcl_blast_resistance = 2.5, }) minetest.register_craft({ diff --git a/mods/ITEMS/mcl_ocean/prismarine.lua b/mods/ITEMS/mcl_ocean/prismarine.lua index e38b3e0a6..32d17538d 100644 --- a/mods/ITEMS/mcl_ocean/prismarine.lua +++ b/mods/ITEMS/mcl_ocean/prismarine.lua @@ -40,7 +40,7 @@ minetest.register_node("mcl_ocean:prismarine", { tiles = {{name="mcl_ocean_prismarine_anim.png", animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=45.0}}}, groups = {pickaxey=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 1.5, + _mcl_blast_resistance = 6, _mcl_hardness = 1.5, }) diff --git a/mods/ITEMS/mcl_ocean/sea_pickle.lua b/mods/ITEMS/mcl_ocean/sea_pickle.lua index 435dc10f0..161438b6a 100644 --- a/mods/ITEMS/mcl_ocean/sea_pickle.lua +++ b/mods/ITEMS/mcl_ocean/sea_pickle.lua @@ -106,7 +106,14 @@ for s=1,4 do }, inventory_image = img, wield_image = img, +<<<<<<< HEAD groups = { dig_immediate = 3, deco_block = 1, sea_pickle=1, not_in_creative_inventory=nici, compostability=65 }, +======= + groups = { + dig_immediate = 3, deco_block = 1, sea_pickle = 1, + not_in_creative_inventory=nici, compostability = 65 + }, +>>>>>>> mcl2/master -- Light level: 6 at size 1, +3 for each additional stage light_source = math.min(6 + (s-1)*3, minetest.LIGHT_MAX), selection_box = { diff --git a/mods/ITEMS/mcl_ocean/seagrass.lua b/mods/ITEMS/mcl_ocean/seagrass.lua index 52c506f81..ba816f5ef 100644 --- a/mods/ITEMS/mcl_ocean/seagrass.lua +++ b/mods/ITEMS/mcl_ocean/seagrass.lua @@ -85,7 +85,11 @@ minetest.register_craftitem("mcl_ocean:seagrass", { inventory_image = "mcl_ocean_seagrass.png^[verticalframe:12:0", wield_image = "mcl_ocean_seagrass.png^[verticalframe:12:0", on_place = seagrass_on_place, +<<<<<<< HEAD groups = { deco_block = 1, compostability=30 }, +======= + groups = {deco_block = 1, compostability = 30}, +>>>>>>> mcl2/master }) -- Seagrass nodes: seagrass on a surface node diff --git a/mods/ITEMS/mcl_portals/locale/mcl_portals.zh_TW.tr b/mods/ITEMS/mcl_portals/locale/mcl_portals.zh_TW.tr new file mode 100644 index 000000000..a6b389036 --- /dev/null +++ b/mods/ITEMS/mcl_portals/locale/mcl_portals.zh_TW.tr @@ -0,0 +1,15 @@ +# textdomain: mcl_portals +End Portal=終界傳送門 +An End portal teleports creatures and objects to the mysterious End dimension (and back!).=終界傳送門用於將生物和實體到達終末之界(或回來!)。 +Hop into the portal to teleport. Entering an End portal in the Overworld teleports you to a fixed position in the End dimension and creates a 5×5 obsidian platform at your destination. End portals in the End will lead back to your spawn point in the Overworld.=跳入傳送門進行傳送。進入終界傳送門會將你傳送到終界的一個固定位置,並在你的目的地創建一個5×5的黑曜石平台。終界的傳送門會將你帶回你在主界的出生點。 +End Portal Frame=終界傳送門框架 +End portal frames are used in the construction of End portals. Each block has a socket for an eye of ender.=終界傳送門框架用於建造終界傳送門。每個框架都有一個插座,用於放置終界之眼。 +NOTE: The End dimension is currently incomplete and might change in future versions.=注意:終界目前還不完整,在未來的版本中可能會有變化。 +End Portal Frame with Eye of Ender=含終界之眼的終界傳送門框架 +Nether Portal=地獄傳送門 +A Nether portal teleports creatures and objects to the hot and dangerous Nether dimension (and back!). Enter at your own risk!=地獄傳送門將生物和實體傳送到炎熱和危險的地獄(或回來!)。進入後風險自負! +Stand in the portal for a moment to activate the teleportation. Entering a Nether portal for the first time will also create a new portal in the other dimension. If a Nether portal has been built in the Nether, it will lead to the Overworld. A Nether portal is destroyed if the any of the obsidian which surrounds it is destroyed, or if it was caught in an explosion.=在傳送門中站立片刻以激活傳送。第一次進入地獄傳送門也會在另一維度創建一個新的傳送門。如果在地獄建立了地獄傳送門,它將會通​​向主世界。如果圍繞著它的任何黑曜石被毀壞,或者它被捲入一場爆炸,地獄傳送門就會被破壞。 +Obsidian is also used as the frame of Nether portals.=黑曜石也被用來作為地獄傳送門的框架。 +To open a Nether portal, place an upright frame of obsidian with a width of at least 4 blocks and a height of 5 blocks, leaving only air in the center. After placing this frame, light a fire in the obsidian frame. Nether portals only work in the Overworld and the Nether.=要打開地獄傳送門,需要放置一個直立的黑曜石框架,寬度至少為4塊,高度為5塊,中間只留有空氣。放置這個框架後,在黑曜石框架中點火。地獄傳送門只在主世界上和地獄起作用。 +Once placed, an eye of ender can not be taken back.=在擺放後,終界之眼無法再取回。 +Used to construct end portals=用於建造終界傳送門 diff --git a/mods/ITEMS/mcl_portals/portal_end.lua b/mods/ITEMS/mcl_portals/portal_end.lua index 3e4f5ba12..26803abb8 100644 --- a/mods/ITEMS/mcl_portals/portal_end.lua +++ b/mods/ITEMS/mcl_portals/portal_end.lua @@ -93,7 +93,7 @@ minetest.register_node("mcl_portals:portal_end", { groups = {portal=1, not_in_creative_inventory = 1, disable_jump = 1}, _mcl_hardness = -1, - _mcl_blast_resistance = 36000000, + _mcl_blast_resistance = 3600000, }) -- Obsidian platform at the End portal destination in the End @@ -235,8 +235,12 @@ function mcl_portals.end_portal_teleport(pos, node) end mcl_portals.end_teleport(obj, objpos) +<<<<<<< HEAD awards.unlock(obj:get_player_name(), "mcl:enterEndPortal") +======= + awards.unlock(obj:get_player_name(), "mcl:enterEndPortal") +>>>>>>> mcl2/master end end end diff --git a/mods/ITEMS/mcl_portals/portal_nether.lua b/mods/ITEMS/mcl_portals/portal_nether.lua index a8fdc51b2..eb323a44d 100644 --- a/mods/ITEMS/mcl_portals/portal_nether.lua +++ b/mods/ITEMS/mcl_portals/portal_nether.lua @@ -209,6 +209,57 @@ local function get_target(p) end end +<<<<<<< HEAD +======= +-- Destroy a nether portal. Connected portal nodes are searched and removed +-- using 'bulk_set_node'. This function is called from 'after_destruct' of +-- nether portal nodes. The flag 'destroying_portal' is used to avoid this +-- function being called recursively through callbacks in 'bulk_set_node'. +local destroying_portal = false +local function destroy_nether_portal(pos, node) + if destroying_portal then + return + end + destroying_portal = true + + local orientation = node.param2 + local checked_tab = { [minetest.hash_node_position(pos)] = true } + local nodes = { pos } + + local function check_remove(pos) + local h = minetest.hash_node_position(pos) + if checked_tab[h] then + return + end + + local node = minetest.get_node(pos) + if node and node.name == PORTAL and (orientation == nil or node.param2 == orientation) then + table.insert(nodes, pos) + checked_tab[h] = true + end + end + + local i = 1 + while i <= #nodes do + pos = nodes[i] + if orientation == 0 then + check_remove({x = pos.x - 1, y = pos.y, z = pos.z}) + check_remove({x = pos.x + 1, y = pos.y, z = pos.z}) + else + check_remove({x = pos.x, y = pos.y, z = pos.z - 1}) + check_remove({x = pos.x, y = pos.y, z = pos.z + 1}) + end + check_remove({x = pos.x, y = pos.y - 1, z = pos.z}) + check_remove({x = pos.x, y = pos.y + 1, z = pos.z}) + remove_exit(pos) + i = i + 1 + end + + minetest.bulk_set_node(nodes, { name = "air" }) + destroying_portal = false +end + +>>>>>>> mcl2/master local on_rotate if minetest.get_modpath("screwdriver") then on_rotate = screwdriver.disallow @@ -387,6 +438,9 @@ local function finalize_teleport(obj, exit) mcl_worlds.dimension_change(obj, dim) minetest.sound_play("mcl_portals_teleport", {pos=exit, gain=0.5, max_hear_distance = 16}, true) log("action", "[mcl_portals] player "..name.." teleported to Nether portal at "..pos_to_string(exit)..".") + if dim == "nether" then + awards.unlock(obj:get_player_name(), "mcl:theNether") + end else log("action", "[mcl_portals] entity teleported to Nether portal at "..pos_to_string(exit)..".") end @@ -831,6 +885,26 @@ local usagehelp = S("To open a Nether portal, place an upright frame of obsidian minetest.override_item(OBSIDIAN, { _doc_items_longdesc = longdesc, _doc_items_usagehelp = usagehelp, +<<<<<<< HEAD +======= + after_destruct = function(pos, node) + local function check_remove(pos, orientation) + local node = get_node(pos) + if node and node.name == PORTAL then + minetest.remove_node(pos) + end + end + + -- check each of 6 sides of it and destroy every portal + check_remove({x = pos.x - 1, y = pos.y, z = pos.z}) + check_remove({x = pos.x + 1, y = pos.y, z = pos.z}) + check_remove({x = pos.x, y = pos.y, z = pos.z - 1}) + check_remove({x = pos.x, y = pos.y, z = pos.z + 1}) + check_remove({x = pos.x, y = pos.y - 1, z = pos.z}) + check_remove({x = pos.x, y = pos.y + 1, z = pos.z}) + end, + +>>>>>>> mcl2/master _on_ignite = function(user, pointed_thing) local x, y, z = pointed_thing.under.x, pointed_thing.under.y, pointed_thing.under.z -- Check empty spaces around obsidian and light all frames found: diff --git a/mods/ITEMS/mcl_potions/functions.lua b/mods/ITEMS/mcl_potions/functions.lua index c3b034b66..2c47d50d1 100644 --- a/mods/ITEMS/mcl_potions/functions.lua +++ b/mods/ITEMS/mcl_potions/functions.lua @@ -116,6 +116,8 @@ minetest.register_globalstep(function(dtime) meta = player:get_meta() meta:set_string("_is_invisible", minetest.serialize(EF.invisible[player])) end + potions_set_hud(player) + end end @@ -165,7 +167,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 @@ -195,6 +197,7 @@ minetest.register_globalstep(function(dtime) if player:get_pos() then mcl_potions._add_spawner(player, "#2E5299") end if player:get_breath() then + hb.hide_hudbar(player, "breath") if player:get_breath() < 10 then player:set_breath(10) end end @@ -203,6 +206,7 @@ minetest.register_globalstep(function(dtime) meta:set_string("_is_water_breathing", minetest.serialize(EF.water_breathing[player])) EF.water_breathing[player] = nil end + potions_set_hud(player) else EF.water_breathing[player] = nil @@ -225,6 +229,7 @@ minetest.register_globalstep(function(dtime) meta = player:get_meta() meta:set_string("_is_leaping", minetest.serialize(EF.leaping[player])) end + potions_set_hud(player) else EF.leaping[player] = nil @@ -247,6 +252,7 @@ minetest.register_globalstep(function(dtime) meta = player:get_meta() meta:set_string("_is_swift", minetest.serialize(EF.swift[player])) end + potions_set_hud(player) else EF.swift[player] = nil @@ -270,6 +276,7 @@ minetest.register_globalstep(function(dtime) meta:set_int("night_vision", 0) end mcl_weather.skycolor.update_sky_color({player}) + potions_set_hud(player) else EF.night_vision[player] = nil @@ -293,6 +300,7 @@ minetest.register_globalstep(function(dtime) meta = player:get_meta() meta:set_string("_is_fire_proof", minetest.serialize(EF.fire_proof[player])) end + potions_set_hud(player) else EF.fire_proof[player] = nil @@ -537,7 +545,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 @@ -678,7 +686,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 36f45b01a..5b9f1fab3 100644 --- a/mods/ITEMS/mcl_potions/init.lua +++ b/mods/ITEMS/mcl_potions/init.lua @@ -281,7 +281,7 @@ local function water_splash(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}, diff --git a/mods/ITEMS/mcl_potions/lingering.lua b/mods/ITEMS/mcl_potions/lingering.lua index d22dd4181..17088ad13 100644 --- a/mods/ITEMS/mcl_potions/lingering.lua +++ b/mods/ITEMS/mcl_potions/lingering.lua @@ -1,5 +1,7 @@ local S = minetest.get_translator(minetest.get_current_modname()) +local mod_target = minetest.get_modpath("mcl_target") + local function lingering_image(colorstring, opacity) if not opacity then opacity = 127 @@ -64,7 +66,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 @@ -95,71 +97,74 @@ function mcl_potions.register_lingering(name, descr, color, def) end end minetest.register_craftitem(id, { - description = descr, - _tt_help = def.tt, - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = S("Use the “Punch” key to throw it."), - inventory_image = lingering_image(color), - groups = {brewitem=1, not_in_creative_inventory=0}, - on_use = function(item, placer, pointed_thing) - local velocity = 10 - local dir = placer:get_look_dir(); - local pos = placer:getpos(); - minetest.sound_play("mcl_throwing_throw", {pos = pos, gain = 0.4, max_hear_distance = 16}, true) - local obj = minetest.add_entity({x=pos.x+dir.x,y=pos.y+2+dir.y,z=pos.z+dir.z}, id.."_flying") - obj:setvelocity({x=dir.x*velocity,y=dir.y*velocity,z=dir.z*velocity}) - obj:setacceleration({x=dir.x*-3, y=-9.8, z=dir.z*-3}) - obj:get_luaentity()._thrower = placer:get_player_name() - if not minetest.is_creative_enabled(placer:get_player_name()) then - item:take_item() + description = descr, + _tt_help = def.tt, + _doc_items_longdesc = longdesc, + _doc_items_usagehelp = S("Use the “Punch” key to throw it."), + inventory_image = lingering_image(color), + groups = {brewitem=1, not_in_creative_inventory=0}, + on_use = function(item, placer, pointed_thing) + local velocity = 10 + local dir = placer:get_look_dir(); + local pos = placer:getpos(); + minetest.sound_play("mcl_throwing_throw", {pos = pos, gain = 0.4, max_hear_distance = 16}, true) + local obj = minetest.add_entity({x=pos.x+dir.x,y=pos.y+2+dir.y,z=pos.z+dir.z}, id.."_flying") + obj:setvelocity({x=dir.x*velocity,y=dir.y*velocity,z=dir.z*velocity}) + obj:setacceleration({x=dir.x*-3, y=-9.8, z=dir.z*-3}) + obj:get_luaentity()._thrower = placer:get_player_name() + if not minetest.is_creative_enabled(placer:get_player_name()) then + item:take_item() + end + return item + end, + stack_max = 1, + _on_dispense = function(stack, dispenserpos, droppos, dropnode, dropdir) + local s_pos = vector.add(dispenserpos, vector.multiply(dropdir, 0.51)) + local pos = {x=s_pos.x+dropdir.x,y=s_pos.y+dropdir.y,z=s_pos.z+dropdir.z} + minetest.sound_play("mcl_throwing_throw", {pos = pos, gain = 0.4, max_hear_distance = 16}, true) + local obj = minetest.add_entity(pos, id.."_flying") + local velocity = 22 + obj:set_velocity({x=dropdir.x*velocity,y=dropdir.y*velocity,z=dropdir.z*velocity}) + obj:set_acceleration({x=dropdir.x*-3, y=-9.8, z=dropdir.z*-3}) end - return item - end, - stack_max = 1, - _on_dispense = function(stack, dispenserpos, droppos, dropnode, dropdir) - local s_pos = vector.add(dispenserpos, vector.multiply(dropdir, 0.51)) - local pos = {x=s_pos.x+dropdir.x,y=s_pos.y+dropdir.y,z=s_pos.z+dropdir.z} - minetest.sound_play("mcl_throwing_throw", {pos = pos, gain = 0.4, max_hear_distance = 16}, true) - local obj = minetest.add_entity(pos, id.."_flying") - local velocity = 22 - obj:set_velocity({x=dropdir.x*velocity,y=dropdir.y*velocity,z=dropdir.z*velocity}) - obj:set_acceleration({x=dropdir.x*-3, y=-9.8, z=dropdir.z*-3}) - end -}) + }) -local w = 0.7 + local w = 0.7 -minetest.register_entity(id.."_flying",{ - textures = {lingering_image(color)}, - hp_max = 1, - visual_size = {x=w/2,y=w/2}, - collisionbox = {-0.1,-0.1,-0.1,0.1,0.1,0.1}, - pointable = false, - on_step = function(self, dtime) - local pos = self.object:get_pos() - local node = minetest.get_node(pos) - local n = node.name - local g = minetest.get_item_group(n, "liquid") - local d = 4 - if n ~= "air" and n ~= "mcl_portals:portal" and n ~= "mcl_portals:portal_end" and g == 0 or mcl_potions.is_obj_hit(self, pos) then - minetest.sound_play("mcl_potions_breaking_glass", {pos = pos, max_hear_distance = 16, gain = 1}) - add_lingering_effect(pos, color, def, name == "water") - local texture - if name == "water" then - texture = "mcl_particles_droplet_bottle.png" - else - if def.instant then - texture = "mcl_particles_instant_effect.png" + minetest.register_entity(id.."_flying",{ + textures = {lingering_image(color)}, + hp_max = 1, + visual_size = {x=w/2,y=w/2}, + collisionbox = {-0.1,-0.1,-0.1,0.1,0.1,0.1}, + pointable = false, + on_step = function(self, dtime) + local pos = self.object:get_pos() + local node = minetest.get_node(pos) + local n = node.name + local g = minetest.get_item_group(n, "liquid") + local d = 4 + if mod_target and n == "mcl_target:target_off" then + mcl_target.hit(vector.round(pos), 0.4) --4 redstone ticks + end + if n ~= "air" and n ~= "mcl_portals:portal" and n ~= "mcl_portals:portal_end" and g == 0 or mcl_potions.is_obj_hit(self, pos) then + minetest.sound_play("mcl_potions_breaking_glass", {pos = pos, max_hear_distance = 16, gain = 1}) + add_lingering_effect(pos, color, def, name == "water") + local texture + if name == "water" then + texture = "mcl_particles_droplet_bottle.png" else - texture = "mcl_particles_effect.png" + if def.instant then + texture = "mcl_particles_instant_effect.png" + else + texture = "mcl_particles_effect.png" + end end + linger_particles(pos, d, texture, color) + if name == "water" then + mcl_potions._extinguish_nearby_fire(pos, d) + end + self.object:remove() end - linger_particles(pos, d, texture, color) - if name == "water" then - mcl_potions._extinguish_nearby_fire(pos, d) - end - self.object:remove() - end - end, -}) + end, + }) end diff --git a/mods/ITEMS/mcl_potions/splash.lua b/mods/ITEMS/mcl_potions/splash.lua index 112b58754..730796952 100644 --- a/mods/ITEMS/mcl_potions/splash.lua +++ b/mods/ITEMS/mcl_potions/splash.lua @@ -1,6 +1,8 @@ local S = minetest.get_translator(minetest.get_current_modname()) local GRAVITY = tonumber(minetest.settings:get("movement_gravity")) +local mod_target = minetest.get_modpath("mcl_target") + local function splash_image(colorstring, opacity) if not opacity then opacity = 127 @@ -66,6 +68,9 @@ function mcl_potions.register_splash(name, descr, color, def) local g = minetest.get_item_group(n, "liquid") local d = 0.1 local redux_map = {7/8,0.5,0.25} + if mod_target and n == "mcl_target:target_off" then + mcl_target.hit(vector.round(pos), 0.4) --4 redstone ticks + end if n ~= "air" and n ~= "mcl_portals:portal" and n ~= "mcl_portals:portal_end" and g == 0 or mcl_potions.is_obj_hit(self, pos) then minetest.sound_play("mcl_potions_breaking_glass", {pos = pos, max_hear_distance = 16, gain = 1}) local texture, acc @@ -105,7 +110,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 907580aef..231a261f4 100644 --- a/mods/ITEMS/mcl_potions/tipped_arrow.lua +++ b/mods/ITEMS/mcl_potions/tipped_arrow.lua @@ -1,5 +1,7 @@ local S = minetest.get_translator(minetest.get_current_modname()) +local mod_target = minetest.get_modpath("mcl_target") + local math = math -- Time in seconds after which a stuck arrow is deleted @@ -208,35 +210,40 @@ function mcl_potions.register_arrow(name, desc, color, def) end -- Iterate through all objects and remember the closest attackable object - for k, obj in pairs(objs) do - local ok = false - -- Arrows can only damage players and mobs - if obj ~= self._shooter and obj:is_player() then - ok = true - elseif obj:get_luaentity() then - if obj ~= self._shooter and obj:get_luaentity()._cmi_is_mob then + local arrow_dir = self.object:get_velocity() + --create a raycast from the arrow based on the velocity of the arrow to deal with lag + local raycast = minetest.raycast(pos, vector.add(pos, vector.multiply(arrow_dir, 0.1)), true, false) + for hitpoint in raycast do + if hitpoint.type == "object" then + -- find the closest object that is in the way of the arrow + local ok = false + if hitpoint.ref:is_player() then ok = true + elseif hitpoint.ref:get_luaentity() then + if (hitpoint.ref:get_luaentity().is_mob or hitpoint.ref:get_luaentity()._hittable_by_projectile) then + ok = true + end end - end - - if ok then - local dist = vector.distance(pos, obj:get_pos()) - if not closest_object or not closest_distance then - closest_object = obj - closest_distance = dist - elseif dist < closest_distance then - closest_object = obj - closest_distance = dist + if ok then + local dist = vector.distance(hitpoint.ref:get_pos(), pos) + if not closest_object or not closest_distance then + closest_object = hitpoint.ref + closest_distance = dist + elseif dist < closest_distance then + closest_object = hitpoint.ref + closest_distance = dist + end end end end + -- If an attackable object was found, we will damage the closest one only if closest_object then 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 @@ -342,6 +349,11 @@ function mcl_potions.register_arrow(name, desc, color, def) self.object:set_velocity({x=0, y=0, z=0}) self.object:set_acceleration({x=0, y=0, z=0}) + -- Activate target + if mod_target and snode.name == "mcl_target:target_off" then + mcl_target.hit(self._stuckin, 1) --10 redstone ticks + end + -- Push the button! Push, push, push the button! if mod_button and minetest.get_item_group(node.name, "button") > 0 and minetest.get_item_group(node.name, "button_push_by_arrow") == 1 then local bdir = minetest.wallmounted_to_dir(node.param2) diff --git a/mods/ITEMS/mcl_raw_ores/init.lua b/mods/ITEMS/mcl_raw_ores/init.lua index 2fc65813b..df3c8aa72 100644 --- a/mods/ITEMS/mcl_raw_ores/init.lua +++ b/mods/ITEMS/mcl_raw_ores/init.lua @@ -1,10 +1,14 @@ +<<<<<<< HEAD local S = minetest.get_translator(minetest.get_current_modname()) +======= +>>>>>>> mcl2/master local function register_raw_ore(description, n) local ore = description:lower() local n = n or "" local raw_ingot = "mcl_raw_ores:raw_"..ore local texture = "mcl_raw_ores_raw_"..ore +<<<<<<< HEAD minetest.register_craftitem(raw_ingot, { description = S("Raw "..description), _doc_items_longdesc = S("Raw "..ore..". Mine a"..n.." "..ore.." ore to get it."), @@ -18,33 +22,63 @@ local function register_raw_ore(description, n) tiles = { texture.."_block.png" }, is_ground_content = false, stack_max = 64, +======= + + minetest.register_craftitem(raw_ingot, { + description = ("Raw "..description), + _doc_items_longdesc = ("Raw "..ore..". Mine a"..n.." "..ore.." ore to get it."), + inventory_image = texture..".png", + groups = { craftitem = 1 }, + }) + + minetest.register_node(raw_ingot.."_block", { + description = ("Block of Raw "..description), + _doc_items_longdesc = ("A block of raw "..ore.." is mostly a decorative block but also useful as a compact storage of raw "..ore.."."), + tiles = { texture.."_block.png" }, + is_ground_content = false, +>>>>>>> mcl2/master groups = { pickaxey = 2, building_block = 1 }, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, }) +<<<<<<< HEAD minetest.override_item("mcl_core:stone_with_"..ore, { drop = raw_ingot, _mcl_fortune_drop = mcl_core.fortune_drop_ore, }) +======= + +>>>>>>> mcl2/master minetest.register_craft({ output = raw_ingot.."_block", recipe = { { raw_ingot, raw_ingot, raw_ingot }, { raw_ingot, raw_ingot, raw_ingot }, { raw_ingot, raw_ingot, raw_ingot }, +<<<<<<< HEAD } }) +======= + }, + }) + +>>>>>>> mcl2/master minetest.register_craft({ type = "cooking", output = "mcl_core:"..ore.."_ingot", recipe = raw_ingot, cooktime = 10, }) +<<<<<<< HEAD +======= + +>>>>>>> mcl2/master minetest.register_craft({ output = raw_ingot.." 9", recipe = { { raw_ingot.."_block" }, +<<<<<<< HEAD } }) end @@ -56,3 +90,11 @@ register_raw_ore("Gold") +======= + }, + }) +end + +register_raw_ore("Iron", "n") +register_raw_ore("Gold") +>>>>>>> mcl2/master diff --git a/mods/ITEMS/mcl_raw_ores/mod.conf b/mods/ITEMS/mcl_raw_ores/mod.conf index 2b74acdf0..86ac1ab54 100644 --- a/mods/ITEMS/mcl_raw_ores/mod.conf +++ b/mods/ITEMS/mcl_raw_ores/mod.conf @@ -1,4 +1,8 @@ name = mcl_raw_ores author = NO11 depends = mcl_core +<<<<<<< HEAD description = Adds raw iron and raw gold. +======= +description = Adds raw iron and raw gold. +>>>>>>> mcl2/master diff --git a/mods/ITEMS/mcl_shields/init.lua b/mods/ITEMS/mcl_shields/init.lua index feff76cd8..e02ac9212 100644 --- a/mods/ITEMS/mcl_shields/init.lua +++ b/mods/ITEMS/mcl_shields/init.lua @@ -8,7 +8,11 @@ mcl_shields = { player = true, arrow = true, generic = true, +<<<<<<< HEAD explosion = true, -- ghasts don't work +======= + explosion = true, +>>>>>>> mcl2/master dragon_breath = true, }, enchantments = {"mending", "unbreaking"}, @@ -22,8 +26,11 @@ interact_priv.give_to_admin = false local overlay = mcl_enchanting.overlay local hud = "mcl_shield_hud.png" +<<<<<<< HEAD local is_player = mcl_util.is_player +======= +>>>>>>> mcl2/master minetest.register_tool("mcl_shields:shield", { description = S("Shield"), _doc_items_longdesc = S("A shield is a tool used for protecting the player against attacks."), @@ -32,7 +39,11 @@ minetest.register_tool("mcl_shields:shield", { groups = { shield = 1, weapon = 1, +<<<<<<< HEAD enchantability = 1, +======= + enchantability = -1, +>>>>>>> mcl2/master no_wieldview = 1, offhand_item = 1, }, @@ -69,6 +80,7 @@ minetest.register_entity("mcl_shields:shield_entity", { }, _blocking = false, _shield_number = 2, +<<<<<<< HEAD on_step = function(self, dtime, moveresult) local player = self.object:get_attach() if player then @@ -101,6 +113,44 @@ minetest.register_entity("mcl_shields:shield_entity", { else self.object:remove() end +======= + _texture_copy = "", + on_step = function(self, dtime, moveresult) + local player = self.object:get_attach() + if not player then + self.object:remove() + return + end + local shield_texture = "mcl_shield_base_nopattern.png" + local i = self._shield_number + local item = wielded_item(player, i) + + if item ~= "mcl_shields:shield" and item ~= "mcl_shields:shield_enchanted" then + local itemstack = player:get_wielded_item() + if i == 1 then + itemstack = player:get_inventory():get_stack("offhand", 1) + end + local meta_texture = itemstack:get_meta():get_string("mcl_shields:shield_custom_pattern_texture") + if meta_texture ~= "" then + shield_texture = meta_texture + else + local color = minetest.registered_items[item]._shield_color + if color then + shield_texture = "mcl_shield_base_nopattern.png^(mcl_shield_pattern_base.png^[colorize:" .. color .. ")" + end + end + end + + if shield_is_enchanted(player, i) then + shield_texture = shield_texture .. overlay + end + + if self._texture_copy ~= shield_texture then + self.object:set_properties({textures = {shield_texture}}) + end + + self._texture_copy = shield_texture +>>>>>>> mcl2/master end, }) @@ -109,6 +159,7 @@ for _, e in pairs(mcl_shields.enchantments) do end function mcl_shields.is_blocking(obj) +<<<<<<< HEAD if not mcl_util or not mcl_util.is_player(obj) then return end local blocking = mcl_shields.players[obj].blocking if blocking > 0 then @@ -118,12 +169,26 @@ function mcl_shields.is_blocking(obj) end return blocking, shieldstack end +======= + if not obj:is_player() then return end + local blocking = mcl_shields.players[obj].blocking + if blocking <= 0 then + return + end + + local shieldstack = obj:get_wielded_item() + if blocking == 1 then + shieldstack = obj:get_inventory():get_stack("offhand", 1) + end + return blocking, shieldstack +>>>>>>> mcl2/master end mcl_damage.register_modifier(function(obj, damage, reason) local type = reason.type local damager = reason.direct local blocking, shieldstack = mcl_shields.is_blocking(obj) +<<<<<<< HEAD if is_player(obj) and blocking and mcl_shields.types[type] and damager then local entity = damager:get_luaentity() if entity and (type == "arrow" or type == "generic") then @@ -148,6 +213,46 @@ mcl_damage.register_modifier(function(obj, damage, reason) return 0 end end +======= + + if not (obj:is_player() and blocking and mcl_shields.types[type] and damager) then + return + end + + local entity = damager:get_luaentity() + if entity and entity._shooter then + damager = entity._shooter + end + + local dpos = damager:get_pos() + + -- Used for removed / killed entities before the projectile hits the player + if entity and not entity._shooter and entity._saved_shooter_pos then + dpos = entity._saved_shooter_pos + end + + if not dpos or vector.dot(obj:get_look_dir(), vector.subtract(dpos, obj:get_pos())) < 0 then + return + end + + local durability = 336 + local unbreaking = mcl_enchanting.get_enchantment(shieldstack, mcl_shields.enchantments[2]) + if unbreaking > 0 then + durability = durability * (unbreaking + 1) + end + + if not minetest.is_creative_enabled(obj:get_player_name()) and damage >= 3 then + shieldstack:add_wear(65535 / durability) + if blocking == 2 then + obj:set_wielded_item(shieldstack) + else + obj:get_inventory():set_stack("offhand", 1, shieldstack) + mcl_inventory.update_inventory_formspec(obj) + end + end + minetest.sound_play({name = "mcl_block"}) + return 0 +>>>>>>> mcl2/master end) local function modify_shield(player, vpos, vrot, i) @@ -155,6 +260,7 @@ local function modify_shield(player, vpos, vrot, i) if i == 1 then arm = "Left" end +<<<<<<< HEAD local player_data = mcl_shields.players[player] if not player_data then return end local shields = player_data.shields @@ -162,6 +268,12 @@ local function modify_shield(player, vpos, vrot, i) local shield = shields[i] if not shield then return end shield:set_attach(player, "Arm_" .. arm, vpos, vrot, false) +======= + local shield = mcl_shields.players[player].shields[i] + if shield then + shield:set_attach(player, "Arm_" .. arm, vpos, vrot, false) + end +>>>>>>> mcl2/master end local function set_shield(player, block, i) @@ -180,20 +292,38 @@ local function set_shield(player, block, i) end local shield = mcl_shields.players[player].shields[i] if not shield then return end +<<<<<<< HEAD local luaentity = shield:get_luaentity() if not luaentity then return end +======= + + local luaentity = shield:get_luaentity() + if not luaentity then return end + +>>>>>>> mcl2/master luaentity._blocking = block end local function set_interact(player, interact) local player_name = player:get_player_name() local privs = minetest.get_player_privs(player_name) +<<<<<<< HEAD if privs.interact ~= interact then local meta = player:get_meta() if meta:get_int("interact_revoked") ~= 1 then privs.interact = interact minetest.set_player_privs(player_name, privs) end +======= + if privs.interact == interact then + return + end + local meta = player:get_meta() + if meta:get_int("mcl_privs:interact_revoked") ~= 1 then + privs.interact = interact + minetest.set_player_privs(player_name, privs) + meta:set_int("mcl_privs:interact_revoked",0) +>>>>>>> mcl2/master end end @@ -207,7 +337,11 @@ local function remove_shield_hud(player) set_shield(player, false, 2) end +<<<<<<< HEAD local hf=player:hud_get_flags() +======= + local hf = player:hud_get_flags() +>>>>>>> mcl2/master if not hf.wielditem then player:hud_set_flags({wielditem = true}) end @@ -234,6 +368,7 @@ end local function handle_blocking(player) local player_shield = mcl_shields.players[player] local rmb = player:get_player_control().RMB +<<<<<<< HEAD if rmb then local shield_in_offhand = mcl_shields.wielding_shield(player, 1) local shield_in_hand = mcl_shields.wielding_shield(player) @@ -267,6 +402,45 @@ local function handle_blocking(player) end else player_shield.blocking = 0 +======= + if not rmb then + player_shield.blocking = 0 + return + end + + local shield_in_offhand = mcl_shields.wielding_shield(player, 1) + local shield_in_hand = mcl_shields.wielding_shield(player) + local not_blocking = player_shield.blocking == 0 + + local pos = player:get_pos() + if shield_in_hand then + if not_blocking then + minetest.after(0.25, function() + if (not_blocking or not shield_in_offhand) and shield_in_hand and rmb then + player_shield.blocking = 2 + set_shield(player, true, 2) + end + end) + elseif not shield_in_offhand then + player_shield.blocking = 2 + end + elseif shield_in_offhand then + local offhand_can_block = (wielded_item(player) == "" or not mcl_util.get_pointed_thing(player, true)) + and (minetest.get_item_group(wielded_item(player), "bow") ~= 1 and minetest.get_item_group(wielded_item(player), "crossbow") ~= 1) + + if not offhand_can_block then + return + end + if not_blocking then + minetest.after(0.25, function() + if (not_blocking or not shield_in_hand) and shield_in_offhand and rmb and offhand_can_block then + player_shield.blocking = 1 + set_shield(player, true, 1) + end + end) + elseif not shield_in_hand then + player_shield.blocking = 1 +>>>>>>> mcl2/master end else player_shield.blocking = 0 @@ -292,13 +466,85 @@ local function update_shield_entity(player, blocking, i) end end +<<<<<<< HEAD minetest.register_globalstep(function(dtime) for _, player in pairs(minetest.get_connected_players()) do if is_player(player) then +======= +local function add_shield_hud(shieldstack, player, blocking) + local texture = hud + if mcl_enchanting.is_enchanted(shieldstack:get_name()) then + texture = texture .. overlay + end + local offset = 100 + if blocking == 1 then + texture = texture .. "^[transform4" + offset = -100 + else + player:hud_set_flags({wielditem = false}) + end + shield_hud[player] = player:hud_add({ + hud_elem_type = "image", + position = {x = 0.5, y = 0.5}, + scale = {x = -101, y = -101}, + offset = {x = offset, y = 0}, + text = texture, + z_index = -200, + }) + playerphysics.add_physics_factor(player, "speed", "shield_speed", 0.5) + set_interact(player, nil) +end + +local function update_shield_hud(player, blocking, shieldstack) + local shieldhud = shield_hud[player] + if not shieldhud then + add_shield_hud(shieldstack, player, blocking) + return + end + + local wielditem = player:hud_get_flags().wielditem + if blocking == 1 then + if not wielditem then + player:hud_change(shieldhud, "text", hud .. "^[transform4") + player:hud_change(shieldhud, "offset", {x = -100, y = 0}) + player:hud_set_flags({wielditem = true}) + end + elseif wielditem then + player:hud_change(shieldhud, "text", hud) + player:hud_change(shieldhud, "offset", {x = 100, y = 0}) + player:hud_set_flags({wielditem = false}) + end + + local image = player:hud_get(shieldhud).text + local enchanted = hud .. overlay + local enchanted1 = image == enchanted + local enchanted2 = image == enchanted .. "^[transform4" + if mcl_enchanting.is_enchanted(shieldstack:get_name()) then + if not enchanted1 and not enchanted2 then + if blocking == 1 then + player:hud_change(shieldhud, "text", hud .. overlay .. "^[transform4") + else + player:hud_change(shieldhud, "text", hud .. overlay) + end + end + elseif enchanted1 or enchanted2 then + if blocking == 1 then + player:hud_change(shieldhud, "text", hud .. "^[transform4") + else + player:hud_change(shieldhud, "text", hud) + end + end +end + +minetest.register_globalstep(function(dtime) + for _, player in pairs(minetest.get_connected_players()) do + +>>>>>>> mcl2/master handle_blocking(player) local blocking, shieldstack = mcl_shields.is_blocking(player) if blocking then +<<<<<<< HEAD local shieldhud = shield_hud[player] if not shieldhud then local texture = hud @@ -358,6 +604,9 @@ minetest.register_globalstep(function(dtime) end end end +======= + update_shield_hud(player, blocking, shieldstack) +>>>>>>> mcl2/master else remove_shield_hud(player) end @@ -365,7 +614,11 @@ minetest.register_globalstep(function(dtime) for i = 1, 2 do update_shield_entity(player, blocking, i) end +<<<<<<< HEAD end end +======= + end +>>>>>>> mcl2/master end) minetest.register_on_dieplayer(function(player) @@ -391,7 +644,12 @@ minetest.register_craft({ }) for _, colortab in pairs(mcl_banners.colors) do +<<<<<<< HEAD minetest.register_tool("mcl_shields:shield_" .. colortab[1], { +======= + local color = colortab[1] + minetest.register_tool("mcl_shields:shield_" .. color, { +>>>>>>> mcl2/master description = S(colortab[6] .. " Shield"), _doc_items_longdesc = S("A shield is a tool used for protecting the player against attacks."), inventory_image = "mcl_shield.png^(mcl_shield_item_overlay.png^[colorize:" .. colortab[4] ..")", @@ -399,7 +657,11 @@ for _, colortab in pairs(mcl_banners.colors) do groups = { shield = 1, weapon = 1, +<<<<<<< HEAD enchantability = 1, +======= + enchantability = -1, +>>>>>>> mcl2/master no_wieldview = 1, not_in_creative_inventory = 1, offhand_item = 1, @@ -410,12 +672,26 @@ for _, colortab in pairs(mcl_banners.colors) do _shield_color = colortab[4], }) +<<<<<<< HEAD local banner = "mcl_banners:banner_item_" .. colortab[1] minetest.register_craft({ type = "shapeless", output = "mcl_shields:shield_" .. colortab[1], recipe = {"mcl_shields:shield", banner}, }) +======= + local banner = "mcl_banners:banner_item_" .. color + minetest.register_craft({ + type = "shapeless", + output = "mcl_shields:shield_" .. color, + recipe = {"mcl_shields:shield", banner}, + }) + minetest.register_craft({ + type = "shapeless", + output = "mcl_shields:shield_" .. color .. "_enchanted", + recipe = {"mcl_shields:shield_enchanted", banner}, + }) +>>>>>>> mcl2/master end local function to_shield_texture(banner_texture) @@ -427,6 +703,7 @@ local function to_shield_texture(banner_texture) end local function craft_banner_on_shield(itemstack, player, old_craft_grid, craft_inv) +<<<<<<< HEAD if string.find(itemstack:get_name(), "mcl_shields:shield_") then local shield_stack for i = 1, player:get_inventory():get_size("craft") do @@ -457,6 +734,40 @@ local function craft_banner_on_shield(itemstack, player, old_craft_grid, craft_i end end return itemstack +======= + if not string.find(itemstack:get_name(), "mcl_shields:shield_") then + return itemstack + end + + local shield_stack + for i = 1, player:get_inventory():get_size("craft") do + local stack = old_craft_grid[i] + local name = stack:get_name() + if minetest.get_item_group(name, "shield") then + shield_stack = stack + break + end + end + + for i = 1, player:get_inventory():get_size("craft") do + local banner_stack = old_craft_grid[i] + local banner_name = banner_stack:get_name() + if string.find(banner_name, "mcl_banners:banner") and shield_stack then + local banner_meta = banner_stack:get_meta() + local layers_meta = banner_meta:get_string("layers") + local new_shield_meta = itemstack:get_meta() + if layers_meta ~= "" then + local color = mcl_banners.color_reverse(banner_name) + local layers = minetest.deserialize(layers_meta) + local texture = mcl_banners.make_banner_texture(color, layers) + new_shield_meta:set_string("description", mcl_banners.make_advanced_banner_description(itemstack:get_description(), layers)) + new_shield_meta:set_string("mcl_shields:shield_custom_pattern_texture", to_shield_texture(texture)) + end + itemstack:set_wear(shield_stack:get_wear()) + break + end + end +>>>>>>> mcl2/master end minetest.register_craft_predict(function(itemstack, player, old_craft_grid, craft_inv) diff --git a/mods/ITEMS/mcl_signs/locale/mcl_signs.zh_TW.tr b/mods/ITEMS/mcl_signs/locale/mcl_signs.zh_TW.tr new file mode 100644 index 000000000..62994bc3d --- /dev/null +++ b/mods/ITEMS/mcl_signs/locale/mcl_signs.zh_TW.tr @@ -0,0 +1,9 @@ +# textdomain: mcl_signs +Sign=告示牌 +Signs can be written and come in two variants: Wall sign and sign on a sign post. Signs can be placed on the top and the sides of other blocks, but not below them.=告示牌可以寫字,有兩種變體:牆上的告示牌和柱上的告示牌。告示牌可以放在其他方塊的頂部和側面,但不能放在下面。 +After placing the sign, you can write something on it. You have 4 lines of text with up to 15 characters for each line; anything beyond these limits is lost. Not all characters are supported. The text can not be changed once it has been written; you have to break and place the sign again.=放置告示牌後,你可以在上面寫東西。你最多可以寫4行文字,每行最多可以寫15個字符;超過這些限制的文字就會丟失。不是所有的字符都被支持。文字一旦寫完就不能更改;你必須打破並重新放置標誌。 +Enter sign text:=輸入告示牌文字: +Maximum line length: 15=每行最多可以寫15個字符 +Maximum lines: 4=最多可以寫4行文字 +Done=確認 +Can be written=可以寫字 diff --git a/mods/ITEMS/mcl_smithing_table/init.lua b/mods/ITEMS/mcl_smithing_table/init.lua index 1f2e2fbc6..57429f00f 100644 --- a/mods/ITEMS/mcl_smithing_table/init.lua +++ b/mods/ITEMS/mcl_smithing_table/init.lua @@ -17,6 +17,7 @@ function mcl_smithing_table.upgrade_item(itemstack) local itemname = itemstack:get_name() +<<<<<<< HEAD local upgrade_item = def._mcl_upgrade_item if upgrade_item and mcl_enchanting.is_enchanted(itemname) then @@ -24,6 +25,9 @@ function mcl_smithing_table.upgrade_item(itemstack) end upgrade_item = upgrade_item or itemname:gsub("diamond", "netherite") +======= + local upgrade_item = def._mcl_upgrade_item or itemname:gsub("diamond", "netherite") +>>>>>>> mcl2/master if upgrade_item == itemname then return @@ -32,6 +36,10 @@ function mcl_smithing_table.upgrade_item(itemstack) itemstack:set_name(upgrade_item) -- Reload the ToolTips of the tool +<<<<<<< HEAD +======= + +>>>>>>> mcl2/master tt.reload_itemstack_description(itemstack) -- Only return itemstack if upgrade was successfull @@ -42,6 +50,7 @@ end -- ToDo: Make better formspec local formspec = "size[9,9]" .. +<<<<<<< HEAD "label[0,4.0;" .. minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))) .. "]" .. "list[current_player;main;0,4.5;9,3;9]" .. mcl_formspec.get_itemslot_bg(0,4.5,9,3) .. @@ -58,6 +67,25 @@ local formspec = "size[9,9]" .. "listring[current_player;main]".. "listring[context;input]".. "listring[current_player;main]" +======= + "background[-0.19,-0.25;9.41,9.49;mcl_smithing_table_inventory.png]".. + "label[0,4.0;" .. minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))) .. "]" .. + "list[current_player;main;0,4.5;9,3;9]" .. + mcl_formspec.get_itemslot_bg(0,4.5,9,3) .. + "list[current_player;main;0,7.74;9,1;]" .. + mcl_formspec.get_itemslot_bg(0,7.74,9,1) .. + "list[context;diamond_item;1,2.5;1,1;]" .. + mcl_formspec.get_itemslot_bg(1,2.5,1,1) .. + "list[context;netherite;4,2.5;1,1;]" .. + mcl_formspec.get_itemslot_bg(4,2.5,1,1) .. + "list[context;upgraded_item;8,2.5;1,1;]" .. + mcl_formspec.get_itemslot_bg(8,2.5,1,1) .. + "label[3,0.1;" .. minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Upgrade Gear"))) .. "]" .. + "listring[context;output]".. + "listring[current_player;main]".. + "listring[context;input]".. + "listring[current_player;main]" +>>>>>>> mcl2/master local function reset_upgraded_item(pos) local inv = minetest.get_meta(pos):get_inventory() @@ -78,13 +106,23 @@ minetest.register_node("mcl_smithing_table:table", { groups = {pickaxey = 2, deco_block = 1}, tiles = { +<<<<<<< HEAD "mcl_smithing_table_top.png", "mcl_smithing_table_bottom.png", "mcl_smithing_table_side.png", "mcl_smithing_table_side.png", "mcl_smithing_table_side.png", "mcl_smithing_table_front.png" +======= + "mcl_smithing_table_top.png", + "mcl_smithing_table_bottom.png", + "mcl_smithing_table_side.png", + "mcl_smithing_table_side.png", + "mcl_smithing_table_side.png", + "mcl_smithing_table_front.png", +>>>>>>> mcl2/master }, sounds = mcl_sounds.node_sound_metal_defaults(), on_construct = function(pos) +<<<<<<< HEAD local meta = minetest.get_meta(pos) meta:set_string("formspec", formspec) @@ -94,6 +132,17 @@ minetest.register_node("mcl_smithing_table:table", { inv:set_size("netherite", 1) inv:set_size("upgraded_item", 1) end, +======= + local meta = minetest.get_meta(pos) + meta:set_string("formspec", formspec) + + local inv = meta:get_inventory() + + inv:set_size("diamond_item", 1) + inv:set_size("netherite", 1) + inv:set_size("upgraded_item", 1) + end, +>>>>>>> mcl2/master allow_metadata_inventory_put = function(pos, listname, index, stack, player) if listname == "diamond_item" and mcl_smithing_table.upgrade_item(stack) or listname == "netherite" and stack:get_name() == "mcl_nether:netherite_ingot" then diff --git a/mods/ITEMS/mcl_smithing_table/locale/mcl_anvils.de.tr b/mods/ITEMS/mcl_smithing_table/locale/mcl_anvils.de.tr new file mode 100644 index 000000000..9e7d88337 --- /dev/null +++ b/mods/ITEMS/mcl_smithing_table/locale/mcl_anvils.de.tr @@ -0,0 +1,16 @@ +# textdomain: mcl_anvils +Set Name=Name setzen +Repair and Name=Reparieren und benennen +Inventory=Inventar +Anvil=Amboss +The anvil allows you to repair tools and armor, and to give names to items. It has a limited durability, however. Don't let it fall on your head, it could be quite painful!=Der Amboss ermöglicht es, Werkzeuge und Rüstung zu reparieren und Gegenstände zu benennen. Er hat jedoch eine begrenzte Lebensdauer. Lassen Sie ihn nicht auf Ihren Kopf fallen, das könnte ziemlich schmerzhaft sein! +To use an anvil, rightclick it. An anvil has 2 input slots (on the left) and one output slot.=Um einen Amboss zu benutzen, rechtsklicken Sie auf ihn. Ein Amboss hat 2 Eingabeplätze (links) und einen Ausgabeplatz (rechts). +To rename items, put an item stack in one of the item slots while keeping the other input slot empty. Type in a name, hit enter or “Set Name”, then take the renamed item from the output slot.=Um Gegenstände umzubenennen, platzieren Sie einen Gegenstand in einen der Eingangsplätze und lassen Sie den anderen frei. Geben Sie einen Namen ein und drücken Sie die Eingabetaste oder „Name setzen”, dann nehmen Sie den umbenannten Gegenstand an sich. +There are two possibilities to repair tools (and armor):=Es gibt zwei Möglichkeiten, Werkzeuge (und Rüstung) zu reparieren: +• Tool + Tool: Place two tools of the same type in the input slots. The “health” of the repaired tool is the sum of the “health” of both input tools, plus a 12% bonus.=• Werkzeug + Werkzeug: Platzieren sie zwei gleiche Werkzeuge in die Eingangsplätze. Der Zustand des reparierten Werkzeugs ist die Summe des Zustands beider Eingangswerkzeuge, plus einem Bonus von 12%. +• Tool + Material: Some tools can also be repaired by combining them with an item that it's made of. For example, iron pickaxes can be repaired with iron ingots. This repairs the tool by 25%.=• Werkzeug + Material: Einige Werkzeuge können auch repariert werden, indem man sie mit einem Gegenstand, aus dem sie gemacht worden sind, kombiniert. Zum Beispiel können Eisenspitzhacken mit Eisenbarren repariert werden. Dadurch wird das Werkzeug um 25% repariert. +Armor counts as a tool. It is possible to repair and rename a tool in a single step.=Rüstung zählt als Werkzeug. Es ist möglich, ein Werkzeug in einem Arbeitsschritt zu reparieren und zu benennen. +The anvil has limited durability and 3 damage levels: undamaged, slightly damaged and very damaged. Each time you repair or rename something, there is a 12% chance the anvil gets damaged. Anvils also have a chance of being damaged when they fall by more than 1 block. If a very damaged anvil is damaged again, it is destroyed.=Der Amboss hat begrenze Lebensdauer und 3 Schadensstufen: Kein Schaden, leicht beschädigt, und stark beschädigt. Jedes mal, wenn Sie etwas reparieren oder umbenennen, gibt es eine 12%-ige Chance, dass der Amboss Schaden nimmt. Ambosse können auch beschädigt werden, wenn sie um mehr als 1 Block fallen. Wenn ein sehr beschädigter Amboss erneut beschädigt wird, wird er zerstört. +Slightly Damaged Anvil=Leicht beschädigter Amboss +Very Damaged Anvil=Stark beschädigter Amboss +Repair and rename items=Für die Reparatur und Umbenennung von Gegenständen diff --git a/mods/ITEMS/mcl_smithing_table/locale/mcl_anvils.es.tr b/mods/ITEMS/mcl_smithing_table/locale/mcl_anvils.es.tr new file mode 100644 index 000000000..7212b92ba --- /dev/null +++ b/mods/ITEMS/mcl_smithing_table/locale/mcl_anvils.es.tr @@ -0,0 +1,15 @@ +# textdomain: mcl_anvils +Set Name=Establece un nombre +Repair and Name=Reparar y nombrar +Inventory=Inventario +Anvil=Yunque +The anvil allows you to repair tools and armor, and to give names to items. It has a limited durability, however. Don't let it fall on your head, it could be quite painful!=El yunque le permite reparar herramientas y armaduras, y dar nombres a los elementos. Sin embargo, tiene una durabilidad limitada. No lo dejes caer sobre tu cabeza, ¡podría ser bastante doloroso! +To use an anvil, rightclick it. An anvil has 2 input slots (on the left) and one output slot.=Para usar un yunque, haga clic derecho sobre él. Un yunque tiene 2 ranuras de entrada (a la izquierda) y una ranura de salida. +To rename items, put an item stack in one of the item slots while keeping the other input slot empty. Type in a name, hit enter or “Set Name”, then take the renamed item from the output slot.=Para cambiar el nombre de los elementos, coloque una pila de elementos en una de las ranuras de elementos mientras mantiene vacía la otra ranura de entrada. Escriba un nombre, presione enter o "Establecer nombre", luego obtenga el elemento renombrado en la ranura de salida. +There are two possibilities to repair tools (and armor):=Hay dos posibilidades para reparar herramientas (y armaduras): +• Tool + Tool: Place two tools of the same type in the input slots. The “health” of the repaired tool is the sum of the “health” of both input tools, plus a 12% bonus.=• Herramienta + Herramienta: Coloque dos herramientas del mismo tipo en las ranuras de entrada. La "salud" de la herramienta reparada es la suma de la "salud" de ambas herramientas, con un bono del 12%. +• Tool + Material: Some tools can also be repaired by combining them with an item that it's made of. For example, iron pickaxes can be repaired with iron ingots. This repairs the tool by 25%.=• Herramienta + Material: Algunas herramientas también pueden repararse combinándolas con un elemento del que está hecho. Por ejemplo, los picos de hierro pueden repararse con lingotes de hierro. Esto repara la herramienta en un 25%. +Armor counts as a tool. It is possible to repair and rename a tool in a single step.=La armadura cuenta como una herramienta. Es posible reparar y cambiar el nombre de una herramienta en un solo paso. +The anvil has limited durability and 3 damage levels: undamaged, slightly damaged and very damaged. Each time you repair or rename something, there is a 12% chance the anvil gets damaged. Anvils also have a chance of being damaged when they fall by more than 1 block. If a very damaged anvil is damaged again, it is destroyed.=El yunque tiene una durabilidad limitada y 3 niveles de daño: sin daños, ligeramente dañado y muy dañado. Cada vez que reparas o cambias el nombre de algo, hay un 12% de posibilidades de que el yunque se dañe. Los yunques también tienen la posibilidad de dañarse cuando caen en más de 1 bloque. Si un yunque muy dañado se daña nuevamente, se destruye. +Slightly Damaged Anvil=Yunque dañado +Very Damaged Anvil=Yunque muy dañado diff --git a/mods/ITEMS/mcl_smithing_table/locale/mcl_anvils.fr.tr b/mods/ITEMS/mcl_smithing_table/locale/mcl_anvils.fr.tr new file mode 100644 index 000000000..1f03de8e5 --- /dev/null +++ b/mods/ITEMS/mcl_smithing_table/locale/mcl_anvils.fr.tr @@ -0,0 +1,16 @@ +# textdomain: mcl_anvils +Set Name=Définir le Nom +Repair and Name=Réparation et Nomme +Inventory=Inventaire +Anvil=Enclume +The anvil allows you to repair tools and armor, and to give names to items. It has a limited durability, however. Don't let it fall on your head, it could be quite painful!=L'enclume vous permet de réparer des outils et des armures, et de donner des noms à des objets. Il a cependant une durabilité limitée. Ne la laissez pas tomber sur la tête, cela pourrait être assez douloureux! +To use an anvil, rightclick it. An anvil has 2 input slots (on the left) and one output slot.=Pour utiliser une enclume, faites un clic droit dessus. Une enclume a 2 emplacements d'entrée (à gauche) et un emplacement de sortie. +To rename items, put an item stack in one of the item slots while keeping the other input slot empty. Type in a name, hit enter or “Set Name”, then take the renamed item from the output slot.=Pour renommer des objets, placez une pile d'objets dans l'un des emplacements d'objets tout en laissant l'autre emplacement d'entrée vide. Tapez un nom, appuyez sur Entrée ou sur «Définir le nom», puis prenez l'élément renommé dans l'emplacement de sortie. +There are two possibilities to repair tools (and armor):=Il existe deux possibilités pour réparer les outils (et les armures): +• Tool + Tool: Place two tools of the same type in the input slots. The “health” of the repaired tool is the sum of the “health” of both input tools, plus a 12% bonus.=• Outil + Outil: Placez deux outils du même type dans les emplacements d'entrée. La "santé" de l'outil réparé est la somme de la "santé" des deux outils d'entrée, plus un bonus de 12%. +• Tool + Material: Some tools can also be repaired by combining them with an item that it's made of. For example, iron pickaxes can be repaired with iron ingots. This repairs the tool by 25%.=• Outil + Matériel: Certains outils peuvent également être réparés en les combinant avec un élément dont il est fait. Par exemple, les pioches de fer peuvent être réparées avec des lingots de fer. Cela répare l'outil de 25%. +Armor counts as a tool. It is possible to repair and rename a tool in a single step.=L'armure compte comme un outil. Il est possible de réparer et de renommer un outil en une seule étape. +The anvil has limited durability and 3 damage levels: undamaged, slightly damaged and very damaged. Each time you repair or rename something, there is a 12% chance the anvil gets damaged. Anvils also have a chance of being damaged when they fall by more than 1 block. If a very damaged anvil is damaged again, it is destroyed.=L'enclume a une durabilité limitée et 3 niveaux de dommages: en bon état, légèrement endommagé et très endommagé. Chaque fois que vous réparez ou renommez quelque chose, il y a 12% de chances que l'enclume soit endommagée. Les enclumes ont également une chance d'être endommagées lorsqu'elles tombent de plus d'un bloc. Si une enclume très endommagée est à nouveau endommagée, elle est détruite. +Slightly Damaged Anvil=Enclume Légèrement Endommagée +Very Damaged Anvil=Enclume Très Endommagée +Repair and rename items=Réparer et renommer des objets diff --git a/mods/ITEMS/mcl_smithing_table/locale/mcl_anvils.ru.tr b/mods/ITEMS/mcl_smithing_table/locale/mcl_anvils.ru.tr new file mode 100644 index 000000000..20281bd6b --- /dev/null +++ b/mods/ITEMS/mcl_smithing_table/locale/mcl_anvils.ru.tr @@ -0,0 +1,16 @@ +# textdomain: mcl_anvils +Set Name=Дать имя +Repair and Name=Починить и дать имя +Inventory=Инвентарь +Anvil=Наковальня +The anvil allows you to repair tools and armor, and to give names to items. It has a limited durability, however. Don't let it fall on your head, it could be quite painful!=Наковальня позволяет ремонтировать инструменты и защиту, а также давать имена предметам. Но она имеет ограниченный срок службы. Не дайте ей упасть вам на голову, это может быть больно! +To use an anvil, rightclick it. An anvil has 2 input slots (on the left) and one output slot.=Чтобы воспользоваться наковальней, кликните по ней правой кнопкой. Наковальня имеет два входных отсека (слева) и один выходной. +To rename items, put an item stack in one of the item slots while keeping the other input slot empty. Type in a name, hit enter or “Set Name”, then take the renamed item from the output slot.=Для переименования положите стопку предметов в один отсек, второй оставьте пустым. Наберите имя, нажмите [Enter] или “Дать имя” и заберите переименованные предметы из выходного отсека. +There are two possibilities to repair tools (and armor):=Есть два способа отремонтировать инструменты (и защиту): +• Tool + Tool: Place two tools of the same type in the input slots. The “health” of the repaired tool is the sum of the “health” of both input tools, plus a 12% bonus.=• Инструмент + Инструмент: Положите два инструмента одного типа во входные отсеки. “Здоровье” отремонтированного инструмента будет равно сумме “здоровья” каждого из них, плюс 12% бонус. +• Tool + Material: Some tools can also be repaired by combining them with an item that it's made of. For example, iron pickaxes can be repaired with iron ingots. This repairs the tool by 25%.=• Инструмент + Материал: Некоторые инструменты можно также ремонтировать, добавляя к ним предмет, из которого они сделаны. Например, железные кирки ремонтируются добавлением слитков железа. Таким способом инструмент восстанавливается на 25%. +Armor counts as a tool. It is possible to repair and rename a tool in a single step.=Защиты считается за инструмент. Можно ремонтировать и переименовывать за одно действие. +The anvil has limited durability and 3 damage levels: undamaged, slightly damaged and very damaged. Each time you repair or rename something, there is a 12% chance the anvil gets damaged. Anvils also have a chance of being damaged when they fall by more than 1 block. If a very damaged anvil is damaged again, it is destroyed.=Наковальня имеет ограниченный срок службы и 3 уровня износа: новая, немного изношенная, сильно повреждённая. Каждый раз, ремонтируя или переименовывая что-либо, вы имеете 12-процентный шанс повредить наковальню. Наковальни также могут повреждаться, когда они падают с высоте более 1 блока. Если повреждённая наковальня повреждается снова, то она уничтожается. +Slightly Damaged Anvil=Немного изношенная наковальня +Very Damaged Anvil=Сильно повреждённая наковальня +Repair and rename items=Ремонтирует и переименовывает предметы diff --git a/mods/ITEMS/mcl_smithing_table/locale/template.txt b/mods/ITEMS/mcl_smithing_table/locale/template.txt index 6133a22db..49dd8f9c1 100644 --- a/mods/ITEMS/mcl_smithing_table/locale/template.txt +++ b/mods/ITEMS/mcl_smithing_table/locale/template.txt @@ -1,4 +1,23 @@ +<<<<<<< HEAD # textdomain: mcl_smithing_table Inventory= Upgrade Gear= Smithing table= +======= +# textdomain: mcl_anvils +Set Name= +Repair and Name= +Inventory= +Anvil= +The anvil allows you to repair tools and armor, and to give names to items. It has a limited durability, however. Don't let it fall on your head, it could be quite painful!= +To use an anvil, rightclick it. An anvil has 2 input slots (on the left) and one output slot.= +To rename items, put an item stack in one of the item slots while keeping the other input slot empty. Type in a name, hit enter or “Set Name”, then take the renamed item from the output slot.= +There are two possibilities to repair tools (and armor):= +• Tool + Tool: Place two tools of the same type in the input slots. The “health” of the repaired tool is the sum of the “health” of both input tools, plus a 12% bonus.= +• Tool + Material: Some tools can also be repaired by combining them with an item that it's made of. For example, iron pickaxes can be repaired with iron ingots. This repairs the tool by 25%.= +Armor counts as a tool. It is possible to repair and rename a tool in a single step.= +The anvil has limited durability and 3 damage levels: undamaged, slightly damaged and very damaged. Each time you repair or rename something, there is a 12% chance the anvil gets damaged. Anvils also have a chance of being damaged when they fall by more than 1 block. If a very damaged anvil is damaged again, it is destroyed.= +Slightly Damaged Anvil= +Very Damaged Anvil= +Repair and rename items= +>>>>>>> mcl2/master diff --git a/mods/ITEMS/mcl_smoker/README.md b/mods/ITEMS/mcl_smoker/README.md index ba7565f0e..9a2427803 100644 --- a/mods/ITEMS/mcl_smoker/README.md +++ b/mods/ITEMS/mcl_smoker/README.md @@ -1,5 +1,10 @@ +<<<<<<< HEAD Smoker for MineClone 5. Heavily based on Minetest Game (default/furnace.lua) and the MineClone 5 Furnaces. +======= +Smoker for MineClone 2. +Heavily based on Minetest Game (default/furnace.lua) and the MineClone 2 Furnaces. +>>>>>>> mcl2/master License of source code ---------------------- @@ -10,4 +15,8 @@ MCl 2 Furances modified by PrairieWind. License of media ---------------- +<<<<<<< HEAD See the main MineClone 5 README.md file. +======= +See the main MineClone 2 README.md file. +>>>>>>> mcl2/master diff --git a/mods/ITEMS/mcl_smoker/init.lua b/mods/ITEMS/mcl_smoker/init.lua index 8491d70d8..33c428269 100644 --- a/mods/ITEMS/mcl_smoker/init.lua +++ b/mods/ITEMS/mcl_smoker/init.lua @@ -96,7 +96,10 @@ local function allow_metadata_inventory_put(pos, listname, index, stack, player) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() if listname == "fuel" then +<<<<<<< HEAD +======= +>>>>>>> mcl2/master -- Test stack with size 1 because we burn one fuel at a time local teststack = ItemStack(stack) teststack:set_count(1) @@ -205,11 +208,70 @@ local function swap_node(pos, name) end end +<<<<<<< HEAD local function furnace_node_timer(pos, elapsed) -- -- Inizialize metadata -- local meta = minetest.get_meta(pos) +======= +local function smoker_reset_delta_time(pos) + local meta = minetest.get_meta(pos) + local time_speed = tonumber(minetest.settings:get("time_speed") or 72) + if (time_speed < 0.1) then + return + end + local time_multiplier = 86400 / time_speed + local current_game_time = .0 + ((minetest.get_day_count() + minetest.get_timeofday()) * time_multiplier) + + -- TODO: Change meta:get/set_string() to get/set_float() for "last_gametime". + -- In Windows *_float() works OK but under Linux it returns rounded unusable values like 449540.000000000 + local last_game_time = meta:get_string("last_gametime") + if last_game_time then + last_game_time = tonumber(last_game_time) + end + if not last_game_time or last_game_time < 1 or math.abs(last_game_time - current_game_time) <= 1.5 then + return + end + + meta:set_string("last_gametime", tostring(current_game_time)) +end + +local function smoker_get_delta_time(pos, elapsed) + local meta = minetest.get_meta(pos) + local time_speed = tonumber(minetest.settings:get("time_speed") or 72) + local current_game_time + if (time_speed < 0.1) then + return meta, elapsed + else + local time_multiplier = 86400 / time_speed + current_game_time = .0 + ((minetest.get_day_count() + minetest.get_timeofday()) * time_multiplier) + end + + local last_game_time = meta:get_string("last_gametime") + if last_game_time then + last_game_time = tonumber(last_game_time) + end + if not last_game_time or last_game_time < 1 then + last_game_time = current_game_time - 0.1 + elseif last_game_time == current_game_time then + current_game_time = current_game_time + 1.0 + end + + local elapsed_game_time = .0 + current_game_time - last_game_time + + meta:set_string("last_gametime", tostring(current_game_time)) + + return meta, elapsed_game_time +end + +local function smoker_node_timer(pos, elapsed) + -- + -- Inizialize metadata + -- + local meta, elapsed_game_time = smoker_get_delta_time(pos, elapsed) + +>>>>>>> mcl2/master local fuel_time = meta:get_float("fuel_time") or 0 local src_time = meta:get_float("src_time") or 0 local src_item = meta:get_string("src_item") or "" @@ -233,13 +295,21 @@ local function furnace_node_timer(pos, elapsed) end local update = true +<<<<<<< HEAD local elapsed_game_time = mcl_time.get_irl_seconds_passed_at_pos_or_nil(pos) or elapsed +======= +>>>>>>> mcl2/master while elapsed_game_time > 0.00001 and update do -- -- Cooking -- +<<<<<<< HEAD local el = elapsed_game_time +======= + -- Run the smoker at twice the speed of a furnace. + local el = elapsed_game_time * 2 +>>>>>>> mcl2/master -- Check if we have cookable content: cookable local aftercooked @@ -280,13 +350,21 @@ local function furnace_node_timer(pos, elapsed) elseif active then el = math.min(el, fuel_totaltime - fuel_time) -- The furnace is currently active and has enough fuel +<<<<<<< HEAD fuel_time = (fuel_time + el)*2 +======= + fuel_time = fuel_time + el +>>>>>>> mcl2/master end -- If there is a cookable item then check if it is ready yet if cookable and active then +<<<<<<< HEAD -- in the src_time variable, the *2 is the multiplication that makes the smoker work faster than a normal furnace. src_time = (src_time + el)*2 +======= + src_time = src_time + el +>>>>>>> mcl2/master -- Place result in dst list if done if src_time >= cooked.time then inv:add_item("dst", cooked.item) @@ -367,6 +445,7 @@ end minetest.register_node("mcl_smoker:smoker", { description = S("Smoker"), _tt_help = S("Cooks food faster than furnace"), +<<<<<<< HEAD _doc_items_longdesc = S("Smokers cook several items, mainly raw foods, into cooked foods, but twice as fast as a normal furnace."), _doc_items_usagehelp = S([[ @@ -379,6 +458,20 @@ minetest.register_node("mcl_smoker:smoker", { _doc_items_hidden = false, tiles = { "smoker_top.png", "smoker_top.png", +======= + _doc_items_longdesc = S("Smokers cook several items, using a furnace fuel, into something else, but twice as fast as a normal furnace"), + _doc_items_usagehelp = + S([[ + Use the smoker to open the furnace menu. + Place a furnace fuel in the lower slot and the source material in the upper slot. + The smoker will slowly use its fuel to smelt the item. + The result will be placed into the output slot at the right side. + ]]).."\n".. + S("Use the recipe book to see what foods you can smelt, what you can use as fuel and how long it will burn."), + _doc_items_hidden = false, + tiles = { + "smoker_top.png", "smoker_bottom.png", +>>>>>>> mcl2/master "smoker_side.png", "smoker_side.png", "smoker_side.png", "smoker_front.png" }, @@ -387,7 +480,11 @@ minetest.register_node("mcl_smoker:smoker", { is_ground_content = false, sounds = mcl_sounds.node_sound_stone_defaults(), +<<<<<<< HEAD on_timer = furnace_node_timer, +======= + on_timer = smoker_node_timer, +>>>>>>> mcl2/master after_dig_node = function(pos, oldnode, oldmetadata, digger) local meta = minetest.get_meta(pos) local meta2 = meta:to_table() @@ -418,20 +515,32 @@ minetest.register_node("mcl_smoker:smoker", { on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) -- Reset accumulated game time when player works with furnace: +<<<<<<< HEAD mcl_time.touch(pos) +======= + smoker_reset_delta_time(pos) +>>>>>>> mcl2/master minetest.get_node_timer(pos):start(1.0) on_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) end, on_metadata_inventory_put = function(pos) -- Reset accumulated game time when player works with furnace: +<<<<<<< HEAD mcl_time.touch(pos) +======= + smoker_reset_delta_time(pos) +>>>>>>> mcl2/master -- start timer function, it will sort out whether furnace can burn or not. minetest.get_node_timer(pos):start(1.0) end, on_metadata_inventory_take = function(pos, listname, index, stack, player) -- Reset accumulated game time when player works with furnace: +<<<<<<< HEAD mcl_time.touch(pos) +======= + smoker_reset_delta_time(pos) +>>>>>>> mcl2/master -- start timer function, it will helpful if player clears dst slot minetest.get_node_timer(pos):start(1.0) @@ -451,7 +560,11 @@ minetest.register_node("mcl_smoker:smoker_active", { description = S("Burning Smoker"), _doc_items_create_entry = false, tiles = { +<<<<<<< HEAD "smoker_top.png", "smoker_top.png", +======= + "smoker_top.png", "smoker_bottom.png", +>>>>>>> mcl2/master "smoker_side.png", "smoker_side.png", "smoker_side.png", {name = "smoker_front_on.png", animation = {type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 48}}, @@ -463,7 +576,11 @@ minetest.register_node("mcl_smoker:smoker_active", { groups = {pickaxey=1, container=4, deco_block=1, not_in_creative_inventory=1, material_stone=1}, is_ground_content = false, sounds = mcl_sounds.node_sound_stone_defaults(), +<<<<<<< HEAD on_timer = furnace_node_timer, +======= + on_timer = smoker_node_timer, +>>>>>>> mcl2/master after_dig_node = function(pos, oldnode, oldmetadata, digger) local meta = minetest.get_meta(pos) @@ -510,16 +627,23 @@ minetest.register_craft({ } }) +<<<<<<< HEAD minetest.register_alias("mcl_smoker:smoker", "mcl_furnaces:smoker") minetest.register_alias("mcl_smoker:smoker_active", "mcl_furnaces:smoker_active") +======= +>>>>>>> mcl2/master -- Add entry alias for the Help if minetest.get_modpath("doc") then doc.add_entry_alias("nodes", "mcl_smoker:smoker", "nodes", "mcl_smoker:smoker_active") end minetest.register_lbm({ +<<<<<<< HEAD label = "Active furnace flame particles", +======= + label = "Active smoker flame particles", +>>>>>>> mcl2/master name = "mcl_smoker:flames", nodenames = {"mcl_smoker:smoker_active"}, run_at_every_load = true, diff --git a/mods/ITEMS/mcl_sponges/locale/mcl_sponges.zh_TW.tr b/mods/ITEMS/mcl_sponges/locale/mcl_sponges.zh_TW.tr new file mode 100644 index 000000000..3b466dff4 --- /dev/null +++ b/mods/ITEMS/mcl_sponges/locale/mcl_sponges.zh_TW.tr @@ -0,0 +1,10 @@ +# textdomain: mcl_sponges +Sponge=海綿 +Sponges are blocks which remove water around them when they are placed or come in contact with water, turning it into a wet sponge.=海綿是一種方塊,當它們被放置或與水接觸時,會去除它們周圍的水,使其變成濕海綿。 +Waterlogged Sponge=濕海綿 +A waterlogged sponge can be dried in the furnace to turn it into (dry) sponge. When there's an empty bucket in the fuel slot of a furnace, the water will pour into the bucket.=濕海綿可以在熔爐裡烘乾,變成(乾)海綿。當爐子的燃料槽裡有一個空桶時,水會倒進桶裡。 +Riverwaterlogged Sponge=濕河水海綿 +This is a sponge soaking wet with river water. It can be dried in the furnace to turn it into (dry) sponge. When there's an empty bucket in the fuel slot of the furnace, the river water will pour into the bucket.=濕河水海綿是含有濕河水的海綿。可以在爐子裡曬乾,變成(乾)海綿。當爐子的燃料槽裡有一個空桶時,水會倒進桶裡。 +A sponge becomes riverwaterlogged (instead of waterlogged) if it sucks up more river water than (normal) water.= +Removes water on contact=如果海綿吸的河水比(正常的)水多,它就會變成濕河水海綿(而不是濕海綿)。 +Can be dried in furnace=可以在熔爐裏烘乾 diff --git a/mods/ITEMS/mcl_spyglass/init.lua b/mods/ITEMS/mcl_spyglass/init.lua index 0fa9a680e..195917521 100644 --- a/mods/ITEMS/mcl_spyglass/init.lua +++ b/mods/ITEMS/mcl_spyglass/init.lua @@ -1,6 +1,7 @@ local S = minetest.get_translator(minetest.get_current_modname()) minetest.register_tool("mcl_spyglass:spyglass",{ +<<<<<<< HEAD description = S("Spyglass"), _doc_items_longdesc = S("A spyglass is an item that can be used for zooming in on specific locations."), inventory_image = "mcl_spyglass.png", @@ -24,10 +25,28 @@ if minetest.get_modpath("mcl_copper") then else craft_spyglass("mcl_core:iron_ingot") end +======= + description = S("Spyglass"), + _doc_items_longdesc = S("A spyglass is an item that can be used for zooming in on specific locations."), + inventory_image = "mcl_spyglass.png", + stack_max = 1, + _mcl_toollike_wield = true, +}) + +minetest.register_craft({ + output = "mcl_spyglass:spyglass", + recipe = { + {"mcl_amethyst:amethyst_shard"}, + {"mcl_copper:copper_ingot"}, + {"mcl_copper:copper_ingot"}, + } +}) +>>>>>>> mcl2/master local spyglass_scope = {} local function add_scope(player) +<<<<<<< HEAD local wielditem = player:get_wielded_item() if wielditem:get_name() == "mcl_spyglass:spyglass" then spyglass_scope[player] = player:hud_add({ @@ -78,4 +97,56 @@ end) minetest.register_on_leaveplayer(function(player) spyglass_scope[player] = nil +======= + local wielditem = player:get_wielded_item() + if wielditem:get_name() == "mcl_spyglass:spyglass" then + spyglass_scope[player] = player:hud_add({ + hud_elem_type = "image", + position = {x = 0.5, y = 0.5}, + scale = {x = -100, y = -100}, + text = "mcl_spyglass_scope.png", + }) + player:hud_set_flags({wielditem = false}) + end +end + +local function remove_scope(player) + if spyglass_scope[player] then + player:hud_remove(spyglass_scope[player]) + spyglass_scope[player] = nil + player:hud_set_flags({wielditem = true}) + player:set_fov(86.1) + end +end + +controls.register_on_press(function(player, key) + if key ~= "RMB" then return end + add_scope(player) +end) + +controls.register_on_release(function(player, key, time) + if key ~= "RMB" then return end + remove_scope(player) +end) + +controls.register_on_hold(function(player, key, time) + if key ~= "RMB" then return end + local wielditem = player:get_wielded_item() + if wielditem:get_name() == "mcl_spyglass:spyglass" then + player:set_fov(8, false, 0.1) + if spyglass_scope[player] == nil then + add_scope(player) + end + else + remove_scope(player) + end +end) + +minetest.register_on_dieplayer(function(player) + remove_scope(player) +end) + +minetest.register_on_leaveplayer(function(player) + spyglass_scope[player] = nil +>>>>>>> mcl2/master end) diff --git a/mods/ITEMS/mcl_spyglass/mod.conf b/mods/ITEMS/mcl_spyglass/mod.conf index 965e6a73b..7669e80de 100644 --- a/mods/ITEMS/mcl_spyglass/mod.conf +++ b/mods/ITEMS/mcl_spyglass/mod.conf @@ -1,5 +1,9 @@ name = mcl_spyglass author = NO11 description = This mod adds a spyglass, which is an item that can be used for zooming in on specific locations. +<<<<<<< HEAD depends = mcl_core, controls, xpanes optional_depends = mcl_copper +======= +depends = mcl_core, controls +>>>>>>> mcl2/master diff --git a/mods/ITEMS/mcl_sus_stew/LICENSE b/mods/ITEMS/mcl_sus_stew/LICENSE new file mode 100644 index 000000000..d41c0bd98 --- /dev/null +++ b/mods/ITEMS/mcl_sus_stew/LICENSE @@ -0,0 +1,232 @@ +GNU GENERAL PUBLIC LICENSE +Version 3, 29 June 2007 + +Copyright © 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. + + + Copyright (C) + + 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: + + Copyright (C) + 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/ITEMS/mcl_sus_stew/Note b/mods/ITEMS/mcl_sus_stew/Note new file mode 100644 index 000000000..cbf07b1f8 --- /dev/null +++ b/mods/ITEMS/mcl_sus_stew/Note @@ -0,0 +1 @@ +The texture for the suspicious stew is from the Minecraft resourcepack "Pixel Perfection Legacy" (https://www.curseforge.com/minecraft/texture-packs/pixel-perfection-legacy), wich is licensed under CC BY-SA 4.0 (Creative Commons license)! \ No newline at end of file diff --git a/mods/ITEMS/mcl_sus_stew/README.md b/mods/ITEMS/mcl_sus_stew/README.md new file mode 100644 index 000000000..374d80b92 --- /dev/null +++ b/mods/ITEMS/mcl_sus_stew/README.md @@ -0,0 +1,3 @@ +# mcl_sus_stew + +This Mod adds Suspicious Stews for Mineclone \ No newline at end of file diff --git a/mods/ITEMS/mcl_sus_stew/init.lua b/mods/ITEMS/mcl_sus_stew/init.lua new file mode 100644 index 000000000..37fb5265f --- /dev/null +++ b/mods/ITEMS/mcl_sus_stew/init.lua @@ -0,0 +1,130 @@ + +-- ____________________________ +--_________________________________________/ Variables & Functions \_________ + +local eat = minetest.item_eat(6, "mcl_core:bowl") --6 hunger points, player receives mcl_core:bowl after eating + +local flower_effect = { + [ "mcl_flowers:tulip_white" ] = "poison", + [ "mcl_flowers:blue_orchid" ] = "hunger", + [ "mcl_flowers:dandelion" ] = "hunger", + [ "mcl_flowers:peony" ] = "jump", + [ "mcl_flowers:oxeye_daisy" ] = "regeneration", + [ "mcl_flowers:poppy" ] = "night_vision" +} + +local effects = { + [ "poison" ] = function(itemstack, placer, pointed_thing) + mcl_potions.poison_func(placer, 1, 12) + return eat(itemstack, placer, pointed_thing) + end, + + [ "hunger" ] = function(itemstack, placer, pointed_thing, player) + mcl_hunger.item_eat(6, "mcl_core:bowl", 3.5, 0, 100) + return eat(itemstack, placer, pointed_thing) + end, + + ["jump"] = function(itemstack, placer, pointed_thing) + mcl_potions.leaping_func(placer, 1, 6) + return eat(itemstack, placer, pointed_thing) + end, + + ["regeneration"] = function(itemstack, placer, pointed_thing) + mcl_potions.regeneration_func(placer, 1, 8) + return eat(itemstack, placer, pointed_thing) + end, + + ["night_vision"] = function(itemstack, placer, pointed_thing) + mcl_potions.night_vision_func(placer, 1, 5) + return eat(itemstack, placer, pointed_thing) + end, +} +local function get_random_effect() + local keys = {} + for k in pairs(effects) do + table.insert(keys, k) + end + return effects[keys[math.random(#keys)]] +end + +local function eat_stew(itemstack, placer, pointed_thing) + local e = itemstack:get_meta():get_string("effect") + local f = effects[e] + if not f then + f = get_random_effect() + end + if f(itemstack,placer,pointed_thing) then + return "mcl_core:bowl" + end +end + +minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv) + if itemstack:get_name() ~= "mcl_sus_stew:stew" then return end + for f,e in pairs(flower_effect) do + for _,it in pairs(old_craft_grid) do + if it:get_name() == f then + itemstack:get_meta():set_string("effect",e) + return itemstack + end + end + end +end) + +-- ________________________ +--_________________________________________/ Item Regestration \_________________ +minetest.register_craftitem("mcl_sus_stew:stew",{ + description = "Suspicious Stew", + inventory_image = "sus_stew.png", + stack_max = 1, + on_place = eat_stew, + groups = { food = 2, eatable = 4, can_eat_when_full = 1, not_in_creative_inventory=1,}, + _mcl_saturation = 7.2, +}) + +mcl_hunger.register_food("mcl_sus_stew:stew",6, "mcl_core:bowl") + +--compat with old (mcl5) sus_stew +minetest.register_alias("mcl_sus_stew:poison_stew", "mcl_sus_stew:stew") +minetest.register_alias("mcl_sus_stew:hunger_stew", "mcl_sus_stew:stew") +minetest.register_alias("mcl_sus_stew:jump_boost_stew", "mcl_sus_stew:stew") +minetest.register_alias("mcl_sus_stew:regneration_stew", "mcl_sus_stew:stew") +minetest.register_alias("mcl_sus_stew:night_vision_stew", "mcl_sus_stew:stew") + +-- ______________ +--_________________________________________/ Crafts \________________________________ + +minetest.register_craft({ + type = "shapeless", + output = "mcl_sus_stew:stew", + recipe = {"mcl_mushrooms:mushroom_red", "mcl_mushrooms:mushroom_brown", "mcl_core:bowl", "mcl_flowers:tulip_white"}, +}) + +minetest.register_craft({ + type = "shapeless", + output = "mcl_sus_stew:stew", + recipe = {"mcl_mushrooms:mushroom_red", "mcl_mushrooms:mushroom_brown", "mcl_core:bowl", "mcl_flowers:blue_orchid"}, +}) + +minetest.register_craft({ + type = "shapeless", + output = "mcl_sus_stew:stew", + recipe = {"mcl_mushrooms:mushroom_red", "mcl_mushrooms:mushroom_brown", "mcl_core:bowl", "mcl_flowers:dandelion"} , +}) + +minetest.register_craft({ + type = "shapeless", + output = "mcl_sus_stew:stew", + recipe = {"mcl_mushrooms:mushroom_red", "mcl_mushrooms:mushroom_brown", "mcl_core:bowl", "mcl_flowers:peony"}, +}) + +minetest.register_craft({ + type = "shapeless", + output = "mcl_sus_stew:stew", + recipe = {"mcl_mushrooms:mushroom_red", "mcl_mushrooms:mushroom_brown", "mcl_core:bowl", "mcl_flowers:oxeye_daisy"}, +}) + +minetest.register_craft({ + type = "shapeless", + output = "mcl_sus_stew:stew", + recipe = {"mcl_mushrooms:mushroom_red", "mcl_mushrooms:mushroom_brown", "mcl_core:bowl", "mcl_flowers:poppy"}, +}) diff --git a/mods/ITEMS/mcl_sus_stew/mod.conf b/mods/ITEMS/mcl_sus_stew/mod.conf new file mode 100644 index 000000000..9e28bd300 --- /dev/null +++ b/mods/ITEMS/mcl_sus_stew/mod.conf @@ -0,0 +1,3 @@ +name = mcl_sus_stew +author = chmodsayshello +depends = mcl_core, mcl_mushrooms, mcl_flowers, mcl_potions, mcl_hunger diff --git a/mods/ITEMS/mcl_sus_stew/textures/sus_stew.png b/mods/ITEMS/mcl_sus_stew/textures/sus_stew.png new file mode 100644 index 0000000000000000000000000000000000000000..3580c35aa063a70d0a424ed2d8530b7bc0112f4b GIT binary patch literal 445 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP-J2RV{+2iMFZ43;IUY;(FAr`0KPTcR!#3<1=zuU#Y zx?W(SjHRTK$CV&~b$MvnO=4`ZCN{`MP=4q6d>zR&^b^cX8&2Tt_7_v)5Ve zQzf~l?TlquHjht3Uw2bk{o$P(8v}2tMH@1BJp1IdUqO(2_QeIW+uej~OC=jJ-b&3r z?HYc0LzhylFSEkiugUgys?ml(m4`SEv=qE_6hX2_=H|&%y^k=$911ArJ;Lu^uy!k l-@3BCKAZ3-@{jW#=IvYR%l7>9ISCAC22WQ%mvv4FO#rEFv3mdj literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_throwing/locale/mcl_throwing.zh_TW.tr b/mods/ITEMS/mcl_throwing/locale/mcl_throwing.zh_TW.tr new file mode 100644 index 000000000..3ee220925 --- /dev/null +++ b/mods/ITEMS/mcl_throwing/locale/mcl_throwing.zh_TW.tr @@ -0,0 +1,12 @@ +# textdomain: mcl_throwing +@1 used the ender pearl too often.=@1 扔得太多終界珍珠了。 +Use the punch key to throw.=按下擊打鍵扔出 +Snowball=雪球 +Snowballs can be thrown or launched from a dispenser for fun. Hitting something with a snowball does nothing.=雪球可以被扔出或從發射器中發射出去取樂。用雪球打東西沒有任何作用。 +Egg=蛋 +Eggs can be thrown or launched from a dispenser and breaks on impact. There is a small chance that 1 or even 4 chicks will pop out of the egg.=雞蛋可以被拋出或從發射器中發射出去,並在撞擊中破碎。有機會,1至4個小雞會從蛋裡跳出來。 +Ender Pearl=終界珍珠 +An ender pearl is an item which can be used for teleportation at the cost of health. It can be thrown and teleport the thrower to its impact location when it hits a solid block or a plant. Each teleportation hurts the user by 5 hit points.=末影珍珠是一種可以在損失生命值的情況下用於傳送的物品。可以將其扔出並將撞到實心塊或植物時將其傳送到其撞擊位置。每次傳送都會傷害使用者5點生命值。 +Throwable=可扔出 +Chance to hatch chicks when broken=破碎時有可能孵化小雞 +Teleports you on impact for cost of 5 HP=損失5點生命值以傳送 diff --git a/mods/ITEMS/mcl_throwing/mod.conf b/mods/ITEMS/mcl_throwing/mod.conf index 60d3e31a7..18248e76f 100644 --- a/mods/ITEMS/mcl_throwing/mod.conf +++ b/mods/ITEMS/mcl_throwing/mod.conf @@ -1,3 +1,3 @@ name = mcl_throwing depends = mcl_colors -optional_depends = mcl_core, mcl_mobitems, doc +optional_depends = mcl_core, mcl_mobitems, doc, mcl_target diff --git a/mods/ITEMS/mcl_throwing/register.lua b/mods/ITEMS/mcl_throwing/register.lua index e261840ef..8bc218199 100644 --- a/mods/ITEMS/mcl_throwing/register.lua +++ b/mods/ITEMS/mcl_throwing/register.lua @@ -3,6 +3,8 @@ local S = minetest.get_translator(minetest.get_current_modname()) local math = math local vector = vector +local mod_target = minetest.get_modpath("mcl_target") + -- The snowball entity local snowball_ENTITY={ physical = false, @@ -59,11 +61,9 @@ local function check_object_hit(self, pos, dmg) and entity.name ~= self.object:get_luaentity().name then if object:is_player() and self._thrower ~= object:get_player_name() then - -- TODO: Deal knockback self.object:remove() return true - elseif (entity._cmi_is_mob == true or entity._hittable_by_projectile) and (self._thrower ~= object) then - -- FIXME: Knockback is broken + elseif (entity.is_mob == true or entity._hittable_by_projectile) and (self._thrower ~= object) then object:punch(self.object, 1.0, { full_punch_interval = 1.0, damage_groups = dmg, @@ -111,6 +111,9 @@ local function snowball_on_step(self, dtime) minetest.sound_play("mcl_throwing_snowball_impact_hard", { pos = pos, max_hear_distance=16, gain=0.7 }, true) snowball_particles(self._lastpos, vel) self.object:remove() + if mod_target and node.name == "mcl_target:target_off" then + mcl_target.hit(vector.round(pos), 0.4) --4 redstone ticks + end return end end @@ -173,12 +176,15 @@ local function egg_on_step(self, dtime) end minetest.sound_play("mcl_throwing_egg_impact", { pos = self.object:get_pos(), max_hear_distance=10, gain=0.5 }, true) self.object:remove() + if mod_target and node.name == "mcl_target:target_off" then + mcl_target.hit(vector.round(pos), 0.4) --4 redstone ticks + end return end end -- Destroy when hitting a mob or player (no chick spawning) - if check_object_hit(self, pos) then + if check_object_hit(self, pos, 0) then minetest.sound_play("mcl_throwing_egg_impact", { pos = self.object:get_pos(), max_hear_distance=10, gain=0.5 }, true) self.object:remove() return @@ -277,6 +283,9 @@ local function pearl_on_step(self, dtime) end self.object:remove() + if mod_target and node.name == "mcl_target:target_off" then + mcl_target.hit(vector.round(pos), 0.4) --4 redstone ticks + end return end end diff --git a/mods/ITEMS/mcl_tnt/locale/mcl_tnt.zh_TW.tr b/mods/ITEMS/mcl_tnt/locale/mcl_tnt.zh_TW.tr new file mode 100644 index 000000000..aaa4c1e52 --- /dev/null +++ b/mods/ITEMS/mcl_tnt/locale/mcl_tnt.zh_TW.tr @@ -0,0 +1,8 @@ +# textdomain: mcl_tnt +@1 was caught in an explosion.=@1被炸飛了。 +TNT= +An explosive device. When it explodes, it will hurt living beings and destroy blocks around it. TNT has an explosion radius of @1. With a small chance, blocks may drop as an item (as if being mined) rather than being destroyed. TNT can be ignited by tools, explosions, fire, lava and redstone signals.=一個爆炸性裝置。當它爆炸時,會傷害生物,並摧毀周圍的方塊。TNT的爆炸半徑為@1。有很小的機率,方塊可能會作為物品掉落(就像被開採一樣)而不是被摧毀。TNT可以被工具、爆炸、火、熔岩和紅石信號點燃。 +An explosive device. When it explodes, it will hurt living beings. TNT has an explosion radius of @1. TNT can be ignited by tools, explosions, fire, lava and redstone signals.=一個爆炸性裝置。當它爆炸時,會傷害生物,並摧毀周圍的方塊。TNT的爆炸半徑為@1。TNT可以被工具、爆炸、火、熔岩和紅石信號點燃。 +Place the TNT and ignite it with one of the methods above. Quickly get in safe distance. The TNT will start to be affected by gravity and explodes in 4 seconds.=放置TNT,並用上述方法之一點燃它。迅速和TNT保持安全距離。TNT將開始受到重力的影響,並在4秒內爆炸。 +Ignited by tools, explosions, fire, lava, redstone power=被工具、爆炸、火、熔岩和紅石信號點燃。 +Explosion radius: @1=爆炸半徑:@1 diff --git a/mods/ITEMS/mcl_tools/crafting.lua b/mods/ITEMS/mcl_tools/crafting.lua index 636cb6660..07032b184 100644 --- a/mods/ITEMS/mcl_tools/crafting.lua +++ b/mods/ITEMS/mcl_tools/crafting.lua @@ -10,7 +10,7 @@ minetest.register_craft({ minetest.register_craft({ output = "mcl_tools:pick_stone", recipe = { - {"mcl_core:cobble", "mcl_core:cobble", "mcl_core:cobble"}, + {"group:cobble", "group:cobble", "group:cobble"}, {"", "mcl_core:stick", ""}, {"", "mcl_core:stick", ""}, } @@ -55,7 +55,7 @@ minetest.register_craft({ minetest.register_craft({ output = "mcl_tools:shovel_stone", recipe = { - {"mcl_core:cobble"}, + {"group:cobble"}, {"mcl_core:stick"}, {"mcl_core:stick"}, } @@ -108,16 +108,16 @@ minetest.register_craft({ minetest.register_craft({ output = "mcl_tools:axe_stone", recipe = { - {"mcl_core:cobble", "mcl_core:cobble"}, - {"mcl_core:cobble", "mcl_core:stick"}, + {"group:cobble", "group:cobble"}, + {"group:cobble", "mcl_core:stick"}, {"", "mcl_core:stick"}, } }) minetest.register_craft({ output = "mcl_tools:axe_stone", recipe = { - {"mcl_core:cobble", "mcl_core:cobble"}, - {"mcl_core:stick", "mcl_core:cobble"}, + {"group:cobble", "group:cobble"}, + {"mcl_core:stick", "group:cobble"}, {"mcl_core:stick", ""}, } }) @@ -185,8 +185,8 @@ minetest.register_craft({ minetest.register_craft({ output = "mcl_tools:sword_stone", recipe = { - {"mcl_core:cobble"}, - {"mcl_core:cobble"}, + {"group:cobble"}, + {"group:cobble"}, {"mcl_core:stick"}, } }) diff --git a/mods/ITEMS/mcl_tools/init.lua b/mods/ITEMS/mcl_tools/init.lua index 565ca9c12..90ff03283 100644 --- a/mods/ITEMS/mcl_tools/init.lua +++ b/mods/ITEMS/mcl_tools/init.lua @@ -110,7 +110,7 @@ minetest.register_tool("mcl_tools:pick_stone", { punch_attack_uses = 66, }, sound = { breaks = "default_tool_breaks" }, - _repair_material = "mcl_core:cobble", + _repair_material = "group:cobble", _mcl_toollike_wield = true, _mcl_diggroups = { pickaxey = { speed = 4, level = 3, uses = 132 } @@ -177,6 +177,30 @@ minetest.register_tool("mcl_tools:pick_diamond", { }, _mcl_upgradable = true, _mcl_upgrade_item = "mcl_tools:pick_netherite" +<<<<<<< HEAD +}) + +minetest.register_tool("mcl_tools:pick_netherite", { + description = S("Netherite Pickaxe"), + _doc_items_longdesc = pickaxe_longdesc, + inventory_image = "default_tool_netheritepick.png", + wield_scale = wield_scale, + groups = { tool=1, pickaxe=1, dig_speed_class=6, enchantability=10 }, + tool_capabilities = { + -- 1/1.2 + full_punch_interval = 0.83333333, + max_drop_level=5, + damage_groups = {fleshy=6}, + punch_attack_uses = 1016, + }, + sound = { breaks = "default_tool_breaks" }, + _repair_material = "mcl_nether:netherite_ingot", + _mcl_toollike_wield = true, + _mcl_diggroups = { + pickaxey = { speed = 9.5, level = 6, uses = 2031 } + }, +======= +>>>>>>> mcl2/master }) minetest.register_tool("mcl_tools:pick_netherite", { @@ -200,7 +224,7 @@ minetest.register_tool("mcl_tools:pick_netherite", { }, }) -local function make_grass_path(itemstack, placer, pointed_thing) +local make_grass_path = function(itemstack, placer, pointed_thing) -- Use pointed node's on_rightclick function first, if present local node = minetest.get_node(pointed_thing.under) if placer and not placer:get_player_control().sneak then @@ -214,7 +238,7 @@ local function make_grass_path(itemstack, placer, pointed_thing) return itemstack end - if (minetest.get_item_group(node.name, "grass_block") == 1) then + if (minetest.get_item_group(node.name, "path_creation_possible") == 1) then local above = table.copy(pointed_thing.under) above.y = above.y + 1 if minetest.get_node(above).name == "air" then @@ -261,7 +285,7 @@ if minetest.get_modpath("mcl_farming") then minetest.sound_play({name="default_grass_footstep", gain=1}, {pos = pointed_thing.above}, true) local dir = vector.subtract(pointed_thing.under, pointed_thing.above) local param2 = minetest.dir_to_facedir(dir) - minetest.swap_node(pointed_thing.under, {name="mcl_farming:pumpkin_face", param2 = param2}) + minetest.set_node(pointed_thing.under, {name="mcl_farming:pumpkin_face", param2 = param2}) minetest.add_item(pointed_thing.above, "mcl_farming:pumpkin_seeds 4") end return itemstack @@ -306,7 +330,7 @@ minetest.register_tool("mcl_tools:shovel_stone", { }, on_place = make_grass_path, sound = { breaks = "default_tool_breaks" }, - _repair_material = "mcl_core:cobble", + _repair_material = "group:cobble", _mcl_toollike_wield = true, _mcl_diggroups = { shovely = { speed = 4, level = 3, uses = 132 } @@ -464,7 +488,7 @@ minetest.register_tool("mcl_tools:axe_stone", { }, on_place = make_stripped_trunk, sound = { breaks = "default_tool_breaks" }, - _repair_material = "mcl_core:cobble", + _repair_material = "group:cobble", _mcl_toollike_wield = true, _mcl_diggroups = { axey = { speed = 4, level = 3, uses = 132 } @@ -590,7 +614,7 @@ minetest.register_tool("mcl_tools:sword_stone", { punch_attack_uses = 132, }, sound = { breaks = "default_tool_breaks" }, - _repair_material = "mcl_core:cobble", + _repair_material = "group:cobble", _mcl_toollike_wield = true, _mcl_diggroups = { swordy = { speed = 4, level = 3, uses = 132 }, diff --git a/mods/ITEMS/mcl_tools/locale/mcl_tools.zh_TW.tr b/mods/ITEMS/mcl_tools/locale/mcl_tools.zh_TW.tr new file mode 100644 index 000000000..ed40c64ba --- /dev/null +++ b/mods/ITEMS/mcl_tools/locale/mcl_tools.zh_TW.tr @@ -0,0 +1,32 @@ +# textdomain: mcl_tools +You use your bare hand whenever you are not wielding any item. With your hand you can mine most blocks, but this is the slowest method and only the weakest blocks will yield their useful drop. The hand also deals minor damage by punching. Using the hand is often a last resort, as proper mining tools and weapons are much better.=只要你不揮舞任何物品,你就用你的手。用你的手可以開採大多數塊狀物,但這是最慢的方法,只有最弱的方塊才會產生有用的掉落物。手還可以通過打拳造成輕微的傷害。使用手往往是最後的手段,因為適當的採礦工具和武器要好得多。 +When you are wielding an item which is not a mining tool or a weapon, it will behave as if it were the hand when you start mining or punching.=當你揮舞一個不是採礦工具或武器的物品時開始採礦或打拳時,它的行為就像手一樣。 +In Creative Mode, the hand is able to break all blocks instantly.=在創造模式式下,手能夠立即打破所有方塊。 +Pickaxes are mining tools to mine hard blocks, such as stone. A pickaxe can also be used as weapon, but it is rather inefficient.=鎬是開採硬方塊的工具,如石頭。鎬也可以作為武器使用,但它的效率很低。 +An axe is your tool of choice to cut down trees, wood-based blocks and other blocks. Axes deal a lot of damage as well, but they are rather slow.=斧頭是您砍伐樹木,木質方塊等的首選工具。斧頭也造成很多傷害,但是速度很慢。 +Swords are great in melee combat, as they are fast, deal high damage and can endure countless battles. Swords can also be used to cut down a few particular blocks, such as cobwebs.=劍在近戰中非常好,因為它們速度快,傷害高,可以經受無數次的戰鬥。劍也可以用來開採一些特殊的方塊,如蜘蛛網。 +Shovels are tools for digging coarse blocks, such as dirt, sand and gravel. They can also be used to turn grass blocks to grass paths. Shovels can be used as weapons, but they are very weak.=鏟子是挖掘粗方塊的工具,如泥土、沙子和礫石。它們也可以用來把草塊變成草路。鏟子可以作為武器使用,但它們非常弱。 +To turn a grass block into a grass path, hold the shovel in your hand, then use (rightclick) the top or side of a grass block. This only works when there's air above the grass block.=要把草塊變成草路,請用手握住鏟子,然後右擊草塊的頂部或側面。這只有在草塊上方的方塊是空氣時才有效。 +Shears are tools to shear sheep and to mine a few block types. Shears are a special mining tool and can be used to obtain the original item from grass, leaves and similar blocks that require cutting.=剪刀是剪羊毛的工具,也是開採一些方塊的工具。剪子是一種特殊的開採工具,可以用來從草、樹葉等方塊中獲得原始物品。 +To shear sheep or carve faceless pumpkins, use the “place” key on them. Faces can only be carved at the side of faceless pumpkins. Mining works as usual, but the drops are different for a few blocks.=要剪羊毛或雕刻南瓜,請在其上使用「放置」鍵。只能在南瓜側面雕刻臉部。開採照常進行,但是掉落物在部分方塊上是不同的。 +Wooden Pickaxe=木鎬 +Stone Pickaxe=石鎬 +Iron Pickaxe=鐵鎬 +Golden Pickaxe=金鎬 +Diamond Pickaxe=鑽石鎬 +Wooden Shovel=木鏟 +Stone Shovel=石鏟 +Iron Shovel=鐵鏟 +Golden Shovel=金鏟 +Diamond Shovel=鑽石鏟 +Wooden Axe=木斧 +Stone Axe=石斧 +Iron Axe=鐵斧 +Golden Axe=金斧 +Diamond Axe=鑽石斧 +Wooden Sword=木劍 +Stone Sword=石劍 +Iron Sword=鐵劍 +Golden Sword=金劍 +Diamond Sword=鑽石劍 +Shears=剪刀 diff --git a/mods/ITEMS/mcl_torches/locale/mcl_torches.zh_TW.tr b/mods/ITEMS/mcl_torches/locale/mcl_torches.zh_TW.tr new file mode 100644 index 000000000..01088cd96 --- /dev/null +++ b/mods/ITEMS/mcl_torches/locale/mcl_torches.zh_TW.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_torches +Torch=火把 +Torches are light sources which can be placed at the side or on the top of most blocks.=火把是光源,可以放在大多數方塊的側面或頂部。 diff --git a/mods/ITEMS/mcl_totems/init.lua b/mods/ITEMS/mcl_totems/init.lua index 5cf5f27a3..4ef9d2045 100644 --- a/mods/ITEMS/mcl_totems/init.lua +++ b/mods/ITEMS/mcl_totems/init.lua @@ -1,35 +1,51 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + local hud_totem = {} minetest.register_on_leaveplayer(function(player) hud_totem[player] = nil end) +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, offhand_item = 1}, +}) +minetest.register_alias("mobs_mc:totem", "mcl_totems:totem") + local particle_colors = {"98BF22", "C49E09", "337D0B", "B0B021", "1E9200"} -- TODO: real MC colors -- Save the player from death when holding totem of undying in hand mcl_damage.register_modifier(function(obj, damage, reason) - if obj:is_player() then + if obj:is_player() and not reason.bypasses_totem then local hp = obj:get_hp() if hp - damage <= 0 then local wield = obj:get_wielded_item() local in_offhand = false +<<<<<<< HEAD if not (wield:get_name() == "mobs_mc:totem") then +======= + if not (wield:get_name() == "mcl_totems:totem") then +>>>>>>> mcl2/master local inv = obj:get_inventory() if inv then wield = obj:get_inventory():get_stack("offhand", 1) in_offhand = true end end +<<<<<<< HEAD if wield:get_name() == "mobs_mc:totem" then +======= + if wield:get_name() == "mcl_totems:totem" then +>>>>>>> mcl2/master 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 - end - -- Reset breath as well + if obj:get_breath() < 11 then obj:set_breath(10) end @@ -44,10 +60,14 @@ mcl_damage.register_modifier(function(obj, damage, reason) end end awards.unlock(obj:get_player_name(), "mcl:postMortal") +<<<<<<< HEAD +======= + +>>>>>>> mcl2/master -- Effects minetest.sound_play({name = "mcl_totems_totem", gain = 1}, {pos=ppos, max_hear_distance = 16}, true) - + for i = 1, 4 do for c = 1, #particle_colors do minetest.add_particlespawner({ 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/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/ITEMS/mcl_walls/locale/mcl_walls.zh_TW.tr b/mods/ITEMS/mcl_walls/locale/mcl_walls.zh_TW.tr new file mode 100644 index 000000000..111241e04 --- /dev/null +++ b/mods/ITEMS/mcl_walls/locale/mcl_walls.zh_TW.tr @@ -0,0 +1,16 @@ +# textdomain: mcl_walls +A piece of wall. It cannot be jumped over with a simple jump. When multiple of these are placed to next to each other, they will automatically build a nice wall structure.=一塊牆。它不能用簡單的跳躍方式跳過去。當多個這樣的東西被放在一起時,它們會自動建立一個漂亮的牆體結構。 +Cobblestone Wall=鵝卵石牆 +Mossy Cobblestone Wall=青苔鵝卵石牆 +Andesite Wall=安山岩牆 +Granite Wall=花崗岩牆 +Diorite Wall=閃長岩牆 +Brick Wall=紅磚牆 +Sandstone Wall=砂岩牆 +Red Sandstone Wall=紅砂岩牆 +Stone Brick Wall=石磚牆 +Mossy Stone Brick Wall=青苔石磚牆 +Prismarine Wall=海磷石牆 +End Stone Brick Wall=終界石磚牆 +Nether Brick Wall=地獄磚牆 +Red Nether Brick Wall=紅地獄磚牆 diff --git a/mods/ITEMS/mcl_wool/init.lua b/mods/ITEMS/mcl_wool/init.lua index 8fb4f51ec..65cbb8708 100644 --- a/mods/ITEMS/mcl_wool/init.lua +++ b/mods/ITEMS/mcl_wool/init.lua @@ -71,12 +71,11 @@ for _, row in ipairs(wool.dyes) do _doc_items_entry_name = name_carpet, _doc_items_longdesc = longdesc_carpet, - walkable = false, -- See is_ground_content = false, tiles = {texture..".png"}, wield_image = texture..".png", wield_scale = { x=1, y=1, z=0.5 }, - groups = {handy=1, carpet=1,attached_node=1,flammable=1,fire_encouragement=60, fire_flammability=20, dig_by_water=1,deco_block=1,[color_group]=1}, + groups = {handy=1, carpet=1,supported_node=1,flammable=1,fire_encouragement=60, fire_flammability=20, dig_by_water=1,deco_block=1,[color_group]=1}, sounds = mcl_sounds.node_sound_wool_defaults(), paramtype = "light", sunlight_propagates = true, diff --git a/mods/ITEMS/mclx_core/locale/mclx_core.zh_TW.tr b/mods/ITEMS/mclx_core/locale/mclx_core.zh_TW.tr new file mode 100644 index 000000000..649fc353d --- /dev/null +++ b/mods/ITEMS/mclx_core/locale/mclx_core.zh_TW.tr @@ -0,0 +1,5 @@ +# textdomain: mclx_core +River Water Source=河水源頭 +River water has the same properties as water, but has a reduced flowing distance and is not renewable.=河水具有與水相同的特性,但流動距離較短,且不可再生。 +River Water=河水 +Flowing River Water=流動的河水 diff --git a/mods/ITEMS/mclx_fences/locale/mclx_fences.zh_TW.tr b/mods/ITEMS/mclx_fences/locale/mclx_fences.zh_TW.tr new file mode 100644 index 000000000..bf06d7240 --- /dev/null +++ b/mods/ITEMS/mclx_fences/locale/mclx_fences.zh_TW.tr @@ -0,0 +1,4 @@ +# textdomain: mclx_fences +Red Nether Brick Fence=紅地獄磚柵欄 +Red Nether Brick Fence Gate=紅地獄磚柵欄門 +Nether Brick Fence Gate=地獄磚柵欄門 diff --git a/mods/ITEMS/screwdriver/locale/screwdriver.zh_TW.tr b/mods/ITEMS/screwdriver/locale/screwdriver.zh_TW.tr new file mode 100644 index 000000000..f29a4bf33 --- /dev/null +++ b/mods/ITEMS/screwdriver/locale/screwdriver.zh_TW.tr @@ -0,0 +1,2 @@ +#textdomain: screwdriver +Screwdriver=螺絲刀 diff --git a/mods/ITEMS/xpanes/locale/xpanes.zh_TW.tr b/mods/ITEMS/xpanes/locale/xpanes.zh_TW.tr new file mode 100644 index 000000000..bcf33c205 --- /dev/null +++ b/mods/ITEMS/xpanes/locale/xpanes.zh_TW.tr @@ -0,0 +1,23 @@ +# textdomain: xpanes +Glass panes are thin layers of glass which neatly connect to their neighbors as you build them.=玻璃板是薄薄的玻璃層,在你建造它們時,它們會整齊地連接到鄰近的方塊。 +Stained glass panes are thin layers of stained glass which neatly connect to their neighbors as you build them. They come in many different colors.=染色玻璃片是薄薄的一層染色玻璃,在你建造它們時,它們會整齊地連接到它們的鄰居。它們有許多不同的顏色。 +Iron Bars=鐵柵欄 +Iron bars neatly connect to their neighbors as you build them.=在你建造鐵柵欄時,它們會整齊地連接到鄰近的方塊。 +Glass Pane=玻璃片 +Stained Glass Pane=染色玻璃片 +Red Stained Glass Pane=紅色玻璃片 +Green Stained Glass Pane=綠色玻璃片 +Blue Stained Glass Pane=藍色玻璃片 +Light Blue Stained Glass Pane=淺藍色玻璃片 +Black Stained Glass Pane=黑色玻璃片 +White Stained Glass Pane=白色玻璃片 +Yellow Stained Glass Pane=黃色玻璃片 +Brown Stained Glass Pane=棕色玻璃片 +Orange Stained Glass Pane=橙色玻璃片 +Pink Stained Glass Pane=粉紅色玻璃片 +Grey Stained Glass Pane=灰色玻璃片 +Lime Stained Glass Pane=淺綠色玻璃片 +Light Grey Stained Glass Pane=淺灰色玻璃片 +Magenta Stained Glass Pane=洋紅色玻璃片 +Purple Stained Glass Pane=紫色玻璃片 +Cyan Stained Glass Pane=青色玻璃片 diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 8ad8700f0..c695a41f3 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -8,6 +8,8 @@ local generate_fallen_logs = minetest.settings:get_bool("mcl_generate_fallen_log local mod_mcl_structures = minetest.get_modpath("mcl_structures") local mod_mcl_core = minetest.get_modpath("mcl_core") local mod_mcl_mushrooms = minetest.get_modpath("mcl_mushrooms") +local mod_mcl_crimson = minetest.get_modpath("mcl_crimson") +local mod_mcl_blackstone = minetest.get_modpath("mcl_blackstone") -- Jungle bush schematic. In PC/Java Edition it's Jungle Wood + Oak Leaves local jungle_bush_schematic = mod_mcl_core.."/schematics/mcl_core_jungle_bush_oak_leaves.mts" @@ -1492,16 +1494,191 @@ local function register_dimension_biomes() node_water = "air", node_river_water = "air", node_cave_liquid = "air", +<<<<<<< HEAD y_min = mcl_mapgen.nether.min, -- FIXME: For some reason the Nether stops generating early if this constant is not added. -- Figure out why. y_max = mcl_mapgen.nether.max + 80, +======= + y_min = mcl_vars.mg_nether_min, + + y_max = mcl_vars.mg_nether_max + 80, +>>>>>>> mcl2/master heat_point = 100, humidity_point = 0, _mcl_biome_type = "hot", _mcl_palette_index = 17, }) + minetest.register_decoration({ + deco_type = "simple", + place_on = {"mcl_nether:netherrack","mcl_nether:glowstone","mcl_blackstone:nether_gold","mcl_nether:quartz_ore","mcl_core:gravel","mcl_nether:soul_sand"}, + sidelen = 16, + fill_ratio = 10, + biomes = { "Nether" }, + y_min = -31000, + y_max = mcl_vars.mg_nether_max, + decoration = "mcl_nether:netherrack", + flags = "all_floors", + param2 = 0, + }) + + minetest.register_biome({ + name = "SoulsandValley", + node_filler = "mcl_nether:netherrack", + node_stone = "mcl_nether:netherrack", + node_top = "mcl_blackstone:soul_soil", + node_water = "air", + node_river_water = "air", + node_cave_liquid = "air", + y_min = mcl_vars.mg_nether_min, + + y_max = mcl_vars.mg_nether_max + 80, + heat_point = 77, + humidity_point = 33, + _mcl_biome_type = "hot", + _mcl_palette_index = 17, + }) + minetest.register_decoration({ + deco_type = "simple", + place_on = {"mcl_nether:netherrack","mcl_nether:glowstone"}, + sidelen = 16, + fill_ratio = 10, + biomes = { "SoulsandValley" }, + y_min = -31000, + y_max = mcl_vars.mg_nether_max, + decoration = "mcl_blackstone:soul_soil", + flags = "all_floors, all_ceilings", + param2 = 0, + }) + + minetest.register_ore({ + ore_type = "blob", + ore = "mcl_nether:soul_sand", + wherein = { "mcl_nether:netherrack", "mcl_blackstone:soul_soil" }, + clust_scarcity = 100, + clust_num_ores = 225, + clust_size = 15, + biomes = { "SoulsandValley" }, + y_min = mcl_vars.mg_nether_min, + y_max = mcl_vars.mg_nether_max + 80, + noise_params = { + offset = 0, + scale = 1, + spread = { x = 250, y = 250, z = 250 }, + seed = 12345, + octaves = 3, + persist = 0.6, + lacunarity = 2, + flags = "defaults", + } + }) + minetest.register_biome({ + name = "CrimsonForest", + node_filler = "mcl_nether:netherrack", + node_stone = "mcl_nether:netherrack", + node_top = "mcl_crimson:crimson_nylium", + node_water = "air", + node_river_water = "air", + node_cave_liquid = "air", + y_min = mcl_vars.mg_nether_min, + + y_max = mcl_vars.mg_nether_max + 80, + heat_point = 60, + humidity_point = 47, + _mcl_biome_type = "hot", + _mcl_palette_index = 17, + }) + minetest.register_decoration({ + deco_type = "simple", + place_on = {"mcl_nether:netherrack","mcl_nether:glowstone","mcl_blackstone:nether_gold","mcl_nether:quartz_ore","mcl_core:gravel","mcl_nether:soul_sand"}, + sidelen = 16, + fill_ratio = 10, + biomes = { "CrimsonForest" }, + y_min = -31000, + y_max = mcl_vars.mg_nether_max, + decoration = "mcl_crimson:crimson_nylium", + flags = "all_floors", + param2 = 0, + }) + minetest.register_biome({ + name = "WarpedForest", + node_filler = "mcl_nether:netherrack", + node_stone = "mcl_nether:netherrack", + node_top = "mcl_crimson:warped_nylium", + node_water = "air", + node_river_water = "air", + node_cave_liquid = "air", + y_min = mcl_vars.mg_nether_min, + y_max = mcl_vars.mg_nether_max + 80, + heat_point = 37, + humidity_point = 70, + _mcl_biome_type = "hot", + _mcl_palette_index = 17, + }) + minetest.register_decoration({ + deco_type = "simple", + place_on = {"mcl_nether:netherrack","mcl_nether:glowstone","mcl_blackstone:nether_gold","mcl_nether:quartz_ore","mcl_core:gravel","mcl_nether:soul_sand"}, + sidelen = 16, + fill_ratio = 10, + biomes = { "WarpedForest" }, + y_min = -31000, + y_max = mcl_vars.mg_nether_max, + decoration = "mcl_crimson:warped_nylium", + flags = "all_floors", + param2 = 0, + }) + minetest.register_biome({ + name = "BasaltDelta", + node_filler = "mcl_nether:netherrack", + node_stone = "mcl_nether:netherrack", + node_top = "mcl_blackstone:basalt", + node_water = "air", + node_river_water = "air", + node_cave_liquid = "air", + y_min = mcl_vars.mg_nether_min, + y_max = mcl_vars.mg_nether_max + 80, + heat_point = 27, + humidity_point = 80, + _mcl_biome_type = "hot", + _mcl_palette_index = 17, + }) + + minetest.register_ore({ + ore_type = "blob", + ore = "mcl_blackstone:blackstone", + wherein = {"mcl_nether:netherrack","mcl_nether:glowstone","mcl_core:gravel","mcl_nether:soul_sand"}, + clust_scarcity = 100, + clust_num_ores = 400, + clust_size = 20, + biomes = { "BasaltDelta" }, + y_min = mcl_vars.mg_nether_min, + y_max = mcl_vars.mg_nether_max + 80, + noise_params = { + offset = 0, + scale = 1, + spread = { x = 250, y = 250, z = 250 }, + seed = 12345, + octaves = 3, + persist = 0.6, + lacunarity = 2, + flags = "defaults", + } + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"mcl_nether:netherrack","mcl_nether:glowstone","mcl_blackstone:nether_gold","mcl_nether:quartz_ore","mcl_core:gravel","mcl_nether:soul_sand","mcl_blackstone:blackstone"}, + sidelen = 16, + fill_ratio = 10, + biomes = { "BasaltDelta" }, + y_min = -31000, + y_max = mcl_vars.mg_nether_max, + decoration = "mcl_blackstone:basalt", + flags = "all_floors", + param2 = 0, + }) + --[[ THE END ]] minetest.register_biome({ name = "End", @@ -1584,6 +1761,39 @@ local function register_biome_ores() "MesaPlateauFM", "MesaPlateauFM_sandlevel", "MesaPlateauFM_ocean", }, }) end + --nether gold + if mg_name ~= "v6" then + minetest.register_ore({ + ore_type = "scatter", + ore = "mcl_blackstone:blackstone_gilded", + wherein = "mcl_blackstone:blackstone", + clust_scarcity = 4775, + clust_num_ores = 2, + clust_size = 2, + y_min = mcl_vars.mg_nether_min, + y_max = mcl_vars.mg_nether_max, + }) + minetest.register_ore({ + ore_type = "scatter", + ore = "mcl_blackstone:nether_gold", + wherein = "mcl_nether:netherrack", + clust_scarcity = 830, + clust_num_ores = 5, + clust_size = 3, + y_min = mcl_vars.mg_nether_min, + y_max = mcl_vars.mg_nether_max, + }) + minetest.register_ore({ + ore_type = "scatter", + ore = "mcl_blackstone:nether_gold", + wherein = "mcl_nether:netherrack", + clust_scarcity = 1660, + clust_num_ores = 4, + clust_size = 2, + y_min = mcl_vars.mg_nether_min, + y_max = mcl_vars.mg_nether_max, + }) + end end -- Register “fake” ores directly related to the biomes. These are mostly low-level landscape alternations @@ -2309,9 +2519,196 @@ local function register_seagrass_decoration(grasstype, offset, scale, biomes) end end +local warm_oceans = { + "JungleEdgeM_ocean", + "Jungle_deep_ocean", + "Savanna_ocean", + "MesaPlateauF_ocean", + "Swampland_ocean", + "Mesa_ocean", + "Plains_ocean", + "MesaPlateauFM_ocean", + "MushroomIsland_ocean", + "SavannaM_ocean", + "JungleEdge_ocean", + "MesaBryce_ocean", + "Jungle_ocean", + "Desert_ocean", + "JungleM_ocean", +} +local corals = { + "brain", + "horn", + "bubble", + "tube", + "fire" +} +local function register_coral_decos(ck) + local c = corals[ck] + local noise = { + offset = -0.0085, + scale = 0.002, + spread = {x = 25, y = 120, z = 25}, + seed = 235, + octaves = 5, + persist = 1.8, + lacunarity = 3.5, + flags = "absvalue" + } + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"group:sand","mcl_core:gravel"}, + sidelen = 80, + noise_params = noise, + biomes = warm_oceans, + y_min = OCEAN_MIN, + y_max = -8, + schematic = mod_mcl_structures.."/schematics/mcl_structures_coral_"..c.."_1.mts", + rotation = "random", + flags = "all_floors,force_placement", + }) + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"group:sand","mcl_core:gravel"}, + noise_params = noise, + sidelen = 80, + biomes = warm_oceans, + y_min = OCEAN_MIN, + y_max = -8, + schematic = mod_mcl_structures.."/schematics/mcl_structures_coral_"..c.."_2.mts", + rotation = "random", + flags = "all_floors,force_placement", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"mcl_ocean:"..c.."_coral_block"}, + sidelen = 16, + fill_ratio = 3, + y_min = OCEAN_MIN, + y_max = 1, + decoration = "mcl_ocean:"..c.."_coral", + biomes = warm_oceans, + flags = "force_placement, all_floors", + height = 1, + height_max = 1, + }) + minetest.register_decoration({ + deco_type = "simple", + place_on = {"mcl_ocean:horn_coral_block"}, + sidelen = 16, + fill_ratio = 7, + y_min = OCEAN_MIN, + y_max = 1, + decoration = "mcl_ocean:"..c.."_coral_fan", + biomes = warm_oceans, + flags = "force_placement, all_floors", + height = 1, + height_max = 1, + }) +end local function register_decorations() + -- Coral Reefs + for k,_ in pairs(corals) do + register_coral_decos(k) + end + minetest.register_decoration({ + deco_type = "simple", + place_on = {"group:sand","mcl_core:gravel"}, + sidelen = 16, + noise_params = { + offset = -0.0085, + scale = 0.002, + spread = {x = 25, y = 120, z = 25}, + seed = 235, + octaves = 5, + persist = 1.8, + lacunarity = 3.5, + flags = "absvalue" + }, + y_min = OCEAN_MIN, + y_max = -5, + decoration = "mcl_ocean:dead_brain_coral_block", + biomes = warm_oceans, + flags = "force_placement", + height = 1, + height_max = 1, + place_offset_y = -1, + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"mcl_ocean:dead_brain_coral_block"}, + sidelen = 16, + fill_ratio = 3, + y_min = OCEAN_MIN, + y_max = 1, + decoration = "mcl_ocean:sea_pickle_1_dead_brain_coral_block", + biomes = warm_oceans, + flags = "force_placement, all_floors", + height = 1, + height_max = 1, + place_offset_y = -1, + }) + minetest.register_decoration({ + deco_type = "simple", + place_on = {"mcl_ocean:dead_brain_coral_block"}, + sidelen = 16, + fill_ratio = 3, + y_min = OCEAN_MIN, + y_max = 1, + decoration = "mcl_ocean:sea_pickle_2_dead_brain_coral_block", + biomes = warm_oceans, + flags = "force_placement, all_floors", + height = 1, + height_max = 1, + place_offset_y = -1, + }) + minetest.register_decoration({ + deco_type = "simple", + place_on = {"mcl_ocean:dead_brain_coral_block"}, + sidelen = 16, + fill_ratio = 2, + y_min = OCEAN_MIN, + y_max = 1, + decoration = "mcl_ocean:sea_pickle_3_dead_brain_coral_block", + biomes = warm_oceans, + flags = "force_placement, all_floors", + height = 1, + height_max = 1, + place_offset_y = -1, + }) + minetest.register_decoration({ + deco_type = "simple", + place_on = {"mcl_ocean:dead_brain_coral_block"}, + sidelen = 16, + fill_ratio = 2, + y_min = OCEAN_MIN, + y_max = 1, + decoration = "mcl_ocean:sea_pickle_4_dead_brain_coral_block", + biomes = warm_oceans, + flags = "force_placement, all_floors", + height = 1, + height_max = 1, + place_offset_y = -1, + }) + --rare CORAl + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"group:sand","mcl_core:gravel"}, + fill_ratio = 0.0001, + sidelen = 80, + biomes = warm_oceans, + y_min = OCEAN_MIN, + y_max = -8, + schematic = mod_mcl_structures.."/schematics/coral_cora.mts", + rotation = "random", + flags = "place_center_x,place_center_z, force_placement", + }) + + -- Large ice spike minetest.register_decoration({ deco_type = "schematic", @@ -2992,6 +3389,29 @@ local function register_decorations() rotation = "0", }) + --Mushrooms in caves + minetest.register_decoration({ + deco_type = "simple", + place_on = {"group:material_stone"}, + sidelen = 80, + fill_ratio = 0.009, + noise_threshold = 2.0, + flags = "all_floors", + y_min = mcl_vars.mg_overworld_min, + y_max = mcl_vars.mg_overworld_max, + decoration = "mcl_mushrooms:mushroom_red", + }) + minetest.register_decoration({ + deco_type = "simple", + place_on = {"group:material_stone"}, + sidelen = 80, + fill_ratio = 0.009, + noise_threshold = 2.0, + y_min = mcl_vars.mg_overworld_min, + y_max = mcl_vars.mg_overworld_max, + decoration = "mcl_mushrooms:mushroom_brown", + }) + -- Mossy cobblestone boulder (3×3) minetest.register_decoration({ deco_type = "schematic", @@ -3010,6 +3430,7 @@ local function register_decorations() y_max = mcl_mapgen.overworld.max, schematic = mod_mcl_structures.."/schematics/mcl_structures_boulder.mts", flags = "place_center_x, place_center_z", + rotation = "random", }) -- Small mossy cobblestone boulder (2×2) @@ -3030,6 +3451,7 @@ local function register_decorations() y_max = mcl_mapgen.overworld.max, schematic = mod_mcl_structures.."/schematics/mcl_structures_boulder_small.mts", flags = "place_center_x, place_center_z", + rotation = "random", }) -- Cacti @@ -3555,7 +3977,7 @@ local function register_decorations() -- Pumpkin minetest.register_decoration({ deco_type = "simple", - decoration = "mcl_farming:pumpkin_face", + decoration = "mcl_farming:pumpkin", param2 = 0, param2_max = 3, place_on = {"group:grass_block_no_snow"}, @@ -3938,7 +4360,331 @@ local chorus_noise_params = { local function register_dimension_decorations() --[[ NETHER ]] - -- TODO: Nether + --NETHER WASTES (Nether) + minetest.register_decoration({ + deco_type = "simple", + place_on = {"mcl_nether:netherrack","mcl_nether:magma"}, + sidelen = 16, + fill_ratio = 0.04, + biomes = {"Nether"}, + y_min = mcl_vars.mg_lava_nether_max + 1, + y_max = mcl_vars.mg_nether_max - 1, + flags = "all_floors", + decoration = "mcl_fire:eternal_fire", + }) + minetest.register_decoration({ + deco_type = "simple", + place_on = {"mcl_nether:netherrack"}, + sidelen = 16, + fill_ratio = 0.013, + biomes = {"Nether"}, + y_min = mcl_vars.mg_lava_nether_max + 1, + y_max = mcl_vars.mg_nether_max - 1, + flags = "all_floors", + decoration = "mcl_mushrooms:mushroom_brown", + }) + minetest.register_decoration({ + deco_type = "simple", + place_on = {"mcl_nether:netherrack"}, + sidelen = 16, + fill_ratio = 0.012, + biomes = {"Nether"}, + y_min = mcl_vars.mg_lava_nether_max + 1, + y_max = mcl_vars.mg_nether_max - 1, + flags = "all_floors", + decoration = "mcl_mushrooms:mushroom_red", + }) + minetest.register_decoration({ + deco_type = "simple", + place_on = {"mcl_nether:soul_sand"}, + sidelen = 16, + fill_ratio = 0.0032, + biomes = {"Nether","SoulsandValley"}, + y_min = mcl_vars.mg_lava_nether_max + 1, + y_max = mcl_vars.mg_nether_max - 1, + flags = "all_floors", + decoration = "mcl_nether:nether_wart", + }) + + -- WARPED FOREST + minetest.register_decoration({ + deco_type = "simple", + place_on = {"mcl_crimson:warped_nylium"}, + sidelen = 16, + fill_ratio = 0.02, + biomes = {"WarpedForest"}, + y_min = mcl_vars.mg_lava_nether_max + 1, + y_max = mcl_vars.mg_nether_max - 10, + flags = "all_floors", + decoration = "mcl_crimson:warped_fungus", + }) + minetest.register_decoration({ + deco_type = "schematic", + name = "mcl_biomes:warped_tree1", + place_on = {"mcl_crimson:warped_nylium"}, + sidelen = 16, + fill_ratio = 0.007, + biomes = {"WarpedForest"}, + y_min = mcl_vars.mg_lava_nether_max + 1, + y_max = mcl_vars.mg_nether_max - 15, + flags = "all_floors, place_center_x, place_center_z", + schematic = mod_mcl_crimson.."/schematics/warped_fungus_1.mts", + size = {x = 5, y = 11, z = 5}, + rotation = "random", + }) + minetest.register_decoration({ + deco_type = "schematic", + name = "mcl_biomes:warped_tree2", + place_on = {"mcl_crimson:warped_nylium"}, + sidelen = 16, + fill_ratio = 0.005, + biomes = {"WarpedForest"}, + y_min = mcl_vars.mg_lava_nether_max + 1, + y_max = mcl_vars.mg_nether_max - 10, + flags = "all_floors, place_center_x, place_center_z", + schematic = mod_mcl_crimson.."/schematics/warped_fungus_2.mts", + size = {x = 5, y = 6, z = 5}, + rotation = "random", + }) + minetest.register_decoration({ + deco_type = "schematic", + name = "mcl_biomes:warped_tree3", + place_on = {"mcl_crimson:warped_nylium"}, + sidelen = 16, + fill_ratio = 0.003, + biomes = {"WarpedForest"}, + y_min = mcl_vars.mg_lava_nether_max + 1, + y_max = mcl_vars.mg_nether_max - 14, + flags = "all_floors, place_center_x, place_center_z", + schematic = mod_mcl_crimson.."/schematics/warped_fungus_3.mts", + size = {x = 5, y = 12, z = 5}, + rotation = "random", + }) + minetest.register_decoration({ + deco_type = "simple", + place_on = {"mcl_crimson:warped_nylium","mcl_crimson:twisting_vines"}, + sidelen = 16, + fill_ratio = 0.012, + biomes = {"WarpedForest"}, + y_min = mcl_vars.mg_lava_nether_max + 1, + flags = "all_floors", + height = 2, + height_max = 8, + decoration = "mcl_crimson:twisting_vines", + }) + minetest.register_decoration({ + deco_type = "simple", + place_on = {"mcl_crimson:warped_nylium"}, + sidelen = 16, + fill_ratio = 0.0812, + biomes = {"WarpedForest"}, + y_min = mcl_vars.mg_lava_nether_max + 1, + flags = "all_floors", + max_height = 5, + decoration = "mcl_crimson:warped_roots", + }) + minetest.register_decoration({ + deco_type = "simple", + place_on = {"mcl_crimson:crimson_nylium"}, + sidelen = 16, + fill_ratio = 0.052, + biomes = {"WarpedForest"}, + y_min = mcl_vars.mg_lava_nether_max + 1, + flags = "all_floors", + decoration = "mcl_crimson:nether_sprouts", + }) + -- CRIMSON FOREST + minetest.register_decoration({ + deco_type = "simple", + place_on = {"mcl_crimson:crimson_nylium"}, + sidelen = 16, + fill_ratio = 0.02, + biomes = {"CrimsonForest"}, + y_min = mcl_vars.mg_lava_nether_max + 1, + y_max = mcl_vars.mg_lava_nether_max - 10, + flags = "all_floors", + decoration = "mcl_crimson:crimson_fungus", + }) + minetest.register_decoration({ + deco_type = "schematic", + name = "mcl_biomes:crimson_tree", + place_on = {"mcl_crimson:crimson_nylium"}, + sidelen = 16, + fill_ratio = 0.008, + biomes = {"CrimsonForest"}, + y_min = mcl_vars.mg_lava_nether_max + 1, + y_max = mcl_vars.mg_nether_max - 10, + flags = "all_floors, place_center_x, place_center_z", + schematic = mod_mcl_crimson.."/schematics/crimson_fungus_1.mts", + size = {x = 5, y = 8, z = 5}, + rotation = "random", + }) + minetest.register_decoration({ + deco_type = "schematic", + name = "mcl_biomes:crimson_tree2", + place_on = {"mcl_crimson:crimson_nylium"}, + sidelen = 16, + fill_ratio = 0.006, + biomes = {"CrimsonForest"}, + y_min = mcl_vars.mg_lava_nether_max + 1, + y_max = mcl_vars.mg_nether_max - 15, + flags = "all_floors, place_center_x, place_center_z", + schematic = mod_mcl_crimson.."/schematics/crimson_fungus_2.mts", + size = {x = 5, y = 12, z = 5}, + rotation = "random", + }) + minetest.register_decoration({ + deco_type = "schematic", + name = "mcl_biomes:crimson_tree3", + place_on = {"mcl_crimson:crimson_nylium"}, + sidelen = 16, + fill_ratio = 0.004, + biomes = {"CrimsonForest"}, + y_min = mcl_vars.mg_lava_nether_max + 1, + y_max = mcl_vars.mg_nether_max - 20, + flags = "all_floors, place_center_x, place_center_z", + schematic = mod_mcl_crimson.."/schematics/crimson_fungus_3.mts", + size = {x = 7, y = 13, z = 7}, + rotation = "random", + }) + minetest.register_decoration({ + deco_type = "simple", + place_on = {"mcl_crimson:crimson_nylium"}, + sidelen = 16, + fill_ratio = 0.082, + biomes = {"CrimsonForest"}, + y_min = mcl_vars.mg_lava_nether_max + 1, + flags = "all_floors", + max_height = 5, + decoration = "mcl_crimson:crimson_roots", + }) + + --SOULSAND VALLEY + minetest.register_decoration({ + deco_type = "simple", + place_on = {"mcl_blackstone:soul_soil","mcl_nether:soul_sand"}, + sidelen = 16, + fill_ratio = 0.062, + biomes = {"SoulsandValley"}, + y_min = mcl_vars.mg_lava_nether_max + 1, + flags = "all_floors", + max_height = 5, + decoration = "mcl_blackstone:soul_fire", + }) + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"mcl_blackstone:soul_soil","mcl_nether:soulsand"}, + sidelen = 16, + fill_ratio = 0.000212, + biomes = {"SoulsandValley"}, + y_min = mcl_vars.mg_lava_nether_max + 1, + flags = "all_floors, place_center_x, place_center_z", + schematic = mod_mcl_blackstone.."/schematics/mcl_blackstone_nether_fossil_1.mts", + size = {x = 5, y = 8, z = 5}, + rotation = "random", + }) + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"mcl_blackstone:soul_soil","mcl_nether:soulsand"}, + sidelen = 16, + fill_ratio = 0.0002233, + biomes = {"SoulsandValley"}, + y_min = mcl_vars.mg_lava_nether_max + 1, + flags = "all_floors, place_center_x, place_center_z", + schematic = mod_mcl_blackstone.."/schematics/mcl_blackstone_nether_fossil_2.mts", + size = {x = 5, y = 8, z = 5}, + rotation = "random", + }) + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"mcl_blackstone:soul_soil","mcl_nether:soulsand"}, + sidelen = 16, + fill_ratio = 0.000225, + biomes = {"SoulsandValley"}, + y_min = mcl_vars.mg_lava_nether_max + 1, + flags = "all_floors, place_center_x, place_center_z", + schematic = mod_mcl_blackstone.."/schematics/mcl_blackstone_nether_fossil_3.mts", + size = {x = 5, y = 8, z = 5}, + rotation = "random", + }) + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"mcl_blackstone:soul_soil","mcl_nether:soulsand"}, + sidelen = 16, + fill_ratio = 0.00022323, + biomes = {"SoulsandValley"}, + y_min = mcl_vars.mg_lava_nether_max + 1, + flags = "all_floors, place_center_x, place_center_z", + schematic = mod_mcl_blackstone.."/schematics/mcl_blackstone_nether_fossil_4.mts", + size = {x = 5, y = 8, z = 5}, + rotation = "random", + }) + --BASALT DELTA + minetest.register_decoration({ + deco_type = "simple", + decoration = "mcl_blackstone:basalt", + place_on = {"mcl_blackstone:basalt","mcl_nether:netherrack","mcl_blackstone:blackstone"}, + sidelen = 80, + height_max = 55, + noise_params={ + offset = -0.0085, + scale = 0.002, + spread = {x = 25, y = 120, z = 25}, + seed = 2325, + octaves = 5, + persist = 2, + lacunarity = 3.5, + flags = "absvalue" + }, + biomes = {"BasaltDelta"}, + y_min = mcl_vars.mg_lava_nether_max + 1, + flags = "all_floors, all ceilings", + }) + minetest.register_decoration({ + deco_type = "simple", + decoration = "mcl_blackstone:basalt", + place_on = {"mcl_blackstone:basalt","mcl_nether:netherrack","mcl_blackstone:blackstone"}, + sidelen = 80, + height_max = 15, + noise_params={ + offset = -0.0085, + scale = 0.004, + spread = {x = 25, y = 120, z = 25}, + seed = 235, + octaves = 5, + persist = 2.5, + lacunarity = 3.5, + flags = "absvalue" + }, + biomes = {"BasaltDelta"}, + y_min = mcl_vars.mg_lava_nether_max + 1, + flags = "all_floors, all ceilings", + }) + minetest.register_decoration({ + deco_type = "simple", + decoration = "mcl_nether:magma", + place_on = {"mcl_blackstone:basalt","mcl_nether:netherrack","mcl_blackstone:blackstone"}, + sidelen = 80, + fill_ratio = 0.082323, + biomes = {"BasaltDelta"}, + place_offset_y = -1, + y_min = mcl_vars.mg_lava_nether_max + 1, + flags = "all_floors, all ceilings", + }) + minetest.register_decoration({ + deco_type = "simple", + decoration = "mcl_nether:nether_lava_source", + place_on = {"mcl_blackstone:basalt","mcl_nether:netherrack","mcl_blackstone:blackstone"}, + spawn_by = {"mcl_blackstone:basalt","mcl_blackstone:blackstone"}, + num_spawn_by = 14, + sidelen = 80, + fill_ratio = 4, + biomes = {"BasaltDelta"}, + place_offset_y = -1, + y_min = mcl_vars.mg_lava_nether_max + 1, + y_max = mcl_vars.mg_nether_max - 5, + flags = "all_floors, force_placement", + }) --[[ THE END ]] @@ -3998,6 +4744,7 @@ if not mcl_mapgen.singlenode then -- Overworld decorations for v6 are handled in mcl_mapgen_core +<<<<<<< HEAD if deco_id_chorus_plant then mcl_mapgen.register_mapgen_block_lvm(function(vm_context) vm_context.gennotify = vm_context.gennotify or minetest.get_mapgen_object("gennotify") @@ -4011,6 +4758,41 @@ if not mcl_mapgen.singlenode then end return vm_context end, mcl_mapgen.order.CHORUS) +======= + local deco_ids_fungus ={ + minetest.get_decoration_id("mcl_biomes:crimson_tree1"), + minetest.get_decoration_id("mcl_biomes:crimson_tree2"), + minetest.get_decoration_id("mcl_biomes:crimson_tree3"), + minetest.get_decoration_id("mcl_biomes:warped_tree1"), + minetest.get_decoration_id("mcl_biomes:warped_tree2"), + minetest.get_decoration_id("mcl_biomes:warped_tree3") + } + for _,f in pairs(deco_ids_fungus) do + minetest.set_gen_notify({decoration=true}, { f }) + end + if deco_id_chorus_plant or deco_id_crimson_tree or deco_id_warped_tree then + mcl_mapgen_core.register_generator("chorus_grow", nil, function(minp, maxp, blockseed) + if minp.y > -26900 then return end + local gennotify = minetest.get_mapgen_object("gennotify") + local pr = PseudoRandom(blockseed + 14) + for _, pos in ipairs(gennotify["decoration#"..deco_id_chorus_plant] or {}) do + local x, y, z = pos.x, pos.y, pos.z + if x < -2 or x > 2 or z < -2 or z > 2 then + local realpos = { x = x, y = y + 1, z = z } + local node = minetest.get_node(realpos) + if node and node.name == "mcl_end:chorus_flower" then + mcl_end.grow_chorus_plant(realpos, node, pr) + end + end + end + if minp.y > mcl_vars.mg_nether_max then return end + for _,f in pairs(deco_ids_fungus) do + for _, pos in ipairs(gennotify["decoration#"..f] or {}) do + minetest.fix_light(vector.offset(pos,-8,-8,-8),vector.offset(pos,8,8,8)) + end + end + end) +>>>>>>> mcl2/master end end diff --git a/mods/MAPGEN/mcl_biomes/mod.conf b/mods/MAPGEN/mcl_biomes/mod.conf index d389640a8..4d543a5a2 100644 --- a/mods/MAPGEN/mcl_biomes/mod.conf +++ b/mods/MAPGEN/mcl_biomes/mod.conf @@ -1,4 +1,8 @@ name = mcl_biomes author = maikerumine description = Adds the various biomes and biome-related things for non-v6 map generators. +<<<<<<< HEAD depends = mcl_mapgen, mcl_mapgen_core, mcl_core, mcl_worlds, mcl_farming, mcl_flowers, mcl_end, mcl_ocean +======= +depends = mcl_init, mcl_mapgen_core, mcl_core, mcl_worlds, mcl_farming, mcl_flowers, mcl_end, mcl_ocean, mcl_crimson, mcl_blackstone +>>>>>>> mcl2/master diff --git a/mods/MAPGEN/mcl_dungeons/init.lua b/mods/MAPGEN/mcl_dungeons/init.lua index c3e406ca1..638f62eef 100644 --- a/mods/MAPGEN/mcl_dungeons/init.lua +++ b/mods/MAPGEN/mcl_dungeons/init.lua @@ -71,13 +71,13 @@ local loottable = { 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 }, { itemstring = "mcl_books:book", weight = 10, func = function(stack, pr) mcl_enchanting.enchant_uniform_randomly(stack, {"soul_speed"}, pr) end }, - { 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 }, } }, @@ -135,6 +135,7 @@ local function spawn_dungeon(p1, p2, dim, pr, dontcheck) -- Check floor and ceiling: Must be *completely* solid local y_floor = y local y_ceiling = y + dim.y + 1 +<<<<<<< HEAD if check then local dim_x, dim_z = dim.x, dim.z @@ -142,6 +143,15 @@ local function spawn_dungeon(p1, p2, dim, pr, dontcheck) if #minetest_find_nodes_in_area({x=x+1,y=y_floor,z=z+1}, {x=x+dim_z,y=y_floor,z=z+dim_z}, "group:walkabke") < size or #minetest_find_nodes_in_area({x=x+1,y=y_floor,z=z+1}, {x=x+dim_z,y=y_floor,z=z+dim_z}, "group:walkabke") < size then return +======= + if check then + for tx = x+1, x+dim.x do + for tz = z+1, z+dim.z do + local fdef = registered_nodes[get_node({x = tx, y = y_floor , z = tz}).name] + local cdef = registered_nodes[get_node({x = tx, y = y_ceiling, z = tz}).name] + if not fdef or not fdef.walkable or not cdef or not cdef.walkable then return false end + end +>>>>>>> mcl2/master end end @@ -293,7 +303,8 @@ local function spawn_dungeon(p1, p2, dim, pr, dontcheck) -- Do not overwrite nodes with is_ground_content == false (e.g. bedrock) -- Exceptions: cobblestone and mossy cobblestone so neighborings dungeons nicely connect to each other local name = get_node(p).name - if registered_nodes[name].is_ground_content or name == "mcl_core:cobble" or name == "mcl_core:mossycobble" then + local rn = registered_nodes[name] + if rn and rn.is_ground_content or name == "mcl_core:cobble" or name == "mcl_core:mossycobble" then -- Floor if ty == y then if pr:next(1,4) == 1 then diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index f8a5d1b53..614b3e674 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -60,6 +60,17 @@ local flat = mcl_mapgen.flat -- Content IDs local c_bedrock = minetest.get_content_id("mcl_core:bedrock") +<<<<<<< HEAD +======= +local c_obsidian = minetest.get_content_id("mcl_core:obsidian") +local c_stone = minetest.get_content_id("mcl_core:stone") +local c_dirt = minetest.get_content_id("mcl_core:dirt") +local c_dirt_with_grass = minetest.get_content_id("mcl_core:dirt_with_grass") +local c_dirt_with_grass_snow = minetest.get_content_id("mcl_core:dirt_with_grass_snow") +local c_reeds = minetest.get_content_id("mcl_core:reeds") +local c_sand = minetest.get_content_id("mcl_core:sand") +--local c_sandstone = minetest.get_content_id("mcl_core:sandstone") +>>>>>>> mcl2/master local c_void = minetest.get_content_id("mcl_core:void") local c_lava = minetest.get_content_id("mcl_core:lava_source") @@ -754,6 +765,7 @@ local function register_mgv6_decorations() y_max = mcl_mapgen.overworld.max, }) +<<<<<<< HEAD -- Large flowers local function register_large_flower(name, seed, offset) minetest.register_decoration({ @@ -782,6 +794,108 @@ local function register_mgv6_decorations() flags = "", }) end +======= + -- Lily pad + minetest.register_decoration({ + deco_type = "schematic", + schematic = { + size = { x=1, y=3, z=1 }, + data = { + { name = "mcl_core:water_source", prob = 0 }, + { name = "mcl_core:water_source" }, + { name = "mcl_flowers:waterlily", param1 = 255 }, + }, + }, + place_on = "mcl_core:dirt", + sidelen = 16, + noise_params = { + offset = -0.12, + scale = 0.3, + spread = {x = 200, y = 200, z = 200}, + seed = 503, + octaves = 6, + persist = 0.7, + }, + y_min = 0, + y_max = 0, + rotation = "random", + }) + + -- Pumpkin + minetest.register_decoration({ + deco_type = "simple", + decoration = "mcl_farming:pumpkin", + param2 = 0, + param2_max = 3, + place_on = {"group:grass_block_no_snow"}, + sidelen = 16, + noise_params = { + offset = -0.008, + scale = 0.00666, + spread = {x = 250, y = 250, z = 250}, + seed = 666, + octaves = 6, + persist = 0.666 + }, + y_min = 1, + y_max = mcl_vars.overworld_max, + }) + + -- Melon + minetest.register_decoration({ + deco_type = "simple", + place_on = {"group:grass_block_no_snow"}, + sidelen = 16, + noise_params = { + offset = 0.002, + scale = 0.006, + spread = {x = 250, y = 250, z = 250}, + seed = 333, + octaves = 3, + persist = 0.6 + }, + -- Small trick to make sure melon spawn in jungles + spawn_by = { "mcl_core:jungletree", "mcl_flowers:fern" }, + num_spawn_by = 1, + y_min = 1, + y_max = 40, + decoration = "mcl_farming:melon", + }) + + -- Tall grass + minetest.register_decoration({ + deco_type = "simple", + place_on = {"group:grass_block_no_snow"}, + sidelen = 8, + noise_params = { + offset = 0.01, + scale = 0.3, + spread = {x = 100, y = 100, z = 100}, + seed = 420, + octaves = 3, + persist = 0.6 + }, + y_min = 1, + y_max = mcl_vars.overworld_max, + decoration = "mcl_flowers:tallgrass", + }) + minetest.register_decoration({ + deco_type = "simple", + place_on = {"group:grass_block_no_snow"}, + sidelen = 8, + noise_params = { + offset = 0.04, + scale = 0.03, + spread = {x = 100, y = 100, z = 100}, + seed = 420, + octaves = 3, + persist = 0.6 + }, + y_min = 1, + y_max = mcl_vars.overworld_max, + decoration = "mcl_flowers:tallgrass", + }) +>>>>>>> mcl2/master register_large_flower("rose_bush", 9350, -0.008) register_large_flower("peony", 10450, -0.008) @@ -1131,6 +1245,718 @@ if string.len(mg_flags_str) > 0 then end minetest.set_mapgen_setting("mg_flags", mg_flags_str, true) +<<<<<<< HEAD +======= +-- Helper function for converting a MC probability to MT, with +-- regards to MapBlocks. +-- Some MC generated structures are generated on per-chunk +-- probability. +-- The MC probability is 1/x per Minecraft chunk (16×16). + +-- x: The MC probability is 1/x. +-- minp, maxp: MapBlock limits +-- returns: Probability (1/return_value) for a single MT mapblock +local function minecraft_chunk_probability(x, minp, maxp) + -- 256 is the MC chunk height + return x * (((maxp.x-minp.x+1)*(maxp.z-minp.z+1)) / 256) +end + +-- Takes an index of a biomemap table (from minetest.get_mapgen_object), +-- minp and maxp (from an on_generated callback) and returns the real world coordinates +-- as X, Z. +-- Inverse function of xz_to_biomemap +--[[local function biomemap_to_xz(index, minp, maxp) + local xwidth = maxp.x - minp.x + 1 + local zwidth = maxp.z - minp.z + 1 + local x = ((index-1) % xwidth) + minp.x + local z = ((index-1) / zwidth) + minp.z + return x, z +end]] + +-- Takes x and z coordinates and minp and maxp of a generated chunk +-- (in on_generated callback) and returns a biomemap index) +-- Inverse function of biomemap_to_xz +local function xz_to_biomemap_index(x, z, minp, maxp) + local xwidth = maxp.x - minp.x + 1 + local zwidth = maxp.z - minp.z + 1 + local minix = x % xwidth + local miniz = z % zwidth + + return (minix + miniz * zwidth) + 1 +end + +-- Perlin noise objects +local perlin_structures +local perlin_vines, perlin_vines_fine, perlin_vines_upwards, perlin_vines_length, perlin_vines_density +local perlin_clay + +local function generate_clay(minp, maxp, blockseed, voxelmanip_data, voxelmanip_area, lvm_used) + -- TODO: Make clay generation reproducible for same seed. + if maxp.y < -5 or minp.y > 0 then + return lvm_used + end + + local pr = PseudoRandom(blockseed) + + perlin_clay = perlin_clay or minetest.get_perlin({ + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = -316, + octaves = 1, + persist = 0.0 + }) + + for y=math.max(minp.y, 0), math.min(maxp.y, -8), -1 do + -- Assume X and Z lengths are equal + local divlen = 4 + local divs = (maxp.x-minp.x)/divlen+1; + for divx=0+1,divs-2 do + for divz=0+1,divs-2 do + -- Get position and shift it a bit randomly so the clay do not obviously appear in a grid + local cx = minp.x + math.floor((divx+0.5)*divlen) + pr:next(-1,1) + local cz = minp.z + math.floor((divz+0.5)*divlen) + pr:next(-1,1) + + local water_pos = voxelmanip_area:index(cx, y+1, cz) + local waternode = voxelmanip_data[water_pos] + local surface_pos = voxelmanip_area:index(cx, y, cz) + local surfacenode = voxelmanip_data[surface_pos] + + local genrnd = pr:next(1, 20) + if genrnd == 1 and perlin_clay:get_3d({x=cx,y=y,z=cz}) > 0 and waternode == c_water and + (surfacenode == c_dirt or minetest.get_item_group(minetest.get_name_from_content_id(surfacenode), "sand") == 1) then + local diamondsize = pr:next(1, 3) + for x1 = -diamondsize, diamondsize do + for z1 = -(diamondsize - math.abs(x1)), diamondsize - math.abs(x1) do + local ccpos = voxelmanip_area:index(cx+x1, y, cz+z1) + local claycandidate = voxelmanip_data[ccpos] + if voxelmanip_data[ccpos] == c_dirt or minetest.get_item_group(minetest.get_name_from_content_id(claycandidate), "sand") == 1 then + voxelmanip_data[ccpos] = c_clay + lvm_used = true + end + end + end + end + end + end + end + return lvm_used +end + +local function generate_end_exit_portal(pos) + local obj = minetest.add_entity(vector.add(pos, vector.new(3, 11, 3)), "mobs_mc:enderdragon") + if obj then + local dragon_entity = obj:get_luaentity() + dragon_entity._initial = true + dragon_entity._portal_pos = pos + else + minetest.log("error", "[mcl_mapgen_core] ERROR! Ender dragon doesn't want to spawn") + end + mcl_structures.call_struct(pos, "end_exit_portal") +end + +-- TODO: Try to use more efficient structure generating code +local function generate_structures(minp, maxp, blockseed, biomemap) + local chunk_has_igloo = false + local struct_min, struct_max = -3, 111 --64 + --except end exit portall all v6 + if mg_name == "v6" and maxp.y >= struct_min and minp.y <= struct_max then + -- Generate structures + local pr = PcgRandom(blockseed) + perlin_structures = perlin_structures or minetest.get_perlin(329, 3, 0.6, 100) + -- Assume X and Z lengths are equal + local divlen = 5 + for x0 = minp.x, maxp.x, divlen do for z0 = minp.z, maxp.z, divlen do + -- Determine amount from perlin noise + local amount = math.floor(perlin_structures:get_2d({x=x0, y=z0}) * 9) + -- Find random positions based on this random + local p, ground_y + for i=0, amount do + p = {x = pr:next(x0, x0+divlen-1), y = 0, z = pr:next(z0, z0+divlen-1)} + -- Find ground level + ground_y = nil + local nn + for y = struct_max, struct_min, -1 do + p.y = y + local checknode = minetest.get_node(p) + if checknode then + nn = checknode.name + local def = minetest.registered_nodes[nn] + if def and def.walkable then + ground_y = y + break + end + end + end + + if ground_y then + p.y = ground_y+1 + local nn0 = minetest.get_node(p).name + -- Check if the node can be replaced + if minetest.registered_nodes[nn0] and minetest.registered_nodes[nn0].buildable_to then + -- Igloos + if not chunk_has_igloo and (nn == "mcl_core:snowblock" or nn == "mcl_core:snow" or (minetest.get_item_group(nn, "grass_block_snow") == 1)) then + if pr:next(1, 4400) == 1 then + -- Check surface + local floor = {x=p.x+9, y=p.y-1, z=p.z+9} + local surface = minetest.find_nodes_in_area({x=p.x,y=p.y-1,z=p.z}, floor, "mcl_core:snowblock") + local surface2 = minetest.find_nodes_in_area({x=p.x,y=p.y-1,z=p.z}, floor, "mcl_core:dirt_with_grass_snow") + if #surface + #surface2 >= 63 then + mcl_structures.call_struct(p, "igloo", nil, pr) + chunk_has_igloo = true + end + end + end + + -- Fossil + if nn == "mcl_core:sandstone" or nn == "mcl_core:sand" and not chunk_has_desert_temple and ground_y > 3 then + local fossil_prob = minecraft_chunk_probability(64, minp, maxp) + + if pr:next(1, fossil_prob) == 1 then + -- Spawn fossil below desert surface between layers 40 and 49 + local p1 = {x=p.x, y=pr:next(mcl_worlds.layer_to_y(40), mcl_worlds.layer_to_y(49)), z=p.z} + -- Very rough check of the environment (we expect to have enough stonelike nodes). + -- Fossils may still appear partially exposed in caves, but this is O.K. + local p2 = vector.add(p1, 4) + local nodes = minetest.find_nodes_in_area(p1, p2, {"mcl_core:sandstone", "mcl_core:stone", "mcl_core:diorite", "mcl_core:andesite", "mcl_core:granite", "mcl_core:stone_with_coal", "mcl_core:dirt", "mcl_core:gravel"}) + + if #nodes >= 100 then -- >= 80% + mcl_structures.call_struct(p1, "fossil", nil, pr) + end + end + end + + -- Witch hut (v6) + if ground_y <= 0 and nn == "mcl_core:dirt" then + local prob = minecraft_chunk_probability(48, minp, maxp) + if pr:next(1, prob) == 1 then + + local swampland = minetest.get_biome_id("Swampland") + local swampland_shore = minetest.get_biome_id("Swampland_shore") + + -- Where do witches live? + -- v6: In Normal biome + if biomeinfo.get_v6_biome(p) == "Normal" then + here_be_witches = true + end + local here_be_witches = false + if here_be_witches then + + local r = tostring(pr:next(0, 3) * 90) -- "0", "90", "180" or 270" + local p1 = {x=p.x-1, y=WITCH_HUT_HEIGHT+2, z=p.z-1} + local size + if r == "0" or r == "180" then + size = {x=10, y=4, z=8} + else + size = {x=8, y=4, z=10} + end + local p2 = vector.add(p1, size) + + -- This checks free space at the “body” of the hut and a bit around. + -- ALL nodes must be free for the placement to succeed. + local free_nodes = minetest.find_nodes_in_area(p1, p2, {"air", "mcl_core:water_source", "mcl_flowers:waterlily"}) + if #free_nodes >= ((size.x+1)*(size.y+1)*(size.z+1)) then + local place = {x=p.x, y=WITCH_HUT_HEIGHT-1, z=p.z} + + -- FIXME: For some mysterious reason (black magic?) this + -- function does sometimes NOT spawn the witch hut. One can only see the + -- oak wood nodes in the water, but no hut. :-/ + mcl_structures.place_structure(place,mcl_structures.registered_structures["witch_hut"],pr) + + local function place_tree_if_free(pos, prev_result) + local nn = minetest.get_node(pos).name + if nn == "mcl_flowers:waterlily" or nn == "mcl_core:water_source" or nn == "mcl_core:water_flowing" or nn == "air" then + minetest.set_node(pos, {name="mcl_core:tree", param2=0}) + return prev_result + else + return false + end + end + local offsets + if r == "0" then + offsets = { + {x=1, y=0, z=1}, + {x=1, y=0, z=5}, + {x=6, y=0, z=1}, + {x=6, y=0, z=5}, + } + elseif r == "180" then + offsets = { + {x=2, y=0, z=1}, + {x=2, y=0, z=5}, + {x=7, y=0, z=1}, + {x=7, y=0, z=5}, + } + elseif r == "270" then + offsets = { + {x=1, y=0, z=1}, + {x=5, y=0, z=1}, + {x=1, y=0, z=6}, + {x=5, y=0, z=6}, + } + elseif r == "90" then + offsets = { + {x=1, y=0, z=2}, + {x=5, y=0, z=2}, + {x=1, y=0, z=7}, + {x=5, y=0, z=7}, + } + end + for o=1, #offsets do + local ok = true + for y=place.y-1, place.y-64, -1 do + local tpos = vector.add(place, offsets[o]) + tpos.y = y + ok = place_tree_if_free(tpos, ok) + if not ok then + break + end + end + end + end + end + end + end + + -- Ice spikes in v6 + -- In other mapgens, ice spikes are generated as decorations. + if nn == "mcl_core:snowblock" then + local spike = pr:next(1,58000) + if spike < 3 then + -- Check surface + local floor = {x=p.x+4, y=p.y-1, z=p.z+4} + local surface = minetest.find_nodes_in_area({x=p.x+1,y=p.y-1,z=p.z+1}, floor, {"mcl_core:snowblock"}) + -- Check for collision with spruce + local spruce_collisions = minetest.find_nodes_in_area({x=p.x+1,y=p.y+2,z=p.z+1}, {x=p.x+4, y=p.y+6, z=p.z+4}, {"mcl_core:sprucetree", "mcl_core:spruceleaves"}) + + if #surface >= 9 and #spruce_collisions == 0 then + mcl_structures.place_structure(p,mcl_structures.registered_structures["ice_spike_large"],pr) + end + elseif spike < 100 then + -- Check surface + local floor = {x=p.x+6, y=p.y-1, z=p.z+6} + local surface = minetest.find_nodes_in_area({x=p.x+1,y=p.y-1,z=p.z+1}, floor, {"mcl_core:snowblock", "mcl_core:dirt_with_grass_snow"}) + + -- Check for collision with spruce + local spruce_collisions = minetest.find_nodes_in_area({x=p.x+1,y=p.y+1,z=p.z+1}, {x=p.x+6, y=p.y+6, z=p.z+6}, {"mcl_core:sprucetree", "mcl_core:spruceleaves"}) + + if #surface >= 25 and #spruce_collisions == 0 then + mcl_structures.place_structure(p,mcl_structures.registered_structures["ice_spike_small"],pr) + end + end + end + end + end + + end + end end + -- End exit portal + elseif minp.y <= END_EXIT_PORTAL_POS.y and maxp.y >= END_EXIT_PORTAL_POS.y and + minp.x <= END_EXIT_PORTAL_POS.x and maxp.x >= END_EXIT_PORTAL_POS.x and + minp.z <= END_EXIT_PORTAL_POS.z and maxp.z >= END_EXIT_PORTAL_POS.z then + for y=maxp.y, minp.y, -1 do + local p = {x=END_EXIT_PORTAL_POS.x, y=y, z=END_EXIT_PORTAL_POS.z} + if minetest.get_node(p).name == "mcl_end:end_stone" then + generate_end_exit_portal(p) + return + end + end + generate_end_exit_portal(END_EXIT_PORTAL_POS) + end +end + +-- Buffers for LuaVoxelManip +-- local lvm_buffer = {} +-- local lvm_buffer_param2 = {} + +-- Generate tree decorations in the bounding box. This adds: +-- * Cocoa at jungle trees +-- * Jungle tree vines +-- * Oak vines in swamplands +local function generate_tree_decorations(minp, maxp, seed, data, param2_data, area, biomemap, lvm_used, pr) + if maxp.y < 0 then + return lvm_used + end + + local oaktree, oakleaves, jungletree, jungleleaves = {}, {}, {}, {} + local swampland = minetest.get_biome_id("Swampland") + local swampland_shore = minetest.get_biome_id("Swampland_shore") + local jungle = minetest.get_biome_id("Jungle") + local jungle_shore = minetest.get_biome_id("Jungle_shore") + local jungle_m = minetest.get_biome_id("JungleM") + local jungle_m_shore = minetest.get_biome_id("JungleM_shore") + local jungle_edge = minetest.get_biome_id("JungleEdge") + local jungle_edge_shore = minetest.get_biome_id("JungleEdge_shore") + local jungle_edge_m = minetest.get_biome_id("JungleEdgeM") + local jungle_edge_m_shore = minetest.get_biome_id("JungleEdgeM_shore") + + -- Modifier for Jungle M biome: More vines and cocoas + local dense_vegetation = false + + if biomemap then + -- Biome map available: Check if the required biome (jungle or swampland) + -- is in this mapchunk. We are only interested in trees in the correct biome. + -- The nodes are added if the correct biome is *anywhere* in the mapchunk. + -- TODO: Strictly generate vines in the correct biomes only. + local swamp_biome_found, jungle_biome_found = false, false + for b=1, #biomemap do + local id = biomemap[b] + + if not swamp_biome_found and (id == swampland or id == swampland_shore) then + oaktree = minetest.find_nodes_in_area(minp, maxp, {"mcl_core:tree"}) + oakleaves = minetest.find_nodes_in_area(minp, maxp, {"mcl_core:leaves"}) + swamp_biome_found = true + end + if not jungle_biome_found and (id == jungle or id == jungle_shore or id == jungle_m or id == jungle_m_shore or id == jungle_edge or id == jungle_edge_shore or id == jungle_edge_m or id == jungle_edge_m_shore) then + jungletree = minetest.find_nodes_in_area(minp, maxp, {"mcl_core:jungletree"}) + jungleleaves = minetest.find_nodes_in_area(minp, maxp, {"mcl_core:jungleleaves"}) + jungle_biome_found = true + end + if not dense_vegetation and (id == jungle_m or id == jungle_m_shore) then + dense_vegetation = true + end + if swamp_biome_found and jungle_biome_found and dense_vegetation then + break + end + end + else + -- If there is no biome map, we just count all jungle things we can find. + -- Oak vines will not be generated. + jungletree = minetest.find_nodes_in_area(minp, maxp, {"mcl_core:jungletree"}) + jungleleaves = minetest.find_nodes_in_area(minp, maxp, {"mcl_core:jungleleaves"}) + end + + local pos, treepos, dir + + local cocoachance = 40 + if dense_vegetation then + cocoachance = 32 + end + + -- Pass 1: Generate cocoas at jungle trees + for n = 1, #jungletree do + + pos = table.copy(jungletree[n]) + treepos = table.copy(pos) + + if minetest.find_node_near(pos, 1, {"mcl_core:jungleleaves"}) then + + dir = pr:next(1, cocoachance) + + if dir == 1 then + pos.z = pos.z + 1 + elseif dir == 2 then + pos.z = pos.z - 1 + elseif dir == 3 then + pos.x = pos.x + 1 + elseif dir == 4 then + pos.x = pos.x -1 + end + + local p_pos = area:index(pos.x, pos.y, pos.z) + local l = minetest.get_node_light(pos) + + if dir < 5 + and data[p_pos] == c_air + and l and l > 12 then + local c = pr:next(1, 3) + if c == 1 then + data[p_pos] = c_cocoa_1 + elseif c == 2 then + data[p_pos] = c_cocoa_2 + else + data[p_pos] = c_cocoa_3 + end + param2_data[p_pos] = minetest.dir_to_facedir(vector.subtract(treepos, pos)) + lvm_used = true + end + + end + end + + -- Pass 2: Generate vines at jungle wood, jungle leaves in jungle and oak wood, oak leaves in swampland + perlin_vines = perlin_vines or minetest.get_perlin(555, 4, 0.6, 500) + perlin_vines_fine = perlin_vines_fine or minetest.get_perlin(43000, 3, 0.6, 1) + perlin_vines_length = perlin_vines_length or minetest.get_perlin(435, 4, 0.6, 75) + perlin_vines_upwards = perlin_vines_upwards or minetest.get_perlin(436, 3, 0.6, 10) + perlin_vines_density = perlin_vines_density or minetest.get_perlin(436, 3, 0.6, 500) + + -- Extra long vines in Jungle M + local maxvinelength = 7 + if dense_vegetation then + maxvinelength = 14 + end + local treething + for i=1, 4 do + if i==1 then + treething = jungletree + elseif i == 2 then + treething = jungleleaves + elseif i == 3 then + treething = oaktree + elseif i == 4 then + treething = oakleaves + end + + for n = 1, #treething do + pos = treething[n] + + treepos = table.copy(pos) + + local dirs = { + {x=1,y=0,z=0}, + {x=-1,y=0,z=0}, + {x=0,y=0,z=1}, + {x=0,y=0,z=-1}, + } + + for d = 1, #dirs do + local pos = vector.add(pos, dirs[d]) + local p_pos = area:index(pos.x, pos.y, pos.z) + + local vine_threshold = math.max(0.33333, perlin_vines_density:get_2d(pos)) + if dense_vegetation then + vine_threshold = vine_threshold * (2/3) + end + + if perlin_vines:get_2d(pos) > -1.0 and perlin_vines_fine:get_3d(pos) > vine_threshold and data[p_pos] == c_air then + + local rdir = {} + rdir.x = -dirs[d].x + rdir.y = dirs[d].y + rdir.z = -dirs[d].z + local param2 = minetest.dir_to_wallmounted(rdir) + + -- Determine growth direction + local grow_upwards = false + -- Only possible on the wood, not on the leaves + if i == 1 then + grow_upwards = perlin_vines_upwards:get_3d(pos) > 0.8 + end + if grow_upwards then + -- Grow vines up 1-4 nodes, even through jungleleaves. + -- This may give climbing access all the way to the top of the tree :-) + -- But this will be fairly rare. + local length = math.ceil(math.abs(perlin_vines_length:get_3d(pos)) * 4) + for l=0, length-1 do + local t_pos = area:index(treepos.x, treepos.y, treepos.z) + + if (data[p_pos] == c_air or data[p_pos] == c_jungleleaves or data[p_pos] == c_leaves) and mcl_core.supports_vines(minetest.get_name_from_content_id(data[t_pos])) then + data[p_pos] = c_vine + param2_data[p_pos] = param2 + lvm_used = true + + else + break + end + pos.y = pos.y + 1 + p_pos = area:index(pos.x, pos.y, pos.z) + treepos.y = treepos.y + 1 + end + else + -- Grow vines down, length between 1 and maxvinelength + local length = math.ceil(math.abs(perlin_vines_length:get_3d(pos)) * maxvinelength) + for l=0, length-1 do + if data[p_pos] == c_air then + data[p_pos] = c_vine + param2_data[p_pos] = param2 + lvm_used = true + + else + break + end + pos.y = pos.y - 1 + p_pos = area:index(pos.x, pos.y, pos.z) + end + end + end + end + + end + end + return lvm_used +end + +-- Generate mushrooms in caves manually. +-- only v6. minetest supports cave decos via "all_floors" flag now +local function generate_underground_mushrooms(minp, maxp, seed) + local pr_shroom = PseudoRandom(seed-24359) + -- Generate rare underground mushrooms + -- TODO: Make them appear in groups, use Perlin noise + local min, max = mcl_vars.mg_lava_overworld_max + 4, 0 + if minp.y > max or maxp.y < min then + return + end + + local bpos + local stone = minetest.find_nodes_in_area_under_air(minp, maxp, {"mcl_core:stone", "mcl_core:dirt", "mcl_core:mycelium", "mcl_core:podzol", "mcl_core:andesite", "mcl_core:diorite", "mcl_core:granite", "mcl_core:stone_with_coal", "mcl_core:stone_with_iron", "mcl_core:stone_with_gold"}) + + for n = 1, #stone do + bpos = {x = stone[n].x, y = stone[n].y + 1, z = stone[n].z } + + local l = minetest.get_node_light(bpos, 0.5) + if bpos.y >= min and bpos.y <= max and l and l <= 12 and pr_shroom:next(1,1000) < 4 then + if pr_shroom:next(1,2) == 1 then + minetest.set_node(bpos, {name = "mcl_mushrooms:mushroom_brown"}) + else + minetest.set_node(bpos, {name = "mcl_mushrooms:mushroom_red"}) + end + end + end +end + +-- Generate Nether decorations manually: Eternal fire, mushrooms, nether wart +-- (only v6) +local nether_wart_chance = 85 +local function generate_nether_decorations(minp, maxp, seed) + local pr_nether = PseudoRandom(seed+667) + + if minp.y > mcl_vars.mg_nether_max or maxp.y < mcl_vars.mg_nether_min then + return + end + + minetest.log("action", "[mcl_mapgen_core] Nether decorations " .. minetest.pos_to_string(minp) .. " ... " .. minetest.pos_to_string(maxp)) + + -- TODO: Generate everything based on Perlin noise instead of PseudoRandom + + local bpos + local rack = minetest.find_nodes_in_area_under_air(minp, maxp, {"mcl_nether:netherrack"}) + local magma = minetest.find_nodes_in_area_under_air(minp, maxp, {"mcl_nether:magma"}) + local ssand = minetest.find_nodes_in_area_under_air(minp, maxp, {"mcl_nether:soul_sand"}) + + -- Helper function to spawn “fake” decoration + local function special_deco(nodes, spawn_func) + for n = 1, #nodes do + bpos = {x = nodes[n].x, y = nodes[n].y + 1, z = nodes[n].z } + + spawn_func(bpos) + end + end + -- Eternal fire on netherrack + special_deco(rack, function(bpos) + -- Eternal fire on netherrack + if pr_nether:next(1,100) <= 3 then + minetest.set_node(bpos, {name = "mcl_fire:eternal_fire"}) + end + end) + + -- Eternal fire on magma cubes + special_deco(magma, function(bpos) + if pr_nether:next(1,150) == 1 then + minetest.set_node(bpos, {name = "mcl_fire:eternal_fire"}) + end + end) + + -- Mushrooms on netherrack + -- Note: Spawned *after* the fire because of light level checks + special_deco(rack, function(bpos) + local l = minetest.get_node_light(bpos, 0.5) + if bpos.y > mcl_vars.mg_lava_nether_max + 6 and l and l <= 12 and pr_nether:next(1,1000) <= 4 then + -- TODO: Make mushrooms appear in groups, use Perlin noise + if pr_nether:next(1,2) == 1 then + minetest.set_node(bpos, {name = "mcl_mushrooms:mushroom_brown"}) + else + minetest.set_node(bpos, {name = "mcl_mushrooms:mushroom_red"}) + end + end + end) + + -- Nether wart on soul sand + -- TODO: Spawn in Nether fortresses + special_deco(ssand, function(bpos) + if pr_nether:next(1, nether_wart_chance) == 1 then + minetest.set_node(bpos, {name = "mcl_nether:nether_wart"}) + end + end) +end + +minetest.register_on_generated(function(minp, maxp, blockseed) + minetest.log("action", "[mcl_mapgen_core] Generating chunk " .. minetest.pos_to_string(minp) .. " ... " .. minetest.pos_to_string(maxp)) + local p1, p2 = {x=minp.x, y=minp.y, z=minp.z}, {x=maxp.x, y=maxp.y, z=maxp.z} + if lvm > 0 then + local lvm_used, shadow = false, false + local lb2 = {} -- param2 + local vm, emin, emax = minetest.get_mapgen_object("voxelmanip") + local e1, e2 = {x=emin.x, y=emin.y, z=emin.z}, {x=emax.x, y=emax.y, z=emax.z} + local data2 + local data = vm:get_data(lvm_buffer) + if param2 > 0 then + data2 = vm:get_param2_data(lb2) + end + local area = VoxelArea:new({MinEdge=e1, MaxEdge=e2}) + + for _, rec in pairs(registered_generators) do + if rec.vf then + local lvm_used0, shadow0 = rec.vf(vm, data, data2, e1, e2, area, p1, p2, blockseed) + if lvm_used0 then + lvm_used = true + end + if shadow0 then + shadow = true + end + end + end + + if lvm_used then + -- Write stuff + vm:set_data(data) + if param2 > 0 then + vm:set_param2_data(data2) + end + vm:calc_lighting(p1, p2, shadow) + vm:write_to_map() + vm:update_liquids() + end + end + + if nodes > 0 then + for _, rec in pairs(registered_generators) do + if rec.nf then + rec.nf(p1, p2, blockseed) + end + end + end + + mcl_vars.add_chunk(minp) +end) + +function minetest.register_on_generated(node_function) + mcl_mapgen_core.register_generator("mod_"..tostring(#registered_generators+1), nil, node_function) +end + +function mcl_mapgen_core.register_generator(id, lvm_function, node_function, priority, needs_param2) + if not id then return end + + local priority = priority or 5000 + + if lvm_function then lvm = lvm + 1 end + if lvm_function then nodes = nodes + 1 end + if needs_param2 then param2 = param2 + 1 end + + local new_record = { + i = priority, + vf = lvm_function, + nf = node_function, + needs_param2 = needs_param2, + } + + registered_generators[id] = new_record + table.sort(registered_generators, function(a, b) + return (a.i < b.i) or ((a.i == b.i) and a.vf and (b.vf == nil)) + end) +end + +function mcl_mapgen_core.unregister_generator(id) + if not registered_generators[id] then return end + local rec = registered_generators[id] + registered_generators[id] = nil + if rec.vf then lvm = lvm - 1 end + if rec.nf then nodes = nodes - 1 end + if rec.needs_param2 then param2 = param2 - 1 end + --if rec.needs_level0 then level0 = level0 - 1 end +end + +>>>>>>> mcl2/master -- Generate basic layer-based nodes: void, bedrock, realm barrier, lava seas, etc. -- Also perform some basic node replacements. @@ -1206,6 +2032,7 @@ local function set_layers(vm_context, pr, min, max, content_id, check) end end +<<<<<<< HEAD ---- Generate layers of air, void, etc local air_layers = { {mcl_mapgen.nether.max + 1, mcl_mapgen.nether.max + 128} -- on Nether Roof @@ -1213,6 +2040,189 @@ local air_layers = { if flat then air_layers[#air_layers + 1] = {mcl_mapgen.nether.flat_floor, mcl_mapgen.nether.flat_ceiling} -- Flat Nether end +======= +-- Below the bedrock, generate air/void +local function basic(vm, data, data2, emin, emax, area, minp, maxp, blockseed) + local biomemap --ymin, ymax + local lvm_used = false + local pr = PseudoRandom(blockseed) + + -- The Void below the Nether: + lvm_used = set_layers(data, area, c_void , nil, mcl_vars.mapgen_edge_min , mcl_vars.mg_nether_min -1, minp, maxp, lvm_used, pr) + + -- [[ THE NETHER: mcl_vars.mg_nether_min mcl_vars.mg_nether_max ]] + + -- The Air on the Nether roof, https://git.minetest.land/MineClone2/MineClone2/issues/1186 + lvm_used = set_layers(data, area, c_air , nil, mcl_vars.mg_nether_max +1, mcl_vars.mg_nether_max + 128 , minp, maxp, lvm_used, pr) + -- The Void above the Nether below the End: + lvm_used = set_layers(data, area, c_void , nil, mcl_vars.mg_nether_max + 128 +1, mcl_vars.mg_end_min -1, minp, maxp, lvm_used, pr) + + -- [[ THE END: mcl_vars.mg_end_min mcl_vars.mg_end_max ]] + + -- The Void above the End below the Realm barrier: + lvm_used = set_layers(data, area, c_void , nil, mcl_vars.mg_end_max +1, mcl_vars.mg_realm_barrier_overworld_end_min-1, minp, maxp, lvm_used, pr) + -- Realm barrier between the Overworld void and the End + lvm_used = set_layers(data, area, c_realm_barrier, nil, mcl_vars.mg_realm_barrier_overworld_end_min , mcl_vars.mg_realm_barrier_overworld_end_max , minp, maxp, lvm_used, pr) + -- The Void above Realm barrier below the Overworld: + lvm_used = set_layers(data, area, c_void , nil, mcl_vars.mg_realm_barrier_overworld_end_max+1, mcl_vars.mg_overworld_min -1, minp, maxp, lvm_used, pr) + + + if mg_name ~= "singlenode" then + -- Bedrock + lvm_used = set_layers(data, area, c_bedrock, bedrock_check, mcl_vars.mg_bedrock_overworld_min, mcl_vars.mg_bedrock_overworld_max, minp, maxp, lvm_used, pr) + lvm_used = set_layers(data, area, c_bedrock, bedrock_check, mcl_vars.mg_bedrock_nether_bottom_min, mcl_vars.mg_bedrock_nether_bottom_max, minp, maxp, lvm_used, pr) + lvm_used = set_layers(data, area, c_bedrock, bedrock_check, mcl_vars.mg_bedrock_nether_top_min, mcl_vars.mg_bedrock_nether_top_max, minp, maxp, lvm_used, pr) + + -- Flat Nether + if mg_name == "flat" then + lvm_used = set_layers(data, area, c_air, nil, mcl_vars.mg_flat_nether_floor, mcl_vars.mg_flat_nether_ceiling, minp, maxp, lvm_used, pr) + end + + -- Big lava seas by replacing air below a certain height + if mcl_vars.mg_lava then + lvm_used = set_layers(data, area, c_lava, c_air, mcl_vars.mg_overworld_min, mcl_vars.mg_lava_overworld_max, minp, maxp, lvm_used, pr) + lvm_used = set_layers(data, area, c_nether_lava, c_air, mcl_vars.mg_nether_min, mcl_vars.mg_lava_nether_max, minp, maxp, lvm_used, pr) + end + + -- Clay, vines, cocoas + lvm_used = generate_clay(minp, maxp, blockseed, data, area, lvm_used) + + biomemap = minetest.get_mapgen_object("biomemap") + lvm_used = generate_tree_decorations(minp, maxp, blockseed, data, data2, area, biomemap, lvm_used, pr) + + ----- Interactive block fixing section ----- + ----- The section to perform basic block overrides of the core mapgen generated world. ----- + + -- Snow and sand fixes. This code implements snow consistency + -- and fixes floating sand and cut plants. + -- A snowy grass block must be below a top snow or snow block at all times. + if minp.y <= mcl_vars.mg_overworld_max and maxp.y >= mcl_vars.mg_overworld_min then + -- v6 mapgen: + if mg_name == "v6" then + + --[[ Remove broken double plants caused by v6 weirdness. + v6 might break the bottom part of double plants because of how it works. + There are 3 possibilities: + 1) Jungle: Top part is placed on top of a jungle tree or fern (=v6 jungle grass). + This is because the schematic might be placed even if some nodes of it + could not be placed because the destination was already occupied. + TODO: A better fix for this would be if schematics could abort placement + altogether if ANY of their nodes could not be placed. + 2) Cavegen: Removes the bottom part, the upper part floats + 3) Mudflow: Same as 2) ]] + local plants = minetest.find_nodes_in_area(minp, maxp, "group:double_plant") + for n = 1, #plants do + local node = vm:get_node_at(plants[n]) + local is_top = minetest.get_item_group(node.name, "double_plant") == 2 + if is_top then + local p_pos = area:index(plants[n].x, plants[n].y-1, plants[n].z) + if p_pos then + node = vm:get_node_at({x=plants[n].x, y=plants[n].y-1, z=plants[n].z}) + local is_bottom = minetest.get_item_group(node.name, "double_plant") == 1 + if not is_bottom then + p_pos = area:index(plants[n].x, plants[n].y, plants[n].z) + data[p_pos] = c_air + lvm_used = true + end + end + end + end + + + -- Non-v6 mapgens: + else + -- Set param2 (=color) of grass blocks. + -- Clear snowy grass blocks without snow above to ensure consistency. + local nodes = minetest.find_nodes_in_area(minp, maxp, {"mcl_core:dirt_with_grass", "mcl_core:dirt_with_grass_snow"}) + + -- Flat area at y=0 to read biome 3 times faster than 5.3.0.get_biome_data(pos).biome: 43us vs 125us per iteration: + local aream = VoxelArea:new({MinEdge={x=minp.x, y=0, z=minp.z}, MaxEdge={x=maxp.x, y=0, z=maxp.z}}) + for n=1, #nodes do + local n = nodes[n] + local p_pos = area:index(n.x, n.y, n.z) + local p_pos_above = area:index(n.x, n.y+1, n.z) + --local p_pos_below = area:index(n.x, n.y-1, n.z) + local b_pos = aream:index(n.x, 0, n.z) + local bn = minetest.get_biome_name(biomemap[b_pos]) + if bn then + local biome = minetest.registered_biomes[bn] + if biome and biome._mcl_biome_type then + data2[p_pos] = biome._mcl_palette_index + lvm_used = true + end + end + if data[p_pos] == c_dirt_with_grass_snow and p_pos_above and data[p_pos_above] ~= c_top_snow and data[p_pos_above] ~= c_snow_block then + data[p_pos] = c_dirt_with_grass + lvm_used = true + end + end + + -- Set param2 (=color) of sugar cane + nodes = minetest.find_nodes_in_area(minp, maxp, {"mcl_core:reeds"}) + for n=1, #nodes do + local n = nodes[n] + local p_pos = area:index(n.x, n.y, n.z) + local b_pos = aream:index(n.x, 0, n.z) + local bn = minetest.get_biome_name(biomemap[b_pos]) + if bn then + local biome = minetest.registered_biomes[bn] + if biome and biome._mcl_biome_type then + data2[p_pos] = biome._mcl_palette_index + lvm_used = true + end + end + end + end + + -- Nether block fixes: + -- * Replace water with Nether lava. + -- * Replace stone, sand dirt in v6 so the Nether works in v6. + elseif emin.y <= mcl_vars.mg_nether_max and emax.y >= mcl_vars.mg_nether_min then + if mg_name == "v6" then + local nodes = minetest.find_nodes_in_area(emin, emax, {"mcl_core:water_source", "mcl_core:stone", "mcl_core:sand", "mcl_core:dirt"}) + for n=1, #nodes do + local p_pos = area:index(nodes[n].x, nodes[n].y, nodes[n].z) + if data[p_pos] == c_water then + data[p_pos] = c_nether_lava + lvm_used = true + elseif data[p_pos] == c_stone then + data[p_pos] = c_netherrack + lvm_used = true + elseif data[p_pos] == c_sand or data[p_pos] == c_dirt then + data[p_pos] = c_soul_sand + lvm_used = true + end + end + else + local nodes = minetest.find_nodes_in_area(emin, emax, {"group:water"}) + for _, n in pairs(nodes) do + data[area:index(n.x, n.y, n.z)] = c_nether_lava + end + end + + -- End block fixes: + -- * Replace water with end stone or air (depending on height). + -- * Remove stone, sand, dirt in v6 so our End map generator works in v6. + -- * Generate spawn platform (End portal destination) + elseif minp.y <= mcl_vars.mg_end_max and maxp.y >= mcl_vars.mg_end_min then + local nodes + if mg_name == "v6" then + nodes = minetest.find_nodes_in_area(emin, emax, {"mcl_core:water_source", "mcl_core:stone", "mcl_core:sand", "mcl_core:dirt"}) + else + nodes = minetest.find_nodes_in_area(emin, emax, {"mcl_core:water_source"}) + end + if #nodes > 0 then + lvm_used = true + for _,n in pairs(nodes) do + data[area:index(n.x, n.y, n.z)] = c_air + end + end + + -- Obsidian spawn platform + if minp.y <= mcl_vars.mg_end_platform_pos.y and maxp.y >= mcl_vars.mg_end_platform_pos.y and + minp.x <= mcl_vars.mg_end_platform_pos.x and maxp.x >= mcl_vars.mg_end_platform_pos.z and + minp.z <= mcl_vars.mg_end_platform_pos.z and maxp.z >= mcl_vars.mg_end_platform_pos.z then +>>>>>>> mcl2/master -- Realm barrier between the Overworld void and the End local barrier_min = mcl_mapgen.realm_barrier_overworld_end_min @@ -1249,6 +2259,7 @@ mcl_mapgen.register_mapgen_block_lvm(function(vm_context) for _, layer in pairs(bedrock_layers) do set_layers(vm_context, pr, layer[1], layer[2], c_bedrock, bedrock_check) end +<<<<<<< HEAD if not singlenode then -- Big lava seas by replacing air below a certain height if mcl_mapgen.lava then @@ -1274,3 +2285,42 @@ end if not singlenode and c_nether then dofile(modpath .. "/nether.lua") end +======= + + return lvm_used, shadow +end + +local function basic_node(minp, maxp, blockseed) + if mg_name ~= "singlenode" then + -- Generate special decorations + if mg_name == "v6" then + generate_underground_mushrooms(minp, maxp, blockseed) + generate_nether_decorations(minp, maxp, blockseed) + end + generate_structures(minp, maxp, blockseed, minetest.get_mapgen_object("biomemap")) + end +end + +mcl_mapgen_core.register_generator("main", basic, basic_node, 1, true) + +mcl_mapgen_core.register_generator("structures",nil, function(minp, maxp, blockseed) + local gennotify = minetest.get_mapgen_object("gennotify") + local pr = PseudoRandom(blockseed + 42) + local has_struct = {} + local poshash = minetest.hash_node_position(minp) + for _,struct in pairs(mcl_structures.registered_structures) do + if struct.deco_id then + local has = false + if has_struct[struct.name] == nil then has_struct[struct.name] = {} end + for _, pos in pairs(gennotify["decoration#"..struct.deco_id] or {}) do + local realpos = vector.offset(pos,0,1,0) + minetest.remove_node(realpos) + if struct.chunk_probability == nil or (not has and pr:next(1,struct.chunk_probability) == 1 ) then + mcl_structures.place_structure(realpos,struct,pr) + has=true + end + end + end + end +end, 100, true) +>>>>>>> mcl2/master diff --git a/mods/MAPGEN/mcl_nether_fortresses/init.lua b/mods/MAPGEN/mcl_nether_fortresses/init.lua new file mode 100644 index 000000000..8a5d97244 --- /dev/null +++ b/mods/MAPGEN/mcl_nether_fortresses/init.lua @@ -0,0 +1,29 @@ +local modname = minetest.get_current_modname() +local modpath = minetest.get_modpath(modname) + +mcl_structures.register_structure("nether_outpost",{ + place_on = {"mcl_nether:netherrack","mcl_crimson:crimson_nylium","mcl_crimson:warped_nylium","mcl_blackstone:basalt","mcl_blackstone:soul_soil"}, + noise_params = { + offset = 0, + scale = 0.00022, + spread = {x = 250, y = 250, z = 250}, + seed = 333, + octaves = 1, + persist = 0.0001, + flags = "absvalue", + }, + flags = "all_floors", + biomes = {"Nether","SoulsandValley","WarpedForest","CrimsonForest","BasaltDelta"}, + sidelen = 15, + solid_ground = true, + make_foundation = true, + y_min = mcl_vars.mg_lava_nether_max - 1, + y_max = mcl_vars.mg_nether_max - 30, + filenames = { modpath.."/schematics/nether_outpost.mts" }, + y_offset = 0, + after_place = function(pos) + local sp = minetest.find_nodes_in_area(pos,vector.offset(pos,0,20,0),{"mcl_mobspawners:spawner"}) + if not sp[1] then return end + mcl_mobspawners.setup_spawner(sp[1], "mobs_mc:blaze", 0, minetest.LIGHT_MAX+1, 10, 3, -1) + end +}) diff --git a/mods/MAPGEN/mcl_nether_fortresses/mod.conf b/mods/MAPGEN/mcl_nether_fortresses/mod.conf new file mode 100644 index 000000000..7d1565ff3 --- /dev/null +++ b/mods/MAPGEN/mcl_nether_fortresses/mod.conf @@ -0,0 +1,3 @@ +name = mcl_nether_fortresses +author = cora +depends = mcl_init, mcl_structures, mcl_mobspawners diff --git a/mods/MAPGEN/mcl_nether_fortresses/schematics/nether_outpost.mts b/mods/MAPGEN/mcl_nether_fortresses/schematics/nether_outpost.mts new file mode 100644 index 0000000000000000000000000000000000000000..7fba741bffc627745bed98dad8e688552a64664e GIT binary patch literal 1392 zcmeYb3HD`RVc=!pXW*?z1q@OQ%!!#r49dC5Iq}6MKxVNOn2OI!Ey+kNicc!aOwNwa zFD*$eVvxnFh(QV@U7nbeQ*2d~ngY=e(Qe2f4w8ciSs|N@N0TWYITMIm(o*x1Q;Sgy zj0cMm@=s=79?(Cy9c;uPjpSgUZ%~4RK?F%MJtx1sxFkO>l|cq13Jb%W#3WQbC?Sk4 z8=sP2nv|1@VsLSODbTpYyc7lrBK~+0%0(SVRt3OD2NMC(u5HtQDDkgGDw1qO3F!0&IX696*wqL@{5u) z@Wh!##hkYhy^|Iz@bq2T{cdgC_U*S{-Mjqh)p0E^j?SiAr|w9#@jYz*BP7FBaKTB- zVP^b(aoM6Kp}GnGio@bK(=Qb}iM%vC@mN>mL91ijnLql9r!M_j!1`e77bC%ylfGTi z`4oL8c+t7nJ3CHDH-~83$WB;4WBQS8ljgJ;oHLqheR4+J*%+y!)QQ@=pJ#0n@G9Oc z5jbz&z3`(7tDLW<{qqoGxU{%Q=F18B2cEOucb*QM$s085&4tg;K7770WhJ}kt>4T! zr#FgawS=VjZ~dfF^gQ=fPhK#0sFQBU{RLu&K3`K7m+qZcpj#slna{trmFsEawI&m` z9fC7Y`~8_#p3k?{LEGZ#?hDTsn7v)Wx>M|(^sO?}-v4?I-&t>e-n}7Q_kp?a+E%Lx zV&S(-6BzG4zRq;)+SNm!zBeUJ@N${^6sv6@bpW-C$^`1J# z7eA#}a;wg#Ot<+ui*|jJy??I0Rm1x;``U$T|GS@>x`plb7jfgD9ej+DhPRY+j6O1K zRdKU+OFp7iQk|0K=D&qoiZ=o%V7+9vM3U?Gj9$seFFKE9W}IP?TAN;QMWBD$%ZyC^ zlZUQs+VE@|Yutow!D4qdF52emnY^i?p3$2pX@gRSyVxDADXitGAN1DnPd)x4@<6=W z>Z*U6oI7^EQQIs~{ae`W)?*?2lP(_JdnX<^eZ^$){L?PGCm2qge4=u)_1(OL+qL%6 zIng_+zc9S}{ZrtAW@2vlvGc_XCES-^Y*9PP;KyKdnR#ARfA@K3yGRcsh21(|W>tH) zy^xQrF#F3NxnX{5?B)vzZl0?jy|}Wq!t12d= pos.x and minp.z <= pos.z and maxp.z >= pos.z and minp.y <= pos.y and maxp.y >= pos.y then + -- Make sure the end portal room is completely within the current mapchunk + -- The original pos is changed intentionally. + if pos.x - 6 < minp.x then + pos.x = minp.x + 7 + end + if pos.x + 6 > maxp.x then + pos.x = maxp.x - 7 + end + if pos.y - 4 < minp.y then + pos.y = minp.y + 5 + end + if pos.y + 4 > maxp.y then + pos.y = maxp.y - 5 + end + if pos.z - 6 < minp.z then + pos.z = minp.z + 7 + end + if pos.z + 6 > maxp.z then + pos.z = maxp.z - 7 + end + + mcl_structures.call_struct(pos, "end_portal_shrine", nil, pr) + strongholds[s].generated = true + end + end + end +end + +init_strongholds() + +mcl_mapgen_core.register_generator("strongholds", nil, generate_strongholds, 999999) diff --git a/mods/MAPGEN/mcl_structures/API.md b/mods/MAPGEN/mcl_structures/API.md new file mode 100644 index 000000000..074810186 --- /dev/null +++ b/mods/MAPGEN/mcl_structures/API.md @@ -0,0 +1,38 @@ +# mcl_structures +Structure placement API for MCL2. + +## mcl_structures.register_structure(name,structure definition,nospawn) +If nospawn is truthy the structure will not be placed by mapgen and the decoration parameters can be omitted. This is intended for secondary structures the placement of which gets triggered by the placement of other structures. It can also be used to register testing structures so they can be used with /spawnstruct. + +### structure definition +{ + fill_ratio = OR noise = {}, + biomes = {}, + y_min =, + y_max =, + place_on = {}, + spawn_by = {}, + num_spawn_by =, + flags = (default: "place_center_x, place_center_z, force_placement") + (same as decoration def) + y_offset =, --can be a number or a function returning a number + filenames = {} OR place_func = function(pos,def,pr) + -- filenames can be a list of any schematics accepted by mcl_structures.place_schematic / minetest.place_schematic + on_place = function(pos,def,pr) end, + -- called before placement. denies placement when returning falsy. + after_place = function(pos,def,pr) + -- executed after successful placement + sidelen = int, --length of one side of the structure. used for foundations. + solid_ground = bool, -- structure requires solid ground + make_foundation = bool, -- a foundation is automatically built for the structure. needs the sidelen param + loot = , + --a table of loot tables for mcl_loot indexed by node names + -- e.g. { ["mcl_chests:chest_small"] = {loot},... } +} +## mcl_structures.registered_structures +Table of the registered structure defintions indexed by name. + +## mcl_structures.place_structure(pos, def, pr) +Places a structure using the mapgen placement function + +## mcl_structures.place_schematic(pos, schematic, rotation, replacements, force_placement, flags, after_placement_callback, pr, callback_param) diff --git a/mods/MAPGEN/mcl_structures/api.lua b/mods/MAPGEN/mcl_structures/api.lua new file mode 100644 index 000000000..4e017b502 --- /dev/null +++ b/mods/MAPGEN/mcl_structures/api.lua @@ -0,0 +1,171 @@ +mcl_structures.registered_structures = {} + + +function mcl_structures.fill_chests(p1,p2,loot,pr) + for it,lt in pairs(loot) do + local nodes = minetest.find_nodes_in_area(p1, p2, it) + for _,p in pairs(nodes) do + local lootitems = mcl_loot.get_multi_loot(lt, pr) + mcl_structures.init_node_construct(p) + local meta = minetest.get_meta(p) + local inv = meta:get_inventory() + mcl_loot.fill_inventory(inv, "main", lootitems, pr) + end + end +end + +local function generate_loot(pos, def, pr) + local hl = def.sidelen / 2 + local p1 = vector.offset(pos,-hl,-hl,-hl) + local p2 = vector.offset(pos,hl,hl,hl) + if def.loot then mcl_structures.fill_chests(p1,p2,def.loot,pr) end +end + + +function mcl_structures.find_lowest_y(pp) + local y = 31000 + for _,p in pairs(pp) do + if p.y < y then y = p.y end + end + return y +end + +function mcl_structures.find_highest_y(pp) + local y = -31000 + for _,p in pairs(pp) do + if p.y > y then y = p.y end + end + return y +end + +function mcl_structures.place_structure(pos, def, pr) + if not def then return end + local logging = not def.terrain_feature + local y_offset = 0 + if type(def.y_offset) == "function" then + y_offset = def.y_offset(pr) + elseif def.y_offset then + y_offset = def.y_offset + end + local pp = vector.offset(pos,0,y_offset,0) + if def.solid_ground and def.sidelen then + local ground_p1 = vector.offset(pos,-def.sidelen/2,-1,-def.sidelen/2) + local ground_p2 = vector.offset(pos,def.sidelen/2,-1,def.sidelen/2) + + local solid = minetest.find_nodes_in_area(ground_p1,ground_p2,{"group:solid"}) + if #solid < ( def.sidelen * def.sidelen ) then + if def.make_foundation then + local node_stone = "mcl_core:stone" + local node_filler = "mcl_core:dirt" + local node_top = "mcl_core:dirt_with_grass" or minetest.get_node(ground_p1).name + local node_dust = nil + + if minetest.get_mapgen_setting("mg_name") ~= "v6" then + local b = minetest.registered_biomes[minetest.get_biome_name(minetest.get_biome_data(pos).biome)] + --minetest.log(dump(b.node_top)) + if b.node_top then node_top = b.node_top end + if b.node_filler then node_filler = b.node_filler end + if b.node_stone then node_stone = b.node_stone end + if b.node_dust then node_dust = b.node_dust end + end + local replace = {"air","group:liquid","mcl_core:snow","group:tree","group:leaves"} + minetest.bulk_set_node(minetest.find_nodes_in_area(ground_p1,ground_p2,replace),{name=node_top}) + if node_dust then + minetest.bulk_set_node(minetest.find_nodes_in_area(vector.offset(ground_p1,0,1,0),vector.offset(ground_p2,0,1,0),{"air"}),{name=node_dust}) + end + minetest.bulk_set_node(minetest.find_nodes_in_area(vector.offset(ground_p1,0,-1,0),vector.offset(ground_p2,0,-4,0),replace),{name=node_filler}) + minetest.bulk_set_node(minetest.find_nodes_in_area(vector.offset(ground_p1,0,-5,0),vector.offset(ground_p2,0,-30,0),replace),{name=node_stone}) + else + if logging then + minetest.log("warning","[mcl_structures] "..def.name.." at "..minetest.pos_to_string(pp).." not placed. No solid ground.") + end + return false + end + end + end + if def.on_place and not def.on_place(pos,def,pr) then + if logging then + minetest.log("warning","[mcl_structures] "..def.name.." at "..minetest.pos_to_string(pp).." not placed. Conditions not satisfied.") + end + return false + end + if def.filenames then + if #def.filenames <= 0 then return false end + local r = pr:next(1,#def.filenames) + local file = def.filenames[r] + if file then + local ap = function(pos,def,pr) end + if def.after_place then ap = def.after_place end + + mcl_structures.place_schematic(pp, file, "random", nil, true, "place_center_x,place_center_z",function(p) + if def.loot then generate_loot(pos,def,pr) end + return ap(pos,def,pr) + end,pr) + if logging then + minetest.log("action","[mcl_structures] "..def.name.." placed at "..minetest.pos_to_string(pp)) + end + return true + end + elseif def.place_func and def.place_func(pos,def,pr) then + if not def.after_place or ( def.after_place and def.after_place(pos,def,pr) ) then + if logging then + minetest.log("action","[mcl_structures] "..def.name.." placed at "..minetest.pos_to_string(pp)) + end + return true + end + end + if logging then + minetest.log("warning","[mcl_structures] placing "..def.name.." failed at "..minetest.pos_to_string(pos)) + end +end + +function mcl_structures.register_structure(name,def,nospawn) --nospawn means it will be placed by another (non-nospawn) structure that contains it's structblock i.e. it will not be placed by mapgen directly + local structblock = "mcl_structures:structblock_"..name + local flags = "place_center_x, place_center_z, force_placement" + local y_offset = 0 + local sbgroups = { structblock = 1, not_in_creative_inventory=1 } + if def.flags then flags = def.flags end + def.name = name + if nospawn then + sbgroups.structblock = nil + sbgroups.structblock_lbm = 1 + else + minetest.register_on_mods_loaded(function() --make sure all previous decorations and biomes have been registered + def.deco = minetest.register_decoration({ + name = "mcl_structures:deco_"..name, + decoration = structblock, + deco_type = "simple", + place_on = def.place_on, + spawn_by = def.spawn_by, + num_spawn_by = def.num_spawn_by, + sidelen = 80, + fill_ratio = def.fill_ratio, + noise_params = def.noise_params, + flags = flags, + biomes = def.biomes, + y_max = def.y_max, + y_min = def.y_min + }) + minetest.register_node(":"..structblock, {drawtype="airlike", walkable = false, pointable = false,groups = sbgroups}) + def.structblock = structblock + def.deco_id = minetest.get_decoration_id("mcl_structures:deco_"..name) + minetest.set_gen_notify({decoration=true}, { def.deco_id }) + --catching of gennotify happens in mcl_mapgen_core + end) + end + mcl_structures.registered_structures[name] = def +end + +--lbm for secondary structures (structblock included in base structure) +minetest.register_lbm({ + name = "mcl_structures:struct_lbm", + run_at_every_load = true, + nodenames = {"group:structblock_lbm"}, + action = function(pos, node) + minetest.remove_node(pos) + local name = node.name:gsub("mcl_structures:structblock_","") + local def = mcl_structures.registered_structures[name] + if not def then return end + mcl_structures.place_structure(pos) + end +}) diff --git a/mods/MAPGEN/mcl_structures/desert_temple.lua b/mods/MAPGEN/mcl_structures/desert_temple.lua index eb1950b18..e3d646b9e 100644 --- a/mods/MAPGEN/mcl_structures/desert_temple.lua +++ b/mods/MAPGEN/mcl_structures/desert_temple.lua @@ -1,4 +1,5 @@ local modname = minetest.get_current_modname() +<<<<<<< HEAD local modpath = minetest.get_modpath(modname) local chance_per_chunk = 11 @@ -43,6 +44,57 @@ local function on_placed(p1, rotation, pr, size) -- Add desert temple loot into chests for c=1, #chests do local lootitems = mcl_loot.get_multi_loot({ +======= +local S = minetest.get_translator(modname) +local modpath = minetest.get_modpath(modname) + +local function temple_placement_callback(pos,def, pr) + local hl = def.sidelen / 2 + local p1 = vector.offset(pos,-hl,-hl,-hl) + local p2 = vector.offset(pos,hl,hl,hl) + -- Delete cacti leftovers: + local cactus_nodes = minetest.find_nodes_in_area_under_air(p1, p2, "mcl_core:cactus") + if cactus_nodes and #cactus_nodes > 0 then + for _, pos in pairs(cactus_nodes) do + local node_below = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}) + if node_below and node_below.name == "mcl_core:sandstone" then + minetest.swap_node(pos, {name="air"}) + end + end + end + + -- Initialize pressure plates and randomly remove up to 5 plates + local pplates = minetest.find_nodes_in_area(p1, p2, "mesecons_pressureplates:pressure_plate_stone_off") + local pplates_remove = 5 + for p=1, #pplates do + if pplates_remove > 0 and pr:next(1, 100) >= 50 then + -- Remove plate + minetest.remove_node(pplates[p]) + pplates_remove = pplates_remove - 1 + else + -- Initialize plate + minetest.registered_nodes["mesecons_pressureplates:pressure_plate_stone_off"].on_construct(pplates[p]) + end + end +end + +mcl_structures.register_structure("desert_temple",{ + place_on = {"group:sand"}, + fill_ratio = 0.01, + flags = "place_center_x, place_center_z", + solid_ground = true, + make_foundation = true, + sidelen = 18, + y_offset = -12, + chunk_probability = 300, + y_max = mcl_vars.mg_overworld_max, + y_min = 1, + biomes = { "Desert" }, + filenames = { modpath.."/schematics/mcl_structures_desert_temple.mts" }, + after_place = temple_placement_callback, + loot = { + ["mcl_chests:chest" ] ={ +>>>>>>> mcl2/master { stacks_min = 2, stacks_max = 4, @@ -59,9 +111,15 @@ local function on_placed(p1, rotation, pr, size) { 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, }, +<<<<<<< HEAD { 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, }, +>>>>>>> mcl2/master { itemstring = "mcl_core:diamond", weight = 5, amount_min = 1, amount_max = 3 }, { itemstring = "mcl_core:apple_gold_enchanted", weight = 2, }, } @@ -76,6 +134,7 @@ local function on_placed(p1, rotation, pr, size) { itemstring = "mcl_core:sand", weight = 10, amount_min = 1, amount_max = 8 }, { itemstring = "mcl_mobitems:string", weight = 10, amount_min = 1, amount_max = 8 }, } +<<<<<<< HEAD }}, pr) mcl_structures.init_node_construct(chests[c]) local meta = minetest.get_meta(chests[c]) @@ -171,4 +230,8 @@ mcl_structures.register_structure({ place(pos, nil, pr) end, place_function = place, +======= + }} + } +>>>>>>> mcl2/master }) diff --git a/mods/MAPGEN/mcl_structures/geode.lua b/mods/MAPGEN/mcl_structures/geode.lua new file mode 100644 index 000000000..1a2e8bedc --- /dev/null +++ b/mods/MAPGEN/mcl_structures/geode.lua @@ -0,0 +1,88 @@ +local adjacents = { + vector.new(1,0,0), + vector.new(-1,0,0), + vector.new(0,0,1), + vector.new(0,0,-1), + vector.new(0,1,0), + vector.new(0,-1,0) +} + +local function set_node_no_bedrock(pos,node) + local n = minetest.get_node(pos) + if n.name == "mcl_core:bedrock" then return end + return minetest.set_node(pos,node) +end + +local function makegeode(pos,def,pr) + local size = pr:next(5,7) + local p1 = vector.offset(pos,-size,-size,-size) + local p2 = vector.offset(pos,size,size,size) + minetest.emerge_area(p1, p2, function(blockpos, action, calls_remaining, param) + if calls_remaining ~= 0 then return end + local calcite = {} + local nn = minetest.find_nodes_in_area(p1,p2,{"group:material_stone"}) + table.sort(nn,function(a, b) + return vector.distance(pos, a) < vector.distance(pos, b) + end) + if not nn[1] then return end + + for i=1,math.random(#nn) do + set_node_no_bedrock(nn[i],{name="mcl_amethyst:amethyst_block"}) + end + + for k,v in pairs(minetest.find_nodes_in_area(p1,p2,{"mcl_amethyst:amethyst_block"})) do + local all_amethyst = true + for kk,vv in pairs(adjacents) do + local pp = vector.add(v,vv) + local an = minetest.get_node(pp) + if an.name ~= "mcl_amethyst:amethyst_block" then + if minetest.get_item_group(an.name,"material_stone") > 0 then + set_node_no_bedrock(pp,{name="mcl_amethyst:calcite"}) + table.insert(calcite,pp) + if pr:next(1,5) == 1 then + set_node_no_bedrock(v,{name="mcl_amethyst:budding_amethyst_block"}) + end + all_amethyst = false + elseif an.name ~= "mcl_amethyst:amethyst_block" and an.name ~= "air" then + all_amethyst = false + end + end + end + if all_amethyst then set_node_no_bedrock(v,{name="air"}) end + end + + for _,v in pairs(calcite) do + for _,vv in pairs(minetest.find_nodes_in_area(vector.offset(v,-1,-1,-1),vector.offset(v,1,1,1),{"group:material_stone"})) do + set_node_no_bedrock(vv,{name="mcl_blackstone:basalt_smooth"}) + end + end + + for k,v in pairs(minetest.find_nodes_in_area_under_air(p1,p2,{"mcl_amethyst:amethyst_block","mcl_amethyst:budding_amethyst_block"})) do + local r = pr:next(1,50) + if r < 10 then + set_node_no_bedrock(vector.offset(v,0,1,0),{name="mcl_amethyst:amethyst_cluster",param2=1}) + end + end + return true + end) + return true +end + +mcl_structures.register_structure("geode",{ + place_on = {"group:material_stone"}, + noise_params = { + offset = 0, + scale = 0.00022, + spread = {x = 250, y = 250, z = 250}, + seed = 7894353, + octaves = 3, + persist = 0.001, + flags = "absvalue", + }, + flags = "force_placement", + terrain_feature = true, + y_max = -24, + y_min = mcl_vars.mg_overworld_min, + y_offset = function(pr) return pr:next(-4,-2) end, + place_func = makegeode, +}) diff --git a/mods/MAPGEN/mcl_structures/igloo.lua b/mods/MAPGEN/mcl_structures/igloo.lua index ebb88667b..c9dcd8f88 100644 --- a/mods/MAPGEN/mcl_structures/igloo.lua +++ b/mods/MAPGEN/mcl_structures/igloo.lua @@ -1,4 +1,5 @@ local modname = minetest.get_current_modname() +<<<<<<< HEAD local modpath = minetest.get_modpath(modname) local chance_per_chunk = 39 @@ -191,4 +192,167 @@ mcl_structures.register_structure({ place(pos, nil, pr) end, place_function = place, +======= +local S = minetest.get_translator(modname) +local modpath = minetest.get_modpath(modname) + +function mcl_structures.generate_igloo_top(pos, pr) + -- FIXME: This spawns bookshelf instead of furnace. Fix this! + -- Furnace does ot work atm because apparently meta is not set. :-( + local newpos = {x=pos.x,y=pos.y-2,z=pos.z} + local path = modpath.."/schematics/mcl_structures_igloo_top.mts" + local rotation = tostring(pr:next(0,3)*90) + return mcl_structures.place_schematic(newpos, path, rotation, nil, true), rotation +end + +function mcl_structures.generate_igloo_basement(pos, orientation, loot, pr) + -- TODO: Add brewing stand + -- TODO: Add monster eggs + local path = modpath.."/schematics/mcl_structures_igloo_basement.mts" + mcl_structures.place_schematic(pos, path, orientation, nil, true, nil, function() + local p1 = vector.offset(pos,-5,-5,-5) + local p2 = vector.offset(pos,5,5,5) + mcl_structures.fill_chests(p1,p2,loot,pr) + local mc = minetest.find_nodes_in_area_under_air(p1,p2,{"mcl_core:stonebrickmossy"}) + if #mc == 2 then + table.shuffle(mc) + minetest.add_entity(vector.offset(mc[1],0,1,0),"mobs_mc:villager") + minetest.add_entity(vector.offset(mc[2],0,1,0),"mobs_mc:villager_zombie") + end + end, pr) +end + +function mcl_structures.generate_igloo(pos, def, pr) + -- Place igloo + local success, rotation = mcl_structures.generate_igloo_top(pos, pr) + -- Place igloo basement with 50% chance + local r = pr:next(1,2) + if r == 1 then + -- Select basement depth + local dim = mcl_worlds.pos_to_dimension(pos) + --local buffer = pos.y - (mcl_vars.mg_lava_overworld_max + 10) + local buffer + if dim == "nether" then + buffer = pos.y - (mcl_vars.mg_lava_nether_max + 10) + elseif dim == "end" then + buffer = pos.y - (mcl_vars.mg_end_min + 1) + elseif dim == "overworld" then + buffer = pos.y - (mcl_vars.mg_lava_overworld_max + 10) + else + return success + end + if buffer <= 19 then + return success + end + local depth = pr:next(19, buffer) + local bpos = {x=pos.x, y=pos.y-depth, z=pos.z} + -- trapdoor position + local tpos + local dir, tdir + if rotation == "0" then + dir = {x=-1, y=0, z=0} + tdir = {x=1, y=0, z=0} + tpos = {x=pos.x+7, y=pos.y-1, z=pos.z+3} + elseif rotation == "90" then + dir = {x=0, y=0, z=-1} + tdir = {x=0, y=0, z=-1} + tpos = {x=pos.x+3, y=pos.y-1, z=pos.z+1} + elseif rotation == "180" then + dir = {x=1, y=0, z=0} + tdir = {x=-1, y=0, z=0} + tpos = {x=pos.x+1, y=pos.y-1, z=pos.z+3} + elseif rotation == "270" then + dir = {x=0, y=0, z=1} + tdir = {x=0, y=0, z=1} + tpos = {x=pos.x+3, y=pos.y-1, z=pos.z+7} + else + return success + end + local function set_brick(pos) + local c = pr:next(1, 3) -- cracked chance + local m = pr:next(1, 10) -- chance for monster egg + local brick + if m == 1 then + if c == 1 then + brick = "mcl_monster_eggs:monster_egg_stonebrickcracked" + else + brick = "mcl_monster_eggs:monster_egg_stonebrick" + end + else + if c == 1 then + brick = "mcl_core:stonebrickcracked" + else + brick = "mcl_core:stonebrick" + end + end + minetest.set_node(pos, {name=brick}) + end + local ladder_param2 = minetest.dir_to_wallmounted(tdir) + local real_depth = 0 + -- Check how deep we can actuall dig + for y=1, depth-5 do + real_depth = real_depth + 1 + local node = minetest.get_node({x=tpos.x,y=tpos.y-y,z=tpos.z}) + local def = minetest.registered_nodes[node.name] + if not (def and def.walkable and def.liquidtype == "none" and def.is_ground_content) then + bpos.y = tpos.y-y+1 + break + end + end + if real_depth <= 6 then + return success + end + -- Generate ladder to basement + for y=1, real_depth-1 do + set_brick({x=tpos.x-1,y=tpos.y-y,z=tpos.z }) + set_brick({x=tpos.x+1,y=tpos.y-y,z=tpos.z }) + set_brick({x=tpos.x ,y=tpos.y-y,z=tpos.z-1}) + set_brick({x=tpos.x ,y=tpos.y-y,z=tpos.z+1}) + minetest.set_node({x=tpos.x,y=tpos.y-y,z=tpos.z}, {name="mcl_core:ladder", param2=ladder_param2}) + end + -- Place basement + mcl_structures.generate_igloo_basement(bpos, rotation, def.loot, pr) + -- Place hidden trapdoor + minetest.after(5, function(tpos, dir) + minetest.set_node(tpos, {name="mcl_doors:trapdoor", param2=20+minetest.dir_to_facedir(dir)}) -- TODO: more reliable param2 + end, tpos, dir) + end + return success +end + +mcl_structures.register_structure("igloo",{ + place_on = {"mcl_core:snowblock","mcl_core:snow","group:grass_block_snow"}, + fill_ratio = 0.01, + sidelen = 16, + chunk_probability = 250, + solid_ground = true, + make_foundation = true, + y_max = mcl_vars.mg_overworld_max, + y_min = 0, + y_offset = 0, + biomes = { "ColdTaiga", "IcePlainsSpikes", "IcePlains" }, + place_func = mcl_structures.generate_igloo, + loot = { + ["mcl_chests:chest"] = {{ + stacks_min = 1, + stacks_max = 1, + items = { + { itemstring = "mcl_core:apple_gold", weight = 1 }, + } + }, + { + stacks_min = 2, + stacks_max = 8, + items = { + { itemstring = "mcl_core:coal_lump", weight = 15, amount_min = 1, amount_max = 4 }, + { itemstring = "mcl_core:apple", weight = 15, amount_min = 1, amount_max = 3 }, + { itemstring = "mcl_farming:wheat_item", weight = 10, amount_min = 2, amount_max = 3 }, + { itemstring = "mcl_core:gold_nugget", weight = 10, amount_min = 1, amount_max = 3 }, + { itemstring = "mcl_mobitems:rotten_flesh", weight = 10 }, + { itemstring = "mcl_tools:axe_stone", weight = 2 }, + { itemstring = "mcl_core:emerald", weight = 1 }, + } + }}, + } +>>>>>>> mcl2/master }) diff --git a/mods/MAPGEN/mcl_structures/init.lua b/mods/MAPGEN/mcl_structures/init.lua index 13609be59..9e446b566 100644 --- a/mods/MAPGEN/mcl_structures/init.lua +++ b/mods/MAPGEN/mcl_structures/init.lua @@ -261,6 +261,15 @@ function mcl_structures.place_schematic(def) else rotation = rotations[math.random(1,#rotations)] end +<<<<<<< HEAD +======= + local p1 = {x=pos.x , y=pos.y , z=pos.z } + local p2 = {x=pos.x+x-1, y=pos.y+s.size.y-1, z=pos.z+z-1} + minetest.log("verbose", "[mcl_structures] size=" ..minetest.pos_to_string(s.size) .. ", rotation=" .. tostring(rotation) .. ", emerge from "..minetest.pos_to_string(p1) .. " to " .. minetest.pos_to_string(p2)) + local param = {pos=vector.new(pos), schematic=s, rotation=rotation, replacements=replacements, force_placement=force_placement, flags=flags, p1=p1, p2=p2, after_placement_callback = after_placement_callback, size=vector.new(s.size), pr=pr, callback_param=callback_param} + minetest.emerge_area(p1, p2, ecb_place, param) + return true +>>>>>>> mcl2/master end if not emerge and not on_placed then @@ -331,6 +340,7 @@ function mcl_structures.init_node_construct(pos) end return false end +mcl_structures.init_node_construct = init_node_construct -- The call of Struct function mcl_structures.call_struct(pos, struct_style, rotation, pr, callback) @@ -338,10 +348,15 @@ function mcl_structures.call_struct(pos, struct_style, rotation, pr, callback) if not rotation then rotation = "random" end +<<<<<<< HEAD if struct_style == "boulder" then return mcl_structures.generate_boulder(pos, rotation, pr) elseif struct_style == "end_exit_portal" then return mcl_structures.generate_end_exit_portal(pos, rotation, pr, callback) +======= + if struct_style == "end_exit_portal" then + return mcl_structures.generate_end_exit_portal(pos, rotation) +>>>>>>> mcl2/master elseif struct_style == "end_exit_portal_open" then return mcl_structures.generate_end_exit_portal_open(pos, rotation) elseif struct_style == "end_gateway_portal" then @@ -353,6 +368,7 @@ function mcl_structures.call_struct(pos, struct_style, rotation, pr, callback) end end +<<<<<<< HEAD function mcl_structures.generate_end_portal(pos, rotation, pr) -- todo: proper facedir local x0, y0, z0 = pos.x - 2, pos.y, pos.z - 2 @@ -385,6 +401,10 @@ function mcl_structures.generate_boulder(pos, rotation, pr) end function mcl_structures.generate_end_exit_portal(pos, rot, pr, callback) +======= + +function mcl_structures.generate_end_exit_portal(pos, rot) +>>>>>>> mcl2/master local path = modpath.."/schematics/mcl_structures_end_exit_portal.mts" return mcl_structures.place_schematic(pos, path, rot or "0", {["mcl_portals:portal_end"] = "air"}, true, nil, callback) end @@ -406,8 +426,177 @@ function mcl_structures.from_16x16_to_chunk_inverted_chance(x) return math.floor(x * 256 / chunk_square + 0.5) end +<<<<<<< HEAD function mcl_structures.from_16x16_to_block_inverted_chance(x) return math.floor(x * 256 / block_square + 0.5) end dofile(modpath .. "/structures.lua") +======= +local structure_data = {} + +--[[ Returns a table of structure of the specified type. +Currently the only valid parameter is "stronghold". +Format of return value: +{ + { pos = , generated= }, -- first structure + { pos = , generated= }, -- second structure + -- and so on +} + +TODO: Implement this function for all other structure types as well. +]] +function mcl_structures.get_structure_data(structure_type) + if structure_data[structure_type] then + return table.copy(structure_data[structure_type]) + else + return {} + end +end + +-- Register a structures table for the given type. The table format is the same as for +-- mcl_structures.get_structure_data. +function mcl_structures.register_structure_data(structure_type, structures) + structure_data[structure_type] = structures +end + +local function dir_to_rotation(dir) + local ax, az = math.abs(dir.x), math.abs(dir.z) + if ax > az then + if dir.x < 0 then + return "270" + end + return "90" + end + if dir.z < 0 then + return "180" + end + return "0" +end + +dofile(modpath.."/api.lua") +dofile(modpath.."/shipwrecks.lua") +dofile(modpath.."/desert_temple.lua") +dofile(modpath.."/jungle_temple.lua") +dofile(modpath.."/ocean_ruins.lua") +dofile(modpath.."/witch_hut.lua") +dofile(modpath.."/igloo.lua") +dofile(modpath.."/woodland_mansion.lua") +dofile(modpath.."/geode.lua") + + + +mcl_structures.register_structure("desert_well",{ + place_on = {"group:sand"}, + fill_ratio = 0.01, + flags = "place_center_x, place_center_z", + not_near = { "desert_temple_new" }, + solid_ground = true, + sidelen = 4, + chunk_probability = 600, + y_max = mcl_vars.mg_overworld_max, + y_min = 1, + y_offset = -2, + biomes = { "Desert" }, + filenames = { modpath.."/schematics/mcl_structures_desert_well.mts" }, +}) + +mcl_structures.register_structure("fossil",{ + place_on = {"group:material_stone","group:sand"}, + fill_ratio = 0.01, + flags = "place_center_x, place_center_z", + solid_ground = true, + sidelen = 13, + chunk_probability = 1000, + y_offset = function(pr) return ( pr:next(1,16) * -1 ) -16 end, + y_max = 15, + y_min = mcl_vars.mg_overworld_min + 35, + biomes = { "Desert" }, + filenames = { + modpath.."/schematics/mcl_structures_fossil_skull_1.mts", -- 4×5×5 + modpath.."/schematics/mcl_structures_fossil_skull_2.mts", -- 5×5×5 + modpath.."/schematics/mcl_structures_fossil_skull_3.mts", -- 5×5×7 + modpath.."/schematics/mcl_structures_fossil_skull_4.mts", -- 7×5×5 + modpath.."/schematics/mcl_structures_fossil_spine_1.mts", -- 3×3×13 + modpath.."/schematics/mcl_structures_fossil_spine_2.mts", -- 5×4×13 + modpath.."/schematics/mcl_structures_fossil_spine_3.mts", -- 7×4×13 + modpath.."/schematics/mcl_structures_fossil_spine_4.mts", -- 8×5×13 + }, +}) + +mcl_structures.register_structure("boulder",{ + filenames = { + modpath.."/schematics/mcl_structures_boulder_small.mts", + modpath.."/schematics/mcl_structures_boulder_small.mts", + modpath.."/schematics/mcl_structures_boulder_small.mts", + modpath.."/schematics/mcl_structures_boulder.mts", + -- small boulder 3x as likely + }, +},true) --is spawned as a normal decoration. this is just for /spawnstruct +mcl_structures.register_structure("ice_spike_small",{ + filenames = { + modpath.."/schematics/mcl_structures_ice_spike_small.mts" + }, +},true) --is spawned as a normal decoration. this is just for /spawnstruct +mcl_structures.register_structure("ice_spike_large",{ + sidelen = 6, + filenames = { + modpath.."/schematics/mcl_structures_ice_spike_large.mts" + }, +},true) --is spawned as a normal decoration. this is just for /spawnstruct + +-- Debug command +minetest.register_chatcommand("spawnstruct", { + params = "end_exit_portal | end_exit_portal_open | end_gateway_portal | end_portal_shrine | nether_portal | dungeon", + description = S("Generate a pre-defined structure near your position."), + privs = {debug = true}, + func = function(name, param) + local player = minetest.get_player_by_name(name) + if not player then return end + local pos = player:get_pos() + if not pos then return end + pos = vector.round(pos) + local dir = minetest.yaw_to_dir(player:get_look_horizontal()) + local rot = dir_to_rotation(dir) + local pr = PseudoRandom(pos.x+pos.y+pos.z) + local errord = false + local message = S("Structure placed.") + if param == "end_exit_portal" then + mcl_structures.generate_end_exit_portal(pos, rot, pr) + elseif param == "end_exit_portal_open" then + mcl_structures.generate_end_exit_portal_open(pos, rot, pr) + elseif param == "end_gateway_portal" then + mcl_structures.generate_end_gateway_portal(pos, rot, pr) + elseif param == "end_portal_shrine" then + mcl_structures.generate_end_portal_shrine(pos, rot, pr) + elseif param == "dungeon" and mcl_dungeons and mcl_dungeons.spawn_dungeon then + mcl_dungeons.spawn_dungeon(pos, rot, pr) + elseif param == "nether_portal" and mcl_portals and mcl_portals.spawn_nether_portal then + mcl_portals.spawn_nether_portal(pos, rot, pr, name) + elseif param == "" then + message = S("Error: No structure type given. Please use “/spawnstruct ”.") + errord = true + else + for n,d in pairs(mcl_structures.registered_structures) do + if n == param then + mcl_structures.place_structure(pos,d,pr) + return true,message + end + end + message = S("Error: Unknown structure type. Please use “/spawnstruct ”.") + errord = true + end + minetest.chat_send_player(name, message) + if errord then + minetest.chat_send_player(name, S("Use /help spawnstruct to see a list of avaiable types.")) + end + end +}) +minetest.register_on_mods_loaded(function() + local p = "" + for n,_ in pairs(mcl_structures.registered_structures) do + p = p .. " | "..n + end + minetest.registered_chatcommands["spawnstruct"].params = minetest.registered_chatcommands["spawnstruct"].params .. p +end) +>>>>>>> mcl2/master diff --git a/mods/MAPGEN/mcl_structures/jungle_temple.lua b/mods/MAPGEN/mcl_structures/jungle_temple.lua index 9abaf4626..ba8c771c6 100644 --- a/mods/MAPGEN/mcl_structures/jungle_temple.lua +++ b/mods/MAPGEN/mcl_structures/jungle_temple.lua @@ -1,4 +1,5 @@ local modname = minetest.get_current_modname() +<<<<<<< HEAD local modpath = minetest.get_modpath(modname) local chance_per_chunk = 30 @@ -200,4 +201,48 @@ mcl_structures.register_structure({ place(pos, nil, pr) end, place_function = place, +======= +local S = minetest.get_translator(modname) +local modpath = minetest.get_modpath(modname) + +mcl_structures.register_structure("jungle_temple",{ + place_on = {"group:grass_block","group:dirt","mcl_core:dirt_with_grass"}, + fill_ratio = 0.01, + flags = "place_center_x, place_center_z", + solid_ground = true, + make_foundation = true, + y_offset = function(pr) return pr:next(-3,0) -5 end, + chunk_probability = 200, + y_max = mcl_vars.mg_overworld_max, + y_min = 1, + biomes = { "Jungle" }, + sidelen = 18, + filenames = { + modpath.."/schematics/mcl_structures_jungle_temple.mts", + modpath.."/schematics/mcl_structures_jungle_temple_nice.mts", + }, + loot = { + ["mcl_chests:trapped_chest_small" ] ={{ + stacks_min = 2, + stacks_max = 6, + items = { + { itemstring = "mcl_mobitems:bone", weight = 20, amount_min = 4, amount_max=6 }, + { itemstring = "mcl_mobitems:rotten_flesh", weight = 16, amount_min = 3, amount_max=7 }, + { itemstring = "mcl_core:gold_ingot", weight = 15, amount_min = 2, amount_max = 7 }, + --{ itemstring = "mcl_bamboo:bamboo", weight = 15, amount_min = 1, amount_max=3 }, --FIXME BAMBOO + { itemstring = "mcl_core:iron_ingot", weight = 15, amount_min = 1, amount_max = 5 }, + { itemstring = "mcl_core:diamond", weight = 3, amount_min = 1, amount_max = 3 }, + { itemstring = "mcl_mobitems:saddle", weight = 3, }, + { itemstring = "mcl_core:emerald", weight = 2, amount_min = 1, amount_max = 3 }, + { itemstring = "mcl_books:book", weight = 1, func = function(stack, pr) + mcl_enchanting.enchant_uniform_randomly(stack, {"soul_speed"}, pr) + end }, + { itemstring = "mcl_mobitems:iron_horse_armor", weight = 1, }, + { itemstring = "mcl_mobitems:gold_horse_armor", weight = 1, }, + { itemstring = "mcl_mobitems:diamond_horse_armor", weight = 1, }, + { itemstring = "mcl_core:apple_gold_enchanted", weight = 2, }, + } + }} + } +>>>>>>> mcl2/master }) diff --git a/mods/MAPGEN/mcl_structures/locale/mcl_structures.zh_TW.tr b/mods/MAPGEN/mcl_structures/locale/mcl_structures.zh_TW.tr new file mode 100644 index 000000000..49796e520 --- /dev/null +++ b/mods/MAPGEN/mcl_structures/locale/mcl_structures.zh_TW.tr @@ -0,0 +1,7 @@ +# textdomain: mcl_structures +Generate a pre-defined structure near your position.=在你的位置附近生成一個預定義的結構。 +Structure placed.=結構已生成。 +Village built. WARNING: Villages are experimental and might have bugs.=村莊已生成。警告:村莊是實驗性的,可能會有錯誤。 +Error: No structure type given. Please use “/spawnstruct ”.=錯誤:未提供結構類型。請使用「/spawnstruct <種類>」。 +Error: Unknown structure type. Please use “/spawnstruct ”.=錯誤:未知結構類型。請使用「/spawnstruct <種類>」。 +Use /help spawnstruct to see a list of avaiable types.=使用「/help spawnstruct」以查看可用結構列表。 diff --git a/mods/MAPGEN/mcl_structures/mod.conf b/mods/MAPGEN/mcl_structures/mod.conf index 1e34960a8..191cc8d3d 100644 --- a/mods/MAPGEN/mcl_structures/mod.conf +++ b/mods/MAPGEN/mcl_structures/mod.conf @@ -1,4 +1,10 @@ name = mcl_structures +<<<<<<< HEAD author = Wuzzy, kay27, cora description = Structures for MineClone 2/5 depends = mcl_loot, mcl_mapgen, mcl_worlds +======= +author = Wuzzy, cora +description = Structure placement for MCL2 +depends = mcl_init, mcl_loot +>>>>>>> mcl2/master diff --git a/mods/MAPGEN/mcl_structures/ocean_ruins.lua b/mods/MAPGEN/mcl_structures/ocean_ruins.lua new file mode 100644 index 000000000..0b609aee7 --- /dev/null +++ b/mods/MAPGEN/mcl_structures/ocean_ruins.lua @@ -0,0 +1,132 @@ +local modname = minetest.get_current_modname() +local S = minetest.get_translator(modname) +local modpath = minetest.get_modpath(modname) + +local cold_oceans = { + "RoofedForest_ocean", + "BirchForestM_ocean", + "BirchForest_ocean", + "IcePlains_deep_ocean", + "ExtremeHillsM_deep_ocean", + "SunflowerPlains_ocean", + "MegaSpruceTaiga_deep_ocean", + "ExtremeHillsM_ocean", + "SunflowerPlains_deep_ocean", + "BirchForest_deep_ocean", + "IcePlainsSpikes_ocean", + "StoneBeach_ocean", + "ColdTaiga_deep_ocean", + "Forest_deep_ocean", + "FlowerForest_deep_ocean", + "MegaTaiga_ocean", + "StoneBeach_deep_ocean", + "IcePlainsSpikes_deep_ocean", + "ColdTaiga_ocean", + "ExtremeHills+_deep_ocean", + "ExtremeHills_ocean", + "Forest_ocean", + "MegaTaiga_deep_ocean", + "MegaSpruceTaiga_ocean", + "ExtremeHills+_ocean", + "RoofedForest_deep_ocean", + "IcePlains_ocean", + "FlowerForest_ocean", + "ExtremeHills_deep_ocean", + "Taiga_ocean", + "BirchForestM_deep_ocean", + "Taiga_deep_ocean", +} + +local warm_oceans = { + "JungleEdgeM_ocean", + "Jungle_deep_ocean", + "Savanna_ocean", + "MesaPlateauF_ocean", + "Swampland_ocean", + "Mesa_ocean", + "Plains_ocean", + "MesaPlateauFM_ocean", + "MushroomIsland_ocean", + "SavannaM_ocean", + "JungleEdge_ocean", + "MesaBryce_ocean", + "Jungle_ocean", + "Desert_ocean", + "JungleM_ocean", + "JungleEdgeM_deep_ocean", + "Jungle_deep_ocean", + "Savanna_deep_ocean", + "MesaPlateauF_deep_ocean", + "Swampland_deep_ocean", + "Mesa_deep_ocean", + "Plains_deep_ocean", + "MesaPlateauFM_deep_ocean", + "MushroomIsland_deep_ocean", + "SavannaM_deep_ocean", + "JungleEdge_deep_ocean", + "MesaBryce_deep_ocean", + "Jungle_deep_ocean", + "Desert_deep_ocean", + "JungleM_deep_ocean", +} + +local cold = { + place_on = {"group:sand","mcl_core:gravel","mcl_core:dirt","mcl_core:clay","group:material_stone"}, + spawn_by = {"mcl_core:water_source"}, + num_spawn_by = 2, + fill_ratio = 0.01, + flags = "place_center_x, place_center_z, force_placement", + solid_ground = true, + make_foundation = true, + y_offset = -1, + y_min = mcl_vars.mg_overworld_min, + y_max = -2, + biomes = cold_oceans, + chunk_probability = 400, + sidelen = 20, + filenames = { + modpath.."/schematics/mcl_structures_ocean_ruins_cold_1.mts", + modpath.."/schematics/mcl_structures_ocean_ruins_cold_2.mts", + modpath.."/schematics/mcl_structures_ocean_ruins_cold_3.mts", + }, + loot = { + ["mcl_chests:chest_small" ] = { + { + stacks_min = 2, + stacks_max = 4, + items = { + { itemstring = "mcl_core:coal_lump", weight = 25, amount_min = 1, amount_max=4 }, + { itemstring = "mcl_farming:wheat_item", weight = 25, amount_min = 2, amount_max=3 }, + { itemstring = "mcl_core:gold_nugget", weight = 25, amount_min = 1, amount_max=3 }, + --{ itemstring = "mcl_maps:treasure_map", weight = 20, }, --FIXME Treasure map + + { itemstring = "mcl_books:book", weight = 10, func = function(stack, pr) + mcl_enchanting.enchant_uniform_randomly(stack, {"soul_speed"}, pr) + end }, + { itemstring = "mcl_fishing:fishing_rod_enchanted", weight = 20, func = function(stack, pr) + mcl_enchanting.enchant_uniform_randomly(stack, {"soul_speed"}, pr) + end }, + { itemstring = "mcl_core:emerald", weight = 15, amount_min = 1, amount_max = 1 }, + { itemstring = "mcl_armor:chestplate_leather", weight = 15, amount_min = 1, amount_max = 1 }, + { itemstring = "mcl_core:apple_gold", weight = 20, }, + { itemstring = "mcl_armor:helmet_gold", weight = 15, amount_min = 1, amount_max = 1 }, + { itemstring = "mcl_core:gold_ingot", weight = 15, amount_min = 2, amount_max = 7 }, + { itemstring = "mcl_core:iron_ingot", weight = 15, amount_min = 1, amount_max = 5 }, + { itemstring = "mcl_core:apple_gold_enchanted", weight = 2, }, + } + } + } + }, +} + +local warm = table.copy(cold) +warm.biomes = warm_oceans +warm.filenames = { + modpath.."/schematics/mcl_structures_ocean_ruins_warm_1.mts", + modpath.."/schematics/mcl_structures_ocean_ruins_warm_2.mts", + modpath.."/schematics/mcl_structures_ocean_ruins_warm_3.mts", + modpath.."/schematics/mcl_structures_ocean_ruins_warm_4.mts", +} + +mcl_structures.register_structure("cold_ocean_ruins",cold) +mcl_structures.register_structure("warm_ocean_ruins",warm) diff --git a/mods/MAPGEN/mcl_structures/schematics/coral_cora.mts b/mods/MAPGEN/mcl_structures/schematics/coral_cora.mts new file mode 100644 index 0000000000000000000000000000000000000000..8ee97182094687f97337715c8583f6f74dbd3887 GIT binary patch literal 719 zcmeYb3HD`RVc=t6W8kR=0|r3`=ETe*2C3ZSocR3Y)WkfijQpa!_~iVe#GLq~oc!c$ z1_`WkX^D9ZBG_aY#1NuMrAbLSsSwkU?LZcf2bm;;T@R)U(lU#n=7IGgxf@9a;%;dq zGm8>4Q9UJzT@vILQLIwPo<&#%@lot)U3ec`uI}Vl(7F6`{QKU#5n{FvZ`we42p_96GR>`ajAvHB`QpMmB$=7 z#r}!$otv-TTSXsco|hBD_Rr)^c<-l=r@mZbQO@cKyc%%9$^6)zteMZdpNVWQ*?hXK zaMj$8vp?>AcKFCIkKWF*JvuwTo>5KZ)%vk)mUgYJEzkC+e$H9@C6dZlsxa?vYp!)j zQ(3I3ths2X;KYe4V%;<1LeksJS()>Vw6di$BIYgjZQ7Su@~+4K7HeDb?+cPF*6LTv z-KR(%W%(vNr!Zh|e}UXX{}8iTzjIG5p73+=XYtou%cIxZW_wSwxn9b6>f9B#GdJd( ldAT;D=68nvR=(pw3q$#G*=i4cD+xZ~tyT1c_4_mh768??B|iWF literal 0 HcmV?d00001 diff --git a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_coral_brain_1.mts b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_coral_brain_1.mts new file mode 100644 index 0000000000000000000000000000000000000000..03e1ddfb621c637646b1faafc1db38d6062a994c GIT binary patch literal 157 zcmeYb3HD`RVPIxpWniuc0T3rKvxq@DH#sLhKRGoq&nl@XF*7edIlm||Cq5}BKRKI0 z61!wtVjhDiR;h|P$q5e3Jv=@oBW?WR=*kPbF(MMvFLjXUEgU~tGB!zBgMsD>9 S4_r)T_$m}c7+im`tN{RRr89s4 literal 0 HcmV?d00001 diff --git a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_coral_brain_2.mts b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_coral_brain_2.mts new file mode 100644 index 0000000000000000000000000000000000000000..f40af2ec3375bf6be90662128275ca39b1e33eea GIT binary patch literal 124 zcmeYb3HD`RVPFD6#`=07i#ai~h(S6xIVV0pIW;lQDyb+jGcP_lzbG*$J}DLS>;wQz$tlGE literal 0 HcmV?d00001 diff --git a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_coral_bubble_1.mts b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_coral_bubble_1.mts new file mode 100644 index 0000000000000000000000000000000000000000..1111368e877da436b84bb6ac4d79fb82dc7fb869 GIT binary patch literal 146 zcmeYb3HD`RVPFQq`uchhGcmJ>K`J*nCq6$pH8IaBsWd4mCpA7fzbG*$J}ohiK?a9h zQciwyHiH;;*@`*I2@Z@s0kb&0jF=UbnXMW+uQ(Uj3K%GGHZpMgXe#sjbg?t^m@qE| E0Q|5m!vFvP literal 0 HcmV?d00001 diff --git a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_coral_bubble_2.mts b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_coral_bubble_2.mts new file mode 100644 index 0000000000000000000000000000000000000000..c3cf1012e3bc6827183080c6a986348bf509f183 GIT binary patch literal 129 zcmeYb3HD`RVPIxpVqmPV2eA?}ix^~blXK$plT#D(tddHTl5$exlkB!lD(CM5uwp($nn literal 0 HcmV?d00001 diff --git a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_coral_horn_1.mts b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_coral_horn_1.mts new file mode 100644 index 0000000000000000000000000000000000000000..03c8f0e851a8205b14e91d4910ffdc6ff9daf7c4 GIT binary patch literal 152 zcmeYb3HD`R0YYX5=KA`25F;_Oh(RhhIVV0pIW;lQDkHxrFFrZHC^08KDJMTUn?VGd z9D@Wl(fG8)yox!=2?+@)4GeBoApoK0Hp>72 literal 0 HcmV?d00001 diff --git a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_coral_horn_2.mts b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_coral_horn_2.mts new file mode 100644 index 0000000000000000000000000000000000000000..8d2ec7f2bddee696bab204bc8fc8df0b256cdd8b GIT binary patch literal 125 zcmeYb3HD`RVPIrnVqmVX2ePDclXK$plT#D(tTOV8^5T>8ixP9V3UeZOU$d7lbn!{kdly;z?O9ER~4H;O3H)81QrGn6DAP=m=Y;> literal 0 HcmV?d00001 diff --git a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_coral_tube_1.mts b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_coral_tube_1.mts new file mode 100644 index 0000000000000000000000000000000000000000..89d08e9eac40597cc04b005da5788f4748ae2caf GIT binary patch literal 138 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 SCO++6RPuLsEhEE1yFUPCvaDYK literal 0 HcmV?d00001 diff --git a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_ocean_ruins_cold_3.mts b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_ocean_ruins_cold_3.mts new file mode 100644 index 0000000000000000000000000000000000000000..67cb5c9acf2f84f69df5514dcae3bc53e2f35e08 GIT binary patch literal 697 zcmeYb3HD`RVGv+oV-TnZ0|s6O=ETe*2L9aSocQGYqExH&qQtV)90p;yKygWaUTRWN zW^y)z1Qx;E{NmzD20m07B=eHU0wB@6)RK(UBCFiQ^xQ;bdkcz6 zlT*v{^HUgj;hKvR^HLbZz}$?~;*w&kWDpf!oST?~?B=Y}y!0H1UP**rxJQx`i^@_{ zD(1YM)?L=Dz~jKoBzybc%=mbYiPL{%bnDuFex^}zVL}TFivkPx1=c(NMO;KAtAn34 zKMG6xer2CDqtwxW)nfA)sus<@@9SKlpk-K~d{Kv!Gv3vjO~^Iyk8X9sL+Q8MuWUYA zZGUI;9qC4!Z(_wxg@1xw*+u#!U#a@LEjT0B85XrCyDBJU;~K59x>*5Ur#`B7?SI`J z$FbmUTh`5Yb$7*uzwcVi(Y1a_hSaK-8e6ZXci-}!%)HTNnzAglw&rhjL;MsW@3Pw( zNs0SoPIjdJv+2LNWuNbj%vZHrwlY=!+-okEv)kNxn_R{Na!eBoU6rKs3FVuz>w^6>uGEO2qU!2e3o zWpD0T_sgrhMisYC4eRf7KJfFK$ydSuGV6BU4&7UREB3kmDA)l|6j0o_dgZit^baHD*k(R8FTsV-G+tQc7HRjU9S{& mu(qEc!he)y=D+1vk0N&yy literal 0 HcmV?d00001 diff --git a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_ocean_ruins_warm_1.mts b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_ocean_ruins_warm_1.mts new file mode 100644 index 0000000000000000000000000000000000000000..072931b1397bc77811ea13295866eabd012adc99 GIT binary patch literal 311 zcmeYb3HD`RVPFMfj(Q+q;9y`*%q(Ky%}vgUPtGq&wJJ``OJNW~;TD(V=cO`8V2ULt z7L}!@Fo?rt(u)%FGD}k9i*xhyOER!&fy#)1wPd6gmlRtigD9Yu#GD)k0g!lJYDq?F zkyUPDdTwIHoTU>Y`5F{>T-t-a-q^dVgm=dge($V=in)P|CecwXc2TSQpItbyB}{wu z^}N+;%0F6*w@sg4++v$&A+c9cd8&n8UCGD8XZ4GBYRKIYyZ8RSW7#FkW542!O3#&f wxqNE8(Rm|MbcfESEaB&m*PUPvzs#{t=z5RAnd=<_f7XBN{j)-N*G0|$0AehGrT_o{ literal 0 HcmV?d00001 diff --git a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_ocean_ruins_warm_2.mts b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_ocean_ruins_warm_2.mts new file mode 100644 index 0000000000000000000000000000000000000000..9834226fafaa66bc4406239dd6858cc2b8d5a381 GIT binary patch literal 331 zcmeYb3HD`RVPIomW#Fg>0R~P6=ETe*2HxD{ocQGYqExHm#Jm&+2^4N|Nq$~xa$-?g zY6^oWNG3lyH8IbsI5jaoCo!)iwI~mphT`1({E`d?0g#5g)RK(UBCFiQ^xQ-SAxy&= z#NlG;MTvQtC8_aH?P6ewjMUr?U+F2HVH+j|Unfyy%eXUuk_H9vV z?YyIfS@X6p-7a+Z$liT#Z^=*P){sb>_)^@d>UeD^L;j{6_U8OM%S|sa-CQiW;(7J| Q{Mye(GYgouOgG*R0OM1L#sB~S literal 0 HcmV?d00001 diff --git a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_ocean_ruins_warm_3.mts b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_ocean_ruins_warm_3.mts new file mode 100644 index 0000000000000000000000000000000000000000..eb43cdf1c8166d40c9d902e56802f5812ed76449 GIT binary patch literal 536 zcmeYb3HD`RVGv+oWe}(b0R~P6=ETe*2HxD{ocQGYqExHm#Jm&+aX2@Pxo0y)P$RGh%3es6zlAo6fRf|O?IkBiLHHAS4QxAg}SS%y8 zxTM%B8AJiCOw7q)5Cw_nC#NRnSrw-y#^)sFm82HsRm^!C9x2wWz{7H%fK4?;BrA2QPdp8!U5vHSbLR8G+ep zpHpjtFR8ir@9%xBy>MMxjAhKGcbo5Vt;*?nFiE8CYH97I-{&;zG&hHcpM7Uo`)-L8 z-x-FlJ4KEj%((fNeFOXNx`{^Cr3>`kh10~Il`A}-&eZ?m&(&uyJLbf{e9d&;`#^!i z{hOB$DE?+no_@OJO75>|-Cxgc+!1p5^XnsTFL#u&34B!4qQGH@1H8tVYANuoMSCh zeC+&V?&5MR4}N==mDbzNc=k`LHg^8;_9xvx3U|$TG`S|_b5OnQ-Sa;u{Sqoob~8Ct aW|eU3rd&zyt@=sq{BkA_c?0*(Wd;BW*z*zq literal 0 HcmV?d00001 diff --git a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_ocean_ruins_warm_4.mts b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_ocean_ruins_warm_4.mts new file mode 100644 index 0000000000000000000000000000000000000000..0eb5bacf0671bd7e33768d8e9e2320d819a6dbf1 GIT binary patch literal 390 zcmeYb3HD`RVc=q5W#Fm@0R~P6-rVGz_~iVeRIB2|yc7oJ#LOZF2^6v7lKi~X*7ccfb&CIAUQ}tT# zj;lQ(UnPx}TI&{nT-%a(@ZvkZxnH=}Ppf|S@NG7)!6BE^#}9C1i*Gw+;#BAVsAqZb z_5D+CrwMVErk{J-^;=`%4BKjEHl?Rac#j_RIHa((Ins&2`l-T8`$^_PAzNKqwpE2q od9!mRm*efqHpS?K%smMT_EYcr$1dJ;DfDf%-=8>RIe)uT0JD#tbN~PV literal 0 HcmV?d00001 diff --git a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_shipwreck_full_back_damaged.mts b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_shipwreck_full_back_damaged.mts new file mode 100644 index 0000000000000000000000000000000000000000..12f3c9b1397a55b114129633349306c427bef496 GIT binary patch literal 1203 zcmeYb3HD`RVNhg{WZ0{D?YyI4lgO*pctQXX;XI?^i0)ZQ#{aV$N&O19v6LA z>McLP!0M>hJPZYOEC0IAlXO zztu&23?83X&#XJIw)btR>f5h#-(;rI`g;})5o_QwjhzK%(jVW`M+-_d{h z`HUCuALqQEk@5cVj3d7--dX>j#nU6pa3KF*Owq02qrZQz`DuKv?9$iBw_DAxPiCIQ zvvx}Q)jPMD8TwLwiS&K@Y_a#s`NulHcmJJ#oRMKpY~Ov$1I8D?feIuZFud9&=Dg32 z!D7m;wcWRh*31jDVm_wwca?*~Ix*%-mhx9e`}A|)bgh_P<2&Qt`MVqss~L*8-)}M$ zT(~QOrNZy@lS?yomu4SyToQh+;=uRmeS%8Mc1_fB&RE?msKn5?=Q{Uu&qF68#0}5< zc^*~v>}^oiLfOwe@9MJW?7Y8p9=ppFv90YJew^y^*lMm+-mkos*<;E>pR*jva|(O& zdz8zvE=jaI9o*QmPW3zEBRl(LAKrcm>Z-DH`(!F?A-++kg(159a6Q8oiH%_Yd^kHb z_2>TC3^KkqueoNjHZ?IGE2+P!;}XShGh9v#SL$1yrOQ(vk z^=Y}sy0p~%m=-?&>>FbNLyaRG4;DW88`!1s?fDM_=Z7j!0=6hWiY@wcH*ik;R7EAF zBex$<`C?I_cGZFJjG$m(jb4n*f#Q|N4pn)i{$$dSsWHFWBk{=JIg_E-uvU_R;lSh{ K>?#)@iUR;mO&+xX literal 0 HcmV?d00001 diff --git a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_shipwreck_full_damaged.mts b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_shipwreck_full_damaged.mts new file mode 100644 index 0000000000000000000000000000000000000000..5c8a3e105cee2ff2ec228e7b5e4e786cea5fd6a2 GIT binary patch literal 1518 zcmeYb3HD`RVNhg{WZ>$ ztMR?aoKRyT#kL`v$HpWy{8~VHs%*CIn)io)eP?8N5V~@XQEu*=_cmLDwKhIFw{=6# zS@~$)T>EWz;=JwqQpL)yZ?b#G$Z)4iE9g}8Dbd|}G3I}_NpFmMzuD~0H}+^XzN2ER z-ko6o>>T(+XUm&5`I~nB^4Z5Wu_W;@+?n_ExWpHJy8 zUt&>`{-}0#+16icW5TUm&Ruioc2^HO;(hAa#b^9^X+@j9{*8anDP48Mk~4OX{MQeg zw~IwvuWPk?G-uu0$2Yw_k65POzr3eaY^{7<+vfLGTc)$U*|DTIc0rHpoR@QNu9M(o zsIkwR`FP5jBZ_svR6*Y11?fU#r*3LOOtH+}F z{o@zk6QA8V9?A5*kl{h~2aEHoPO7s%vs=B)bx!5^RhfeA=~o#T;uy`3`?YS z{$bJCbH~V;)}GF%{bTMr2Mz+@wN7*3q>vyq?5MD9dDd@rbB$yp__Ma#LhZkvH5aviC?Nr z{l~@K^QtRsJJ0;`6pR;d;(KVHpgHraVW*bIFIQo|lDma5`wcD??pd57>n^+XmBqTy z>qW_b!hf4b^1oOz$LZQ>&ow`e-supw>ifB=Lz!(Mcc;aMmMQmZGW(3*aGY(}y5Wd_A`_N|w0i!~M0Uo$ju{O!7C zXJ&u&0b9>st`$O}T6XQ%tyUNKvRRugd*S_~P^Lnn=%bU*@6B=X$5k%nulvKhO+W5w z`icp1fu7O~-<|zl|EW2nspY@WsxR$u-SXPk7W;T@r<{4+p5_tgQqB6HXlKRhzp87* zKmVJwl3&$T@Hl_6i%bQZ9$(hl?UEth`!xbI+BF+x*yeRDNpH1oRocHeVhIo=e2Hi0*XM&v~3-?$ts+I9cKw}{0 zqSy=K#3#iY;gTweH>#NPb}n!DVgmtJ=Bs5}U+=2syEgxH{CzVAPqoSXUV$sVyXAVu zsX0o@ZH(w`3=O_%)P8GP<(XcCdcM#5`574cy`D}f%r5^sYk8U1(kYpOZ5DainJkOH z=`Vi$y+m*O*Y`>`^H0~@XJ&}tdaDy#woGoyL&@D=_PqXnm-YIO-#I+n|2yg~71Xl+ zbns7*$W9LNdB4wZsGoN(yRC@3f`>up{M)*ZMwj(d&L>u@yceJPT=-W0)NeEQ?tBry z{^Gol^Pcgaf3KbO_(>S=*3wywGU>T8+*#X>Y)j{le!A~<_e;Z7b+Lvkte?!(-+D|! zsi$wTt3l^X9%cTw&5z&Y?6mn^tJm(*bLoC!=-yAhod&Ju(T6O1>Nf8`XgkmL{NehV z0-1(B@%4WSy}FwB3cdgJL+)Yx?c?jW@ju^u@8A=e<$lL1HYe|i+j`e4`Aplpo7qZj z?<|a(JkKnCXaD_r$8?M1n{P|Jwm5#Tu^^|SW)SN__YHS4j@?r`5? zo_C?l3>7Rf{kJ>Q|Ja_p!tuwJkKw?l5A&F1_dI7n1tJ%>z4d9FDXVDDazOl2)Gzk8 zFLGEp9k;LK?70`};^AjByP6?b!)Apt*G&|)9!gmW^F_B=+ zdh{i9t>EX3fEYr=C zRCN=4RX#h#xp*E;{~wVqn&%O?(bzTr(Entiba|V|3Yi%`=k%Kn?>o80yHm|TKIyl~ zmHFpB_4}{nFkZx!Y$Kp@?iDBh>pvegM0dZQ-ghc^Md#w)pqsDk3jav#n))OysYW5<_Gu=$BMn0Tt3W1?6 zrZ_WllTpAEZ7)`PwL*rT`Q^J-b4J>Ttbfd~L*??*?iJbpj%!1Fo73^%_Uvg70H#i? A82|tP literal 0 HcmV?d00001 diff --git a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_shipwreck_half_back.mts b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_shipwreck_half_back.mts new file mode 100644 index 0000000000000000000000000000000000000000..f58376f3009eb49fb9bbb3e71668aee3205aa9ef GIT binary patch literal 1248 zcmeYb3HD`RVNhg{WZ$H!}{I@5+GeGy1i&snG z{Nq-$;|gomo|#y`PX50C=eK7CKJHpkc}1QfI!^p;`2CX5|C4vj-@HbAv(9Vqh(0fy zedjo1!{Rr8Be#CBw%oS!-X~kv?4y#}Y3=7%F&?lyyZY{FzWx2liT}SGF={Hlw(I2k z#|#HPKbXlZcU}e@;6UQR%dNSyEf1u+UodC96L`D$Vdzc1O>8G#$8kUSqc_R&#>5@3 zZiPi&i>iOakQllB?*5J|Jm0v38yN~8ZZr1UFJt#-^OX5o&z}8pl@NHPUbtcVog*{8 zo?@P3aG-alu#AFy^BvjH%Sy@*e+z`w?OwzyuxRz{@`FbTgCDUd*Yt*J+?2iJl2dcQ zdxb^RqX_MDQ!F0FhV(hUTlVOIz@u4So;rq2QzQ;=_`t`v{uINy!VdvSpBC}%d#Lk$ z*NUnK)s^AA_dBPF7n(@S zHZJ3IobQ~DJ%#Hg?mo$3Gh;<+?R;Ghe~Ej#g(n=|EXjPbxi;tMM*bHX;tp%dZ5Aw3 z|Kc_I>z*6yR}}U(FTdomQdM=X{D#|g6D)rCNg00J*LF8Gy}|h6=T{Y}C*$uhGcfG_ K!EU%o(E|2 literal 0 HcmV?d00001 diff --git a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_shipwreck_half_front.mts b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_shipwreck_half_front.mts new file mode 100644 index 0000000000000000000000000000000000000000..41efb386b3ca718e4788f051e050a0d8405208ac GIT binary patch literal 903 zcmeYb3HD`RVNhg{WZ2D<~CHD;!E-i7-Z000<#n>3-&ZjH`r$|X$A?n zGmA@#G7Ab)Q=pz;5Ch9(q!yPHTP1_2_~P8eoE(S_m|-BNz|5+c^Y-q=yju2Xqw+g2GQ23znQSx??-}bG3 zB|X!``gVI)PYlhjSa(!aSMefe^y%B8Tix7OE?ro7>32k#u*iptS9^WtTq=Cz^1DIq zQT80Z>;E3ATo8Wab2-&@+vZtHiww)917D|GKo+{V!Ku)zIE`{`iVV6VB`~^D|qVE6?k0*>bxf yNKaNv%F9Ql>`Bqfi{`wdyl2^WU%V7yYvmn(FkWx^j-O|gL6+S+nSU%V(*yuqfRd5` literal 0 HcmV?d00001 diff --git a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_woodland_cabin.mts b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_woodland_cabin.mts new file mode 100644 index 0000000000000000000000000000000000000000..f654da926d5583b0109bcdcb3b43cf5fbb768fef GIT binary patch literal 2736 zcmaJtc=E!0f?zPLZ~?d;Hfwq8AO=r19&O}L`7g3Bqjp{5lH&s)wO5Sa=X%GO#rL1wf^N6vV3k$)ks5Q>hV%6@Lzq zvAA~(EMsX{3J9U}J3zrQSqv;0h$Lf~^Q0p{kOt{I9l>`egt;DSjx>(Qz!T=+=Q884 z3h{CqQNCYM=kMKzdF%V4m@uobUC)6R=Edc$L!E z)m*|aQd%S@#azE$IE*}aHJvWp_vOyP#Co;+dZgiFmYgx<(~1e{jLE6R@b@^Vs-3&1 z)abJSe=wjcf3|?+Q^>P%BBoFGqNG7e++J~|?8g@zORf|nTsQH(a_o>`fMZ?y`OY5* zIi;6cdPh$jIVSvMo0wWV8FI&sMn^qlf#uI8t)|tt>-XJA(JFpbCM(@LGlsTgk2;Lj zSNnpeTV>8^B-wpWBUs&4?z|+@rtY_JDd}06&0F8%xO6-aM4xRwOql%ER~ycp8(n>M`W?u3i`6W#Xw+pofOps{-Ic))-nAl_`1O;^6%hdi&az3R_c z7|zIMO#XQ!k|^dgx1zf|Uv}j2v)-~vJ45el%pt1)hmn(oTdvam+;bD`Grzh<%G{n` zusi9+)cDP#V(C(FRF;-mZl3ga2%`RuyyaqZb?dMMTD9)7U9*-I7v2Qq8lY(60A_=Ol zLv}>cy;7^zKC%>Bd9h8#T1&8E(Ss=t5)?~!=S*B71w!&IugU9Li3>}Frp%^ZZD#=c zPO{9P^l!$C2APfgGd#J_F&W!}Njv4Gte&u%82c{!&XVn?lHBPHy%(!q!2!>|Uj)}q z60Bi-Pv7L=?+!VyVBZX0r>jpmbvWfT>}!lVK}Wj5D(yitnD}XTrK+RyjITv7L36HB%v@rE5^hFyH)$cKP<_7QZ0r zys+zw^PD59MuenV6hiT6SxHK6am{bE{ zoznbGWBkO=c6?%*0G;;7ZKB(50AO>^m95`i4C)bZWmRY+^a@&JB*(VyT;HM5%?FGU z%DwHw*>_c(siEkLfHd;}PmcMPe|Dy#CTDcLr-Y}OL2)S+$-v&>mGN>5AS4r#yR~`W z@V?RL^4t{;Tn>0Fj{`i^s;Sq>-F(xiZ0%*-wYrdP_+7m8`x*v!I!-ddvlP;K8oM?B z$mlZ?+~S%Qx*$99MaKbY$7yB$sTgO{neONV%AsBm#Q%?+V4%gDXa!x64cBf{NO(g5TCI8@ zencHEyyd#L)G+>Ej<)_2n4ojo#H<+g8gPTTOT`0G=Tgh$If!VZ7cZCJpWT@@Pk3?}_@nkRp;KTAARF@2;Z z=??b`5ghin~V`sUBsLMt;29H)Xz#fti#f`*~41OpMfrZUY_G+xv5aw*+1 zp6h(eMipQl{;nPC^y%*>jTlIvFa|K1aa((;lrrXeL|6OgPUh&LFbes0!Mt2AM z6^!b^+zfXAIlo}M%lg|F{O!?=9|cPzzbiSUHrf`9k!oj+6un^p?*_6S$P_?<`= zPSbVsM4t4y-N{LekAPF=2d5>V3yVJxdoPB0<;Q`Q?pRjrSr23F50%EfcA4&0*}1$f zEJ`eBOQXxj{1{&GF|pz{e9nREV4_Q~!r)ljU~?<4TD1+Y_FFCTsD+)69gBo)tjepb z!~`{=?nz*8gPJQS_ilSkl!SMNbvqhLM&1^eaFhz$rjlD8iDW^2LB60ZuRjvqkZbEl z^D?WwJB8k@8Oft@O8~?B&wAXVSqDE>*hrNWi_vnEX(*WO)4uhBvgk?RkwZ4W+lrz+ z#)++sfq02FY456~UzR<_Rn?@oZH$so>`gzSbFURKG3-py;p%(ARNJ)!p+BOjhOb~} zr&oouD|V4h)%S)BTNOc~IGHRBkR0_EHph8EodV(PvZv84=~pZ zv#$b;{ji~^(pfNrBCu0%JdJIhNnuh^zCCxbrh~LoyD^H}@36ry*)-mf=n`Ss(xJRj eVEa;_+r6hNh|^bsCGHrP-pwD)8eHa&J^c^W-au>s literal 0 HcmV?d00001 diff --git a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_woodland_outpost.mts b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_woodland_outpost.mts new file mode 100644 index 0000000000000000000000000000000000000000..6fd48068b0f5d3b67cbbd8448806c7269619a82b GIT binary patch literal 3341 zcmaJ>dmvQ#9zT_oL>omC+S``3*1MFM?z+^jlt&(|5>98%91O>tab`SgY_hxMkydT= zVC=G@^@zr!yo$;!c|?UV9!qIThFnDv-7{xUc5i$BIOq5KzR&0T`F`zPUF-olKpjv4 zRKNS%15kiP5CaER2f!%kjbb4P&ZcmJPzDRc5jwEu?_vyxm_Eo~93T|+!67yq_*CkE zLQD>VGuae27BqJQVT6G)m_C4#)C9(Ggc8hPB7n*~57-xCFaZrREy9EmHiZu1{vZbV zgWl3RuyW2@s^H)VA}f;3A%26%h(a__stLg`x-8DDMr!b0wN4smR`sD1$iY~^+PN%j z4$fe)5IX58tpiXCWkF1$FzFklp%6@zhC&<}BC`?6WMmEV3noRXA4JEP2n}bz{=lj^ zVF1Qvhrt+)h9dI{nKgxRBIj&#NFdpqSsm#MsFAUJ5jKZSfu$di9YC}Q*dUe5y3E1| zo$Lq_XX5vmbOdE!OhD)3Ml6iQ3IjHN+<=A#As~jsz6`nykD2mjFqFdgzWsCt&H+d) zXc*?trjT!61oZ~U=FG8Z<}gQ~f5;Do2jSAD1R)&Y6S7PhiDcZ_^zp)Fl%L@?*$Qt6 z45SsI^2)CZLg+Xp;i;XyD$l1o!+G>?Yt_ezqC^D2pSTc;!6aZ zbt5+nDfS_Tb}kwzCOJAwRTS~&{2vD63?JW_AtNCOfruRg5*r35wgQO+8JyT!vl(UW zAa~kd+3roOC)sTMjb+44U^rkzK!Ly*lMS+Pgv};c#Uf^0I`uPGki3ILPCAHrdjllw zGF0X^7KsTBH2JuaLn!C1-uGijl4brzW)VaK)Jc-fZ0ZmA9-1uijI|b-uUcKuFUOKs z+LU8F_O!V8pr|4hECEwrUG);zIq%Y3O7WwKC-x_Df{q|x>&00m=P&k8Zc@7RZ$@F2 zk20#3vVDk8Jzent9m-Go?BXKxlRsq?yVlw_ex;dIZa};8*lDQXdST|>p{w_|G~Cjo z!s43|Uv)T|HQJ86WjFFe7p8eNxRzPGdZE|fpK^E0bZyk|#ZE8ZJwNyT_vjveQ_VD6 zZ6mZpoU?z${TTX{D#Zek9JSRw>5yRHnM!}WFqT{dT~M3YfZ`qNr-cWR)WwbQ^4jnttXdXkr3+Mvnc@raIy z-1}Qip|K8&=MU-JvvfsCGS${scb|%-^I1kF=eO_s6a$RlqecdRu2y!8=6KxiVO> zq|HcyT3nd|={QpZJ9ja3ze=Pf`ROj<=BL1;H1pQR6%(T=x6D~Zw_*k8!rfc06dil2 zB04dWZdcINQ1;o-&nI7aoa{6y+4rOn7GzXv@q6N%e#auas@vkZR~wogw%!_TiWUp| zb{(^UJmNcWo6z3{Py7VKJ;Q1EjihKsBCW^g!T5+kO9bZzKUFE4n!I%`Cs=!0&ZRCd zaLMHbr>eJAnX4`E7ui!S3sME$qp^cK2989I54xT2_D{?%?0GyntSk};xZNh)I&QZR z?6h)x%Ith&tQs;lUhX1Z<~)k}{n$|d%dfj=m6Jj_vw+JQlFl&m^uka>yTaDo*2Y}4 zq8myNGdFY0EoP6RC+wT}Zyw!Aw(tX~m&>?s%U#qo_uAGy*jsdFVT;3~a{cvNJXG`* zx0$4$tctDd>2+4k3zomUGV=ALR@HRW8^704PCdg*$2@OV!ULMh6O&qQ)IAOHPH9>t zg34wi*in!YHkldTU0a}&87#Nf(Q1I2tWGJ;3Mu_Ad*4#GaQn!Z-IE90Zf5$9#7|jN z;;pN5HclGVdYu_;g>Q_ur$%@#s0Jh%Q-apSNH2A@4Mo-l-}wFDu5rf1KH!hYm!!*qfu)Noq{ z&sma{a8JuCmseK7j|WMi~R&Wjr|fVb(zT1e{bNC6L56FIpHObrZz9< zk@9coD`ec4H>0 zjqpU;qt>^dmBXb*V-A*{vA#u1UJhxBPmgwo9Tg_tDdP*fY@VkWcG$iJmRp_u!4czG zC=8~&3`(22dLtHp+d&tQTJ%kIrBNXc@?o3*+xW@Z-P#(#FO<8E{XzZuS9(uJf|7p4qlCK)mm?9$9l}~_ zucKb3odeCET9I+(>Dcf($>u+A_gx$1*ev#~e}ddNS6t@5qz8 zuU^r9^BpC!eqd$FWa~wTp2}iToLFl)t<(OzqF7k0=6IiaV9iZlbryd_hh-v8R^_dT roJJoX3cr0VP@J`|re(10=jWCa>Ykfx3c@neh^H@f#L_G6?&bdh=AZnz literal 0 HcmV?d00001 diff --git a/mods/MAPGEN/mcl_structures/shipwrecks.lua b/mods/MAPGEN/mcl_structures/shipwrecks.lua new file mode 100644 index 000000000..72823d811 --- /dev/null +++ b/mods/MAPGEN/mcl_structures/shipwrecks.lua @@ -0,0 +1,161 @@ +local modname = minetest.get_current_modname() +local modpath = minetest.get_modpath(modname) +--local S = minetest.get_translator(modname) + +local seed = minetest.get_mapgen_setting("seed") +local water_level = minetest.get_mapgen_setting("water_level") +local pr = PseudoRandom(seed) + +--schematics by chmodsayshello +local schems = { + modpath.."/schematics/mcl_structures_shipwreck_full_damaged.mts", + modpath.."/schematics/mcl_structures_shipwreck_full_normal.mts", + modpath.."/schematics/mcl_structures_shipwreck_full_back_damaged.mts", + modpath.."/schematics/mcl_structures_shipwreck_half_front.mts", + modpath.."/schematics/mcl_structures_shipwreck_half_back.mts", +} + +local ocean_biomes = { + "RoofedForest_ocean", + "JungleEdgeM_ocean", + "BirchForestM_ocean", + "BirchForest_ocean", + "IcePlains_deep_ocean", + "Jungle_deep_ocean", + "Savanna_ocean", + "MesaPlateauF_ocean", + "ExtremeHillsM_deep_ocean", + "Savanna_deep_ocean", + "SunflowerPlains_ocean", + "Swampland_deep_ocean", + "Swampland_ocean", + "MegaSpruceTaiga_deep_ocean", + "ExtremeHillsM_ocean", + "JungleEdgeM_deep_ocean", + "SunflowerPlains_deep_ocean", + "BirchForest_deep_ocean", + "IcePlainsSpikes_ocean", + "Mesa_ocean", + "StoneBeach_ocean", + "Plains_deep_ocean", + "JungleEdge_deep_ocean", + "SavannaM_deep_ocean", + "Desert_deep_ocean", + "Mesa_deep_ocean", + "ColdTaiga_deep_ocean", + "Plains_ocean", + "MesaPlateauFM_ocean", + "Forest_deep_ocean", + "JungleM_deep_ocean", + "FlowerForest_deep_ocean", + "MushroomIsland_ocean", + "MegaTaiga_ocean", + "StoneBeach_deep_ocean", + "IcePlainsSpikes_deep_ocean", + "ColdTaiga_ocean", + "SavannaM_ocean", + "MesaPlateauF_deep_ocean", + "MesaBryce_deep_ocean", + "ExtremeHills+_deep_ocean", + "ExtremeHills_ocean", + "MushroomIsland_deep_ocean", + "Forest_ocean", + "MegaTaiga_deep_ocean", + "JungleEdge_ocean", + "MesaBryce_ocean", + "MegaSpruceTaiga_ocean", + "ExtremeHills+_ocean", + "Jungle_ocean", + "RoofedForest_deep_ocean", + "IcePlains_ocean", + "FlowerForest_ocean", + "ExtremeHills_deep_ocean", + "MesaPlateauFM_deep_ocean", + "Desert_ocean", + "Taiga_ocean", + "BirchForestM_deep_ocean", + "Taiga_deep_ocean", + "JungleM_ocean" +} + +local beach_biomes = { + "FlowerForest_beach", + "Forest_beach", + "StoneBeach", + "ColdTaiga_beach_water", + "Taiga_beach", + "Savanna_beach", + "Plains_beach", + "ExtremeHills_beach", + "ColdTaiga_beach", + "Swampland_shore", + "MushroomIslandShore", + "JungleM_shore", + "Jungle_shore" +} + +mcl_structures.register_structure("shipwreck",{ + place_on = {"group:sand","mcl_core:gravel"}, + spawn_by = {"group:water"}, + num_spawn_by = 4, + noise_params = { + offset = 0, + scale = 0.000022, + spread = {x = 250, y = 250, z = 250}, + seed = 3, + octaves = 3, + persist = 0.001, + flags = "absvalue", + }, + sidelen = 16, + flags = "force_placement", + biomes = ocean_biomes, + y_max = water_level-4, + y_min = mcl_vars.mg_overworld_min, + filenames = schems, + y_offset = function(pr) return pr:next(-4,-2) end, + loot = { + ["mcl_chests:chest_small"] = { + stacks_min = 3, + stacks_max = 10, + items = { + { itemstring = "mcl_sus_stew:stew", weight = 10, amount_min = 1, amount_max = 1 }, + { itemstring = "mcl_core:paper", weight = 8, amount_min = 1, amount_max = 12 }, + { itemstring = "mcl_farming:wheat_item", weight = 7, amount_min = 8, amount_max = 21 }, + { itemstring = "mcl_farming:carrot_item", weight = 7, amount_min = 4, amount_max = 8 }, + { itemstring = "mcl_farming:potato_item_poison", weight = 7, amount_min = 2, amount_max = 6 }, + { itemstring = "mcl_farming:potato_item", weight = 7, amount_min = 2, amount_max = 6 }, + --{ itemstring = "TODO:moss_block", weight = 7, amount_min = 1, amount_max = 4 }, + { itemstring = "mcl_core:coal_lump", weight = 6, amount_min = 2, amount_max = 8 }, + { itemstring = "mcl_mobitems:rotten_flesh", weight = 5, amount_min = 5, amount_max = 24 }, + { itemstring = "mcl_farming:potato_item", weight = 3, amount_min = 1, amount_max = 5 }, + { itemstring = "mcl_armor:helmet_leather_enchanted", weight = 3, func = function(stack, pr) + mcl_enchanting.enchant_uniform_randomly(stack, {"soul_speed"}) end }, + { itemstring = "mcl_armor:chestplate_leather_enchanted", weight = 3, func = function(stack, pr) + mcl_enchanting.enchant_uniform_randomly(stack, {"soul_speed"}) end }, + { itemstring = "mcl_armor:leggings_leather_enchanted", weight = 3, func = function(stack, pr) + mcl_enchanting.enchant_uniform_randomly(stack, {"soul_speed"}) end }, + { itemstring = "mcl_armor:boots_leather_enchanted", weight = 3, func = function(stack, pr) + mcl_enchanting.enchant_uniform_randomly(stack, {"soul_speed"}) end }, + --{ itemstring = "TODO:bamboo", weight = 2, amount_min = 1, amount_max = 3 }, + { itemstring = "mcl_farming:pumpkin", weight = 2, amount_min = 1, amount_max = 3 }, + { itemstring = "mcl_tnt:tnt", weight = 1, amount_min = 1, amount_max = 2 }, + + }, + { + stacks_min = 3, + stacks_max = 10, + items = { + { itemstring = "mcl_core:iron_ingot", weight = 8, amount_min = 1, amount_max = 5 }, + { itemstring = "mcl_core:iron_nugget", weight = 8, amount_min = 1, amount_max = 10 }, + { itemstring = "mcl_core:emerald", weight = 8, amount_min = 1, amount_max = 12 }, + { itemstring = "mcl_dye:blue", weight = 8, amount_min = 1, amount_max = 12 }, + { itemstring = "mcl_core:gold_ingot", weight = 8, amount_min = 1, amount_max = 5 }, + { itemstring = "mcl_core:gold_nugget", weight = 8, amount_min = 1, amount_max = 10 }, + { itemstring = "mcl_experience:bottle", weight = 8, amount_min = 1, amount_max = 10 }, + { itemstring = "mcl_core:diamond", weight = 8, amount_min = 1, amount_max = 10 }, + } + } + } + } +}) diff --git a/mods/MAPGEN/mcl_structures/witch_hut.lua b/mods/MAPGEN/mcl_structures/witch_hut.lua index 49843bb59..3b67fafc3 100644 --- a/mods/MAPGEN/mcl_structures/witch_hut.lua +++ b/mods/MAPGEN/mcl_structures/witch_hut.lua @@ -1,4 +1,5 @@ local modname = minetest.get_current_modname() +<<<<<<< HEAD local modpath = minetest.get_modpath(modname) local chance_per_chunk = 17 @@ -133,4 +134,53 @@ mcl_structures.register_structure({ place(pos, nil, pr) end, place_function = place, +======= +local S = minetest.get_translator(modname) +local modpath = minetest.get_modpath(modname) + +local function spawn_witch(p1,p2) + local c = minetest.find_node_near(p1,15,{"mcl_cauldrons:cauldron"}) + if c then + local nn = minetest.find_nodes_in_area_under_air(vector.new(p1.x,c.y-1,p1.z),vector.new(p2.x,c.y-1,p2.z),{"mcl_core:sprucewood"}) + local witch = minetest.add_entity(vector.offset(nn[math.random(#nn)],0,1,0),"mobs_mc:witch"):get_luaentity() + local cat = minetest.add_entity(vector.offset(nn[math.random(#nn)],0,1,0),"mobs_mc:cat"):get_luaentity() + witch._home = c + witch.can_despawn = false + cat.object:set_properties({textures = {"mobs_mc_cat_black.png"}}) + cat.owner = "!witch!" --so it's not claimable by player + cat._home = c + cat.can_despawn = false + return + end +end + +local function hut_placement_callback(pos,def,pr) + local hl = def.sidelen / 2 + local p1 = vector.offset(pos,-hl,-hl,-hl) + local p2 = vector.offset(pos,hl,hl,hl) + local legs = minetest.find_nodes_in_area(vector.offset(pos,-hl,0,-hl),vector.offset(pos,hl,0,hl), "mcl_core:tree") + local tree = {} + for _,leg in pairs(legs) do + while minetest.get_item_group(mcl_vars.get_node(vector.offset(leg,0,-1,0), true, 333333).name, "water") ~= 0 do + leg = vector.offset(leg,0,-1,0) + table.insert(tree,leg) + end + end + minetest.bulk_set_node(tree, {name = "mcl_core:tree", param2 = 2}) + spawn_witch(p1,p2) +end + +mcl_structures.register_structure("witch_hut",{ + place_on = {"group:sand","group:grass_block","mcl_core:water_source","group:dirt"}, + fill_ratio = 0.01, + flags = "place_center_x, place_center_z, liquid_surface, force_placement", + sidelen = 8, + chunk_probability = 300, + y_max = mcl_vars.mg_overworld_max, + y_min = -4, + y_offset = 0, + biomes = { "Swampland", "Swampland_ocean", "Swampland_shore" }, + filenames = { modpath.."/schematics/mcl_structures_witch_hut.mts" }, + after_place = hut_placement_callback, +>>>>>>> mcl2/master }) diff --git a/mods/MAPGEN/mcl_structures/woodland_mansion.lua b/mods/MAPGEN/mcl_structures/woodland_mansion.lua new file mode 100644 index 000000000..d47d4a0e6 --- /dev/null +++ b/mods/MAPGEN/mcl_structures/woodland_mansion.lua @@ -0,0 +1,58 @@ +local modname = minetest.get_current_modname() +local S = minetest.get_translator(modname) +local modpath = minetest.get_modpath(modname) + +mcl_structures.register_structure("woodland_cabin",{ + place_on = {"group:grass_block","group:dirt","mcl_core:dirt_with_grass"}, + fill_ratio = 0.01, + flags = "place_center_x, place_center_z", + solid_ground = true, + make_foundation = true, + chunk_probability = 800, + y_max = mcl_vars.mg_overworld_max, + y_min = 1, + biomes = { "RoofedForest" }, + sidelen = 32, + filenames = { + modpath.."/schematics/mcl_structures_woodland_cabin.mts", + modpath.."/schematics/mcl_structures_woodland_outpost.mts", + }, + loot = { + ["mcl_chests:chest_small" ] ={{ + stacks_min = 3, + stacks_max = 3, + items = { + { itemstring = "mcl_mobitems:bone", weight = 10, amount_min = 1, amount_max=8 }, + { itemstring = "mcl_mobitems:gunpowder", weight = 10, amount_min = 1, amount_max = 8 }, + { itemstring = "mcl_mobitems:rotten_flesh", weight = 10, amount_min = 1, amount_max=8 }, + { itemstring = "mcl_mobitems:string", weight = 10, amount_min = 1, amount_max=8 }, + + { itemstring = "mcl_core:gold_ingot", weight = 15, amount_min = 2, amount_max = 7 }, + }},{ + stacks_min = 1, + stacks_max = 4, + items = { + { itemstring = "mcl_farming:wheat_item", weight = 20, amount_min = 1, amount_max = 4 }, + { itemstring = "mcl_farming:bread", weight = 20, amount_min = 1, amount_max = 1 }, + { itemstring = "mcl_core:coal_lump", weight = 15, amount_min = 1, amount_max = 4 }, + { itemstring = "mesecons:mesecon", weight = 15, amount_min = 1, amount_max = 4 }, + { itemstring = "mcl_farming:beetroot_seeds", weight = 10, amount_min = 2, amount_max = 4 }, + { itemstring = "mcl_farming:melon_seeds", weight = 10, amount_min = 2, amount_max = 4 }, + { itemstring = "mcl_farming:pumpkin_seeds", weight = 10, amount_min = 2, amount_max = 4 }, + { itemstring = "mcl_core:iron_ingot", weight = 10, amount_min = 1, amount_max = 4 }, + { itemstring = "mcl_buckets:bucket_empty", weight = 10, amount_min = 1, amount_max = 1 }, + { itemstring = "mcl_core:gold_ingot", weight = 5, amount_min = 1, amount_max = 4 }, + }},{ + stacks_min = 1, + stacks_max = 4, + items = { + --{ itemstring = "FIXME:lead", weight = 20, amount_min = 1, amount_max = 1 }, + { itemstring = "mcl_mobs:nametag", weight = 2, amount_min = 1, amount_max = 3 }, + { itemstring = "mcl_books:book", weight = 1, func = function(stack, pr)mcl_enchanting.enchant_uniform_randomly(stack, {"soul_speed"}, pr) end }, + { itemstring = "mcl_armor:chestplate_chain", weight = 1, }, + { itemstring = "mcl_armor:chestplate_diamond", weight = 1, }, + { itemstring = "mcl_core:apple_gold_enchanted", weight = 2, }, + } + }} + } +}) diff --git a/mods/MAPGEN/mcl_terrain_features/init.lua b/mods/MAPGEN/mcl_terrain_features/init.lua new file mode 100644 index 000000000..0c95eb9b2 --- /dev/null +++ b/mods/MAPGEN/mcl_terrain_features/init.lua @@ -0,0 +1,269 @@ +local adjacents = { + vector.new(1,0,0), + vector.new(1,0,1), + vector.new(1,0,-1), + vector.new(-1,0,0), + vector.new(-1,0,1), + vector.new(-1,0,-1), + vector.new(0,0,1), + vector.new(0,0,-1), + vector.new(0,-1,0) +} + +local plane_adjacents = { + vector.new(1,0,0), + vector.new(-1,0,0), + vector.new(0,0,1), + vector.new(0,0,-1), +} + +local function set_node_no_bedrock(pos,node) + local n = minetest.get_node(pos) + if n.name == "mcl_core:bedrock" then return end + return minetest.set_node(pos,node) +end + +local function airtower(pos,tbl,h) + for i=1,h do + table.insert(tbl,vector.offset(pos,0,i,0)) + end +end + +local function makelake(pos,size,liquid,placein,border,pr) + local node_under = minetest.get_node(vector.offset(pos,0,-1,0)) + local p1 = vector.offset(pos,-size,-1,-size) + local p2 = vector.offset(pos,size,-1,size) + minetest.emerge_area(p1, p2, function(blockpos, action, calls_remaining, param) + if calls_remaining ~= 0 then return end + local nn = minetest.find_nodes_in_area(p1,p2,placein) + table.sort(nn,function(a, b) + return vector.distance(vector.new(pos.x,0,pos.z), a) < vector.distance(vector.new(pos.x,0,pos.z), b) + end) + if not nn[1] then return end + local y = pos.y - pr:next(1,2) + local lq = {} + local air = {} + local r = pr:next(1,#nn) + if r > #nn then return end + for i=1,r do + if nn[i].y == y then + airtower(nn[i],air,55) + table.insert(lq,nn[i]) + end + end + minetest.bulk_set_node(lq,{name=liquid}) + minetest.bulk_set_node(air,{name="air"}) + air = {} + local br = {} + for k,v in pairs(lq) do + for kk,vv in pairs(adjacents) do + local pp = vector.add(v,vv) + local an = minetest.get_node(pp) + local un = minetest.get_node(vector.offset(pp,0,1,0)) + if not border then + if minetest.get_item_group(an.name,"solid") > 0 then + border = an.name + elseif minetest.get_item_group(minetest.get_node(nn[1]).name,"solid") > 0 then + border = minetest.get_node_or_nil(nn[1]).name + else + border = "mcl_core:stone" + end + if border == nil or border == "mcl_core:dirt" then border = "mcl_core:dirt_with_grass" end + end + if an.name ~= liquid then + table.insert(br,pp) + if un.name ~= liquid then + airtower(pp,air,55) + end + end + end + end + minetest.bulk_set_node(br,{name=border}) + minetest.bulk_set_node(air,{name="air"}) + return true + end) + return true +end + +mcl_structures.register_structure("lavapool",{ + place_on = {"group:sand", "group:dirt", "group:stone"}, + terrain_feature = true, + noise_params = { + offset = 0, + scale = 0.0000022, + spread = {x = 250, y = 250, z = 250}, + seed = 78375213, + octaves = 3, + persist = 0.001, + flags = "absvalue", + }, + flags = "place_center_x, place_center_z, force_placement", + y_max = mcl_vars.mg_overworld_max, + y_min = minetest.get_mapgen_setting("water_level"), + place_func = function(pos,def,pr) + return makelake(pos,5,"mcl_core:lava_source",{"group:material_stone", "group:sand", "group:dirt"},"mcl_core:stone",pr) + end +}) + +mcl_structures.register_structure("water_lake",{ + place_on = {"group:dirt","group:stone"}, + terrain_feature = true, + noise_params = { + offset = 0, + scale = 0.000032, + spread = {x = 250, y = 250, z = 250}, + seed = 756641353, + octaves = 3, + persist = 0.001, + flags = "absvalue", + }, + flags = "place_center_x, place_center_z, force_placement", + y_max = mcl_vars.mg_overworld_max, + y_min = minetest.get_mapgen_setting("water_level"), + place_func = function(pos,def,pr) + return makelake(pos,5,"mcl_core:water_source",{"group:material_stone", "group:sand", "group:dirt","group:grass_block"},nil,pr) + end +}) + +local pool_adjacents = { + vector.new(1,0,0), + vector.new(-1,0,0), + vector.new(0,-1,0), + vector.new(0,0,1), + vector.new(0,0,-1), +} + +mcl_structures.register_structure("basalt_column",{ + place_on = {"mcl_blackstone:blackstone","mcl_blackstone:basalt"}, + terrain_feature = true, + spawn_by = {"air"}, + num_spawn_by = 2, + noise_params = { + offset = 0, + scale = 0.003, + spread = {x = 250, y = 250, z = 250}, + seed = 72235213, + octaves = 5, + persist = 0.3, + flags = "absvalue", + }, + flags = "all_floors", + y_max = mcl_vars.mg_nether_max - 20, + y_min = mcl_vars.mg_lava_nether_max + 1, + biomes = { "BasaltDelta" }, + place_func = function(pos,def,pr) + local nn = minetest.find_nodes_in_area(vector.offset(pos,-5,-1,-5),vector.offset(pos,5,-1,5),{"air","mcl_blackstone:basalt","mcl_blackstone:blackstone"}) + table.sort(nn,function(a, b) + return vector.distance(vector.new(pos.x,0,pos.z), a) < vector.distance(vector.new(pos.x,0,pos.z), b) + end) + if #nn < 1 then return false end + local basalt = {} + local magma = {} + for i=1,pr:next(1,#nn) do + if minetest.get_node(vector.offset(nn[i],0,-1,0)).name ~= "air" then + local dst=vector.distance(pos,nn[i]) + local r = pr:next(1,14)-dst + for ii=0,r do + if pr:next(1,25) == 1 then + table.insert(magma,vector.new(nn[i].x,nn[i].y + ii,nn[i].z)) + else + table.insert(basalt,vector.new(nn[i].x,nn[i].y + ii,nn[i].z)) + end + end + end + end + minetest.bulk_set_node(magma,{name="mcl_nether:magma"}) + minetest.bulk_set_node(basalt,{name="mcl_blackstone:basalt"}) + return true + end +}) +mcl_structures.register_structure("basalt_pillar",{ + place_on = {"mcl_blackstone:blackstone","mcl_blackstone:basalt"}, + terrain_feature = true, + noise_params = { + offset = 0, + scale = 0.001, + spread = {x = 250, y = 250, z = 250}, + seed = 7113, + octaves = 5, + persist = 0.1, + flags = "absvalue", + }, + flags = "all_floors", + y_max = mcl_vars.mg_nether_max-40, + y_min = mcl_vars.mg_lava_nether_max + 1, + biomes = { "BasaltDelta" }, + place_func = function(pos,def,pr) + local nn = minetest.find_nodes_in_area(vector.offset(pos,-2,-1,-2),vector.offset(pos,2,-1,2),{"air","mcl_blackstone:basalt","mcl_blackstone:blackstone"}) + table.sort(nn,function(a, b) + return vector.distance(vector.new(pos.x,0,pos.z), a) < vector.distance(vector.new(pos.x,0,pos.z), b) + end) + if #nn < 1 then return false end + local basalt = {} + local magma = {} + for i=1,pr:next(1,#nn) do + if minetest.get_node(vector.offset(nn[i],0,-1,0)).name ~= "air" then + local dst=vector.distance(pos,nn[i]) + for ii=0,pr:next(19,35)-dst do + if pr:next(1,20) == 1 then + table.insert(magma,vector.new(nn[i].x,nn[i].y + ii,nn[i].z)) + else + table.insert(basalt,vector.new(nn[i].x,nn[i].y + ii,nn[i].z)) + end + end + end + end + minetest.bulk_set_node(basalt,{name="mcl_blackstone:basalt"}) + minetest.bulk_set_node(magma,{name="mcl_nether:magma"}) + return true + end +}) + +mcl_structures.register_structure("lavadelta",{ + place_on = {"mcl_blackstone:blackstone","mcl_blackstone:basalt"}, + spawn_by = {"mcl_blackstone:basalt","mcl_blackstone:blackstone"}, + num_spawn_by = 2, + terrain_feature = true, + noise_params = { + offset = 0, + scale = 0.005, + spread = {x = 250, y = 250, z = 250}, + seed = 78375213, + octaves = 5, + persist = 0.1, + flags = "absvalue", + }, + flags = "all_floors", + y_max = mcl_vars.mg_nether_max, + y_min = mcl_vars.mg_lava_nether_max + 1, + biomes = { "BasaltDelta" }, + place_func = function(pos,def,pr) + local nn = minetest.find_nodes_in_area_under_air(vector.offset(pos,-10,-1,-10),vector.offset(pos,10,-2,10),{"mcl_blackstone:basalt","mcl_blackstone:blackstone","mcl_nether:netherrack"}) + table.sort(nn,function(a, b) + return vector.distance(vector.new(pos.x,0,pos.z), a) < vector.distance(vector.new(pos.x,0,pos.z), b) + end) + if #nn < 1 then return false end + local lava = {} + for i=1,pr:next(1,#nn) do + table.insert(lava,nn[i]) + end + minetest.bulk_set_node(lava,{name="mcl_nether:nether_lava_source"}) + local basalt = {} + local magma = {} + for _,v in pairs(lava) do + for _,vv in pairs(adjacents) do + local p = vector.add(v,vv) + if minetest.get_node(p).name ~= "mcl_nether:nether_lava_source" then + table.insert(basalt,p) + + end + end + if math.random(3) == 1 then + table.insert(magma,v) + end + end + minetest.bulk_set_node(basalt,{name="mcl_blackstone:basalt"}) + minetest.bulk_set_node(magma,{name="mcl_nether:magma"}) + return true + end +}) diff --git a/mods/MAPGEN/mcl_terrain_features/mod.conf b/mods/MAPGEN/mcl_terrain_features/mod.conf new file mode 100644 index 000000000..008e370cc --- /dev/null +++ b/mods/MAPGEN/mcl_terrain_features/mod.conf @@ -0,0 +1,3 @@ +name = mcl_terrain_features +author = cora +depends = mcl_init, mcl_structures diff --git a/mods/MAPGEN/mcl_villages/buildings.lua b/mods/MAPGEN/mcl_villages/buildings.lua new file mode 100644 index 000000000..67a0785ce --- /dev/null +++ b/mods/MAPGEN/mcl_villages/buildings.lua @@ -0,0 +1,332 @@ +--[[ +------------------------------------------------------------------------------- +-- build schematic, replace material, rotation +------------------------------------------------------------------------------- +function settlements.build_schematic(vm, data, va, pos, building, replace_wall, name) + -- get building node material for better integration to surrounding + local platform_material = mcl_vars.get_node(pos) + if not platform_material or (platform_material.name == "air" or platform_material.name == "ignore") then + return + end + platform_material = platform_material.name + -- pick random material + local material = wallmaterial[math.random(1,#wallmaterial)] + -- schematic conversion to lua + local schem_lua = minetest.serialize_schematic(building, + "lua", + {lua_use_comments = false, lua_num_indent_spaces = 0}).." return schematic" + -- replace material + if replace_wall == "y" then + schem_lua = schem_lua:gsub("mcl_core:cobble", material) + end + schem_lua = schem_lua:gsub("mcl_core:dirt_with_grass", + platform_material) + +-- Disable special junglewood for now. + -- special material for spawning npcs + -- schem_lua = schem_lua:gsub("mcl_core:junglewood", + -- "settlements:junglewood") +-- + + -- format schematic string + local schematic = loadstring(schem_lua)() + -- build foundation for the building an make room above + local width = schematic["size"]["x"] + local depth = schematic["size"]["z"] + local height = schematic["size"]["y"] + local possible_rotations = {"0", "90", "180", "270"} + local rotation = possible_rotations[ math.random( #possible_rotations ) ] + settlements.foundation( + pos, + width, + depth, + height, + rotation) + vm:set_data(data) + -- place schematic + + minetest.place_schematic_on_vmanip( + vm, + pos, + schematic, + rotation, + nil, + true) + vm:write_to_map(true) +end]] +------------------------------------------------------------------------------- +-- initialize settlement_info +------------------------------------------------------------------------------- +function settlements.initialize_settlement_info(pr) + local count_buildings = {} + + -- count_buildings table reset + for k,v in pairs(settlements.schematic_table) do + count_buildings[v["name"]] = 0 + end + + -- randomize number of buildings + local number_of_buildings = pr:next(10, 25) + local number_built = 1 + settlements.debug("Village ".. number_of_buildings) + + return count_buildings, number_of_buildings, number_built +end +------------------------------------------------------------------------------- +-- fill settlement_info +-------------------------------------------------------------------------------- +function settlements.create_site_plan(maxp, minp, pr) + local settlement_info = {} + local building_all_info + local possible_rotations = {"0", "90", "180", "270"} + -- find center of chunk + local center = { + x=math.floor((minp.x+maxp.x)/2), + y=maxp.y, + z=math.floor((minp.z+maxp.z)/2) + } + -- find center_surface of chunk + local center_surface , surface_material = settlements.find_surface(center, true) + local chunks = {} + chunks[mcl_vars.get_chunk_number(center)] = true + + -- go build settlement around center + if not center_surface then return false end + + -- initialize all settlement_info table + local count_buildings, number_of_buildings, number_built = settlements.initialize_settlement_info(pr) + -- first building is townhall in the center + building_all_info = settlements.schematic_table[1] + local rotation = possible_rotations[ pr:next(1, #possible_rotations ) ] + -- add to settlement info table + local index = 1 + settlement_info[index] = { + pos = center_surface, + name = building_all_info["name"], + hsize = building_all_info["hsize"], + rotat = rotation, + surface_mat = surface_material + } + --increase index for following buildings + index = index + 1 + -- now some buildings around in a circle, radius = size of town center + local x, z, r = center_surface.x, center_surface.z, building_all_info["hsize"] + -- draw j circles around center and increase radius by math.random(2,5) + for j = 1,20 do + -- set position on imaginary circle + for j = 0, 360, 15 do + local angle = j * math.pi / 180 + local ptx, ptz = x + r * math.cos( angle ), z + r * math.sin( angle ) + ptx = settlements.round(ptx, 0) + ptz = settlements.round(ptz, 0) + local pos1 = { x=ptx, y=center_surface.y+50, z=ptz} + local chunk_number = mcl_vars.get_chunk_number(pos1) + local pos_surface, surface_material + if chunks[chunk_number] then + pos_surface, surface_material = settlements.find_surface(pos1) + else + chunks[chunk_number] = true + pos_surface, surface_material = settlements.find_surface(pos1, true) + end + if not pos_surface then break end + + local randomized_schematic_table = shuffle(settlements.schematic_table, pr) + -- pick schematic + local size = #randomized_schematic_table + for i = size, 1, -1 do + -- already enough buildings of that type? + if count_buildings[randomized_schematic_table[i]["name"]] < randomized_schematic_table[i]["max_num"]*number_of_buildings then + building_all_info = randomized_schematic_table[i] + -- check distance to other buildings + local distance_to_other_buildings_ok = settlements.check_distance(settlement_info, pos_surface, building_all_info["hsize"]) + if distance_to_other_buildings_ok then + -- count built houses + count_buildings[building_all_info["name"]] = count_buildings[building_all_info["name"]] +1 + rotation = possible_rotations[ pr:next(1, #possible_rotations ) ] + number_built = number_built + 1 + settlement_info[index] = { + pos = pos_surface, + name = building_all_info["name"], + hsize = building_all_info["hsize"], + rotat = rotation, + surface_mat = surface_material + } + index = index + 1 + break + end + end + end + if number_of_buildings == number_built then + break + end + end + if number_built >= number_of_buildings then + break + end + r = r + pr:next(2,5) + end + settlements.debug("really ".. number_built) + return settlement_info +end +------------------------------------------------------------------------------- +-- evaluate settlement_info and place schematics +------------------------------------------------------------------------------- +-- Initialize node +local function construct_node(p1, p2, name) + local r = minetest.registered_nodes[name] + if r then + if r.on_construct then + local nodes = minetest.find_nodes_in_area(p1, p2, name) + for p=1, #nodes do + local pos = nodes[p] + r.on_construct(pos) + end + return nodes + end + minetest.log("warning", "[mcl_villages] No on_construct defined for node name " .. name) + return + end + minetest.log("warning", "[mcl_villages] Attempt to 'construct' inexistant nodes: " .. name) +end + +local function spawn_iron_golem(pos) + local p = minetest.find_node_near(pos,50,"mcl_core:grass_path") + if p then + local l=minetest.add_entity(p,"mobs_mc:iron_golem"):get_luaentity() + if l then + l._home = p + end + end +end + +local function spawn_villagers(minp,maxp) + local beds=minetest.find_nodes_in_area(vector.offset(minp,-20,-20,-20),vector.offset(maxp,20,20,20),{"mcl_beds:bed_red_bottom"}) + for _,bed in pairs(beds) do + local m = minetest.get_meta(bed) + if m:get_string("villager") == "" then + local v=minetest.add_entity(bed,"mobs_mc:villager") + if v then + local l=v:get_luaentity() + l._bed = bed + m:set_string("villager",l._id) + end + end + end +end + +local function init_nodes(p1, p2, size, rotation, pr) + construct_node(p1, p2, "mcl_itemframes:item_frame") + construct_node(p1, p2, "mcl_furnaces:furnace") + construct_node(p1, p2, "mcl_anvils:anvil") + + construct_node(p1, p2, "mcl_smoker:smoker") + construct_node(p1, p2, "mcl_barrels:barrel_closed") + construct_node(p1, p2, "mcl_blast_furnace:blast_furnace") + construct_node(p1, p2, "mcl_brewing:stand_000") + local nodes = construct_node(p1, p2, "mcl_chests:chest") + if nodes and #nodes > 0 then + for p=1, #nodes do + local pos = nodes[p] + settlements.fill_chest(pos, pr) + end + end +end + +function settlements.place_schematics(settlement_info, pr) + local building_all_info + + --attempt to place one belltower in the center of the village - this doesn't always work out great but it's a lot better than doing it first or last. + local belltower = table.remove(settlement_info,math.floor(#settlement_info/2)) + if belltower then + mcl_structures.place_schematic( + vector.offset(belltower["pos"],0,0,0), + settlements.modpath.."/schematics/belltower.mts", + belltower["rotation"], + nil, + true, + nil, + function(p1, p2, size, rotation, pr) + spawn_iron_golem(p1) + end, + pr + ) + end + + for i, built_house in ipairs(settlement_info) do + local is_last = i == #settlement_info + + for j, schem in ipairs(settlements.schematic_table) do + if settlement_info[i]["name"] == schem["name"] then + building_all_info = schem + break + end + end + + local pos = settlement_info[i]["pos"] + local rotation = settlement_info[i]["rotat"] + -- get building node material for better integration to surrounding + local platform_material = settlement_info[i]["surface_mat"] + --platform_material_name = minetest.get_name_from_content_id(platform_material) + -- pick random material + --local material = wallmaterial[pr:next(1,#wallmaterial)] + -- + local building = building_all_info["mts"] + local replace_wall = building_all_info["rplc"] + -- schematic conversion to lua + local schem_lua = minetest.serialize_schematic(building, + "lua", + {lua_use_comments = false, lua_num_indent_spaces = 0}).." return schematic" + schem_lua = schem_lua:gsub("mcl_core:stonebrickcarved", "mcl_villages:stonebrickcarved") + -- replace material + if replace_wall then + --Note, block substitution isn't matching node names exactly; so nodes that are to be substituted that have the same prefixes cause bugs. + -- Example: Attempting to swap out 'mcl_core:stonebrick'; which has multiple, additional sub-variants: (carved, cracked, mossy). Will currently cause issues, so leaving disabled. + if platform_material == "mcl_core:snow" or platform_material == "mcl_core:dirt_with_grass_snow" or platform_material == "mcl_core:podzol" then + schem_lua = schem_lua:gsub("mcl_core:tree", "mcl_core:sprucetree") + schem_lua = schem_lua:gsub("mcl_core:wood", "mcl_core:sprucewood") + --schem_lua = schem_lua:gsub("mcl_fences:fence", "mcl_fences:spruce_fence") + --schem_lua = schem_lua:gsub("mcl_stairs:slab_wood_top", "mcl_stairs:slab_sprucewood_top") + --schem_lua = schem_lua:gsub("mcl_stairs:stair_wood", "mcl_stairs:stair_sprucewood") + --schem_lua = schem_lua:gsub("mesecons_pressureplates:pressure_plate_wood_off", "mesecons_pressureplates:pressure_plate_sprucewood_off") + elseif platform_material == "mcl_core:sand" or platform_material == "mcl_core:redsand" then + schem_lua = schem_lua:gsub("mcl_core:tree", "mcl_core:sandstonecarved") + schem_lua = schem_lua:gsub("mcl_core:cobble", "mcl_core:sandstone") + schem_lua = schem_lua:gsub("mcl_core:wood", "mcl_core:sandstonesmooth") + --schem_lua = schem_lua:gsub("mcl_fences:fence", "mcl_fences:birch_fence") + --schem_lua = schem_lua:gsub("mcl_stairs:slab_wood_top", "mcl_stairs:slab_birchwood_top") + --schem_lua = schem_lua:gsub("mcl_stairs:stair_wood", "mcl_stairs:stair_birchwood") + --schem_lua = schem_lua:gsub("mesecons_pressureplates:pressure_plate_wood_off", "mesecons_pressureplates:pressure_plate_birchwood_off") + --schem_lua = schem_lua:gsub("mcl_stairs:stair_stonebrick", "mcl_stairs:stair_redsandstone") + --schem_lua = schem_lua:gsub("mcl_core:stonebrick", "mcl_core:redsandstonesmooth") + schem_lua = schem_lua:gsub("mcl_core:brick_block", "mcl_core:redsandstone") + end + end + schem_lua = schem_lua:gsub("mcl_core:dirt_with_grass", platform_material) + + --[[ Disable special junglewood for now. + -- special material for spawning npcs + schem_lua = schem_lua:gsub("mcl_core:junglewood", "settlements:junglewood") + --]] + + schem_lua = schem_lua:gsub("mcl_stairs:stair_wood_outer", "mcl_stairs:slab_wood") + schem_lua = schem_lua:gsub("mcl_stairs:stair_stone_rough_outer", "air") + + -- format schematic string + local schematic = loadstring(schem_lua)() + -- build foundation for the building an make room above + -- place schematic + mcl_structures.place_schematic( + pos, + schematic, + rotation, + nil, + true, + nil, + function(p1, p2, size, rotation, pr) + init_nodes(p1, p2, size, rotation, pr) + spawn_villagers(p1,p2) + end, + pr + ) + end +end diff --git a/mods/MAPGEN/mcl_villages/const.lua b/mods/MAPGEN/mcl_villages/const.lua new file mode 100644 index 000000000..65f43f344 --- /dev/null +++ b/mods/MAPGEN/mcl_villages/const.lua @@ -0,0 +1,76 @@ +-- switch for debugging +function settlements.debug(message) + -- minetest.chat_send_all(message) + -- minetest.log("warning", "[mcl_villages] "..message) + minetest.log("verbose", "[mcl_villages] "..message) +end + +--[[ Manually set in 'buildings.lua' +-- material to replace cobblestone with +local wallmaterial = { + "mcl_core:junglewood", + "mcl_core:sprucewood", + "mcl_core:wood", + "mcl_core:birchwood", + "mcl_core:acaciawood", + "mcl_core:stonebrick", + "mcl_core:cobble", + "mcl_core:sandstonecarved", + "mcl_core:sandstone", + "mcl_core:sandstonesmooth2" +} +--]] +settlements.surface_mat = {} +------------------------------------------------------------------------------- +-- Set array to list +-- https://stackoverflow.com/questions/656199/search-for-an-item-in-a-lua-list +------------------------------------------------------------------------------- +function settlements.grundstellungen() + settlements.surface_mat = settlements.Set { + "mcl_core:dirt_with_grass", + --"mcl_core:dry_dirt_with_grass", + "mcl_core:dirt_with_grass_snow", + --"mcl_core:dirt_with_dry_grass", + "mcl_core:podzol", + "mcl_core:sand", + "mcl_core:redsand", + --"mcl_core:silver_sand", + "mcl_core:snow" + } +end +-- +-- possible surfaces where buildings can be built +-- + +-- +-- path to schematics +-- +schem_path = settlements.modpath.."/schematics/" +-- +-- list of schematics +-- +local basic_pseudobiome_villages = minetest.settings:get_bool("basic_pseudobiome_villages", true) + +settlements.schematic_table = { + {name = "large_house", mts = schem_path.."large_house.mts", hwidth = 11, hdepth = 12, hheight = 9, hsize = 14, max_num = 0.08 , rplc = basic_pseudobiome_villages }, + {name = "blacksmith", mts = schem_path.."blacksmith.mts", hwidth = 7, hdepth = 7, hheight = 13, hsize = 13, max_num = 0.055, rplc = basic_pseudobiome_villages }, + {name = "butcher", mts = schem_path.."butcher.mts", hwidth = 11, hdepth = 8, hheight = 10, hsize = 14, max_num = 0.03 , rplc = basic_pseudobiome_villages }, + {name = "church", mts = schem_path.."church.mts", hwidth = 13, hdepth = 13, hheight = 14, hsize = 15, max_num = 0.04 , rplc = basic_pseudobiome_villages }, + {name = "farm", mts = schem_path.."farm.mts", hwidth = 7, hdepth = 7, hheight = 13, hsize = 13, max_num = 0.1 , rplc = basic_pseudobiome_villages }, + {name = "lamp", mts = schem_path.."lamp.mts", hwidth = 3, hdepth = 3, hheight = 13, hsize = 10, max_num = 0.1 , rplc = false }, + {name = "library", mts = schem_path.."library.mts", hwidth = 12, hdepth = 12, hheight = 8, hsize = 13, max_num = 0.04 , rplc = basic_pseudobiome_villages }, + {name = "medium_house", mts = schem_path.."medium_house.mts", hwidth = 8, hdepth = 12, hheight = 8, hsize = 14, max_num = 0.08 , rplc = basic_pseudobiome_villages }, + {name = "small_house", mts = schem_path.."small_house.mts", hwidth = 9, hdepth = 7, hheight = 8, hsize = 13, max_num = 0.7 , rplc = basic_pseudobiome_villages }, + {name = "tavern", mts = schem_path.."tavern.mts", hwidth = 11, hdepth = 10, hheight = 10, hsize = 13, max_num = 0.050, rplc = basic_pseudobiome_villages }, + {name = "well", mts = schem_path.."well.mts", hwidth = 6, hdepth = 8, hheight = 6, hsize = 10, max_num = 0.045, rplc = basic_pseudobiome_villages }, +} + +-- +-- maximum allowed difference in height for building a sttlement +-- +max_height_difference = 56 +-- +-- +-- +half_map_chunk_size = 40 +--quarter_map_chunk_size = 20 diff --git a/mods/MAPGEN/mcl_villages/init.lua b/mods/MAPGEN/mcl_villages/init.lua index 37052a9b6..6302e063e 100644 --- a/mods/MAPGEN/mcl_villages/init.lua +++ b/mods/MAPGEN/mcl_villages/init.lua @@ -1,3 +1,4 @@ +<<<<<<< HEAD mcl_villages = {} local chance_per_chunk = 100 local chunk_offset_top = 16 @@ -226,6 +227,21 @@ local function create_site_plan(minp, maxp, pr) end return plan end +======= +settlements = {} +settlements.modpath = minetest.get_modpath(minetest.get_current_modname()) + +dofile(settlements.modpath.."/const.lua") +dofile(settlements.modpath.."/utils.lua") +dofile(settlements.modpath.."/foundation.lua") +dofile(settlements.modpath.."/buildings.lua") +dofile(settlements.modpath.."/paths.lua") +--dofile(settlements.modpath.."/convert_lua_mts.lua") +-- +-- load settlements on server +-- +settlements.grundstellungen() +>>>>>>> mcl2/master local function ground(pos1, pos2, minp, maxp, pr, mat) local pos1, pos2 = pos1, pos2 @@ -366,6 +382,7 @@ local function place_schematics(plan, pr) end end +local villagegen={} -- -- register block for npc spawn -- @@ -376,7 +393,6 @@ minetest.register_node("mcl_villages:stonebrickcarved", { description = S("Chiseled Stone Village Bricks"), _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"mcl_core_stonebrick_carved.png"}, - stack_max = 64, drop = "mcl_core:stonebrickcarved", groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), @@ -386,6 +402,7 @@ minetest.register_node("mcl_villages:stonebrickcarved", { on_construct = spawn_villager, }) +<<<<<<< HEAD minetest.register_abm({ label = "Spawn villagers", nodenames = {"mcl_villages:stonebrickcarved"}, @@ -413,6 +430,28 @@ minetest.register_abm({ +======= +minetest.register_node("mcl_villages:structblock", {drawtype="airlike",groups = {not_in_creative_inventory=1},}) + + + +--[[ Enable for testing, but use MineClone2's own spawn code if/when merging. +-- +-- register inhabitants +-- +if minetest.get_modpath("mobs_mc") then + mcl_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 +--]] + +>>>>>>> mcl2/master -- -- on map generation, try to build a settlement -- @@ -436,6 +475,7 @@ local function build_a_village(minp, maxp, pr, placer) end -- Disable natural generation in singlenode. +<<<<<<< HEAD if not mcl_mapgen.singlenode then local scan_last_node = mcl_mapgen.LAST_BLOCK * mcl_mapgen.BS - 1 local scan_offset = mcl_mapgen.BS @@ -466,11 +506,29 @@ if not mcl_mapgen.singlenode then max = math_max(y, max) end local height_difference = max - min +======= +local mg_name = minetest.get_mapgen_setting("mg_name") +if mg_name ~= "singlenode" then + mcl_mapgen_core.register_generator("villages", nil, function(minp, maxp, blockseed) + -- don't build settlement underground + if maxp.y < 0 then return end + -- randomly try to build settlements + if blockseed % 77 ~= 17 then return end + -- needed for manual and automated settlement building + -- don't build settlements on (too) uneven terrain + local n=minetest.get_node_or_nil(minp) + if n and n.name == "mcl_villages:structblock" then return end + if villagegen[minetest.pos_to_string(minp)] ~= nil then return end + minetest.set_node(minp,{name="mcl_villages:structblock"}) + + local height_difference = settlements.evaluate_heightmap() +>>>>>>> mcl2/master if height_difference > max_height_difference then return end build_a_village(minp, maxp, chunkkseed) end, mcl_mapgen.order.VILLAGES) end +<<<<<<< HEAD for k, v in pairs(schematic_table) do local schem_lua = minetest.serialize_schematic( v.mts, @@ -505,6 +563,36 @@ for k, v in pairs(schematic_table) do terraform(plan, minp, maxp, pr) end place_schematics(plan, pr) +======= + villagegen[minetest.pos_to_string(minp)]={minp=vector.new(minp), maxp=vector.new(maxp), blockseed=blockseed} + end) +end + +minetest.register_lbm({ + name = "mcl_villages:structblock", + run_at_every_load = true, + nodenames = {"mcl_villages:structblock"}, + action = function(pos, node) + minetest.set_node(pos, {name = "air"}) + if not villagegen[minetest.pos_to_string(pos)] then return end + local minp=villagegen[minetest.pos_to_string(pos)].minp + local maxp=villagegen[minetest.pos_to_string(pos)].maxp + minetest.emerge_area(minp, maxp, ecb_village, villagegen[minetest.pos_to_string(minp)]) + villagegen[minetest.pos_to_string(minp)]=nil + end +}) +-- manually place villages +if minetest.is_creative_enabled("") then + minetest.register_craftitem("mcl_villages:tool", { + description = "mcl_villages build tool", + inventory_image = "default_tool_woodshovel.png", + -- build ssettlement + on_place = function(itemstack, placer, pointed_thing) + if not pointed_thing.under then return end + local minp = vector.subtract( pointed_thing.under, half_map_chunk_size) + local maxp = vector.add( pointed_thing.under, half_map_chunk_size) + build_a_settlement(minp, maxp, math.random(0,32767)) +>>>>>>> mcl2/master end }) end diff --git a/mods/MAPGEN/mcl_villages/schematics/belltower.mts b/mods/MAPGEN/mcl_villages/schematics/belltower.mts new file mode 100644 index 0000000000000000000000000000000000000000..8eb524312cc98c62899ef6d7714398c5ef869d4e GIT binary patch literal 211 zcmeYb3HD`RVPIuoV_>ZZ0|s^m;oRh$_~iVeRIB2W{JhkpqRixM2Ij=fA_g&#OnG8X zPBD^Hya9sAc0LZz9heZfe$2;lnOEjL^240_&JGrC8 max_y then + max_y = heightmap[i] + end + end + -- set next line + square_start = square_start + 80 + square_end = square_end + 80 + end + -- return the difference between highest and lowest pos in chunk + local height_diff = max_y - min_y + -- filter buggy heightmaps + if height_diff <= 1 then + return max_height_difference + 1 + end + -- debug info + settlements.debug("heightdiff ".. height_diff) + return height_diff +end +------------------------------------------------------------------------------- +-- Set array to list +-- https://stackoverflow.com/questions/656199/search-for-an-item-in-a-lua-list +------------------------------------------------------------------------------- +function settlements.Set (list) + local set = {} + for _, l in ipairs(list) do set[l] = true end + return set +end diff --git a/mods/MAPGEN/tsm_railcorridors/init.lua b/mods/MAPGEN/tsm_railcorridors/init.lua index 654a05672..594b0d2ba 100644 --- a/mods/MAPGEN/tsm_railcorridors/init.lua +++ b/mods/MAPGEN/tsm_railcorridors/init.lua @@ -153,16 +153,16 @@ local function SetNodeIfCanBuild(pos, node, check_above, can_replace_rail) local abovename = minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z}).name local abovedef = minetest.registered_nodes[abovename] if abovename == "unknown" or abovename == "ignore" or - (abovedef.groups and abovedef.groups.attached_node) or + (abovedef and abovedef.groups and abovedef.groups.attached_node) or -- This is done because cobwebs are often fake liquids - (abovedef.liquidtype ~= "none" and abovename ~= tsm_railcorridors.nodes.cobweb) then + (abovedef and abovedef.liquidtype ~= "none" and abovename ~= tsm_railcorridors.nodes.cobweb) then return false end end local name = minetest.get_node(pos).name local def = minetest.registered_nodes[name] if name ~= "unknown" and name ~= "ignore" and - ((def.is_ground_content and def.liquidtype == "none") or + ((def and def.is_ground_content and def.liquidtype == "none") or name == tsm_railcorridors.nodes.cobweb or name == tsm_railcorridors.nodes.torch_wall or name == tsm_railcorridors.nodes.torch_floor or @@ -191,7 +191,7 @@ end local function IsGround(pos) local nodename = minetest.get_node(pos).name local nodedef = minetest.registered_nodes[nodename] - return nodename ~= "unknown" and nodename ~= "ignore" and nodedef.is_ground_content and nodedef.walkable and nodedef.liquidtype == "none" + return nodename ~= "unknown" and nodename ~= "ignore" and nodedef and nodedef.is_ground_content and nodedef.walkable and nodedef.liquidtype == "none" end -- Returns true if rails are allowed to be placed on top of this node @@ -199,7 +199,7 @@ local function IsRailSurface(pos) local nodename = minetest.get_node(pos).name local nodename_above = minetest.get_node({x=pos.x,y=pos.y+2,z=pos.z}).name local nodedef = minetest.registered_nodes[nodename] - return nodename ~= "unknown" and nodename ~= "ignore" and nodedef.walkable and (nodedef.node_box == nil or nodedef.node_box.type == "regular") and nodename_above ~= tsm_railcorridors.nodes.rail + return nodename ~= "unknown" and nodename ~= "ignore" and nodedef and nodedef.walkable and (nodedef.node_box == nil or nodedef.node_box.type == "regular") and nodename_above ~= tsm_railcorridors.nodes.rail end -- Checks if the node is empty space which requires to be filled by a platform @@ -210,7 +210,7 @@ local function NeedsPlatform(pos) local falling = minetest.get_item_group(node.name, "falling_node") == 1 return -- Node can be replaced if ground content or rail - (node.name ~= "ignore" and node.name ~= "unknown" and nodedef.is_ground_content) and + (node.name ~= "ignore" and node.name ~= "unknown" and nodedef and nodedef.is_ground_content) and -- Node needs platform if node below is not walkable. -- Unless 2 nodes below there is dirt: This is a special case for the starter cube. ((nodedef.walkable == false and node2.name ~= tsm_railcorridors.nodes.dirt) or @@ -252,7 +252,7 @@ local function Cube(p, radius, node, replace_air_only, wood, post) if yi == y_top then local topnode = minetest.get_node({x=xi,y=yi+1,z=zi}) local topdef = minetest.registered_nodes[topnode.name] - if minetest.get_item_group(topnode.name, "attached_node") ~= 1 and topdef.liquidtype == "none" then + if minetest.get_item_group(topnode.name, "attached_node") ~= 1 and topdef and topdef.liquidtype == "none" then ok = true end elseif column_last_attached and yi == column_last_attached - 1 then @@ -276,7 +276,7 @@ local function Cube(p, radius, node, replace_air_only, wood, post) elseif wood and (xi == p.x or zi == p.z) and thisnode.name == wood then local topnode = minetest.get_node({x=xi,y=yi+1,z=zi}) local topdef = minetest.registered_nodes[topnode.name] - if topdef.walkable and topnode.name ~= wood then + if topdef and topdef.walkable and topnode.name ~= wood then minetest.set_node({x=xi,y=yi,z=zi}, node) -- Check for torches around the wood and schedule them -- for removal @@ -428,7 +428,7 @@ local function TryPlaceCobweb(pos, needs_check, side_vector) local cpos = vector.add(pos, check_vectors[c]) local cname = minetest.get_node(cpos).name local cdef = minetest.registered_nodes[cname] - if cname ~= "ignore" and cdef.walkable then + if cname ~= "ignore" and cdef and cdef.walkable then check_passed = true break end @@ -522,12 +522,12 @@ local function WoodSupport(p, wood, post, torches, dir, torchdir) local nodedef1 = minetest.registered_nodes[minetest.get_node(pos1).name] local nodedef2 = minetest.registered_nodes[minetest.get_node(pos2).name] - if nodedef1.walkable then + if nodedef1 and nodedef1.walkable then pos1.y = pos1.y + 1 end SetNodeIfCanBuild(pos1, node, true) - if nodedef2.walkable then + if nodedef2 and nodedef2.walkable then pos2.y = pos2.y + 1 end SetNodeIfCanBuild(pos2, node, true) diff --git a/mods/MISC/findbiome/locale/findbiome.zh_TW.tr b/mods/MISC/findbiome/locale/findbiome.zh_TW.tr new file mode 100644 index 000000000..d84abda86 --- /dev/null +++ b/mods/MISC/findbiome/locale/findbiome.zh_TW.tr @@ -0,0 +1,10 @@ +# textdomain: findbiome +Find and teleport to biome=找尋和傳送至生態域 +=<生態域> +No player.=沒有玩家。 +Biome does not exist!=生態域不存在! +Biome found at @1.=生態域在 @1 找到。 +No biome found!=生態域找不到! +List all biomes=列出所有生態域 +No biomes.=沒有生態域。 +Not supported. The “biomeinfo” mod is required for v6 mapgen support!=不支援。「biomeinfo」MOD要求v6世界生成器! diff --git a/mods/MISC/mcl_commands/kill.lua b/mods/MISC/mcl_commands/kill.lua index becd42917..5478e6bf6 100644 --- a/mods/MISC/mcl_commands/kill.lua +++ b/mods/MISC/mcl_commands/kill.lua @@ -14,12 +14,6 @@ local function handle_kill_command(suspect, victim) return false, S("@1 is already dead", victim) end end - -- 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 - victimref:set_wielded_item("") - end -- DIE! victimref:set_hp(0, {_mcl_type = "out_of_world"}) -- Log diff --git a/mods/MISC/mcl_commands/locale/mcl_commands.ru.tr b/mods/MISC/mcl_commands/locale/mcl_commands.ru.tr index 3c18f554c..f69aa3bee 100644 --- a/mods/MISC/mcl_commands/locale/mcl_commands.ru.tr +++ b/mods/MISC/mcl_commands/locale/mcl_commands.ru.tr @@ -9,12 +9,21 @@ You are already dead=Вы уже мертвы Kill player or yourself=Убить игрока или себя Can use /say=Можно использовать /say =<сообщение> +<<<<<<< HEAD Send a message to every player=Отправить сообщение всем игрокам Invalid usage, see /help @1.=Недопустимое использование, см. /help @1. ,, =,, <НаименованиеБлока> Set node at given position=Устанавливает блок в заданной позиции Invalid node=Неправильный блок @1 spawned.=@1 возродился. +======= +Send a message to every player=Отправляет сообщение всем игрокам +Invalid usage, see /help say.=Недопустимое использование, см. /help say. +,, =,, <ИмяБлока> +Set node at given position=Устанавливает блок в заданной позиции +Invalid node=Неправильный блок +@1 spawned.=@1 возродился(ась). +>>>>>>> mcl2/master Invalid parameters (see /help setblock)=Недопустимые параметры (см. /help setblock) List bans=Список банов Ban list: @1=Бан-лист: @1 diff --git a/mods/MISC/mcl_commands/locale/mcl_commands.zh_TW.tr b/mods/MISC/mcl_commands/locale/mcl_commands.zh_TW.tr new file mode 100644 index 000000000..0f3885cfe --- /dev/null +++ b/mods/MISC/mcl_commands/locale/mcl_commands.zh_TW.tr @@ -0,0 +1,23 @@ +# textdomain: mcl_commands +Players can't be killed right now, damage has been disabled.=玩家現在不能被殺死,傷害已被禁用。 +Player @1 does not exist.=玩家 @1 不存在。 +You are already dead=你已經死了 +@1 is already dead=@1 已經死了。 +@1 committed suicide.=@1 自殺了。 +@1 was killed by @2.=@1 被 @2 殺死了。 +[]=[<名字>] +Kill player or yourself=殺死玩家或自己 +Can use /say=可以使用 /say +=<信息> +Send a message to every player=廣播信息給每個玩家 +Invalid usage, see /help say.=無效用法,見 /help say +,, =,, <方塊名稱> +Set node at given position=在指定位置放置指定方塊 +Invalid node=無效方塊 +@1 spawned.=@1 已生成。 +Invalid parameters (see /help setblock)=無效參數(見 /help setblock) +List bans=查看封鎖列表 +Ban list: @1=封鎖列表:@1 +Show who is logged on=列出在線玩家 +Displays the world seed=顯示種子碼 +Only peaceful mobs allowed!=只允許和平生物! diff --git a/mods/MISC/mcl_commands/mod.conf b/mods/MISC/mcl_commands/mod.conf index 00d707098..dba130564 100644 --- a/mods/MISC/mcl_commands/mod.conf +++ b/mods/MISC/mcl_commands/mod.conf @@ -1,3 +1,4 @@ name = mcl_commands author = Wuzzy description = MCL2 commands +depends = mcl_colors diff --git a/mods/MISC/mcl_commands/seed.lua b/mods/MISC/mcl_commands/seed.lua index 6a99d53cb..2ebb04474 100644 --- a/mods/MISC/mcl_commands/seed.lua +++ b/mods/MISC/mcl_commands/seed.lua @@ -5,6 +5,6 @@ minetest.register_chatcommand("seed", { params = "", privs = {}, func = function(name) - minetest.chat_send_player(name, "Seed: "..minetest.get_mapgen_setting("seed")) + minetest.chat_send_player(name, "Seed: ["..minetest.colorize(mcl_colors.GREEN, ""..minetest.get_mapgen_setting("seed")).."]") end }) \ No newline at end of file diff --git a/mods/MISC/mcl_commands/summon.lua b/mods/MISC/mcl_commands/summon.lua index 2a2792f5f..dec765229 100644 --- a/mods/MISC/mcl_commands/summon.lua +++ b/mods/MISC/mcl_commands/summon.lua @@ -3,9 +3,18 @@ local S = minetest.get_translator(minetest.get_current_modname()) local orig_func = minetest.registered_chatcommands["spawnentity"].func local cmd = table.copy(minetest.registered_chatcommands["spawnentity"]) cmd.func = function(name, param) +<<<<<<< HEAD local params = param:split(" ") if not params[1] or params[3] then return false, S("Usage: /spawnentity [,,]") +======= + local ent = minetest.registered_entities[param] + 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) + return bool, msg +>>>>>>> mcl2/master end local entity_name = params[1] local pos = params[2] diff --git a/mods/MISC/mcl_privs/init.lua b/mods/MISC/mcl_privs/init.lua index bbf75f37b..d3e2f24f4 100644 --- a/mods/MISC/mcl_privs/init.lua +++ b/mods/MISC/mcl_privs/init.lua @@ -7,7 +7,7 @@ minetest.register_privilege("maphack", { minetest.register_on_joinplayer(function(player) local name = player:get_player_name() local meta = player:get_meta() - if meta:get_int("fly_changed") == 1 then return end + if meta:get_int("mcl_privs:fly_changed") == 1 then return end local fly = nil if minetest.is_creative_enabled(name) then @@ -21,6 +21,7 @@ end) for _, action in pairs({"grant", "revoke"}) do minetest["register_on_priv_" .. action](function(name, _, priv) local player = minetest.get_player_by_name(name) +<<<<<<< HEAD if player then local meta = player:get_meta() @@ -39,6 +40,27 @@ for _, action in pairs({"grant", "revoke"}) do else meta:set_int("ineract_revoked", 0) end +======= + if not player then + return + end + + local meta = player:get_meta() + + if priv == "fly" then + meta:set_int("mcl_privs:fly_changed", 1) + end + + --[[ + so e.g. hackers who have been revoked of the interact privilege + will not automatically get the interact privilege through the mcl shields code back + ]] + if priv == "interact" then + if action == "revoke" then + meta:set_int("mcl_privs:interact_revoked", 1) + else + meta:set_int("mcl_privs:interact_revoked", 0) +>>>>>>> mcl2/master end end end) diff --git a/mods/MISC/mcl_privs/locale/mcl_privs.zh_TW.tr b/mods/MISC/mcl_privs/locale/mcl_privs.zh_TW.tr new file mode 100644 index 000000000..d4e3f96f6 --- /dev/null +++ b/mods/MISC/mcl_privs/locale/mcl_privs.zh_TW.tr @@ -0,0 +1,2 @@ +# textdomain: mcl_privs +Can place and use advanced blocks like mob spawners, command blocks and barriers.=可以放置和使用高級方塊,如生怪磚、命令方塊和屏障 diff --git a/mods/MISC/mcl_wip/locale/mcl_wip.zh_TW.tr b/mods/MISC/mcl_wip/locale/mcl_wip.zh_TW.tr new file mode 100644 index 000000000..e4b36ff07 --- /dev/null +++ b/mods/MISC/mcl_wip/locale/mcl_wip.zh_TW.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_wip +# WIP means “Work in Progress” +(WIP)=(WIP) +(Temporary)=(暫時) diff --git a/mods/PLAYER/mcl_hunger/api.lua b/mods/PLAYER/mcl_hunger/api.lua index 20937023a..3c9cd97e9 100644 --- a/mods/PLAYER/mcl_hunger/api.lua +++ b/mods/PLAYER/mcl_hunger/api.lua @@ -67,7 +67,7 @@ if mcl_hunger.active then local satuchanged = false local s = mcl_hunger.get_saturation(player) if s > 0 then - mcl_hunger.set_saturation(player, math.max(s - 1.0, 0)) + mcl_hunger.set_saturation(player, math.max(s - 1.5, 0)) satuchanged = true elseif s <= 0.0001 then h = mcl_hunger.get_hunger(player) diff --git a/mods/PLAYER/mcl_hunger/init.lua b/mods/PLAYER/mcl_hunger/init.lua index 21c1e0860..0cae89a7d 100644 --- a/mods/PLAYER/mcl_hunger/init.lua +++ b/mods/PLAYER/mcl_hunger/init.lua @@ -28,6 +28,7 @@ mcl_hunger.EXHAUST_SWIM = 10 -- player movement in water mcl_hunger.EXHAUST_SPRINT = 100 -- sprint (per node) mcl_hunger.EXHAUST_DAMAGE = 100 -- taking damage (protected by armor) mcl_hunger.EXHAUST_REGEN = 6000 -- Regenerate 1 HP +mcl_hunger.EXHAUST_HUNGER = 5 -- Hunger status effect at base level. mcl_hunger.EXHAUST_LVL = 4000 -- at what exhaustion player saturation gets lowered mcl_hunger.SATURATION_INIT = 5 -- Initial saturation for new/respawning players @@ -147,7 +148,13 @@ minetest.register_globalstep(function(dtime) if food_tick_timer > 4.0 then food_tick_timer = 0 - if food_level >= 18 then -- slow regenration + -- let hunger work always + if player_health > 0 and player_health <= 20 then + --mcl_hunger.exhaust(player_name, mcl_hunger.EXHAUST_HUNGER) -- later for hunger status effect + mcl_hunger.update_exhaustion_hud(player, mcl_hunger.get_exhaustion(player)) + end + + if food_level >= 18 then -- slow regeneration if player_health > 0 and player_health < 20 then player:set_hp(player_health+1) mcl_hunger.exhaust(player_name, mcl_hunger.EXHAUST_REGEN) @@ -164,7 +171,7 @@ minetest.register_globalstep(function(dtime) end end - elseif food_tick_timer > 0.5 and food_level == 20 and food_saturation_level >= 6 then -- fast regeneration + elseif food_tick_timer > 0.5 and food_level == 20 and food_saturation_level > 0 then -- fast regeneration if player_health > 0 and player_health < 20 then food_tick_timer = 0 player:set_hp(player_health+1) diff --git a/mods/PLAYER/mcl_hunger/locale/mcl_hunger.zh_TW.tr b/mods/PLAYER/mcl_hunger/locale/mcl_hunger.zh_TW.tr new file mode 100644 index 000000000..18d265ef4 --- /dev/null +++ b/mods/PLAYER/mcl_hunger/locale/mcl_hunger.zh_TW.tr @@ -0,0 +1,8 @@ +# textdomain: mcl_hunger +@1 succumbed to the poison.= +Food=食物 +Saturation=飽食度 +%s: %.1f/%d= +Exhaust.=飢餓值 +%s: %d/%d= +@1 starved to death.=@1 餓死了。 diff --git a/mods/PLAYER/mcl_player/init.lua b/mods/PLAYER/mcl_player/init.lua index f3e5ad0c3..33ab381f1 100644 --- a/mods/PLAYER/mcl_player/init.lua +++ b/mods/PLAYER/mcl_player/init.lua @@ -95,20 +95,15 @@ local function set_texture(player, index, texture) player:set_properties({textures = textures}) end -local function set_preview(player, field, preview) - player:get_meta():set_string("mcl_player:" .. field .. "_preview", preview) -end - -function mcl_player.player_set_skin(player, texture, preview) +function mcl_player.player_set_skin(player, texture) set_texture(player, 1, texture) - set_preview(player, "skin", preview) end -function mcl_player.player_set_armor(player, texture, preview) +function mcl_player.player_set_armor(player, texture) set_texture(player, 2, texture) - set_preview(player, "armor", preview) end +<<<<<<< HEAD function mcl_player.player_get_preview(player) local preview = player:get_meta():get_string("mcl_player:skin_preview") if preview == "" then @@ -120,6 +115,10 @@ function mcl_player.player_get_preview(player) end return preview +======= +function mcl_player.player_set_wielditem(player, texture) + set_texture(player, 3, texture) +>>>>>>> mcl2/master end function mcl_player.get_player_formspec_model(player, x, y, w, h, fsname) @@ -190,7 +189,10 @@ minetest.register_globalstep(function(dtime) if mcl_shields.is_blocking(player) then animation_speed_mod = animation_speed_mod / 2 end +<<<<<<< HEAD +======= +>>>>>>> mcl2/master -- ask if player is swiming local head_in_water = minetest.get_item_group(mcl_playerinfo[name].node_head, "water") ~= 0 diff --git a/mods/PLAYER/mcl_player/mod.conf b/mods/PLAYER/mcl_player/mod.conf index 97ccce8e6..7cc5d14fa 100644 --- a/mods/PLAYER/mcl_player/mod.conf +++ b/mods/PLAYER/mcl_player/mod.conf @@ -1,3 +1,4 @@ name = mcl_player author = celeron55 description = Adds the 3D player model, taken from Minetest Game 0.4.16. +depends = mcl_shields \ No newline at end of file diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 7d282d9ca..671bd5469 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -36,9 +36,15 @@ local function player_collision(player) local width = .75 for _,object in pairs(minetest.get_objects_inside_radius(pos, width)) do +<<<<<<< HEAD local luaentity = object:get_luaentity() if object and ((mcl_util and mcl_util.is_player(object)) or (luaentity and luaentity._cmi_is_mob == true and object ~= player)) then +======= + + local ent = object:get_luaentity() + if (object:is_player() or (ent and ent.is_mob and object ~= player)) then +>>>>>>> mcl2/master local pos2 = object:get_pos() local vec = {x = pos.x - pos2.x, z = pos.z - pos2.z} @@ -122,6 +128,12 @@ end local node_stand, node_stand_below, node_head, node_feet +<<<<<<< HEAD +======= +-- This following part is 2 wrapper functions for player:set_bones +-- and player:set_properties preventing them from being resent on +-- every globalstep when they have not changed. +>>>>>>> mcl2/master local function roundN(n, d) if type(n) ~= "number" then return n end @@ -158,6 +170,7 @@ local function props_changed(props,oldprops) return changed,p end +<<<<<<< HEAD --test if assert works assert(true) assert(not false) @@ -172,17 +185,27 @@ assert(test_equal1==test_equal2) assert(test_equal1~=test_equal3) --testdata for roundN +======= +--tests for roundN +>>>>>>> mcl2/master local test_round1=15 local test_round2=15.00199999999 local test_round3=15.00111111 local test_round4=15.00999999 +<<<<<<< HEAD assert(roundN(test_round1,2)==roundN(test_round1,2)) --test again if basic equality works because wth not +======= +assert(roundN(test_round1,2)==roundN(test_round1,2)) +>>>>>>> mcl2/master assert(roundN(test_round1,2)==roundN(test_round2,2)) assert(roundN(test_round1,2)==roundN(test_round3,2)) assert(roundN(test_round1,2)~=roundN(test_round4,2)) +<<<<<<< HEAD +======= +>>>>>>> mcl2/master -- tests for close_enough local test_cb = {-0.35,0,-0.35,0.35,0.8,0.35} --collisionboxes local test_cb_close = {-0.351213,0,-0.35,0.35,0.8,0.351212} @@ -197,6 +220,7 @@ local test_nt_diff = { r = 225, b = 225, a = 0, g = 225 } assert(close_enough(test_cb,test_cb_close)) assert(not close_enough(test_cb,test_cb_diff)) +<<<<<<< HEAD assert(close_enough(test_eh,test_eh_close)) assert(not close_enough(test_eh,test_eh_diff)) @@ -209,12 +233,27 @@ local test_properties_set2={collisionbox = {-0.35,0,-0.35,0.35,0.8,0.35}, eye_he local test_p1,p=props_changed(test_properties_set1,test_properties_set1) local test_p2,p=props_changed(test_properties_set1,test_properties_set2) +======= +assert(close_enough(test_eh,test_eh_close)) +assert(not close_enough(test_eh,test_eh_diff)) +assert(not close_enough(test_nt,test_nt_diff)) --no floats involved here + +--tests for properties_changed +local test_properties_set1={collisionbox = {-0.35,0,-0.35,0.35,0.8,0.35}, eye_height = 0.65, nametag_color = { r = 225, b = 225, a = 225, g = 225 }} +local test_properties_set2={collisionbox = {-0.35,0,-0.35,0.35,0.8,0.35}, eye_height = 1.35, nametag_color = { r = 225, b = 225, a = 225, g = 225 }} + +local test_p1,_=props_changed(test_properties_set1,test_properties_set1) +local test_p2,_=props_changed(test_properties_set1,test_properties_set2) +>>>>>>> mcl2/master assert(not test_p1) assert(test_p2) +<<<<<<< HEAD -- we still don't really know if lua is lying to us! but at least everything *seems* to be ok +======= +>>>>>>> mcl2/master local function set_properties_conditional(player,props) local changed,p=props_changed(props,player:get_properties()) if changed then @@ -229,6 +268,12 @@ local function set_bone_position_conditional(player,b,p,r) --bone,position,rotat end player:set_bone_position(b,p,r) end +<<<<<<< HEAD +======= + + + +>>>>>>> mcl2/master minetest.register_globalstep(function(dtime) time = time + dtime @@ -257,8 +302,7 @@ minetest.register_globalstep(function(dtime) --[[ if player_velocity.x + player_velocity.y < .5 and c_x + c_y > 0 then - local add_velocity = player.add_player_velocity or player.add_velocity - add_velocity(player, {x = c_x, y = 0, z = c_y}) + player:add_velocity({x = c_x, y = 0, z = c_y}) player_velocity = player:get_velocity() or player:get_player_velocity() end ]]-- @@ -311,8 +355,7 @@ minetest.register_globalstep(function(dtime) if elytra.rocketing > 0 then elytra.rocketing = elytra.rocketing - dtime if vector.length(player_velocity) < 40 then - local add_velocity = player.add_velocity or player.add_player_velocity - add_velocity(player, vector.multiply(player:get_look_dir(), 4)) + player:add_velocity(vector.multiply(player:get_look_dir(), 4)) add_particle({ pos = fly_pos, velocity = {x = 0, y = 0, z = 0}, @@ -332,6 +375,7 @@ minetest.register_globalstep(function(dtime) end if wielded_def and wielded_def._mcl_toollike_wield then +<<<<<<< HEAD set_bone_position_conditional(player,"Wield_Item", vector.new(0,4.7,3.1), vector.new(-90,225,90)) elseif string.find(wielded:get_name(), "mcl_bows:bow") then set_bone_position_conditional(player,"Wield_Item", vector.new(1,4,0), vector.new(90,130,115)) @@ -345,6 +389,22 @@ minetest.register_globalstep(function(dtime) set_bone_position_conditional(player,"Wield_Item", vector.new(0,5.3,2), vector.new(90,0,0)) end +======= + set_bone_position_conditional(player,"Wield_Item", vector.new(0,3.9,1.3), vector.new(90,0,0)) + elseif string.find(wielded:get_name(), "mcl_bows:bow") then + set_bone_position_conditional(player,"Wield_Item", vector.new(.5,4.5,-1.6), vector.new(90,0,20)) + elseif string.find(wielded:get_name(), "mcl_bows:crossbow_loaded") then + set_bone_position_conditional(player,"Wield_Item", vector.new(-1.5,5.7,1.8), vector.new(64,90,0)) + elseif string.find(wielded:get_name(), "mcl_bows:crossbow") then + set_bone_position_conditional(player,"Wield_Item", vector.new(-1.5,5.7,1.8), vector.new(90,90,0)) + else + set_bone_position_conditional(player,"Wield_Item", vector.new(-1.5,4.9,1.8), vector.new(135,0,90)) + end + + player_velocity_old = player:get_velocity() or player:get_player_velocity() + + +>>>>>>> mcl2/master -- controls right and left arms pitch when shooting a bow or blocking if mcl_shields.is_blocking(player) == 2 then set_bone_position_conditional(player, "Arm_Right_Pitch_Control", vector.new(-3, 5.785, 0), vector.new(20, -20, 0)) diff --git a/mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.zh_TW.tr b/mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.zh_TW.tr new file mode 100644 index 000000000..eb9e6b1db --- /dev/null +++ b/mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.zh_TW.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_playerplus +@1 suffocated to death.=@1 在牆壁裡窒息。 +@1 was prickled to death by a cactus.=@1 被仙人掌刺死了。 diff --git a/mods/PLAYER/mcl_playerplus/mod.conf b/mods/PLAYER/mcl_playerplus/mod.conf index 374178625..0a0ccfd9b 100644 --- a/mods/PLAYER/mcl_playerplus/mod.conf +++ b/mods/PLAYER/mcl_playerplus/mod.conf @@ -1,5 +1,9 @@ name = mcl_playerplus author = TenPlus1 description = Adds some simple player-related gameplay effects: Hurt by touching a cactus, suffocation and more. +<<<<<<< HEAD depends = mcl_init, mcl_core, mcl_particles, mcl_hunger, playerphysics, mcl_playerinfo, mcl_weather, mcl_spawn, mcl_enchanting, mcl_damage, mcl_sprint, mcl_shields +======= +depends = mcl_init, mcl_core, mcl_particles, mcl_hunger, playerphysics, mcl_playerinfo, mcl_weather, mcl_spawn, mcl_enchanting, mcl_damage, mcl_sprint, mcl_util, mcl_shields +>>>>>>> mcl2/master diff --git a/mods/PLAYER/mcl_skins/.gitignore b/mods/PLAYER/mcl_skins/.gitignore new file mode 100644 index 000000000..6edbd2834 --- /dev/null +++ b/mods/PLAYER/mcl_skins/.gitignore @@ -0,0 +1,4 @@ +!textures/mcl_skins_character_1.png +textures/mcl_skins_character_* +!meta/mcl_skins_character_1.txt +meta/mcl_skins_character_* \ No newline at end of file diff --git a/mods/PLAYER/mcl_skins/init.lua b/mods/PLAYER/mcl_skins/init.lua index 6d5461a98..485e342b1 100644 --- a/mods/PLAYER/mcl_skins/init.lua +++ b/mods/PLAYER/mcl_skins/init.lua @@ -3,7 +3,7 @@ local modname = minetest.get_current_modname() mcl_skins = { - skins = {}, list = {}, previews = {}, meta = {}, has_preview = {}, + skins = {}, list = {}, meta = {}, modpath = minetest.get_modpath(modname), skin_count = 0, -- counter of _custom_ skins (all skins except character.png) } @@ -18,10 +18,8 @@ while true do if id == 0 then skin = "character" - mcl_skins.has_preview[id] = true else skin = "mcl_skins_character_" .. id - local preview = "mcl_skins_player_" .. id -- Does skin file exist? f = io.open(mcl_skins.modpath .. "/textures/" .. skin .. ".png") @@ -31,20 +29,12 @@ while true do break end f:close() - - -- Does skin preview file exist? - local file_preview = io.open(mcl_skins.modpath .. "/textures/" .. preview .. ".png") - if file_preview == nil then - minetest.log("warning", "[mcl_skins] Player skin #"..id.." does not have preview image (player_"..id..".png)") - mcl_skins.has_preview[id] = false - else - mcl_skins.has_preview[id] = true - file_preview:close() - end end mcl_skins.list[id] = skin + local metafile + -- does metadata exist for that skin file ? if id == 0 then metafile = "mcl_skins_character.txt" @@ -89,12 +79,11 @@ function mcl_skins.set_player_skin(player, skin_id) return false end local playername = player:get_player_name() - local skin, preview + local skin if skin_id == nil or type(skin_id) ~= "number" or skin_id < 0 or skin_id > mcl_skins.skin_count then return false elseif skin_id == 0 then skin = "character" - preview = "player" mcl_player.player_set_model(player, "mcl_armor_character.b3d") else skin = "mcl_skins_character_" .. tostring(skin_id) @@ -104,16 +93,9 @@ function mcl_skins.set_player_skin(player, skin_id) else mcl_player.player_set_model(player, "mcl_armor_character.b3d") end - if mcl_skins.has_preview[skin_id] then - preview = "mcl_skins_player_" .. tostring(skin_id) - else - -- Fallback preview image if preview image is missing - preview = "mcl_skins_player_dummy" - end end --local skin_file = skin .. ".png" mcl_skins.skins[playername] = skin - mcl_skins.previews[playername] = preview player:get_meta():set_string("mcl_skins:skin_id", tostring(skin_id)) mcl_skins.update_player_skin(player) if has_mcl_inventory then @@ -131,7 +113,7 @@ function mcl_skins.update_player_skin(player) return end local playername = player:get_player_name() - mcl_player.player_set_skin(player, mcl_skins.skins[playername] .. ".png", mcl_skins.previews[playername] .. ".png") + mcl_player.player_set_skin(player, mcl_skins.skins[playername] .. ".png") end -- load player skin on join @@ -259,7 +241,11 @@ function mcl_skins.show_formspec(playername) formspec = formspec .. ";" .. selected .. ";false]" - formspec = formspec .. "image[0,0;1.35,2.7;" .. mcl_skins.previews[playername] .. ".png]" + local player = minetest.get_player_by_name(playername) + if player then + --maybe the function could accept both player object and player name? + formspec = formspec .. mcl_player.get_player_formspec_model(player, 0, 0, 1.35, 2.7, "mcl_skins:skin_select") + end if meta then if meta.name and meta.name ~= "" then diff --git a/mods/PLAYER/mcl_skins/locale/mcl_skins.zh_TW.tr b/mods/PLAYER/mcl_skins/locale/mcl_skins.zh_TW.tr new file mode 100644 index 000000000..1347800ee --- /dev/null +++ b/mods/PLAYER/mcl_skins/locale/mcl_skins.zh_TW.tr @@ -0,0 +1,13 @@ +# textdomain: mcl_skins +[] []=[<玩家名字>] [<皮膚篇號>] +Select player skin of yourself or another player=替自己或其他玩家選擇皮膚 +Insufficient or wrong parameters=無效或錯誤參數 +Player @1 not online!=玩家 @1 不在線! +You need the “server” privilege to change the skin of other players!=你需要「server」權限來替換其他玩家的皮膚! +Invalid skin number! Valid numbers: 0 to @1=無效皮膚篇號!有效篇號:0至@1 +Your skin has been set to: @1=你的皮膚已換成:@1 +Your skin has been set to: @1 (@2)=你的皮膚已換成:@1(@2) +Skin of @1 set to: @2 (@3)=@1的皮膚已換成:@1 +Select player skin:=選擇玩家皮膚: +@1 (@2)=@1(@2) +Name: @1=名稱:@1 diff --git a/mods/PLAYER/mcl_skins/textures/mcl_skins_player_1.png b/mods/PLAYER/mcl_skins/textures/mcl_skins_player_1.png deleted file mode 100644 index 3d7af2a980c2412be1f72e39fd6d7ffeda8f7fb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2625 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 Eg6UDq0RR91 diff --git a/mods/PLAYER/mcl_spawn/init.lua b/mods/PLAYER/mcl_spawn/init.lua index ca6aa97b1..655525f66 100644 --- a/mods/PLAYER/mcl_spawn/init.lua +++ b/mods/PLAYER/mcl_spawn/init.lua @@ -452,6 +452,7 @@ function mcl_spawn.get_player_spawn_pos(player) if bgroup ~= 1 and bgroup ~= 2 then -- Bed is destroyed: if player and player:is_player() then +<<<<<<< HEAD local function split(s, delimiter) --this is just a common function to split strings, since it is way harder to do in lua like in python, java etc. result = {}; @@ -505,9 +506,35 @@ function mcl_spawn.get_player_spawn_pos(player) end end end +======= + local checkpos = minetest.string_to_pos(player:get_meta():get_string("mcl_beds:spawn")) + local checknode = minetest.get_node(checkpos) + + if(string.match(checknode.name, "mcl_beds:respawn_anchor_charged_")) then + local charge_level = tonumber(string.sub(checknode.name, -1)) + if not charge_level then + minetest.log("warning","could not get level of players respawn anchor, sending him back to spawn!") + player:get_meta():set_string("mcl_beds:spawn", "") + minetest.chat_send_player(player:get_player_name(), S("Couldn't get level of your respawn anchor!")) + return mcl_spawn.get_world_spawn_pos(), false + elseif charge_level ~= 1 then + minetest.set_node(checkpos, {name="mcl_beds:respawn_anchor_charged_".. charge_level-1}) + return checkpos, false + else + minetest.set_node(checkpos, {name="mcl_beds:respawn_anchor"}) + return checkpos, false + end + else + player:get_meta():set_string("mcl_beds:spawn", "") + minetest.chat_send_player(player:get_player_name(), S("Your spawn bed was missing or blocked, and you had no charged respawn anchor!")) + return mcl_spawn.get_world_spawn_pos(), false + end +>>>>>>> mcl2/master end end + + -- Find spawning position on/near the bed free of solid or damaging blocks iterating a square spiral 15x15: local dir = minetest.facedir_to_dir(minetest.get_node(pos).param2) diff --git a/mods/PLAYER/mcl_spawn/locale/mcl_spawn.de.tr b/mods/PLAYER/mcl_spawn/locale/mcl_spawn.de.tr index e30a71650..57d32a5f7 100644 --- a/mods/PLAYER/mcl_spawn/locale/mcl_spawn.de.tr +++ b/mods/PLAYER/mcl_spawn/locale/mcl_spawn.de.tr @@ -1,4 +1,5 @@ # textdomain: mcl_spawn New respawn position set!=Neue Wiedereinstiegsposition gesetzt! Respawn position cleared!=Wiedereinstiegsposition gelöscht! -Your spawn bed was missing or blocked.=Ihr Startbett fehlte oder war blockiert. +Your spawn bed was missing or blocked, and you had no charged respawn anchor!=Ihr Startbett fehlte oder war blockiert, und Sie hatten keinen geladenen Seelenanker! +Couldn't get level of your respawn anchor!=Das Füllstand ihres Seelenankers konnte nicht erkannt werden! \ No newline at end of file diff --git a/mods/PLAYER/mcl_spawn/locale/mcl_spawn.zh_TW.tr b/mods/PLAYER/mcl_spawn/locale/mcl_spawn.zh_TW.tr new file mode 100644 index 000000000..f47d22c2d --- /dev/null +++ b/mods/PLAYER/mcl_spawn/locale/mcl_spawn.zh_TW.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_spawn +New respawn position set!=新重生點已設定! +Respawn position cleared!=重生點已清除! +Your spawn bed was missing or blocked.=你的床被破壞或被堵住了。 diff --git a/mods/PLAYER/mcl_spawn/locale/template.txt b/mods/PLAYER/mcl_spawn/locale/template.txt index 8906d18f9..aa8aafe8d 100644 --- a/mods/PLAYER/mcl_spawn/locale/template.txt +++ b/mods/PLAYER/mcl_spawn/locale/template.txt @@ -1,4 +1,5 @@ # textdomain: mcl_spawn New respawn position set!= Respawn position cleared!= -Your spawn bed was missing or blocked.= +Couldn't get level of your respawn anchor!= +Your spawn bed was missing or blocked, and you had no charged respawn anchor!= \ No newline at end of file diff --git a/mods/PLAYER/mcl_wieldview/init.lua b/mods/PLAYER/mcl_wieldview/init.lua index 947c2fdce..7bde8fc23 100644 --- a/mods/PLAYER/mcl_wieldview/init.lua +++ b/mods/PLAYER/mcl_wieldview/init.lua @@ -1,5 +1,58 @@ local get_item_group = minetest.get_item_group +<<<<<<< HEAD +======= +mcl_wieldview = { + players = {} +} + +function mcl_wieldview.get_item_texture(itemname) + if itemname == "" or minetest.get_item_group(itemname, "no_wieldview") ~= 0 then + return + end + + local def = minetest.registered_items[itemname] + if not def then + return + end + + local inv_image = def.inventory_image + if inv_image == "" then + return + end + + local texture = inv_image + + local transform = get_item_group(itemname, "wieldview_transform") + if transform then + -- This actually works with groups ratings because transform1, transform2, etc. + -- have meaning and transform0 is used for identidy, so it can be ignored + texture = texture .. "^[transform" .. transform + end + + return texture +end + +function mcl_wieldview.update_wielded_item(player) + if not player then + return + end + local itemstack = player:get_wielded_item() + local itemname = itemstack:get_name() + + local def = mcl_wieldview.players[player] + + if def.item == itemname then + return + end + + def.item = itemname + def.texture = mcl_wieldview.get_item_texture(itemname) or "blank.png" + + mcl_player.player_set_wielditem(player, def.texture) +end + +>>>>>>> mcl2/master minetest.register_on_joinplayer(function(player) if not player or not player:is_player() then return @@ -19,7 +72,33 @@ minetest.register_entity("mcl_wieldview:wieldnode", { static_save = false, visual_size = {x = 0.21, y = 0.21}, on_step = function(self) +<<<<<<< HEAD if not self._wielder or not self._wielder:is_player() then +======= + if self.wielder:is_player() then + local def = mcl_wieldview.players[self.wielder] + local itemstring = def.item + + if self.itemstring ~= itemstring then + local itemdef = minetest.registered_items[itemstring] + self.object:set_properties({glow = itemdef and itemdef.light_source or 0}) + + -- wield item as cubic + if def.texture == "blank.png" then + self.object:set_properties({textures = {itemstring}}) + -- wield item as flat + else + self.object:set_properties({textures = {""}}) + end + + if minetest.get_item_group(itemstring, "no_wieldview") ~= 0 then + self.object:set_properties({textures = {""}}) + end + + self.itemstring = itemstring + end + else +>>>>>>> mcl2/master self.object:remove() end local player = self._wielder diff --git a/settingtypes.txt b/settingtypes.txt index 0587438da..3b385ea11 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -20,6 +20,18 @@ enable_fire (Destructive and spreading fire) bool true # If enabled, the weather will change naturally over time. mcl_doWeatherCycle (Change weather) bool true +# Amount of rain particles. You can reduce this to get better FPS (default: 500) +mcl_weather_rain_particles (Rain particles) int 500 0 + +# Amount of thunderstorm rain particles. You can reduce this to get better FPS (default: 900) +mcl_weather_thunder_particles (Thunderstorm rain particles) int 900 0 + +# Amount of snow particles. You can reduce this to get better FPS (default: 100) +mcl_weather_snow_particles (Snow particles) int 100 0 + +# Amount of nether dust particles. You can reduce this to get better FPS (default: 150) +mcl_weather_snow_particles (Nether dust particles) int 150 0 + # If enabled, breaking blocks will cause them to drop as item. # Note that blocks never have drops when in Creative Mode. mcl_doTileDrops (Blocks have drops) bool true @@ -101,9 +113,6 @@ fire_animation_frames (Fire Animation Frames) int 8 # Whether to animate chests when open / close animated_chests (Animated chests) bool true -# Whether to preview the player in inventory in 3D (requires Minetest 5.4) -3d_player_preview (3D Player preview) bool true - # The maximum number of boss bars to simultaniously display on the screen max_bossbars (Maximum Boss bars) int 5 diff --git a/tools/Conversion_Table.csv b/tools/Conversion_Table.csv index 426712f5b..07343479d 100644 --- a/tools/Conversion_Table.csv +++ b/tools/Conversion_Table.csv @@ -176,7 +176,7 @@ Source path,Source file,Target path,Target file,xs,ys,xl,yl,xt,yt,Blacklisted? /assets/minecraft/textures/blocks,cobblestone_mossy.png,/mods/ITEMS/mcl_core/textures,default_mossycobble.png,,,,,,, /assets/minecraft/textures/blocks,obsidian.png,/mods/ITEMS/mcl_core/textures,default_obsidian.png,,,,,,, /assets/minecraft/textures/items,paper.png,/mods/ITEMS/mcl_core/textures,default_paper.png,,,,,,, -/assets/minecraft/textures/blocks,reeds.png,/mods/ITEMS/mcl_core/textures,default_papyrus.png,,,,,,, +/assets/minecraft/textures/blocks,reeds.png,/mods/ITEMS/mcl_core/textures,mcl_core_papyrus.png,,,,,,, /assets/minecraft/textures/blocks,sand.png,/mods/ITEMS/mcl_core/textures,default_sand.png,,,,,,, /assets/minecraft/textures/blocks,snow.png,/mods/ITEMS/mcl_core/textures,default_snow.png,,,,,,, /assets/minecraft/textures/blocks,iron_block.png,/mods/ITEMS/mcl_core/textures,default_steel_block.png,,,,,,, diff --git a/tools/strip_trailing_whitespace.sh b/tools/strip_trailing_whitespace.sh new file mode 100755 index 000000000..57e51d311 --- /dev/null +++ b/tools/strip_trailing_whitespace.sh @@ -0,0 +1,2 @@ +#!/bin/bash +sed --in-place 's/[[:space:]]\+$//' $(find -name "*.lua")

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 Ls>)PKnfU!5Wd#{H diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_orange.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_orange.png index ff17ff67c3f1903f27f80c44224f283c98803e23..a261eada2373ee7d2b8375e33c244ef9fff8eb6e 100644 GIT binary patch delta 945 zcmV;i15W(pImQQ&BYy*pNkls-zjn&-=^dREf1ikeUD_>U3Lv!_q|uo)2ch_dZ+p9;y z=iB}8;YK&>v+md#Gi}iiZNIv7Fg!lJD}21!3vaF*4qxxiWoOE{&p33=c-~*1&7NgU zl-Xq)hROYQZ+|cpe|d3dc9tl3U)8oTAQ>3_(C+KYhqAuD+(|RTpbrlE;~vI==sbfl zP{w`AIILL1Fv$pmAQDNQ*F*$Z*tR}v7em0?F$Vg;=PDz7(y#W zLWo|z4sy&){a!2Uii7|P&+`0d=k^Z0ln`EL>B7s^Hh=9Y0>nZ;Kff;%moh~H#`WaP z?qNMe5xZ=|F!6Y%1V<3A5ds05NHS>)LFN4znDPu60evDcXAB}60_}Vgo^N5=2EI z83oU^CITQNlTx-GQKM`Gkf+ff-l#~xWH<2^kbmZ{f@)U=CPQFppnr+1WRNnFKrIj2 z3uuJ_ES*S73#rIK-70Td%ZaS13Ii1z>{ z%m7B^0LA-$3oynQV~jDz7-Nhv#u#IaF)GFwV~jDz7-Nhv#u#IaF~%5U{wcoz%+-|{ TYo^mo00000NkvXXu0mjf>3Oh5 literal 7396 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 MtALdo6(O+y1O7G#1ONa4 diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_pink.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_pink.png index 7009e6efc5d29ab14705578dab4f9cfbc481f759..108aab15535351fde7187ba41ca7e29ec404bde0 100644 GIT binary patch literal 5506 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