From 713b0dee2c3d3fbb8711db31ac9e1bab290a79d3 Mon Sep 17 00:00:00 2001 From: Hamlet Date: Sat, 22 Sep 2018 21:57:58 +0200 Subject: [PATCH] v2.4.0 --- doc/changelog.txt | 8 + doc/credits.txt | 12 +- game.conf | 2 +- minetest.conf | 3 +- mods/buildings_etc/castle_tapestries/init.lua | 103 +- mods/buildings_etc/darkage/aliases.lua | 3 + mods/buildings_etc/frame/init.lua | 18 +- mods/buildings_etc/hidden_doors/README.md | 27 + mods/buildings_etc/hidden_doors/changelog.md | 175 + mods/buildings_etc/hidden_doors/darkage.lua | 4 +- mods/buildings_etc/hidden_doors/init.lua | 29 +- mods/buildings_etc/hidden_doors/locale/it.po | 247 +- .../hidden_doors/locale/template.pot | 140 +- mods/buildings_etc/hidden_doors/main.lua | 76 +- .../hidden_doors/minetest_game.lua | 4 +- mods/buildings_etc/hidden_doors/mod.conf | 8 +- .../buildings_etc/hidden_doors/moreblocks.lua | 4 +- mods/buildings_etc/hidden_doors/remover.lua | 4 +- .../buildings_etc/hidden_doors/screenshot.png | Bin 0 -> 86678 bytes .../hidden_doors/settingtypes.txt | 6 + .../textures/hidden_doors_hinges_overlay.png | Bin 0 -> 377 bytes .../textures/hidden_doors_painted_overlay.png | Bin 0 -> 621 bytes .../buildings_etc/my_castle_doors/depends.txt | 3 + .../my_castle_doors/description.txt | 1 + mods/buildings_etc/my_castle_doors/init.lua | 2 + mods/buildings_etc/my_castle_doors/locked.lua | 141 + mods/buildings_etc/my_castle_doors/mod.conf | 1 + .../my_castle_doors/screenshot.png | Bin 0 -> 141125 bytes .../textures/mydoors_door1.png | Bin 0 -> 3332 bytes .../textures/mydoors_door10.png | Bin 0 -> 3142 bytes .../textures/mydoors_door10_inv.png | Bin 0 -> 1112 bytes .../textures/mydoors_door11.png | Bin 0 -> 2300 bytes .../textures/mydoors_door11_inv.png | Bin 0 -> 791 bytes .../textures/mydoors_door12.png | Bin 0 -> 3074 bytes .../textures/mydoors_door12_inv.png | Bin 0 -> 998 bytes .../textures/mydoors_door13.png | Bin 0 -> 2784 bytes .../textures/mydoors_door13_inv.png | Bin 0 -> 1682 bytes .../textures/mydoors_door1_inv.png | Bin 0 -> 1112 bytes .../textures/mydoors_door2.png | Bin 0 -> 4907 bytes .../textures/mydoors_door2_inv.png | Bin 0 -> 1706 bytes .../textures/mydoors_door3.png | Bin 0 -> 1482 bytes .../textures/mydoors_door3_inv.png | Bin 0 -> 982 bytes .../textures/mydoors_door4.png | Bin 0 -> 1250 bytes .../textures/mydoors_door4_inv.png | Bin 0 -> 744 bytes .../textures/mydoors_door5.png | Bin 0 -> 1401 bytes .../textures/mydoors_door5_inv.png | Bin 0 -> 1031 bytes .../textures/mydoors_door6.png | Bin 0 -> 4051 bytes .../textures/mydoors_door6_inv.png | Bin 0 -> 1488 bytes .../textures/mydoors_door7.png | Bin 0 -> 2742 bytes .../textures/mydoors_door7_inv.png | Bin 0 -> 930 bytes .../textures/mydoors_door8.png | Bin 0 -> 5400 bytes .../textures/mydoors_door8_inv.png | Bin 0 -> 1283 bytes .../textures/mydoors_door9.png | Bin 0 -> 3749 bytes .../textures/mydoors_door9_inv.png | Bin 0 -> 1336 bytes .../my_castle_doors/unlocked.lua | 138 + .../my_cottage_doors/depends.txt | 3 + .../my_cottage_doors/description.txt | 1 + mods/buildings_etc/my_cottage_doors/init.lua | 2 + .../buildings_etc/my_cottage_doors/locked.lua | 39 + mods/buildings_etc/my_cottage_doors/mod.conf | 1 + .../my_cottage_doors/screenshot.png | Bin 0 -> 97815 bytes .../textures/mycdoors_door1.png | Bin 0 -> 8001 bytes .../textures/mycdoors_door1_inv.png | Bin 0 -> 3701 bytes .../textures/mycdoors_door2.png | Bin 0 -> 5943 bytes .../textures/mycdoors_door2_inv.png | Bin 0 -> 2866 bytes .../my_cottage_doors/unlocked.lua | 39 + mods/buildings_etc/my_door_wood/depends.txt | 3 + .../my_door_wood/description.txt | 1 + mods/buildings_etc/my_door_wood/init.lua | 62 + mods/buildings_etc/my_door_wood/mod.conf | 1 + .../buildings_etc/my_door_wood/screenshot.png | Bin 0 -> 93373 bytes .../textures/mydoors_black_wood.png | Bin 0 -> 223 bytes .../textures/mydoors_brown_wood.png | Bin 0 -> 195 bytes .../textures/mydoors_dark_grey_wood.png | Bin 0 -> 173 bytes .../textures/mydoors_grey_wood.png | Bin 0 -> 141 bytes .../textures/mydoors_red_wood.png | Bin 0 -> 209 bytes .../my_door_wood/textures/mydoors_swood.png | Bin 0 -> 324 bytes .../textures/mydoors_white_wood.png | Bin 0 -> 153 bytes .../textures/mydoors_yellow_wood.png | Bin 0 -> 230 bytes mods/buildings_etc/ts_furniture/LICENSE | 0 mods/buildings_etc/ts_furniture/README.txt | 0 mods/buildings_etc/ts_furniture/depends.txt | 0 .../ts_furniture/description.txt | 0 mods/buildings_etc/ts_furniture/init.lua | 15 + mods/buildings_etc/ts_furniture/mod.conf | 0 .../buildings_etc/ts_furniture/screenshot.png | Bin mods/character/3d_armor/3d_armor/api.lua | 2 +- mods/character/3d_armor/3d_armor/init.lua | 26 +- mods/character/3d_armor/3d_armor/locale/fr.po | 109 +- mods/character/3d_armor/3d_armor/locale/it.po | 107 +- mods/character/3d_armor/3d_armor/locale/ms.po | 114 +- mods/character/3d_armor/3d_armor/locale/ru.po | 294 ++ .../3d_armor/3d_armor/locale/template.pot | 105 +- .../3d_armor/3d_armor/tools/README.md | 7 + .../3d_armor/3d_armor/tools/updatepo.sh | 1 - mods/character/3d_armor/README.md | 4 +- mods/character/3d_armor/preview_gen.py | 0 mods/flora_fauna/crops/.luacheckrc | 15 - mods/flora_fauna/mob_horse/init.lua | 2 +- mods/flora_fauna/mob_horse/readme.md | 18 + mods/flora_fauna/mobs_animal/bee.lua | 4 +- mods/flora_fauna/mobs_animal/bunny.lua | 3 +- mods/flora_fauna/mobs_animal/chicken.lua | 4 +- mods/flora_fauna/mobs_animal/cow.lua | 7 +- mods/flora_fauna/mobs_animal/init.lua | 1 + mods/flora_fauna/mobs_animal/kitten.lua | 99 +- mods/flora_fauna/mobs_animal/lucky_block.lua | 1 + .../mobs_animal/models/mobs_panda.b3d | Bin 0 -> 102237 bytes mods/flora_fauna/mobs_animal/panda.lua | 86 + mods/flora_fauna/mobs_animal/readme.md | 10 +- mods/flora_fauna/mobs_animal/sheep.lua | 1 + .../mobs_animal/sounds/mobs_panda.ogg | Bin 0 -> 9971 bytes .../mobs_animal/textures/mobs_hairball.png | Bin 0 -> 363 bytes .../mobs_animal/textures/mobs_panda.png | Bin 0 -> 1402 bytes mods/flora_fauna/mobs_animal/warthog.lua | 2 + mods/flora_fauna/mobs_balrog/README.md | 23 + mods/flora_fauna/mobs_balrog/changelog.md | 35 + mods/flora_fauna/mobs_balrog/description.txt | 3 +- mods/flora_fauna/mobs_balrog/init.lua | 127 +- mods/flora_fauna/mobs_balrog/mod.conf | 4 +- mods/flora_fauna/mobs_goblins/goblins.lua | 5 +- .../flora_fauna/mobs_monster/dirt_monster.lua | 2 +- .../mobs_monster/dungeon_master.lua | 46 +- mods/flora_fauna/mobs_monster/lava_flan.lua | 6 +- mods/flora_fauna/mobs_monster/lucky_block.lua | 23 + .../flora_fauna/mobs_monster/mese_monster.lua | 4 +- .../mobs_monster/models/mobs_spider.b3d | Bin 0 -> 103645 bytes mods/flora_fauna/mobs_monster/oerkki.lua | 3 +- mods/flora_fauna/mobs_monster/readme.md | 4 +- mods/flora_fauna/mobs_monster/spider.lua | 112 +- .../mobs_monster/stone_monster.lua | 6 +- .../textures/mobs_spider_crystal.png | Bin 0 -> 4663 bytes .../textures/mobs_spider_grey.png | Bin 0 -> 8013 bytes .../textures/mobs_spider_mese.png | Bin 0 -> 3193 bytes .../textures/mobs_spider_orange.png | Bin 0 -> 10561 bytes .../textures/mobs_spider_snowy.png | Bin 0 -> 8481 bytes .../flora_fauna/mobs_monster/tree_monster.lua | 7 +- mods/flora_fauna/mobs_others/CHANGELOG.md | 13 +- mods/flora_fauna/mobs_others/LICENSE.txt | 0 mods/flora_fauna/mobs_others/README.md | 3 +- mods/flora_fauna/mobs_others/depends.txt | 3 +- mods/flora_fauna/mobs_others/description.txt | 0 mods/flora_fauna/mobs_others/init.lua | 50 +- mods/flora_fauna/mobs_others/mod.conf | 2 +- mods/flora_fauna/mobs_others/screenshot.png | Bin mods/flora_fauna/mobs_redo/api.lua | 3949 ++++++++++++++++ mods/flora_fauna/mobs_redo/api.lua_testspawn | 3985 +++++++++++++++++ mods/flora_fauna/mobs_redo/api.txt | 742 +++ mods/flora_fauna/mobs_redo/crafts.lua | 221 + mods/flora_fauna/mobs_redo/depends.txt | 9 + mods/flora_fauna/mobs_redo/description.txt | 1 + mods/flora_fauna/mobs_redo/init.lua | 19 + mods/flora_fauna/mobs_redo/intllib.lua | 45 + mods/flora_fauna/mobs_redo/license.txt | 21 + mods/flora_fauna/mobs_redo/locale/de_DE.po | 131 + mods/flora_fauna/mobs_redo/locale/es.po | 128 + mods/flora_fauna/mobs_redo/locale/fr.po | 129 + mods/flora_fauna/mobs_redo/locale/it.po | 131 + mods/flora_fauna/mobs_redo/locale/ms.po | 131 + mods/flora_fauna/mobs_redo/locale/pt.po | 133 + mods/flora_fauna/mobs_redo/locale/ru.po | 129 + .../flora_fauna/mobs_redo/locale/template.pot | 128 + mods/flora_fauna/mobs_redo/locale/tr.po | 133 + mods/flora_fauna/mobs_redo/lucky_block.lua | 18 + mods/flora_fauna/mobs_redo/mod.conf | 1 + mods/flora_fauna/mobs_redo/mount.lua | 448 ++ mods/flora_fauna/mobs_redo/readme.MD | 83 + mods/flora_fauna/mobs_redo/settingtypes.txt | 29 + .../mobs_redo/sounds/default_punch.ogg | Bin 0 -> 5946 bytes mods/flora_fauna/mobs_redo/sounds/license.txt | 7 + .../mobs_redo/sounds/mobs_spell.ogg | Bin 0 -> 15205 bytes .../mobs_redo/sounds/mobs_swing.ogg | Bin 0 -> 6895 bytes mods/flora_fauna/mobs_redo/spawner.lua | 181 + .../mobs_redo/textures/mob_spawner.png | Bin 0 -> 108 bytes .../mobs_redo/textures/mobs_blood.png | Bin 0 -> 267 bytes .../mobs_redo/textures/mobs_chicken_egg.png | Bin 0 -> 235 bytes .../textures/mobs_chicken_egg_overlay.png | Bin 0 -> 191 bytes .../mobs_redo/textures/mobs_leather.png | Bin 0 -> 196 bytes .../mobs_redo/textures/mobs_magic_lasso.png | Bin 0 -> 176 bytes .../mobs_redo/textures/mobs_meat.png | Bin 0 -> 411 bytes .../mobs_redo/textures/mobs_meat_raw.png | Bin 0 -> 426 bytes .../mobs_redo/textures/mobs_nametag.png | Bin 0 -> 247 bytes .../mobs_redo/textures/mobs_net.png | Bin 0 -> 195 bytes .../textures/mobs_noentry_particle.png | Bin 0 -> 165 bytes .../textures/mobs_protect_particle.png | Bin 0 -> 117 bytes .../mobs_redo/textures/mobs_protector.png | Bin 0 -> 164 bytes .../mobs_redo/textures/mobs_saddle.png | Bin 0 -> 166 bytes .../mobs_redo/textures/mobs_shears.png | Bin 0 -> 224 bytes .../mobs_redo/textures/tnt_smoke.png | Bin 0 -> 202 bytes .../mobs_water/mobs_crocs/init.lua | 2 +- mods/map/dfcaverns/biomes.lua | 113 +- mods/map/dfcaverns/config.lua | 1 + mods/map/dfcaverns/locale/update.bat | 0 mods/map/dfcaverns/settingtypes.txt | 4 + .../textures/dfcaverns_spore_tree_ladder.png | Bin 0 -> 701 bytes mods/map/dfcaverns/trees/spore_tree.lua | 46 +- mods/map/real_minerals/locale/update.bat | 0 mods/map/snowdrift/README.txt | 12 +- mods/map/snowdrift/init.lua | 169 +- mods/map/subterrane/functions.lua | 8 + mods/map/subterrane/locale/update.bat | 0 mods/physics/killer_nodes/README.txt | 4 +- mods/physics/killer_nodes/depends.txt | 1 - mods/physics/killer_nodes/init.lua | 33 +- mods/tools_etc/fort_spikes/README.md | 13 +- mods/tools_etc/fort_spikes/bower.json | 18 - mods/tools_etc/handholds/init.lua | 212 +- mods/tools_etc/hardtorch/fuel.lua | 25 + mods/tools_etc/hardtorch/init.lua | 7 +- mods/tools_etc/hardtorch/oil.lua | 1 + mods/tools_etc/hardtorch/tool.lua | 21 + mods/tools_etc/toolranks/init.lua | 41 + mods/unifieddyes/API.md | 124 +- mods/unifieddyes/init.lua | 439 +- mods/unifieddyes/locale/pt_br.txt | 85 + mods/user_interface/doc/doc/API.md | 6 +- mods/user_interface/doc/doc/README.md | 6 +- mods/user_interface/doc/doc/init.lua | 2 +- mods/user_interface/doc/doc_basics/README.md | 2 +- mods/user_interface/doc/doc_basics/init.lua | 22 +- .../doc/doc_identifier/README.md | 2 +- .../doc/doc_identifier/init.lua | 22 +- .../doc/doc_identifier/locale/de.txt | 2 +- .../doc/doc_identifier/locale/template.txt | 2 +- mods/user_interface/doc/doc_items/API.md | 4 +- mods/user_interface/doc/doc_items/README.md | 2 +- mods/user_interface/doc/doc_items/init.lua | 4 +- .../doc_minetest_game/helptexts.lua | 19 +- .../user_interface/doc_minetest_game/init.lua | 2 + .../doc_minetest_game/locale/it.lua | 249 + .../doc_minetest_game/locale/template.txt | 249 + .../user_interface/intllib/tools/xgettext.bat | 0 settingtypes.txt | 16 +- 233 files changed, 14110 insertions(+), 1641 deletions(-) create mode 100644 mods/buildings_etc/hidden_doors/README.md create mode 100644 mods/buildings_etc/hidden_doors/changelog.md create mode 100644 mods/buildings_etc/hidden_doors/screenshot.png create mode 100644 mods/buildings_etc/hidden_doors/textures/hidden_doors_hinges_overlay.png create mode 100644 mods/buildings_etc/hidden_doors/textures/hidden_doors_painted_overlay.png create mode 100644 mods/buildings_etc/my_castle_doors/depends.txt create mode 100644 mods/buildings_etc/my_castle_doors/description.txt create mode 100644 mods/buildings_etc/my_castle_doors/init.lua create mode 100644 mods/buildings_etc/my_castle_doors/locked.lua create mode 100644 mods/buildings_etc/my_castle_doors/mod.conf create mode 100644 mods/buildings_etc/my_castle_doors/screenshot.png create mode 100644 mods/buildings_etc/my_castle_doors/textures/mydoors_door1.png create mode 100644 mods/buildings_etc/my_castle_doors/textures/mydoors_door10.png create mode 100644 mods/buildings_etc/my_castle_doors/textures/mydoors_door10_inv.png create mode 100644 mods/buildings_etc/my_castle_doors/textures/mydoors_door11.png create mode 100644 mods/buildings_etc/my_castle_doors/textures/mydoors_door11_inv.png create mode 100644 mods/buildings_etc/my_castle_doors/textures/mydoors_door12.png create mode 100644 mods/buildings_etc/my_castle_doors/textures/mydoors_door12_inv.png create mode 100644 mods/buildings_etc/my_castle_doors/textures/mydoors_door13.png create mode 100644 mods/buildings_etc/my_castle_doors/textures/mydoors_door13_inv.png create mode 100644 mods/buildings_etc/my_castle_doors/textures/mydoors_door1_inv.png create mode 100644 mods/buildings_etc/my_castle_doors/textures/mydoors_door2.png create mode 100644 mods/buildings_etc/my_castle_doors/textures/mydoors_door2_inv.png create mode 100644 mods/buildings_etc/my_castle_doors/textures/mydoors_door3.png create mode 100644 mods/buildings_etc/my_castle_doors/textures/mydoors_door3_inv.png create mode 100644 mods/buildings_etc/my_castle_doors/textures/mydoors_door4.png create mode 100644 mods/buildings_etc/my_castle_doors/textures/mydoors_door4_inv.png create mode 100644 mods/buildings_etc/my_castle_doors/textures/mydoors_door5.png create mode 100644 mods/buildings_etc/my_castle_doors/textures/mydoors_door5_inv.png create mode 100644 mods/buildings_etc/my_castle_doors/textures/mydoors_door6.png create mode 100644 mods/buildings_etc/my_castle_doors/textures/mydoors_door6_inv.png create mode 100644 mods/buildings_etc/my_castle_doors/textures/mydoors_door7.png create mode 100644 mods/buildings_etc/my_castle_doors/textures/mydoors_door7_inv.png create mode 100644 mods/buildings_etc/my_castle_doors/textures/mydoors_door8.png create mode 100644 mods/buildings_etc/my_castle_doors/textures/mydoors_door8_inv.png create mode 100644 mods/buildings_etc/my_castle_doors/textures/mydoors_door9.png create mode 100644 mods/buildings_etc/my_castle_doors/textures/mydoors_door9_inv.png create mode 100644 mods/buildings_etc/my_castle_doors/unlocked.lua create mode 100644 mods/buildings_etc/my_cottage_doors/depends.txt create mode 100644 mods/buildings_etc/my_cottage_doors/description.txt create mode 100644 mods/buildings_etc/my_cottage_doors/init.lua create mode 100644 mods/buildings_etc/my_cottage_doors/locked.lua create mode 100644 mods/buildings_etc/my_cottage_doors/mod.conf create mode 100644 mods/buildings_etc/my_cottage_doors/screenshot.png create mode 100644 mods/buildings_etc/my_cottage_doors/textures/mycdoors_door1.png create mode 100644 mods/buildings_etc/my_cottage_doors/textures/mycdoors_door1_inv.png create mode 100644 mods/buildings_etc/my_cottage_doors/textures/mycdoors_door2.png create mode 100644 mods/buildings_etc/my_cottage_doors/textures/mycdoors_door2_inv.png create mode 100644 mods/buildings_etc/my_cottage_doors/unlocked.lua create mode 100644 mods/buildings_etc/my_door_wood/depends.txt create mode 100644 mods/buildings_etc/my_door_wood/description.txt create mode 100644 mods/buildings_etc/my_door_wood/init.lua create mode 100644 mods/buildings_etc/my_door_wood/mod.conf create mode 100644 mods/buildings_etc/my_door_wood/screenshot.png create mode 100644 mods/buildings_etc/my_door_wood/textures/mydoors_black_wood.png create mode 100644 mods/buildings_etc/my_door_wood/textures/mydoors_brown_wood.png create mode 100644 mods/buildings_etc/my_door_wood/textures/mydoors_dark_grey_wood.png create mode 100644 mods/buildings_etc/my_door_wood/textures/mydoors_grey_wood.png create mode 100644 mods/buildings_etc/my_door_wood/textures/mydoors_red_wood.png create mode 100644 mods/buildings_etc/my_door_wood/textures/mydoors_swood.png create mode 100644 mods/buildings_etc/my_door_wood/textures/mydoors_white_wood.png create mode 100644 mods/buildings_etc/my_door_wood/textures/mydoors_yellow_wood.png mode change 100644 => 100755 mods/buildings_etc/ts_furniture/LICENSE mode change 100644 => 100755 mods/buildings_etc/ts_furniture/README.txt mode change 100644 => 100755 mods/buildings_etc/ts_furniture/depends.txt mode change 100644 => 100755 mods/buildings_etc/ts_furniture/description.txt mode change 100644 => 100755 mods/buildings_etc/ts_furniture/init.lua mode change 100644 => 100755 mods/buildings_etc/ts_furniture/mod.conf mode change 100644 => 100755 mods/buildings_etc/ts_furniture/screenshot.png create mode 100644 mods/character/3d_armor/3d_armor/locale/ru.po create mode 100644 mods/character/3d_armor/3d_armor/tools/README.md mode change 100644 => 100755 mods/character/3d_armor/3d_armor/tools/updatepo.sh mode change 100644 => 100755 mods/character/3d_armor/preview_gen.py delete mode 100644 mods/flora_fauna/crops/.luacheckrc create mode 100644 mods/flora_fauna/mob_horse/readme.md create mode 100644 mods/flora_fauna/mobs_animal/models/mobs_panda.b3d create mode 100644 mods/flora_fauna/mobs_animal/panda.lua create mode 100644 mods/flora_fauna/mobs_animal/sounds/mobs_panda.ogg create mode 100644 mods/flora_fauna/mobs_animal/textures/mobs_hairball.png create mode 100644 mods/flora_fauna/mobs_animal/textures/mobs_panda.png create mode 100644 mods/flora_fauna/mobs_balrog/README.md create mode 100644 mods/flora_fauna/mobs_balrog/changelog.md create mode 100644 mods/flora_fauna/mobs_monster/models/mobs_spider.b3d create mode 100644 mods/flora_fauna/mobs_monster/textures/mobs_spider_crystal.png create mode 100644 mods/flora_fauna/mobs_monster/textures/mobs_spider_grey.png create mode 100644 mods/flora_fauna/mobs_monster/textures/mobs_spider_mese.png create mode 100644 mods/flora_fauna/mobs_monster/textures/mobs_spider_orange.png create mode 100644 mods/flora_fauna/mobs_monster/textures/mobs_spider_snowy.png mode change 100644 => 100755 mods/flora_fauna/mobs_others/CHANGELOG.md mode change 100644 => 100755 mods/flora_fauna/mobs_others/LICENSE.txt mode change 100644 => 100755 mods/flora_fauna/mobs_others/README.md mode change 100644 => 100755 mods/flora_fauna/mobs_others/depends.txt mode change 100644 => 100755 mods/flora_fauna/mobs_others/description.txt mode change 100644 => 100755 mods/flora_fauna/mobs_others/init.lua mode change 100644 => 100755 mods/flora_fauna/mobs_others/mod.conf mode change 100644 => 100755 mods/flora_fauna/mobs_others/screenshot.png create mode 100644 mods/flora_fauna/mobs_redo/api.lua create mode 100644 mods/flora_fauna/mobs_redo/api.lua_testspawn create mode 100644 mods/flora_fauna/mobs_redo/api.txt create mode 100644 mods/flora_fauna/mobs_redo/crafts.lua create mode 100644 mods/flora_fauna/mobs_redo/depends.txt create mode 100644 mods/flora_fauna/mobs_redo/description.txt create mode 100644 mods/flora_fauna/mobs_redo/init.lua create mode 100644 mods/flora_fauna/mobs_redo/intllib.lua create mode 100644 mods/flora_fauna/mobs_redo/license.txt create mode 100644 mods/flora_fauna/mobs_redo/locale/de_DE.po create mode 100644 mods/flora_fauna/mobs_redo/locale/es.po create mode 100644 mods/flora_fauna/mobs_redo/locale/fr.po create mode 100644 mods/flora_fauna/mobs_redo/locale/it.po create mode 100644 mods/flora_fauna/mobs_redo/locale/ms.po create mode 100644 mods/flora_fauna/mobs_redo/locale/pt.po create mode 100644 mods/flora_fauna/mobs_redo/locale/ru.po create mode 100644 mods/flora_fauna/mobs_redo/locale/template.pot create mode 100644 mods/flora_fauna/mobs_redo/locale/tr.po create mode 100644 mods/flora_fauna/mobs_redo/lucky_block.lua create mode 100644 mods/flora_fauna/mobs_redo/mod.conf create mode 100644 mods/flora_fauna/mobs_redo/mount.lua create mode 100644 mods/flora_fauna/mobs_redo/readme.MD create mode 100644 mods/flora_fauna/mobs_redo/settingtypes.txt create mode 100644 mods/flora_fauna/mobs_redo/sounds/default_punch.ogg create mode 100644 mods/flora_fauna/mobs_redo/sounds/license.txt create mode 100644 mods/flora_fauna/mobs_redo/sounds/mobs_spell.ogg create mode 100644 mods/flora_fauna/mobs_redo/sounds/mobs_swing.ogg create mode 100644 mods/flora_fauna/mobs_redo/spawner.lua create mode 100644 mods/flora_fauna/mobs_redo/textures/mob_spawner.png create mode 100644 mods/flora_fauna/mobs_redo/textures/mobs_blood.png create mode 100644 mods/flora_fauna/mobs_redo/textures/mobs_chicken_egg.png create mode 100644 mods/flora_fauna/mobs_redo/textures/mobs_chicken_egg_overlay.png create mode 100644 mods/flora_fauna/mobs_redo/textures/mobs_leather.png create mode 100644 mods/flora_fauna/mobs_redo/textures/mobs_magic_lasso.png create mode 100644 mods/flora_fauna/mobs_redo/textures/mobs_meat.png create mode 100644 mods/flora_fauna/mobs_redo/textures/mobs_meat_raw.png create mode 100644 mods/flora_fauna/mobs_redo/textures/mobs_nametag.png create mode 100644 mods/flora_fauna/mobs_redo/textures/mobs_net.png create mode 100644 mods/flora_fauna/mobs_redo/textures/mobs_noentry_particle.png create mode 100644 mods/flora_fauna/mobs_redo/textures/mobs_protect_particle.png create mode 100644 mods/flora_fauna/mobs_redo/textures/mobs_protector.png create mode 100644 mods/flora_fauna/mobs_redo/textures/mobs_saddle.png create mode 100644 mods/flora_fauna/mobs_redo/textures/mobs_shears.png create mode 100644 mods/flora_fauna/mobs_redo/textures/tnt_smoke.png mode change 100755 => 100644 mods/map/dfcaverns/locale/update.bat create mode 100644 mods/map/dfcaverns/textures/dfcaverns_spore_tree_ladder.png mode change 100755 => 100644 mods/map/real_minerals/locale/update.bat mode change 100755 => 100644 mods/map/subterrane/locale/update.bat delete mode 100644 mods/tools_etc/fort_spikes/bower.json create mode 100644 mods/unifieddyes/locale/pt_br.txt create mode 100644 mods/user_interface/doc_minetest_game/locale/it.lua create mode 100644 mods/user_interface/doc_minetest_game/locale/template.txt mode change 100755 => 100644 mods/user_interface/intllib/tools/xgettext.bat diff --git a/doc/changelog.txt b/doc/changelog.txt index 8ad7a37..cefeb85 100644 --- a/doc/changelog.txt +++ b/doc/changelog.txt @@ -3,6 +3,14 @@ Hamlet's Quest - Changelog ========================== + v. 2.4.0 (2018-09-22) + - Added "Castle Doors", "Cottage Doors" and "Door Wood" by Don. + - Reverted mobs' difficulty to 1 (was 2) + introduced in v. 1.1.2-dev (2017-09-18) + - Mobs' difficulty now can be changed using the advanced settings menu. + - Deactivated frames' registration for inexistent items (e.g. tnt) + - All the modules have been updated to their latest versions. + v. 2.3.0 (2018-06-03) diff --git a/doc/credits.txt b/doc/credits.txt index 2e77cd5..c3f0069 100644 --- a/doc/credits.txt +++ b/doc/credits.txt @@ -9,8 +9,8 @@ INDEX (row's number - topic) 119 - Flora and fauna 173 - Character 217 - Tools and alike -285 - Buildings and similar -375 - Engine related +286 - Buildings and similar +381 - Engine related Based on @@ -249,7 +249,8 @@ https://forum.minetest.net/memberlist.php?mode=viewprofile&u=5293 - Mountain Climbing [handholds] - https://forum.minetest.net/viewtopic.php?f=11&t=17069 -By Shara https://forum.minetest.net/memberlist.php?mode=viewprofile&u=19807 +By Shara +https://forum.minetest.net/memberlist.php?mode=viewprofile&u=19807 - Path marker signs [breadcrumbs] - https://forum.minetest.net/viewtopic.php?t=16511 @@ -295,6 +296,11 @@ https://forum.minetest.net/viewtopic.php?f=11&t=2875 By Jordach https://forum.minetest.net/memberlist.php?mode=viewprofile&u=332 +- Castle Doors, Cottage Doors, Door Wood - +https://forum.minetest.net/viewtopic.php?f=11&t=10626 +By Don +https://forum.minetest.net/memberlist.php?mode=viewprofile&u=10447 + - Castle Gates - https://github.com/minetest-mods/castle_gates By philipbenr and Dan DunCombe diff --git a/game.conf b/game.conf index e3fc912..bfa1ed2 100644 --- a/game.conf +++ b/game.conf @@ -1 +1 @@ -name = Hamlet's Quest v.2.3.0 +name = Hamlet's Quest v.2.4.0 diff --git a/minetest.conf b/minetest.conf index 47d10f2..7562a3c 100644 --- a/minetest.conf +++ b/minetest.conf @@ -5,6 +5,7 @@ armor_heal_multiplier = 0 armor_water_protect = false breadcrumbs_glow_in_the_dark = false breadcrumbs_particles = true +debug_log_level = error dfcaverns_flooded_biomes = false enable_bed_night_skip = true enable_bed_respawn = true @@ -12,7 +13,7 @@ hardtorch_torch_nights = 1 hardtorch_torch_lighter = true hbarmor_autohide = false hudbars_sorting = health=0, satiation=1, armor=2, thirst=3, breath=4, stamina=5 -mob_difficulty = 2 +mob_difficulty = 1 mob_show_health = false mob_horse:horse_chance 75000 mobs_balrog_max_height = -2700 diff --git a/mods/buildings_etc/castle_tapestries/init.lua b/mods/buildings_etc/castle_tapestries/init.lua index c4e5983..8d703d6 100644 --- a/mods/buildings_etc/castle_tapestries/init.lua +++ b/mods/buildings_etc/castle_tapestries/init.lua @@ -69,27 +69,14 @@ minetest.register_node("castle_tapestries:tapestry", { paramtype = "light", paramtype2 = "colorwallmounted", palette = "unifieddyes_palette_colorwallmounted.png", - walkable = false, selection_box = { type = "wallmounted", wall_side = {-0.5,-0.5,0.4375,0.5,1.5,0.5}, }, - after_place_node = function(pos, placer, itemstack, pointed_thing) - unifieddyes.fix_rotation_nsew(pos, placer, itemstack, pointed_thing) - unifieddyes.recolor_on_place(pos, placer, itemstack, pointed_thing) - end, - after_dig_node = unifieddyes.after_dig_node, + after_place_node = unifieddyes.fix_rotation_nsew, on_rotate = unifieddyes.fix_after_screwdriver_nsew }) --- Crafting from wool and a stick - -minetest.register_craft({ - type = "shapeless", - output = 'castle_tapestries:tapestry', - recipe = {'wool:white', 'default:stick'}, -}) - -- Long tapestry minetest.register_node("castle_tapestries:tapestry_long", { @@ -103,27 +90,14 @@ minetest.register_node("castle_tapestries:tapestry_long", { paramtype = "light", paramtype2 = "colorwallmounted", palette = "unifieddyes_palette_colorwallmounted.png", - walkable = false, selection_box = { type = "wallmounted", wall_side = {-0.5,-0.5,0.4375,0.5,2.5,0.5}, }, - after_place_node = function(pos, placer, itemstack, pointed_thing) - unifieddyes.fix_rotation_nsew(pos, placer, itemstack, pointed_thing) - unifieddyes.recolor_on_place(pos, placer, itemstack, pointed_thing) - end, - after_dig_node = unifieddyes.after_dig_node, + after_place_node = unifieddyes.fix_rotation_nsew, on_rotate = unifieddyes.fix_after_screwdriver_nsew }) --- Crafting from normal tapestry and wool - -minetest.register_craft({ - type = "shapeless", - output = 'castle_tapestries:tapestry_long', - recipe = {'wool:white', 'castle_tapestries:tapestry'}, -}) - -- Very long tapestry minetest.register_node("castle_tapestries:tapestry_very_long", { @@ -137,20 +111,39 @@ minetest.register_node("castle_tapestries:tapestry_very_long", { paramtype = "light", paramtype2 = "colorwallmounted", palette = "unifieddyes_palette_colorwallmounted.png", - walkable = false, selection_box = { type = "wallmounted", wall_side = {-0.5,-0.5,0.4375,0.5,3.5,0.5}, }, - after_place_node = function(pos, placer, itemstack, pointed_thing) - unifieddyes.fix_rotation_nsew(pos, placer, itemstack, pointed_thing) - unifieddyes.recolor_on_place(pos, placer, itemstack, pointed_thing) - end, - after_dig_node = unifieddyes.after_dig_node, + after_place_node = unifieddyes.fix_rotation_nsew, on_rotate = unifieddyes.fix_after_screwdriver_nsew }) --- Crafting from long tapestry and wool +-- Crafting + +minetest.register_craft({ + type = "shapeless", + output = 'castle_tapestries:tapestry', + recipe = {'wool:white', 'default:stick'}, +}) + +minetest.register_craft({ + type = "shapeless", + output = 'castle_tapestries:tapestry', + recipe = {'cottages:wool', 'default:stick'}, +}) + +minetest.register_craft({ + type = "shapeless", + output = 'castle_tapestries:tapestry_long', + recipe = {'wool:white', 'castle_tapestries:tapestry'}, +}) + +minetest.register_craft({ + type = "shapeless", + output = 'castle_tapestries:tapestry_long', + recipe = {'cottages:wool', 'castle_tapestries:tapestry'}, +}) minetest.register_craft({ type = "shapeless", @@ -158,6 +151,46 @@ minetest.register_craft({ recipe = {'wool:white', 'castle_tapestries:tapestry_long'}, }) +minetest.register_craft({ + type = "shapeless", + output = 'castle_tapestries:tapestry_very_long', + recipe = {'cottages:wool', 'castle_tapestries:tapestry_long'}, +}) + + +unifieddyes.register_color_craft({ + output = "castle_tapestries:tapestry", + palette = "wallmounted", + type = "shapeless", + neutral_node = "castle_tapestries:tapestry", + recipe = { + "NEUTRAL_NODE", + "MAIN_DYE", + } +}) + +unifieddyes.register_color_craft({ + output = "castle_tapestries:tapestry_long", + palette = "wallmounted", + type = "shapeless", + neutral_node = "castle_tapestries:tapestry_long", + recipe = { + "NEUTRAL_NODE", + "MAIN_DYE", + } +}) + +unifieddyes.register_color_craft({ + output = "castle_tapestries:tapestry_very_long", + palette = "wallmounted", + type = "shapeless", + neutral_node = "castle_tapestries:tapestry_very_long", + recipe = { + "NEUTRAL_NODE", + "MAIN_DYE", + } +}) + -- Convert static tapestries to param2 color local old_static_tapestries = {} diff --git a/mods/buildings_etc/darkage/aliases.lua b/mods/buildings_etc/darkage/aliases.lua index 684305e..355713d 100644 --- a/mods/buildings_etc/darkage/aliases.lua +++ b/mods/buildings_etc/darkage/aliases.lua @@ -96,3 +96,6 @@ minetest.register_alias("stairs:slab_gneiss_cobble", "stairs:slab_gneiss_brick") minetest.register_alias("stairs:stair_gneiss_cobble", "stairs:stair_gneiss_brick") register_moreblocks_alias("darkage:gneis_cobble", "darkage:gneiss_brick") minetest.register_alias("darkage:gneiss_cobble_wall", "darkage:gneiss_rubble_wall") + +-- Straw +register_moreblocks_alias("darkage:straw", "moreblocks:straw") diff --git a/mods/buildings_etc/frame/init.lua b/mods/buildings_etc/frame/init.lua index 75ccf27..a4b149e 100644 --- a/mods/buildings_etc/frame/init.lua +++ b/mods/buildings_etc/frame/init.lua @@ -213,12 +213,12 @@ for _, node in pairs({ "boats:boat", "boats:boat", "bucket:bucket_empty", - "bucket:bucket_lava", + --"bucket:bucket_lava", "bucket:bucket_river_water", "bucket:bucket_water", "carts:brakerail", "carts:cart", - "carts:powerrail", + --"carts:powerrail", "carts:rail", "default:acacia_bush_leaves", "default:acacia_bush_sapling", @@ -237,7 +237,7 @@ for _, node in pairs({ "default:axe_mese", "default:axe_steel", "default:axe_stone", - "default:axe_wood", + --"default:axe_wood", "default:book", "default:bookshelf", "default:book_written", @@ -323,7 +323,7 @@ for _, node in pairs({ "default:pick_mese", "default:pick_steel", "default:pick_stone", - "default:pick_wood", + --"default:pick_wood", "default:pine_needles", "default:pine_sapling", "default:pine_tree", @@ -424,7 +424,7 @@ for _, node in pairs({ "fire:basic_flame", "fire:flint_and_steel", "fire:permanent_flame", - "flowerpot:empty", + --"flowerpot:empty", "flowers:dandelion_white", "flowers:dandelion_yellow", "flowers:geranium", @@ -434,11 +434,11 @@ for _, node in pairs({ "flowers:tulip", "flowers:viola", "flowers:waterlily", - "nyancat:nyancat", - "nyancat:nyancat_rainbow", + --"nyancat:nyancat", + --"nyancat:nyancat_rainbow", "screwdriver:screwdriver", - "tnt:gunpowder", - "tnt:tnt", + --"tnt:gunpowder", + --"tnt:tnt", "vessels:drinking_glass", "vessels:glass_bottle", "vessels:glass_fragments", diff --git a/mods/buildings_etc/hidden_doors/README.md b/mods/buildings_etc/hidden_doors/README.md new file mode 100644 index 0000000..e898769 --- /dev/null +++ b/mods/buildings_etc/hidden_doors/README.md @@ -0,0 +1,27 @@ +### HIDDEN DOORS +![Hidden Doors' screenshot](screenshot.png) +**_Adds various wood, stone, etc. doors._** +Allows to use painted doors Settings/Advanced Settings/Mods/hidden_doors +Allows self-removal via Advanced Settings + +**Version:** 1.11 +**Source code's license:** GPL v3.0 +**Media (Textures, Sounds) license:** CC BY-SA 4.0 International + +**Dependencies:** default, doors, stairs, vessels (found in Minetest Game) +**Supported:** Darkage (Addi's fork), Moreblocks + + +### Installation + +Unzip the archive, rename the folder to hidden_doors and place it in +../minetest/mods/ + +If you only want this to be used in a single world, place it in +../minetest/worlds/WORLD_NAME/worldmods/ + +GNU+Linux - If you use a system-wide installation place it in +~/.minetest/mods/ + +For further information or help see: +https://wiki.minetest.net/Help:Installing_Mods diff --git a/mods/buildings_etc/hidden_doors/changelog.md b/mods/buildings_etc/hidden_doors/changelog.md new file mode 100644 index 0000000..b4e7e7c --- /dev/null +++ b/mods/buildings_etc/hidden_doors/changelog.md @@ -0,0 +1,175 @@ +# Changelog +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) +and this project adheres to [Semantic Versioning](https://semver.org/). + + +## [Unreleased] + + No further features planned. + + +## [1.11] - 2018-09-12 +### Added + + Painted doors, thanks to Treer + + + +## [1.10.2] - 2018-07-12 +### Added + + screenshot.png + +### Changed + + Default options' values are no longer written on minetest.conf. + Minor code changes. + changelog.txt -> changelog.md + README.txt -> README.md + + + +## [1.10.1] +### Changed + Code fix due to changed or removed Moreblocks nodes. + + + +## [1.10.0] +### Added + + Added self removing option. + Settings/Advanced Settings/Mods/hidden_doors + + + +## [1.9.0] +### Added + + Added sand, silver sand and desert sand doors. + + + +## [1.8.0] +### Added + + Added support for the Moreblocks module. + Added bookshelf door from Minetest Game (vessels dependency). + +### Changed + + Moved the doors registrations into subfiles named after their + respective modules (e.g. darkage.lua); for an easier maintenance. + + + +## [1.7.2] +### Changed + + Removed goto statement, changed the code to accomplish the same + task without it. + + + +## [1.7.1] +### Changed + + Disabled textures' scaling for Darkage: when using texture packs + having a resolution higher than 16px, Darkage's textures will be + kept at their native resolution. + + + +## [1.7.0] +### Added + + Added support for the Darkage module (Addi's fork). + + + +## [1.6.0] +### Added + + Texture resolution configurable via GUI under Advanced Settings. + Stone doors' sound volume as above. + Hardcoded check for invalid resolutions. + Hidden doors made of ice. + Locale template updated. + Italian locale updated. + + + +## [1.5.2] +### Changed + + Minor fix - Stone doors' sound increased. + + + +## [1.5.1] +### Changed + + Bugfix - Textures applied correctly to doors, inventory images are generated + as they should. Napiophelios + + + +## [1.5.0] +### Added + + New hidden doors: dirt, brick, metals, gems. + + + +## [1.4.0] +### Changed + + Texture combiner's code changed to be more easier to understand and mantain. + Optional support for resolutions higher than 16px using + hidden_doors_res = into minetest.conf; defaults to 16. + Supported resolutions: 16, 32, 64, 128, 256, 512 + + + +## [1.3.0] +### Added + + Added the opening and closing sounds for the stone doors. + +### Changed + + Changed the module's description. + Code re-formatted to fit into 80 columns. + Recipes changed to prevent any conflict. + + + +## [1.2.0] +### Added + + Added localization support: intllib by Diego Martínez (kaeza) + Added the Italian locale file. + +### Changed + + Updated the function to handle sound's specification to allow different + sounds for different materials doors. + + + +## [1.1.0] +### Added + + Napiophelios added texture handling and the function to dynamically + register the doors. + Hamlet added the new doors. + + + +## [1.0.0] +### Added + + Initial stable release. + Cobble, stone and stone brick's doors available. diff --git a/mods/buildings_etc/hidden_doors/darkage.lua b/mods/buildings_etc/hidden_doors/darkage.lua index ea3574f..e88fc6a 100644 --- a/mods/buildings_etc/hidden_doors/darkage.lua +++ b/mods/buildings_etc/hidden_doors/darkage.lua @@ -1,8 +1,8 @@ --[[ - Hidden Doors darkage.lua + Hidden Doors - Adds various wood, stone, etc. doors. - Copyright 2017 Hamlet + Copyright (C) 2017-2018 Hamlet 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 diff --git a/mods/buildings_etc/hidden_doors/init.lua b/mods/buildings_etc/hidden_doors/init.lua index 5245392..63afaa8 100644 --- a/mods/buildings_etc/hidden_doors/init.lua +++ b/mods/buildings_etc/hidden_doors/init.lua @@ -1,8 +1,8 @@ --[[ - Hidden Doors init.lua + Hidden Doors - Adds various wood, stone, etc. doors. - Copyright 2017 Hamlet , Napiophelios + Copyright (C) 2017-2018 Hamlet 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 @@ -22,9 +22,13 @@ ]]-- --- Load support for intllib. -local MP = minetest.get_modpath(minetest.get_current_modname()) -S, NS = dofile(MP.."/intllib.lua") +-- +-- General variables +-- + +local minetest_log_level = minetest.settings:get("debug_log_level") +local mod_load_message = "[Mod] Hidden Doors [v1.10.2] loaded." +local mod_path = minetest.get_modpath("hidden_doors") -- Hidden Doors' operation mode @@ -32,18 +36,23 @@ local hidden_doors_remover = minetest.settings:get_bool("hidden_doors_remover") if not hidden_doors_remover then hidden_doors_remover = false - minetest.settings:set_bool("hidden_doors_remover", hidden_doors_remover) end if (hidden_doors_remover == false) then - dofile(minetest.get_modpath("hidden_doors") .. "/main.lua") + dofile(mod_path .. "/main.lua") end if (hidden_doors_remover == true) then - dofile(minetest.get_modpath("hidden_doors") .. "/remover.lua") + dofile(mod_path .. "/remover.lua") end -if minetest.settings:get("log_mods") then - minetest.log("action", S("[Mod] Hidden Doors loaded")) +-- +-- Minetest engine debug logging +-- + +if (minetest_log_level == nil) or (minetest_log_level == "action") or + (minetest_log_level == "info") or (minetest_log_level == "verbose") then + + minetest.log("action", mod_load_message) end diff --git a/mods/buildings_etc/hidden_doors/locale/it.po b/mods/buildings_etc/hidden_doors/locale/it.po index 4783ec8..8279f56 100644 --- a/mods/buildings_etc/hidden_doors/locale/it.po +++ b/mods/buildings_etc/hidden_doors/locale/it.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: Hidden Doors module's Italian locale\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-08-31 23:55+0200\n" -"PO-Revision-Date: 2017-08-31 23:57+0100\n" -"Last-Translator: H4mlet \n" +"POT-Creation-Date: 2018-09-12 14:18+0200\n" +"PO-Revision-Date: 2018-09-12 14:20+0100\n" +"Last-Translator: Hamlet\n" "Language-Team: \n" "Language: it\n" "MIME-Version: 1.0\n" @@ -18,17 +18,17 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.6.10\n" -#: init.lua +#: main.lua msgid "Concealed " -msgstr "Porta camuffata di " +msgstr "porta camuffata di " -#: init.lua +#: main.lua msgid " Door" msgstr " " -#: init.lua -msgid "[Mod] Hidden Doors loaded" -msgstr "[Mod] Hidden Doors caricato" +#: main.lua +msgid "Painted " +msgstr "porta dipinta di " #: minetest_game.lua msgid "Stone" @@ -210,126 +210,6 @@ msgstr "sabbia argentea" msgid "Desert Sand" msgstr "sabbia del deserto" -#: darkage.lua -msgid "Adobe" -msgstr "adobo" - -#: darkage.lua -msgid "Basalt" -msgstr "basalto" - -#: darkage.lua -msgid "Basalt Rubble" -msgstr "detriti di basalto" - -#: darkage.lua -msgid "Basalt Brick" -msgstr "mattoni di basalto" - -#: darkage.lua -msgid "Basalt Block" -msgstr "blocchi di basalto" - -#: darkage.lua -msgid "Gneiss" -msgstr "gneis" - -#: darkage.lua -msgid "Gneiss Rubble" -msgstr "detriti di gneis" - -#: darkage.lua -msgid "Gneiss Brick" -msgstr "mattoni di gneis" - -#: darkage.lua -msgid "Gneiss Block" -msgstr "blocchi di gneis" - -#: darkage.lua -msgid "Marble" -msgstr "marmo" - -#: darkage.lua -msgid "Marble Tile" -msgstr "mattonelle di marmo" - -#: darkage.lua -msgid "Old Red Sandstone" -msgstr "arenaria rosso antico" - -#: darkage.lua -msgid "Old Red Sandstone Rubble" -msgstr "detriti di arenaria rosso antico" - -#: darkage.lua -msgid "Old Red Sandstone Brick" -msgstr "mattoni di arenaria rosso antico" - -#: darkage.lua -msgid "Old Red Sandstone Block" -msgstr "blocchi di arenaria rosso antico" - -#: darkage.lua -msgid "Serpentine" -msgstr "serpentina" - -#: darkage.lua -msgid "Shale" -msgstr "argillite" - -#: darkage.lua -msgid "Schist" -msgstr "scisto" - -#: darkage.lua -msgid "Slate" -msgstr "lavagna" - -#: darkage.lua -msgid "Slate Rubble" -msgstr "detriti di lavagna" - -#: darkage.lua -msgid "Slate Tile" -msgstr "mattonelle di lavagna" - -#: darkage.lua -msgid "Slate Block" -msgstr "blocchi di lavagna" - -#: darkage.lua -msgid "Slate Brick" -msgstr "mattoni di lavagna" - -#: darkage.lua -msgid "Tuff" -msgstr "tufo vulcanico" - -#: darkage.lua -msgid "Tuff Bricks" -msgstr "mattoni di tufo vulcanico" - -#: darkage.lua -msgid "Tuff Rubble" -msgstr "detriti di tufo vulcanico" - -#: darkage.lua -msgid "Rhyolitic Tuff" -msgstr "tufo di riolite" - -#: darkage.lua -msgid "Rhyolitic Tuff Bricks" -msgstr "mattoni di tufo di riolite" - -#: darkage.lua -msgid "Old Tuff Bricks" -msgstr "mattoni di tufo vulcanico vecchio" - -#: darkage.lua -msgid "Rhyolitic Tuff Rubble" -msgstr "detriti di tufo di riolite" - #: moreblocks.lua msgid "All-faces Jungle Tree" msgstr "cuore di albero della giungla" @@ -359,7 +239,7 @@ msgid "Copper Patina" msgstr "patina di rame" #: moreblocks.lua -msgid "Empty Bookshelf" +msgid "Empty Shelf" msgstr "scaffale vuoto" #: moreblocks.lua @@ -382,10 +262,6 @@ msgstr "pietra e assi" msgid "Split Stone Tile" msgstr "mattonelle di pietra divisa" -#: moreblocks.lua -msgid "Checkered Stone Tile" -msgstr "mattonelle di pietra a scacchi" - #: moreblocks.lua msgid "Stone Tile" msgstr "mattonelle di pietra" @@ -394,10 +270,105 @@ msgstr "mattonelle di pietra" msgid "Tar" msgstr "catrame" -#: moreblocks.lua -msgid "Trap Stone" -msgstr "pietra trappola" - #: moreblocks.lua msgid "Full Wooden Tile" msgstr "mattonelle di legno pieno" + +#~ msgid "[Mod] Hidden Doors loaded" +#~ msgstr "[Mod] Hidden Doors caricato" + +#~ msgid "Adobe" +#~ msgstr "adobo" + +#~ msgid "Basalt" +#~ msgstr "basalto" + +#~ msgid "Basalt Rubble" +#~ msgstr "detriti di basalto" + +#~ msgid "Basalt Brick" +#~ msgstr "mattoni di basalto" + +#~ msgid "Basalt Block" +#~ msgstr "blocchi di basalto" + +#~ msgid "Gneiss" +#~ msgstr "gneis" + +#~ msgid "Gneiss Rubble" +#~ msgstr "detriti di gneis" + +#~ msgid "Gneiss Brick" +#~ msgstr "mattoni di gneis" + +#~ msgid "Gneiss Block" +#~ msgstr "blocchi di gneis" + +#~ msgid "Marble" +#~ msgstr "marmo" + +#~ msgid "Marble Tile" +#~ msgstr "mattonelle di marmo" + +#~ msgid "Old Red Sandstone" +#~ msgstr "arenaria rosso antico" + +#~ msgid "Old Red Sandstone Rubble" +#~ msgstr "detriti di arenaria rosso antico" + +#~ msgid "Old Red Sandstone Brick" +#~ msgstr "mattoni di arenaria rosso antico" + +#~ msgid "Old Red Sandstone Block" +#~ msgstr "blocchi di arenaria rosso antico" + +#~ msgid "Serpentine" +#~ msgstr "serpentina" + +#~ msgid "Shale" +#~ msgstr "argillite" + +#~ msgid "Schist" +#~ msgstr "scisto" + +#~ msgid "Slate" +#~ msgstr "lavagna" + +#~ msgid "Slate Rubble" +#~ msgstr "detriti di lavagna" + +#~ msgid "Slate Tile" +#~ msgstr "mattonelle di lavagna" + +#~ msgid "Slate Block" +#~ msgstr "blocchi di lavagna" + +#~ msgid "Slate Brick" +#~ msgstr "mattoni di lavagna" + +#~ msgid "Tuff" +#~ msgstr "tufo vulcanico" + +#~ msgid "Tuff Bricks" +#~ msgstr "mattoni di tufo vulcanico" + +#~ msgid "Tuff Rubble" +#~ msgstr "detriti di tufo vulcanico" + +#~ msgid "Rhyolitic Tuff" +#~ msgstr "tufo di riolite" + +#~ msgid "Rhyolitic Tuff Bricks" +#~ msgstr "mattoni di tufo di riolite" + +#~ msgid "Old Tuff Bricks" +#~ msgstr "mattoni di tufo vulcanico vecchio" + +#~ msgid "Rhyolitic Tuff Rubble" +#~ msgstr "detriti di tufo di riolite" + +#~ msgid "Checkered Stone Tile" +#~ msgstr "mattonelle di pietra a scacchi" + +#~ msgid "Trap Stone" +#~ msgstr "pietra trappola" diff --git a/mods/buildings_etc/hidden_doors/locale/template.pot b/mods/buildings_etc/hidden_doors/locale/template.pot index cbcd119..2d2d738 100644 --- a/mods/buildings_etc/hidden_doors/locale/template.pot +++ b/mods/buildings_etc/hidden_doors/locale/template.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-08-31 23:55+0200\n" +"POT-Creation-Date: 2018-09-12 14:18+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,16 +17,16 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: init.lua +#: main.lua msgid "Concealed " msgstr "" -#: init.lua +#: main.lua msgid " Door" msgstr "" -#: init.lua -msgid "[Mod] Hidden Doors loaded" +#: main.lua +msgid "Painted " msgstr "" #: minetest_game.lua @@ -209,126 +209,6 @@ msgstr "" msgid "Desert Sand" msgstr "" -#: darkage.lua -msgid "Adobe" -msgstr "" - -#: darkage.lua -msgid "Basalt" -msgstr "" - -#: darkage.lua -msgid "Basalt Rubble" -msgstr "" - -#: darkage.lua -msgid "Basalt Brick" -msgstr "" - -#: darkage.lua -msgid "Basalt Block" -msgstr "" - -#: darkage.lua -msgid "Gneiss" -msgstr "" - -#: darkage.lua -msgid "Gneiss Rubble" -msgstr "" - -#: darkage.lua -msgid "Gneiss Brick" -msgstr "" - -#: darkage.lua -msgid "Gneiss Block" -msgstr "" - -#: darkage.lua -msgid "Marble" -msgstr "" - -#: darkage.lua -msgid "Marble Tile" -msgstr "" - -#: darkage.lua -msgid "Old Red Sandstone" -msgstr "" - -#: darkage.lua -msgid "Old Red Sandstone Rubble" -msgstr "" - -#: darkage.lua -msgid "Old Red Sandstone Brick" -msgstr "" - -#: darkage.lua -msgid "Old Red Sandstone Block" -msgstr "" - -#: darkage.lua -msgid "Serpentine" -msgstr "" - -#: darkage.lua -msgid "Shale" -msgstr "" - -#: darkage.lua -msgid "Schist" -msgstr "" - -#: darkage.lua -msgid "Slate" -msgstr "" - -#: darkage.lua -msgid "Slate Rubble" -msgstr "" - -#: darkage.lua -msgid "Slate Tile" -msgstr "" - -#: darkage.lua -msgid "Slate Block" -msgstr "" - -#: darkage.lua -msgid "Slate Brick" -msgstr "" - -#: darkage.lua -msgid "Tuff" -msgstr "" - -#: darkage.lua -msgid "Tuff Bricks" -msgstr "" - -#: darkage.lua -msgid "Tuff Rubble" -msgstr "" - -#: darkage.lua -msgid "Rhyolitic Tuff" -msgstr "" - -#: darkage.lua -msgid "Rhyolitic Tuff Bricks" -msgstr "" - -#: darkage.lua -msgid "Old Tuff Bricks" -msgstr "" - -#: darkage.lua -msgid "Rhyolitic Tuff Rubble" -msgstr "" - #: moreblocks.lua msgid "All-faces Jungle Tree" msgstr "" @@ -358,7 +238,7 @@ msgid "Copper Patina" msgstr "" #: moreblocks.lua -msgid "Empty Bookshelf" +msgid "Empty Shelf" msgstr "" #: moreblocks.lua @@ -381,10 +261,6 @@ msgstr "" msgid "Split Stone Tile" msgstr "" -#: moreblocks.lua -msgid "Checkered Stone Tile" -msgstr "" - #: moreblocks.lua msgid "Stone Tile" msgstr "" @@ -393,10 +269,6 @@ msgstr "" msgid "Tar" msgstr "" -#: moreblocks.lua -msgid "Trap Stone" -msgstr "" - #: moreblocks.lua msgid "Full Wooden Tile" msgstr "" diff --git a/mods/buildings_etc/hidden_doors/main.lua b/mods/buildings_etc/hidden_doors/main.lua index a921cf3..15d4d17 100644 --- a/mods/buildings_etc/hidden_doors/main.lua +++ b/mods/buildings_etc/hidden_doors/main.lua @@ -1,8 +1,8 @@ --[[ - Hidden Doors main.lua + Hidden Doors - Adds various wood, stone, etc. doors. - Copyright 2017 Hamlet , Napiophelios + Copyright (C) 2017-2018 Hamlet, Napiophelios, Treer 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 @@ -31,12 +31,18 @@ hidden_doors = {} local description_1 = S("Concealed ") local description_2 = S(" Door") +-- 'painted' doors are not fully concealed, they are wooden doors painted to blend in +local doors_are_painted = minetest.settings:get_bool("hidden_doors_painted", false) + +if doors_are_painted then + description_1 = S("Painted ") +end + -- Hidden Doors' sounds local hidden_doors_vol = tonumber(minetest.settings:get("hidden_doors_vol")) if not hidden_doors_vol then hidden_doors_vol = 5.0 - minetest.settings:set("hidden_doors_vol", hidden_doors_vol) end stone_default = default.node_sound_stone_defaults() @@ -70,12 +76,8 @@ local Y4 = 0 local X4 = 0 local hidden_doors_res = tonumber(minetest.settings:get("hidden_doors_res")) - if not hidden_doors_res then - hidden_doors_res = pixels - minetest.settings:set("hidden_doors_res", hidden_doors_res) - end @@ -171,6 +173,37 @@ else end +function hidden_doors.get_painted_texture_suffix(use_default_16px_res) + + local texture_suffix = "" + local texture_suffix_inv = "" + + if doors_are_painted then + + local paint_opacity = 35 + local paint_opacity_inv = paint_opacity + 15 + + if use_default_16px_res then + texture_suffix = + "^((hidden_doors_painted_overlay.png^[opacity:" .. paint_opacity .. + "^hidden_doors_hinges_overlay.png)^[resize:38x32)" + texture_suffix_inv = + ":8,0=hidden_doors_painted_overlay.png\\^[opacity\\:" .. + paint_opacity_inv .. "\\^[resize\\:38x32" + else + texture_suffix = + "^((hidden_doors_painted_overlay.png^[opacity:" .. paint_opacity .. + "^hidden_doors_hinges_overlay.png)^[resize:" .. image_size .. ")" + texture_suffix_inv = + ": " .. X1 .. ",0=hidden_doors_painted_overlay.png\\^[opacity\\:" .. + paint_opacity_inv .. "\\^[resize\\:" .. image_size + end + end + + return texture_suffix, texture_suffix_inv +end + + function hidden_doors.register_hidden_doors(modname, subname, recipeItem1, recipeItem2, recipeItem3, desc, sounds, sound_open, sound_close) @@ -188,18 +221,22 @@ function hidden_doors.register_hidden_doors(modname, subname, recipeItem1, "0=" .. texture_name .. ":" .. X4 .. "," .. Y3 .. "=" .. texture_name + local painted_texture_suffix, painted_texture_suffix_inv = + hidden_doors.get_painted_texture_suffix(false) + doors.register("hidden_door_" .. subname, { description = description_1 .. desc .. description_2, tiles = {{ name = "(" .. new_texture .. - "^[transformFX)^[combine:" .. image_size.. ":" ..X3.. "," .. + "^[transformFX)^([combine:" .. image_size.. ":" ..X3.. "," .. "0=" .. texture_name .. ":" .. X3 .. "," .. - Y3 .. "=" .. texture_name , backface_culling = true }}, + Y3 .. "=" .. texture_name .. ")" .. painted_texture_suffix, + backface_culling = true }}, inventory_image = "[combine:" .. inv_size .. ":" .. X1 .. "," .. "0=" .. texture_name .. ":" .. X1 .. "," .. - Y1 .. "=" ..texture_name, + Y1 .. "=" ..texture_name .. painted_texture_suffix_inv, groups = {cracky = 1, level = 2}, sounds = sounds, @@ -219,18 +256,22 @@ function hidden_doors.register_hidden_doors(modname, subname, recipeItem1, "0=" .. texture_name .. ": 22," .. "16=" .. texture_name + local painted_texture_suffix, painted_texture_suffix_inv = + hidden_doors.get_painted_texture_suffix(true) + doors.register("hidden_door_" .. subname, { description = description_1 .. desc .. description_2, tiles = {{ name = "(" .. new_texture .. - "^[transformFX)^[combine:" .. "38x32" .. ": 16," .. + "^[transformFX)^([combine:" .. "38x32" .. ": 16," .. "0=" .. texture_name .. ": 16," .. - "16=" .. texture_name , backface_culling = true }}, + "16=" .. texture_name .. ")" .. painted_texture_suffix, + backface_culling = true }}, inventory_image = "[combine:" .. "32x32" .. ": 8," .. "0=" .. texture_name .. ": 8," .. - "16=" .. texture_name, + "16=" .. texture_name .. painted_texture_suffix_inv, groups = {cracky = 1, level = 2}, sounds = sounds, @@ -256,18 +297,9 @@ dofile(MP .. "/minetest_game.lua") -- if minetest.get_modpath("darkage") then - dofile(MP .. "/darkage.lua") - end if minetest.get_modpath("moreblocks") then - dofile(MP .. "/moreblocks.lua") - -end - - -if minetest.settings:get("log_mods") then - minetest.log("action", S("[Mod] Hidden Doors loaded")) end diff --git a/mods/buildings_etc/hidden_doors/minetest_game.lua b/mods/buildings_etc/hidden_doors/minetest_game.lua index 4eb2cf1..cd3cb0b 100644 --- a/mods/buildings_etc/hidden_doors/minetest_game.lua +++ b/mods/buildings_etc/hidden_doors/minetest_game.lua @@ -1,8 +1,8 @@ --[[ - Hidden Doors minetest_game.lua + Hidden Doors - Adds various wood, stone, etc. doors. - Copyright 2017 Hamlet , Napiophelios + Copyright (C) 2017-2018 Hamlet, Napiophelios 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 diff --git a/mods/buildings_etc/hidden_doors/mod.conf b/mods/buildings_etc/hidden_doors/mod.conf index 9493c0b..6da09a3 100644 --- a/mods/buildings_etc/hidden_doors/mod.conf +++ b/mods/buildings_etc/hidden_doors/mod.conf @@ -1 +1,7 @@ -name = hidden_doors \ No newline at end of file +name = hidden_doors +title = Hidden Doors +author = Hamlet, Napiophelios, Treer +description = Adds various wood, stone, etc. doors. +license = GPLv3 - CC BY-SA +forum = https://forum.minetest.net/viewtopic.php?f=11&t=18294 +version = 1.11 \ No newline at end of file diff --git a/mods/buildings_etc/hidden_doors/moreblocks.lua b/mods/buildings_etc/hidden_doors/moreblocks.lua index a424dab..93f062e 100644 --- a/mods/buildings_etc/hidden_doors/moreblocks.lua +++ b/mods/buildings_etc/hidden_doors/moreblocks.lua @@ -1,8 +1,8 @@ --[[ - Hidden Doors moreblocks.lua + Hidden Doors - Adds various wood, stone, etc. doors. - Copyright 2017 Hamlet + Copyright (C) 2017-2018 Hamlet 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 diff --git a/mods/buildings_etc/hidden_doors/remover.lua b/mods/buildings_etc/hidden_doors/remover.lua index 845e6a5..ff718e3 100644 --- a/mods/buildings_etc/hidden_doors/remover.lua +++ b/mods/buildings_etc/hidden_doors/remover.lua @@ -1,8 +1,8 @@ --[[ - Hidden Doors remover.lua + Hidden Doors - Adds various wood, stone, etc. doors. - Copyright 2017 Hamlet + Copyright (C) 2017-2018 Hamlet 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 diff --git a/mods/buildings_etc/hidden_doors/screenshot.png b/mods/buildings_etc/hidden_doors/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..effd45194b64181309f6e9ae6e0752606d6d9499 GIT binary patch literal 86678 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 literal 0 HcmV?d00001 diff --git a/mods/buildings_etc/hidden_doors/textures/hidden_doors_painted_overlay.png b/mods/buildings_etc/hidden_doors/textures/hidden_doors_painted_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..0f620654a234466f5caa5ef9bcaa79631bbee9c8 GIT binary patch literal 621 zcmeAS@N?(olHy`uVBq!ia0vp^YCx>O!2%?&p z0*}aI1_o|n5N2eUHAey{$X?><>&pI!lZR14tT({lUEyy&tK&x|b$XFRyyT@&k`yzI0~yW}jr%h&Q0nD+fj+W+xxWO?LCXHm5s z2Q&pG%Wv9eY>BBho5=m-{>>`}G8~s@osCHst6r1t7h=Y2pK81!=hcooQ}=yQ;F!lN zvMcp gt3=UYXk}z#Wo!Y_kYFs-0@T3Z>FVdQ&MBb@0QW)ZZ~y=R literal 0 HcmV?d00001 diff --git a/mods/buildings_etc/my_castle_doors/depends.txt b/mods/buildings_etc/my_castle_doors/depends.txt new file mode 100644 index 0000000..4f77cd1 --- /dev/null +++ b/mods/buildings_etc/my_castle_doors/depends.txt @@ -0,0 +1,3 @@ +default +my_door_wood +doors diff --git a/mods/buildings_etc/my_castle_doors/description.txt b/mods/buildings_etc/my_castle_doors/description.txt new file mode 100644 index 0000000..2e44599 --- /dev/null +++ b/mods/buildings_etc/my_castle_doors/description.txt @@ -0,0 +1 @@ +Castle style doors. diff --git a/mods/buildings_etc/my_castle_doors/init.lua b/mods/buildings_etc/my_castle_doors/init.lua new file mode 100644 index 0000000..450e098 --- /dev/null +++ b/mods/buildings_etc/my_castle_doors/init.lua @@ -0,0 +1,2 @@ +dofile(minetest.get_modpath("my_castle_doors").."/locked.lua") +dofile(minetest.get_modpath("my_castle_doors").."/unlocked.lua") diff --git a/mods/buildings_etc/my_castle_doors/locked.lua b/mods/buildings_etc/my_castle_doors/locked.lua new file mode 100644 index 0000000..86a6492 --- /dev/null +++ b/mods/buildings_etc/my_castle_doors/locked.lua @@ -0,0 +1,141 @@ +local cdoor_list = { --Number , Description , Inven Image , Image + {"Castle Door 1" , "door1"}, + {"Castle Door 2" , "door2"}, +-- {"Castle Door 3" , "door3"}, +-- {"Castle Door 4" , "door4"}, +-- {"Castle Door 5" , "door5"}, + {"Castle Door 6" , "door6"}, + {"Castle Door 7" , "door7"}, + {"Castle Door 8" , "door8"}, +-- {"Castle Door 9" , "door9"}, +-- {"Castle Door 10" , "door10"}, +-- {"Castle Door 11" , "door11"}, +-- {"Castle Door 12" , "door12"}, +-- {"Castle Door 13" , "door13"}, +} + + +for i in ipairs(cdoor_list) do + local desc = cdoor_list[i][1] + local img = cdoor_list[i][2] + + +doors.register("my_castle_doors:"..img.."_locked", { + description = desc.." Locked", + inventory_image = "mydoors_"..img.."_inv.png", + groups = {choppy=2,cracky=2,door=1}, + tiles = {{ name = "mydoors_"..img..".png", backface_culling = true }}, + protected = true, +}) +end + +---[[ Crafts + +minetest.register_craft({ + output = "my_castle_doors:door1_locked 1", + recipe = { + {"default:steel_ingot", "default:glass", ""}, + {"my_door_wood:wood_dark_grey", "my_door_wood:wood_dark_grey", "default:steel_ingot"}, + {"my_door_wood:wood_dark_grey", "default:steel_ingot", ""} + } +}) + +minetest.register_craft({ + output = "my_castle_doors:door2_locked 1", + recipe = { + {"default:steel_ingot", "default:glass", ""}, + {"my_door_wood:wood_red", "my_door_wood:wood_red", "default:steel_ingot"}, + {"my_door_wood:wood_red", "default:steel_ingot", ""} + } +}) +minetest.register_craft({ + output = "my_castle_doors:door3_locked 1", + recipe = { + {"my_door_wood:wood_yellow", "default:steel_ingot", ""}, + {"my_door_wood:wood_yellow", "my_door_wood:wood_yellow", "default:steel_ingot"}, + {"my_door_wood:wood_yellow", "my_door_wood:wood_yellow", ""} + } +}) +minetest.register_craft({ + output = "my_castle_doors:door4_locked 1", + recipe = { + {"my_door_wood:wood_brown", "default:steel_ingot", ""}, + {"my_door_wood:wood_brown", "my_door_wood:wood_brown", "default:steel_ingot"}, + {"my_door_wood:wood_brown", "my_door_wood:wood_brown", ""} + } +}) +minetest.register_craft({ + output = "my_castle_doors:door5_locked 1", + recipe = { + {"my_door_wood:wood_yellow", "default:steel_ingot", ""}, + {"my_door_wood:wood_white", "my_door_wood:wood_yellow", "default:steel_ingot"}, + {"my_door_wood:wood_yellow", "my_door_wood:wood_yellow", ""} + } +}) +minetest.register_craft({ + output = "my_castle_doors:door6_locked 1", + recipe = { + {"my_door_wood:wood_grey", "my_door_wood:wood_grey", ""}, + {"my_door_wood:wood_grey", "default:steel_ingot", "default:steel_ingot"}, + {"my_door_wood:wood_grey", "my_door_wood:wood_grey", ""} + } +}) +minetest.register_craft({ + output = "my_castle_doors:door7_locked 1", + recipe = { + {"my_door_wood:wood_red", "my_door_wood:wood_red", ""}, + {"my_door_wood:wood_red", "default:steel_ingot", "default:steel_ingot"}, + {"my_door_wood:wood_red", "my_door_wood:wood_red", ""} + } +}) +minetest.register_craft({ + output = "my_castle_doors:door8_locked 1", + recipe = { + {"default:steel_ingot", "default:steel_ingot", ""}, + {"my_door_wood:wood_dark_grey", "my_door_wood:wood_dark_grey", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot", ""} + } +}) +minetest.register_craft({ + output = "my_castle_doors:door9_locked 1", + recipe = { + {"default:steel_ingot", "my_door_wood:wood_yellow", ""}, + {"my_door_wood:wood_yellow", "my_door_wood:wood_yellow", "default:steel_ingot"}, + {"my_door_wood:wood_yellow", "my_door_wood:wood_yellow", ""} + } +}) +minetest.register_craft({ + output = "my_castle_doors:door10_locked 1", + recipe = { + {"my_door_wood:wood_red", "default:steel_ingot", ""}, + {"my_door_wood:wood_red", "my_door_wood:wood_red", "default:steel_ingot"}, + {"my_door_wood:wood_red", "my_door_wood:wood_red", ""} + } +}) +minetest.register_craft({ + output = "my_castle_doors:door11_locked 1", + recipe = { + {"my_door_wood:wood_brown", "default:steel_ingot", ""}, + {"my_door_wood:wood_brown", "my_door_wood:wood_brown", "default:steel_ingot"}, + {"my_door_wood:wood_brown", "my_door_wood:wood_brown", ""} + } +}) +minetest.register_craft({ + output = "my_castle_doors:door12_locked 1", + recipe = { + {"my_door_wood:wood_brown", "default:steel_ingot", ""}, + {"my_door_wood:wood_grey", "my_door_wood:wood_brown", "default:steel_ingot"}, + {"my_door_wood:wood_brown", "my_door_wood:wood_brown", ""} + } +}) +minetest.register_craft({ + output = "my_castle_doors:door13_locked 1", + recipe = { + {"my_door_wood:wood_brown", "my_door_wood:wood_brown", "default:steel_ingot"}, + {"my_door_wood:wood_brown", "my_door_wood:wood_brown", "default:steel_ingot"}, + {"my_door_wood:wood_brown", "my_door_wood:wood_brown", "default:steel_ingot"} + } +}) + + +--]] diff --git a/mods/buildings_etc/my_castle_doors/mod.conf b/mods/buildings_etc/my_castle_doors/mod.conf new file mode 100644 index 0000000..0bbfec7 --- /dev/null +++ b/mods/buildings_etc/my_castle_doors/mod.conf @@ -0,0 +1 @@ +name = my_castle_doors diff --git a/mods/buildings_etc/my_castle_doors/screenshot.png b/mods/buildings_etc/my_castle_doors/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..84376be2214ab75e3b97f8b85b350a21b39ff473 GIT binary patch literal 141125 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
OSM?J#OB+Ls1yo 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°g0ECJ8 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

d__MyNC2j2x+ zJiH5Nu0rn}V->X5hVh31$A1`6=Zd~IOwSR+`2$i%bT^Gs-ArT8|MLj%9p-PWy2cY9 z{F~8%kCy>);3#T+R3MRCcKhoCb)oCL*{CQU__-f;s*;a@s!3*-Op*$Lz-MZtnrSP|p)z_M%@m2UT*HfF_dyGZduADJb7`sn#L7?%nPcEXW=gSS8` z7aYpWCHtmdX{-GWj$N-GdHCl?MSgJMzoAR&+HB#>#LZv@H@!j*)xKY6@wI94L?_t} z(OaRo-kYhUbf*|MBQl_Igf~40_|fC>g{ETfIL>A^&4(&7*r?A1c6b|F-&=SbryAUU zrK5E%wr493s@NC^X1Vr84{^Z}#XmUQe$A-4VHj+GVxZ086!8B6S{G#Mw_}r600000 LNkvXXu0mjfox=fB literal 0 HcmV?d00001 diff --git a/mods/buildings_etc/my_castle_doors/textures/mydoors_door1.png b/mods/buildings_etc/my_castle_doors/textures/mydoors_door1.png new file mode 100644 index 0000000000000000000000000000000000000000..8357a8ac5aea8ef16969a32634ae7a2a1da27ebc GIT binary patch literal 3332 zcmV+f4g2zmP)2+%GjiUA=5HU#5?55WKR{b9KhBJqf$NU<$p*%pXI zUgCq-yX)O~bPl-stLf?P>Gf`MNlUAJ%%iHS>+!4VniVfzyifpeetwSs(rC3>0DzN| zlbNoQS(ZU5h5y=6N+HX#;PZ9U#;g?^2!RqQNgb@DD0v zi{nBFD5dmw^StZVucO^=qbLdpAv8Sz`m<6BQc8@+V|@DbscZ@t^oa&pg=rlopLBd> zWd%Zr%3Lb~6^dz9)$+unM~{?J3Tc`mioQy5cXt;;2uLX*rPQBIMmV!vaI^^gm=FS2 zuU^HKD_0<;M4soG9(^u~0)xQ-U%q^)+@H?135xD-3QQ@5qA2v|m6a7uuhD3PX|xc4 zQpoZQaTG%mL6SBJi@!){T!{1=O^lebT|?hbPEK%kc7~!T5XZ4T7RND)qQKeN8BR`4 ztk=?KPK)T7JlW_AA+*&H?LZs;dQBAn-y~_6!s2$%zdwHb7)4RQ3>e$n+ofx1a$FPs z`s*(UA+WTxRMLjwaHx;*dvXmYlYQ{uLFt}x979TpH*emQcs8}4=6L7M9j}Zg(M*fpXqyS=W_qJyu7SUiJ!~) z6GGt4n>Q7$CxLTU;TkSsSp{aA8WH~Chaa@C@;t|MI>l%-(!bFpqA0?5-+hO@y}gpz z@X_gX&}y}irfCTi*&-Tg;P>Bu4Hu!vzO6c)4&pe*&6_uIaBxr(J_(LYh-(OsSlrU8_pM3l$aseE9G| zoSvQ{O;aREf?lszx^Kwpk{QwH^?FE>1ZkS$^z_szEC6`*>XjIe$NKxzr%x-sI2f-v zc$GE{qp`NOris)Ei^k#Mp*TA`LzZPok_6puw-nxeLgVKsrO@qmkt7MSEW_E^84eE* zYw2^LDW$Nswq~8%WrtP6=#^y|ilPV>7L9|012G&9HQw<7T2o-$$u}Ae_Y$((ILBV-JRL!DL7 zTrQW`8fK;FH3cV@fT+S*dBR!a+vqNXpGqna2^DvBbs zS}kmCZOu%dcqVh4W#OZ^s%c3hf$*8+?(QxKOC_FU)Tb>}_oBR#1Y+|iv_N#u-rgSa zJl9F{tRqPhjp58<=%sz4%_R9dPjY9`vggmAD=G*Mhr>#`WfOoIMU_$-OGQzH=g*(3 z%V-w`9CL09bNbwueEReWX__L>b2OVx+`D(LmgyHSUMQ+sq-lzsot;Xt&ss~jR7!Ss zc623J2m#vR@{N1)36DP=blGLN0qYn!f}}CW1=X+@$oSLU}1oGVI3bI z>wN+`&zEJ)tzn#Tr4;)8zSgujjx}VUmk>hNtKPqV4=E+0C@Ps*Q53aN(yWrwJ>I{6 zkI`s^EX#DEl3tBQqa>_;zh80#JcC%chM74XcgX#IAAkP&C$3$)hEAuW^GzB%J3A#I zNhx(m=cwDnXEbRZ{>{w{r4+Wew~^<0r6!-}IYy%qK7amPDzV$N)|<*@1!U~kLhvCU6z8o1A3uK7Os8pz`}gmo z)oRThj%k8vnqoK{BFi%Ev$&?jag1-i`9>$)^G39yC~$s$j^BR!P2W>Wi5oX=gtrRV zG>mW8^Fd*H(ZgI>-l{Mfjqpzn-lj0O(_da*Mw+Hb(-bQ!DG%5>kH=`Y+ZCkWZnrTWkJ0b<_4#HCQyop4 zFgYJIx22_}N+mdo>$NOTvvPmf-rinil}u(i=Ha;^hZ(k(DPsKi_!yJPqyj7_lL?NG zkDb8Rw)`XRyKTs zr_Zi-C%$1}((_pYKi4dPn(bS5NnC8TL50BzbAq-?giW1Y8fCjjXvLLZ>k?c@F_Hvt zmX@s7DFg}2Sq}?QU0V-qT`yLMz)ZpWG%KX{YtavF#J&=-tq^B!d%4=b`Bs~+uiiE} zvjftMcxGYKW_q^oix8glZ9@2VdFrC0tH2k;l%Yko`-SjfmU(RVI3J(Sr(t!bV%tn` zJ#65rV}+QxYxBgX(VVwX;kMeXz=A=9EX%8#AT|eV7V>YnW@JHPmmJ{R}o(;)-mxa=58EX7mf?zfM@qW($+a`Q@UdX+|z4Y!2Ogn83C{ z>=KyGcX2`5%-&VTo>j9ZlXEClKzP7w91^j7=$k)rL5cLN=}kyrFq?|aCrUzqbC|!D zvjJB#$#vE3O`(|+Gb2>UD!a7VwJTKDhRNsfk2a&&9H&ia{Fv#CFAE2JaKaW`TtW*C zSQ=iOPv%4VzU14si)3!-nh|QIr!XvZ%>>&8P+k7Ct|__IYF-**-OpN0tpV0a((uCyvn*m`I>h9BMMWP#cEONP9OnYh&T4ASM#yxU`lF;T zod{_jUPPyi&6Lfcr32S0&%rF*|f=|W&XQ>&%aT-m928CQ=U9W9MGR{)v#N)ZdLvbz-1CPly2J)H6Lt$ z^5h9RolZqyolXZ&o;;~MdK^l}%)h(?jEx(lop&C>E=cHx_gKJl??T(y4sy)9sCiP(P)I9e)`GU zD)8*tGjuwgixp0T{sEw_uFo5WN!Y%>k_mG9w!e~z;}~%qYg3tPRW24FO;Zd8gGzrE z(H{&3y6uzqQ_Mq`?!~ooVf|rdrQx6W^B^)ATYuOh7AGXtn(41(jPW;{&Oaa4aN6bo O0000Q#3)4wN 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 literal 0 HcmV?d00001 diff --git a/mods/buildings_etc/my_castle_doors/textures/mydoors_door10_inv.png b/mods/buildings_etc/my_castle_doors/textures/mydoors_door10_inv.png new file mode 100644 index 0000000000000000000000000000000000000000..d3093e9651d6ddd309d462d3d615ee9d9aae5566 GIT binary patch literal 1112 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 W@=F0}P)t-s0000B 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 Q>i_@%07*qoM6N<$f`v)!S^xk5 literal 0 HcmV?d00001 diff --git a/mods/buildings_etc/my_castle_doors/textures/mydoors_door12_inv.png b/mods/buildings_etc/my_castle_doors/textures/mydoors_door12_inv.png new file mode 100644 index 0000000000000000000000000000000000000000..11f4957880d1dd27d7979089c8087af41a50aa16 GIT binary patch literal 998 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!S^|7RT!FNrgn*KypsKWxx~zz% zoQRgZsJ4QbuA-QplDNLIgubq>p^Ai&s-&@+l(CVKv9YnKx|ErQw7I5?rKXIPmaLV9 zg|)VvwUw2Pj=Y_&yuF@+lYyd>gM+i7l8ceDi<6U^v9h~~iifGHmzk=!xtfoKy04d) zpQU<6T2xtCSyMy9*-y)t1Kq(`666=m;PC858Uq8ffTxRNNCo54h{WPs20U-sd=GkS zs-CpT*?vp7aq8Ru|Mwr=^hwdATx0h7~Z2wvx;9|GK3pJABdV_Wf6vMdgRD zD>^KFcz=8K@cM4sszA(PHu}7TT+niysi(r|LIz3lDe0htO-So*`%^?UC~gGWzmwva{9CF{YHRoom6~u;$${pmgYo zS9!fauE6G9|1WkfpKx_6!vmRgMvK+2-vxKPuuapbNGa8BW~+H-$-uP3kin+8tmaiZ zLtkX9Gn=f`oQnV1Rc&G4u2eHOe4g{*kAl77aS3?JtCna-@D-M@864$_Ifn9$a?M-Q7g%q!Be*ETb1nQXGuLl zGx`b*d8fTDIJV}fgi7ndj~w3WVN44mr%zm>`qDy8>!FKJh!{%>A zlHQwA>@Tcoj@hEJ1;p4J!!@x*_4mOUTVuEcy-t5)J}Ffs*{O4r|JYn7y)4bRP4X^J zb*DSA>`AfjI2Ene>hYvQuA^>Xwji?_uSCy^Jx7Bz)@Yp0x*6b7 z_f&V@rLK-OYz-=(wDUhs2~#<|WbHv8yVL7|ilQd!WEZ&^_ac~%mEFs|TsN(`w=V~* z+9hRePue9voyrVX4~8{qLic91hpC*-Vhs4%T7J@5TWM2Rn6c=+RrQtLHHoH^Kh2X| z2jc%Xi8<|~wI{z_d%j$+wx0%&_4;YbhRrs|Tfe95sQR~~qM7Z}oKN$3!c`=mGYPHu z0Aw-fN;0fqbpR&d^1e*cMI^z?*NZDq+C QU`Ao^boFyt=akR{0DD`a*#H0l literal 0 HcmV?d00001 diff --git a/mods/buildings_etc/my_castle_doors/textures/mydoors_door13.png b/mods/buildings_etc/my_castle_doors/textures/mydoors_door13.png new file mode 100644 index 0000000000000000000000000000000000000000..c6556eb0db77f916ae9c552dd656199dc8a74692 GIT binary patch literal 2784 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 v^1T5=QPm$}RdElls09 literal 0 HcmV?d00001 diff --git a/mods/buildings_etc/my_castle_doors/textures/mydoors_door3.png b/mods/buildings_etc/my_castle_doors/textures/mydoors_door3.png new file mode 100644 index 0000000000000000000000000000000000000000..59b2ea8a595fd300ac3de9801289f3e90e12d7b3 GIT binary patch literal 1482 zcmV;*1vUDKP)00006VoOIv0RI60 z0RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_000McNliru-~tj4G7?YKA5s7S1y@N# zK~z}7&6qoHB*zhezpCo#nb{Xf2L^nG;lP&Q|8T+m|I`QK0;d8LNaypB%X##x9L(|{ znFa`A18I|KVD{_Ynd++gdgZ%!cP^>~Gep45FcsV#QDa?KV(ciTVx|Z}E(L&GD&88` z@a9kvT5E`a0GQ994nX8yXZ5VVW0GE|k`2-e~U3^U85Q(rV#xdfJ{gR}i?C zUvs6_2JRq&H)qKOMU)T>Go@3b0i`uks$_>4x^1yiSeHce20*Qi=5Q_V2)R|%pw$K< zwC2e7f4=jZ+XK6PU|timo@lMHt}9*F5kes6jG3XT?DY{TaGq9DPPjL&;X5;yl<6+_ zYi(3_)ZJN9MMTKC;_lqv-^+&&ANcg?lYIR6QQp6Q&;9+qq?9=BMy55pE(!%7sVpMjCVn0-%d#!hDz#M_a4ny5rM5<@+uobjL@pI=K;L&foEP@{kr?Bz zCi&&K?|Y^>aeH&3ctwG0`M%SwH27B6Ix~VPDmZS=*T*xb{SJ2r;BYv6oA`NLN+GR< z(_x_RhwY7B$uGIFj~&e&5G*K5DySnU%D9i*p7!4+e!l*496}(NVxgmtw%xmuAEQxQ zBL>BBQf>qjg>jzr}?tSYI7bRpEwViygR^2p7_g+aM%sZYhhUu3S7&Z z3iDbJft(AaHezR}AcTO6kxIc#@Y=YR$3cVOzJ(Q>^O}Bp9}B7k-G1yCjU`o7_&xa8)-Ml3 zq&5e+6m7vNrE=H}$ECmtRrf-2Lx(7bI9wQk06E$^4N`nV)ah2t2v z@cyq)HIyNCO!LILB#!$LM46UEnqT*^xAL(IsBB5$D7iGE$x9#e=Ac`4oX<16p~J-4 z4UyvQRUdmRzpMpS#RP&1+m!aw$676@1rCQj)f;ZQom|}MhyGO`do#~w6#z>qtfk`Z z|M=LlCScnKL*Mgoo>-Sm-}l_?$5(yqt-P9I>ZIZf7Z*#_U;3EZ*8irb#2-!v9v&ZA z%Vr6&?_c$?xAJQ)h$v&P)XSOD-Cz3HejG7`QZgY1zJ56qLqKt!o~BoQ?9IFjr8MTX z&>Z^C2xePLdU%-G9}j%~^1$8gk;n5w2!^<@JL~{>nwPD{xHC`FRxsVUmLFrd_`cAY zP^ts|(#NJXVIriGDY-BnMsDv;Jf3Iz7+>|VxAL3aI-Mz{IjwCc^WTM!nQTox<${W^ zAG+V($ASsfom?xiGY~j03HjTfZhiafXgfxU$Yzqwv0&tsw`-|%!N50P0%+bysc;SN k)$!(p5SUYD3`PO|3oz747Ghibi~s-t07*qoM6N<$g3y!Ft^fc4 literal 0 HcmV?d00001 diff --git a/mods/buildings_etc/my_castle_doors/textures/mydoors_door3_inv.png b/mods/buildings_etc/my_castle_doors/textures/mydoors_door3_inv.png new file mode 100644 index 0000000000000000000000000000000000000000..46036dd65838e332c8a0a360df52b9fb2b8a9f1e GIT binary patch literal 982 zcmV;{11bE8P)Nkls3Uig2Zm1Z_zqUu2<0KJm}OATME}3@*HpZ->aX! zOr?aFFO511@}7ou>R>zcu$y}LXPd)ql<@a;h85R$^BB8XjI7(jqThj61OS^GolD zv5Cupg~KL=-zsA@uyH%}aYbO$z99heZWC@19&pr)qX)R5EglHN5WerjvMhL>C-ZK% zdt8(8m|!Qqj*ua9iwZ$Vl3k^akS+)UdFj*Bli1U->$=!ZJmHM5Rp6=xg&?O({~GmR zH{N~&@bK^;_H=ywZ9R10F!o`)RtyOp%5W64v0(f=wb$bA5Ha5~#*&U>^5Nqm#yBysh)oI4 z^{^{RY2dXmA#vRz02uW*=v4o}H0mH=;Yn;oHtbt<9OjY4d)c?7Kz$&f8G*!RgGoy( z1^}hUSeB8vOs|Y@VyU7)zE8Igxz$roOVwD zo6N<>Rg5{;wqp+?U#Im2z$DNG0Et_G4F3Zl?4AaUbKb=Vx_(EdA66+wB=G;llfX{#79<9)hfE^wRTfk3aEzaI$Lp6{2jWX7zk;%+lQ?xxbh~B1Q)@UZB4j-kES_T1MAEYN#;E17oIw{6#;NF=`s5mzx#n-vmcPp zY)`AmCpSOC<PV>nfNL@5z5i`&D)JofAL00006VoOIv0RI60 z0RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_000McNliru-~tj4G9-X+ipu~11aC=1 zK~z}7&6v%O+%^z|ziyI}W)Z_kF3HvK`@dEWIR$XME0N9a9LSkjdyOpC3Sesv!_lbt z*VWZUNrn(W1q2Ws?Epl;3{nDjPz3<*wvo0P{&MTFWKy*nPk_&{sM zx)j2lqt>xncbF?YgKs@>=eEV+_a1pB_r$B!SWwaU}elYIE_fqmb_%vejISuhvQS-j0jb%)-^WCcbjvqDzoXxy%d zc+pNN5fL;S87K4qGk8^@^+|StOHp!``CEn7+DO|;%5Pm}Huy2q`zjS@@HWYRrNv>6 z^%$YdIk6wkqGMIhJ9*yDIa8Z)Sx4tGLwN?D)5vH7dWWQtR7NP#;K^ZI_14+4EHB!< zcg%uqE#!31sx$c3VatNg&XNkvrd$X@5x8v27u@*zN-2>9R1-Pf@1MahS?~zTZK8qd zl#68P@ zs)Q)r9Tg$sDzM*=CqNQJ3{3;r&40WfOA1L8>%(w1dsf7Mq#qmg(%F`~`o|0@?!j6z zJ%ZjrRjJMJZfqB2KMWP2nGpo4!nG8h#Yc>S{#0Y|Yn5x2`^rxNB_&z|Yn^pjK%kjn zjo1Cy8}TI#i*qee)`vfP;m5*9fJNXq8cSA`L0}JF^fnG*-Vo#|p#SB^z6XE3ng^|q$-nSp79&7Om7JC1XjmIw>ax7<$KHy+okG^&6Kuk M07*qoM6N<$g2h`<0{{R3 literal 0 HcmV?d00001 diff --git a/mods/buildings_etc/my_castle_doors/textures/mydoors_door4_inv.png b/mods/buildings_etc/my_castle_doors/textures/mydoors_door4_inv.png new file mode 100644 index 0000000000000000000000000000000000000000..f10c4339d482fbc7a4028e6b2173b9c165444e63 GIT binary patch literal 744 zcmVP)70?)sr5XkA1m6;w_N-`^S{5^Y%fh3pl^(<*~@7Na+!j>o_YkKJ?i;oZn^qk zWN9l21pttNK5ig}Xk}CohtA1q^zw4bg6B_jlH1bCd5ki5jsV7J$^jT#D_LJUr%HxK zZCew>ZOsz(`BDAL6nQqa6#!tBNr5K={Ax0gQj!>>IOimUfITeE;1lc^EmP)8F_4@B z$R0(y2Y_^*hX(n+19*Rbr+xJCY#lrUCu<}WN&%@~H2;+` zp!-VzNDBbeXxowuEZIq0vDcYroWH%j(LVTOU`$qWvjq>u01UNQwNt9@06srIX&-&> zw>mj03#l&1z+rF_tdZ*+Q3GEBz_TG3IZd%_8+HM$XrTcBaBn;BJy%`V_dNp7ss+d1 zi7O<!&7ZF*=1@8i;AP@jq;MZOiz}kCxKJts9 ze$WcF5dcU(0oWp4Kme@nDQd7jfO=j&w`1n{(~?kl1aO@q|87!d8v8R3e8+j9+pcB? zxGs@}nH^aGxc%pWc56du0y=@TXAhs^wEsMiD)f7VWe5B^s1|rK08snS1JQ!|7St2i z^V^%>#+DU)!5j3OX3E(_70Pr&pe9w8{-cr%B74NrW=Xu6`L#wOC8P>ne a1HS>zPZxBbQc7X~0000GP)00006VoOIv0RI60 z0RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_000McNliru-~tj4G%_OLm>d8A1qMk( zK~z}7&6iD&+{O`xpQ`RAIow&TWL*Tra(v4rCmjSQf5phZ6c+j^J}ZU;CxElsnOTzk zRXK3U{g8phng@lzV48=gS*)&l>!tkox3`A#ICZE3>hTI@hH0S00oMddDyUba3bkec zQZ7(3Tlih$F*B;MUcm_-fu`-SXoNnnZyH1$OT>bYq zcD-=@>os{JuL2c8F`UX8pemKn3(`77gmD~6xsa-XRtzJKk^ZcM5;;vL0CKG0U@Kp$ zQR-dBN;Oh3v`D}=9_IybN)aKMkz-}Tq1w$4D}^*B&b(5w0~>B(N(+ zP{(*UuANaz`C{$8$7&(w5vtsbp$i<35r4KPgz#{ad+VlY7=}cL^%i4A-C8cRglv=zZU>8!zip3TY_3*f&Txn=`hNUuvw}Q`lK9aA;N9*Dd?=yN!SE za?asYFyGR(IzMb9ADpZmX=bZr$UlB~YvJ_;<^pX@eA4fzwc?y3=eebG&U9Tz&Y3^g ze-h3EK^_18*KfE|*uuBLuMMzk978O#j#Y#4`kL2o|HSF%1K(Zz%&rMsUtRI$%^Utx z2Et%qm1f^yx#KV;jDoL~vXNJTF;#*Sa;dA>Dq7KTq#kb&E97w`=8E_^wY@4L!Zb~^ zp(W))y~*U|d^YkTvWo2ef5j@+oO7BC?f2B=>AMcG9jeN4%-|) zt$Z$Xwt^F4uB-Yh>QMt%3XNC#^A2y7{fiE3j4oATja1jIH500vU$;}X@*={R>I2oU z2CAj5U4cRH4!kEcj$$n}MVi**!>w2H4na^=sLE#kp4!8m`fGKH-!;S`6RBX8DJ4`h zts2AOGmSPh>ha!FBrxTIdLU*t^Tz5Z7A=dpetkc-DE*@Pso32R|C)ZR+MKQ6@ipG1K6{geaNk8^nevyl1Bn2n4|990mT~FxwOFmy6IDdK0@fdNz zAz6?Y7XS>?1a9uaJRIr!jtXq$yP#_WJP_E$kL~vz@n&R52@m8N$te>q&S<}R#m#ZV z`-Z;n7^mCs##-6Ruf={lmewKu|KP_|X1Q3h)p-5-eoSS~(9)I55SJhS{?<^BisGDL z2;M2B7}|Jjnjm;eDLCh#fZ6=*Xi~^iW(yz0uWG*pR}KCL#%~7}z)MY_00000NkvXX Hu0mjf^GmeU literal 0 HcmV?d00001 diff --git a/mods/buildings_etc/my_castle_doors/textures/mydoors_door5_inv.png b/mods/buildings_etc/my_castle_doors/textures/mydoors_door5_inv.png new file mode 100644 index 0000000000000000000000000000000000000000..652ed5400b4f64994ecf401eb4c00c2298ff5a65 GIT binary patch literal 1031 zcmV+i1o-=jP)ZzS5bm$2w$0LoLKAZbNCGzZ5g-Nc%1 z{J#%Bdnu9uTGEPUSU^{HVp{a!@#+N2$`Rh0acF^0cvWMV6pt{gL@+Bw&`CQmE;^x# zfBigwy0nL0!A92E(aX6o$l5VJ_u;AJ!&@tgX5bGjOA=N}2(#M&21OqO7|3?0Asqlz zgGLOmUFc*T7|Ms}ojK4ic=2%Q!LpS=OEO||;l;cx;(>q-t~?CjE^S3EXw<<2K?8eW zT=cOA^7%YuSw2kRoZ@OBoSZ?c? zOa_nT6EJ6jUr`Gf^$9`m)P|>PKdQ9hJAlPv!E#&Q{5HMyL5Z5s6fHWDFkrx4-idM6 z4TTs_?&eLG%O%TgeG?W2kT9Sr8TAQ4Rr-Sa8!xnw6>9Pu3WWl1I-O2gZtKJYBB%>3 z;z~VY&@T-~iU(!aXN+=gCfa6wyl`0~pd8 z1Bjb+AfbP61Ay5*lHL5_mr@YVr2v+V1cs;N`nrVSIRn7rR^<0adFN(U_&pE&g7ZKp zvA=1}oDqwfNS1ogO<3_#5z&`zyPpTtgdOveh*rXgryCz;Hvt0WU~=}tUw1zbG@?`o zsv_D66Z#n&Uh7l?k^+069W(8I9?(K&% zfFM45JkSVz#-H|c&U*L z@8eaAa2@E7yI&g-jPvf@&jZsdAE)FUrQTaT3N3xW0Oln>#ux72^T4k;5AZR&9wrbm z3m?PjXioY*T4@`!sF{!DjktxS7C(4Dp8v0T;2$S%kPL1%51Ie~002ovPDHLkV1j7m B(R%;@ literal 0 HcmV?d00001 diff --git a/mods/buildings_etc/my_castle_doors/textures/mydoors_door6.png b/mods/buildings_etc/my_castle_doors/textures/mydoors_door6.png new file mode 100644 index 0000000000000000000000000000000000000000..0afc1003f884543e2c61e7b2e5f1d508d187d491 GIT binary patch literal 4051 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 FV1jfvv{V29 literal 0 HcmV?d00001 diff --git a/mods/buildings_etc/my_castle_doors/textures/mydoors_door6_inv.png b/mods/buildings_etc/my_castle_doors/textures/mydoors_door6_inv.png new file mode 100644 index 0000000000000000000000000000000000000000..bd7eec5872bee75473a425cd402acfe26b903cd5 GIT binary patch literal 1488 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 literal 0 HcmV?d00001 diff --git a/mods/buildings_etc/my_castle_doors/textures/mydoors_door7_inv.png b/mods/buildings_etc/my_castle_doors/textures/mydoors_door7_inv.png new file mode 100644 index 0000000000000000000000000000000000000000..cbe357c1339623723b4f8c6eeb5452823e7e8817 GIT binary patch literal 930 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!Rs{HjxB_WrW+oP9W)>C}R#sLv zHXveSX9ps74j|&--~=L0AmZc#A}%1};^yMy29n%B#LdIa#RDXHfQW~ehnp8j@&XYr zA1@CdkmLg*K7Kx4em*_{ejwr(5D*Y$V-sU%mtbd?_ul;h--=i*XOkWu8~ zQc{xD;^WiOR5BJ2FcT6o7ZS1%7Pb-=uC3W}4(L|Kk|4ie28U-i(ij++R(QHNhEy=_ zy_Q{k+ePAN;R-DI0Q^!W}0!G!GOil z@1XH|)(OXL3iui;a~sZ`7FB#|YI~@XY0rYsHZ!iVaiq7FHk^o(V(2nf5S$TRU%slm z{Ib%AZ|4{~A{bd#SYG3Q%>Vu!|NG;=Zphim@Vs~6d9iEpm%kqiXXVM;g@)d>^ZA^7 z|Gn;hBd6>AwO8LBKU{Y`n@|n{UH@>;$Z$IzX-H(fxEHh%5BGI@< zo;SWRhF$DL{FjqV4ikhAF0s4Dpuxm6x#}bj2h&^^wXYl58l0>ubRT#ct!H)My0COB z)6v(nXQwtiNYy>y8+dP;s%uA)_*RCe=eHl#XYEY=uxOd}j@sBgwZiOwL>W#eMenL- zdUp0KgF=p9kxRo2le|2!1sU6=-4i6|n3*q`J)5y&tLW{sTn4xA@EkDfh>273yl!fG z>Fn7L+WC$zvW1Fc*QDRMqvODxbFY)dLHzaeb3nW8D?Voh@9A}~U6G|6C z=Cd2Demh~RP1EidlQ}uK9aKs;hAHr=Y-OIoXgTSGHnTt&!wj#V5#rfwHWSR4=2x=M zXuP3#jq5_A%O%Ed>lGS{7R@N>FlDg+`}$PFeg?aljz?Gmr&t0LFoUP7pUXO@geCwQ Cr&^@| literal 0 HcmV?d00001 diff --git a/mods/buildings_etc/my_castle_doors/textures/mydoors_door8.png b/mods/buildings_etc/my_castle_doors/textures/mydoors_door8.png new file mode 100644 index 0000000000000000000000000000000000000000..fda16a906ef43deb59db526b2cab51bb8d21a0eb GIT binary patch literal 5400 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 literal 0 HcmV?d00001 diff --git a/mods/buildings_etc/my_castle_doors/textures/mydoors_door9.png b/mods/buildings_etc/my_castle_doors/textures/mydoors_door9.png new file mode 100644 index 0000000000000000000000000000000000000000..0bcaba8fbae45557402a7d570690398333b865f5 GIT binary patch literal 3749 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 P00000NkvXXu0mjf-t#zd literal 0 HcmV?d00001 diff --git a/mods/buildings_etc/my_castle_doors/textures/mydoors_door9_inv.png b/mods/buildings_etc/my_castle_doors/textures/mydoors_door9_inv.png new file mode 100644 index 0000000000000000000000000000000000000000..3c8401b4ae66b955fedbd9b514777239237fb7b6 GIT binary patch literal 1336 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�B z(-YY!)kbRIqy}=(e|BPQ@x9;tL3$ubn$fkPssgZHuaHvWtf9!qtjZN9r_ZR$lBl1J ztLrk9h?~Itaeeh2)6)yqt0hsC&~+6`1si9*WmJs0y}f2MI@>ZXFBi86BzZB$bR9{O zp|TOn9lJYjqqp%-^8Clifxl0<8o*y5xn?VC1Ps>xyvr*QXeO%f%%`)bYU zr#W@$NVP*n8i}WNmSP+O64N#m;}~B+94X4RVRhwr|K^7AIH76`P1zx};_O+1t1Y98 zm}X&k@zVmkc1Ytf70Afbv^FsIT8D_??%Op&N!n#ZF^Q-b2AxMlnIck>ha?{SpK4gX z7ZKKQO3od`XySV>;HMO+z5ht3DZa0vJvjCcl^}WX$Z)}j8VddcvGnlXh{hEBID=X*qI;z;f57(_iTF8WfK#a7?#`aj6Q zEtbgq<+k*-DQ`YSP)hW#M@fvs)43MqBaH2kks^sRoO8@pcf@f@V_Lj)I2_HiMgL7g z+ZxhQ!pfDzKc6sLlw{+S(liJmiE>4`Y)Ep&TCH)52%|mH3s$B^#|23iW4%LqNheyE zD*ScCl7QlxL?@)Dl5)O5MS4&X>)Q?=8BXF;(o7;^O+1NdW*zmcqmzzu(UD?Nu>$Fl zsUY%-{8Tf0TNCAq+uI723iRYGrnL^QJgtRTY07m+z3dPIrbR|o8t5F8X~KNgke{YB z?;FlPFQ~5!E_Rqs5?e_$(tP`yImI-hzHOO2%cyFLP@Z(GFv|!dftANbikCmhncZ5v zb7W3at}XS_LL|s?g_RyB94eD|3)Xsk4L(*(pC#0_r>z}PqA;apdDUS~Mnor{?#J^- z8=xNVdx~a)NK9KVAKdmag2gC5+auVv_2uz!(K}@EYR`%X(uZSBTK`}MqP0SbpieHO z=3VUHDF0+fW%5BAqvGvAg|}zM;}>ILf3rO7ZSJtlUll z_ii(h3izw{q4e0J#dQ8^$B_Gok@oaWJOQ??_npT_IV697O#kqA@u5iY3G1_QjQ{(H z^Wq}h``S>pp7A85T-BV#XRK}v&wid`jc4(`B93C5kRTGI_So9fwQ%w>CY#30FH7P~ zk*1QoR#+SKmR|jGM71_V7DzSA>zd*urmZ@%Jf>_6x|5 zT^qX6^2sm8Eax5V(o!u9@kn7^M^kphV~t&V&OgbhOGljmJ+!{_^ zq^KzL7UGdYYR}DgYpTl7)eZTXMvN?@X@(O+5iJigT

ubsrn~; z|6aO4VC=Q;ios=*6jlwhChjfOhRjVP(#oKB9cMgHc>s1Uhl9s?E|gCe{ukr zFgEapuVgEt$d;=&LXl*ar0e? z^bT(vH*YG0P>jxF@)rr-3Yw+Cm7XY8WM?tU%Puf!7ZM#yOyy9C!ZjY(c&4v&vQfA1k79s{#$>^EF8-Y>@jc>7y#dMOZZ%T9`sa6%EpC#K8mjB>@hJS)!;N#iHpQlXm zIJt@dzPfQFvE$9m?4ouAUS#||~4U;6U{4F0J* z&OhsU{e^%WKm3;vfATg$z+|ea){fJ0%I$SUTN{!*qP87gTB0aodDk*J)5wV;)0$>o za`~nr$ux}!V-vAfv`dRlCCN#GnRkpPF;{m0^{yRS>qu|kan`u%SzgaVx^l-6ASuE80P ziUc|pEWTTD`>r8U3g1Z~}9qImxE4C6zyFVj#r9zBXkvly9qu76h{q`(xew>k05KRR)U#=-mBHDF_cTnF1wXXTRV|B1YY`)^lHVpiIb-Al?NCAI+R`IKwY_ERoY;gXQBGj~^2!4H)(%Jo)8tdV2UmCQQ zM3Ll+E6<|#_<^DSBo~|~uqt6)!ude|DNSQWMSfs|JkKsp={m!FvD&I9ZqBW4=5$Xi zVFkgTzHF0T?3F>}69t6s|BUzU#a@}Lo;{jfe$2vAk5s^F7fPJx>i%?pYr?;o>LI;i zC;oJ(pH81$Y1soiC>FNGw4oAXI>#b5q*G1T^e9f}5TZdy$@QB%bR>EI zs}(9$$Ozh1g=vBipfNRCDenHm9a>A?{l_IbQHTg^Rno2l&m$NGMmH#dj^msp9gBj-=4&)VF&mnrE<&f8zz5G9H{k7-JS1X2XT8RnOU@k@>E z!h*ZKDiO8EwhlzfYEg2Qq`dy?Q-p+f|8U3jJfki<@{uNL1;v@7S+z``YnHc`wz4c| z4W~cKz$vO_hiwe?A1u#aj+nh)lBO}(m1 zNmS!#dr5KEIjUugQi^n}sn>?IP{bpR>wF-t9Yu7drCPQ~sYnWi%p@_2xCj#B#(DBI zqFGz&MTd}*I9I4dqMalzG?fe2DK0c^8A6WLO-r09bfz)JQ;ZZ{9pLa$DlxS~Y0v7W zCCW5W9--Hl4RN8+iK1EYk%r15N1nXS@Y?sGnEybw?FX`(y)oZgJj1q#{|Lvy zqnU;GL5L-gv^_23*gM1_e@Rc2WQ^hVZr(?SyKTezNO>oLq+{dUII$9XJsVor3T?u_oU;1V2cV4yH#2 zs?Fo@p(nihLrwmpn8n+g zI8}j6@#_jAMRKa~Ht^rAe_tVUSeFK=C7p3}?;W;*V{SXD?+nq; zW74yf)m0q^;S6}|$;O&`We@_M{XE0>%&g8irY{PbnL#MXpKBx$*Q=J3^Ne!YB0a=j z&@NgMBZ(%xP*5VN)*Y?u5XN))51|nM^6#eHezoGoXBqivhE$TbzrG>S0$&HGW6Cg@ zn-!8}Y0zWM`nClDt9eJ4nr#W|(E&ZbZ!B@97YK3#8~Kov@E_+m4&T3r6zK`|+(WYl zemju3n+-TXhPVR6c0`(Q*3c;&Z`l?Uqi+kuSkemzL+af1xj?0SCmb#Y85{eYnX?~m+yq$ITm z*FI_;j+WduzjjW;b3t+zF?&-H}oj-?xZ2Yet_fgAi1pjRL8zrde7z=rJ%(G$`RIf@O5AT9 z*;LV7b{JzAKZ~g@E0WU)X*?InDT}DZebeC)xOt1U4!yb2u5nDBrOe({y!b`V=t5F2 zJjOyg(dbA}UUi`wnF^#1w5#Q^qgu9{{V1orwJfhnvT?-hHe?~*IFgA%C4#OMBv}}V zPl^aN5+tJtAz}HhCdw4+tCpmQSX_2oy{i#QFgcBBj3Iv&bNf|8lnPWLun{Ca952lk zI+lz+O;C%9YWD45;mZ9iVlYrF4yI&TEqD^c?lx+?&#-&wS^OgwWIN?N$aee(`LH~8 zOG;>aB|*)}N$7!uUP9RV>gsNLep0}{IBW30Z|+hquWtJKyTW_;FJD*v--7@6Hm0+J zyV;I8);jpxSB5B(NGU=Oq=M_4ol4)Utm8B`TO^Q_JGf_EH`H}=uZjNt>UQVMdhfG= z@z!_W?6L8RJ(2ZCtmta~y;2G9pPuvVoy)z-&C__i4i8}m^LiTr)mVmmEd7p-eJ`*F zs@4ZR?Ss0#c%;~L5STyRpB>t9|JcOsK?&=C5@_p^2R!bMK_GOGLTJAUw9Qt;;Qs9t z4(>aV-YLq>km_M+ZBUoo%a-n)w`G3a;0;VqVhj@HJgu;(Q^AY8VD(Ln>VQn(tY>@? zdcEp};^dPY8Be(Ta!K?Hg>EhFziWe<>r40uv{*I+BTk+EFhIZ6gBl z*Wdy6_u~Ki&cPq%>K}L}4n2$W{%9@hIKWrzm%#kN6Y*H7#QO)0rx>IQ?%<2L1Bj9v ze3bC_r?{OL_k^9?5&e*3uN_n^j?-;#xv-AgsNf&P5m@q{yHNFXh5_*bqQH+SVTm5O zCi}kwM8fV^a0DzH*-xj7KG1;E$o8CAV#{}h?PoxSGpoI$>1>|`_R~jk&u!&IUjGb}Ue-Cr%`G?GaW`RUP>>Ce0<| zb4@o($)0I2@ag|_PTP7;UdD8#yg!w2jRd@KU7-!VAgSb z;_u#$52+IR{i@YHv*kbJI0nXCD2-AY=PbrruCMR5nZVynYpjPjK2ZJZ|NYzZnz#o< zt=Ib+?heo2z6zv=O&yHfc#?sD`N{=KY2c?9!H6YV_6Ee!l^)Xs2M{ax_A+E3!+Ltt zv|Kgqptdib+@SS;4(zP|etnI<6pD2Vc=B6nz%3K{ z8u>kXg8gAeanSo4NEScjNCf*W@L>>lto-Enzvo^bgaiE_A$F3u2R)m^?Y(zQU&oY} z233eYV}@+3X-Z4mScHYT1eY3gB#82eNnFs>9hG(5{$`1eB+bfVDvNLeFX8grir1eP z#Q*h({O1`$IO0~}ea7OprTOWtKD*uycXnMz*98GTV=YoBq*i2;Q)YM9+ZmOvYpLorSz2sSpWbWq?Y9lf%Z4bG zs93Uo-%&RK8|bWH@*|BBg4-|Fp@tSqqD0d=kJExQjhUQkR?8MA1oN8~nMy_%5#D;5 zxg$OItS%e8ktB(t_&f+pU4FI3{CkceEX7$t zyReK-6~n#=;2-5U_985|LwY=j*4iw6xsAf2 zEJG{ou}wL`ooD<H}e>cyzJvD#gb;kdNv1OZ$-0rNGH_cP0aP@!^ji%-ihU-$5^FvsTi`-7Ae%-A({E zk{&7iE)$VE$nA!4SM*VW)&l1Rjg?5@iKO4P-v+9MYHNIV`!)R<((<58HWU%-OPIyv zsJbacZ=8AZ1s3AFzZt$Pz9X)+bNwljIt=OayUo%KX+)EQels-#CW_M_ zD?X@|Hg%2CDdWirce7ihRK!WPRbE6&oOAtl3DfBrce5L`j!Dx|NW7dwDTVV6T`vt< zD_;Gw2p(KOQOYe7-^EYzP?9npt0UHL8cgSiM-p9Vyz}_hqnr=MMM~s2rCK^xR~6}4 zqt@YJmXV{Jb%C>ZGhczvAy-QJ~iiz^GL5Lxr4A;Hya2|%{4(U*&uff~x zQ@R)32#FVJuTgur%!4tOs2)iZX^?iK)e&^7>jy-my#H|Y?1y!6vET4N7VZ97BJoWm zDCMKQh6A%S@E;#B_wl{y$R3FOg+vTKKSb5yLDbn}!T(cF@uAFMbN|F&7`f&L>&V~h zvG~1`(H1AWhlV_O&cwYA$l$p9SM3niyK%5$Sc@7oWDdt(#IXlqP!a?9U&XI6-Y|Kc z<0_BupvHoOljj-fNb~kLCGl7iXByW8P?D6A>8C06UB~*WLqra10&2yyLEbxx1u7Pd zKFMesgXkhU)l#oKltEfHvI@V3>_yDo*Cq156TJEtC)|BgQj{@R!TjGZ$m0pZddhl9 zl8#Vugcg$b@86PUBaF4!rY6k_l!EnoK~_vaD0BqxFW-`81#Q>jtR;$rV(ogpARkT8 z7e7ytkz{-xQO{c1l|f`09fc_L_FYRAc0q8mS~@)ltuaw&v+iGuBrvF7h-t9q}?8|KjgXXi9@= z9Cm5w8iRF)I2Tllj^aGQYS3}Guu2NtGO+PJjKF%BOXTBbJwEI>cIo*+N#cP9yMM@% zA3eV8u`NMbHqR8^SxniGrLbCoi}q1fvd=7zN^ETF-2^Iw!R3*1pMS~w5RD2XO>29E zR?kt~2mg}5sik%VzE8G1QKE)p@E@N@{3B9m_>W?s7kiE9sR~B&)_N>@s|Vt}M~f}G zd3!yz4*O~0x0%YuDA#V6$9M@+dZgN!U?n_pP&{#`# zQ!;s;(+W#mBzS9CFDz~Camvxup4NK&x+NM#oV<>yt~y-eiB2`v3X)7B<1nmO%?*tZ zB$;B}mZ(TFI@6@11lu`87G^=b^DGw~_O1={B~I}EixR2elV21pW|ruGj1j_;r~|KoABr>i@JD3MAcr6!JIuIAq{ot{(I6*3Y?r7+gebzNW?_MR-wxxD(8laptZ zmQfZXlt*c}`Lg1ZvBm2TG)Da)&+7M?^%$bCKI}M#&f_Q*xIe5r z565B#bM@Wc^!FZK z#=B$fB<^2K9>XAg&zM{cCy5^I-|V&%IGG(*>vrWsu`f)uM*VXj~PTKpJOA&lKX{2viyq-(FC^?-*SqEH7J3)-dIiX4#@+ z&3f6A6pFLroO(Ay8^%9PIQ=Zg zbq?EF=I?9rsYXg@RvvEz=_DmO5!lvIeO(1IHYHhI*A&kZd@FeN`6$q#RE~PlV!FWc zm{0mBI*BmC;+^N_cO{dPh;*7Fj7J%Poj6>e2_=$>X5IwoT+<@0z^(+@I6`M>SRnoK zlKr$f9;8Z$i_vbnd~0-j(gat64-bqK0ufDi4|6+vAoK8eksmEr9WzZ%Bq01C!j}gT z_|A1$IXYf4lL4H(H9r2nvE6WBc?PxVBTYwhSbtZ$(t~M(F><4j4NQs**9-E5CZ-@s zcKMJcJY2rl0vV#TvMga#WHe33a<$$%j~CC+Y1@|Be09(Ta5y=_Ni*mtthc|XlOH{3 z@Rh6g!UK`)7zTW|2s1z1cL&!@BzU2pl<&CVy?Ny4q3!luoOrB(?zf7Met@cTKG4ey zb?rPc+3Kh8MeFNO+L?pqVaq*+|dK zD>lvYO$lp|e)&BV6-Or3hsY}KO{G8Bu-{8xm5c2 zvY-ihnLLY8iDdC@jch&nsYXi2=uC3@ z*CR}0X-iADFr57~V|m%4rDyWvC@hK=bR3cE04uLcjrP5Owh#hqJjqlNj|HOgM5)GE z&$C}-l(#k2q9aKaFMg7epXan|!<;qa(}b=vRBsG23UeC(-gu%^vb?DoO*ON34MGa6 zu~e(jkUzNysadt?kX0B+v}?oJCmA>>=QSu#tRgZMp&~)KXo)jNK8@%)M_XD>UWRi} zwZ*g^pAO=?J!wyc=ncd%bu{1Wb@U89h`uKhqBgsa92w3GZ0o815k}wPFrYYEa(M_u z>ittAWbwWF6CYLa@gHtpc3psl_TwIW>KZC%navG;;8lbW+}_Pewc{5TZO|<^7GT+kc0a!q_wvmL>X!dl)Fi!hu-_YVv3+^6*Qs}qIMq9e-mTc4YQjq*Z&8C>LG{Mk z(?e<slEt*5O$r=P}%STXymL@SB466+dp5M?o=RAF0#YaBY3 z$gJ0(SSwo7(abB{I^4Bnq-Yw4lL37cpTyjJxn}xF5-3+{!|bZT)efC%qFCNr47)|q zh78~+Z17X zxDIYmePhv)B2F~_KXq@`EJ=1<>3#d0<3mjM-W;m322=qAL{e0F?=5Z6<3oNoKNElOO>WfI?N}bf=hnIOl9V91kC2xS0h4B$WnOX2rb`;Suh>r?vK4 z`z8>Z$g3|(>PBfFJZ7GuMsYamx@Es)2O{TjmgxFHe~{-o4&otZ?^TmHgAKu(--lRhBR2c#Zg7 zfL3Xnz_VY>z`*-o?YX|rDX$&xzu%()u5AKBO|HZu!wBqt*pST}55K8ceO}^;un!HbYcs_lj7<>?e->H#^?^ zdP})**dpo87c;~1s-UhEXM~`zc)lQNstz+}*>55ufy@f!vjSd1{m=olGfh;~kbeK= zS2M^h?|xh3n}BsG5!Lq<^)jIIQCr-*0G?kA(K7(V;o_CiO?sLnbmHU839r4oKZdNeTSP`4s6;0a~t`hY;X>W5_bFav&F0<{f)*j{b9#F=8*kF zkaAF1mFn?g;Eg7qoX^-cqtBVaXiTN(#H~(7ppDJvOg9(I8dT3|p zrC|Ga(|*Kci8zu@*7#3GNVEOEEMU}&bfZNKcCss>7~;um<-G{#^tBEEwvnTKCQiGC zUIii!25olsa`@hj!1jC2sp_f}M6($1lx8~}^^JZelTK*d*;-saV~GEb6I-oIO1o#V z!l^i;D=kheh>*uftRo?lblyzD3t|;nQzHV4=LOBarQNiwUe5Z3&t~5eLQ>{!?;6Bd zT%Nosp?dy?ccQIPH@YlI-ZZ@o!YIZX6{&COMtAdwb&(Jm!Yvsik3-<47sy8+ED!~Q0M0^vu{$z#*#W#V_M4VTpexH`c zTxO^?4eFJ}%aUSlD6fhXpheg}Hux5@nZXs7)vF9a2qM@beYfBJUym3kEUqolE6on( zHziFQDV`Z-S8)3eJ5-fs-QqHv^tPTC%;pxG36K-2!&0GQoFE}7T%w>^67wRaNqJjE z=AWfOe5f2Iw%D-ll0d{Rzn-Yo>H6ELhJ+3y4{xp}0Ui;=cr!Z z-X7C{ohVL}%)u-NZPJUaiiERx9p>!AcN0g$5kVxIjCd~B?Zwet;uwgRGau+^#vv&X zT}mMGN9;f@k`~TD_h%)|k1B0B^BaypMRsC!rXvhQj+XtF_(^x}M%U>%H)XHGamESR zfRXM9oyve7jf97ZbC0o|;1kpHbi_NEd>6;hQRxZ2XBb@5SNIT%ix`rgoD~`$5GQPZ zn>4XZW(aM>w~@t7mSp$$f$NtAi@#V>Z#~tzWw%L~vkxiGHT!_eBE?NXRR^@ve!-F| zGJBa(%yZuV?vZ-aFrVegfwHi~HsYJW^P3WlO5MP0F~homiIGrP+D(7}yS0Z1uG1~M z|Dk62Nr6VC@rsj(-+5-&dD;zJH`H}xabr=J6hDYc*hXAJ&IGYSHnTmIFZjUh+R^R< z^|qxf9eHV~ss?El>tVMK#2A@B%Lz@yZv)rQGp@hRi5{AD?7#YU+pzgYk*+a+Kre(wKH6$Fs-9N!6Wh^vVWj`#Fpq&-uYCULvk~yvJsuNqs&uOmI$#pW zKaQIVX3+;h~KA21F)0L96u=W()x#+sTeq43v8ieOG{isL# z5mf9>hn%Upb%bHa1f4q#&iWxk*^B2WjzRG$oPGYjq1#M9`LT?Wi%ffjetu`CyEtP% z7&&XOd$A)qS8U~1CCz4yXu!-M&n>2N?bD#_b`1o`qeY`~{b|nj&U5#>imWu`3yYdG zIe7VtB^s57Z+D0a&3ynH$QK!pZ+9TV{P~QaO59g0KF!IUMXh09HNj?pty3>n-q5zFAT-ZP#Z8odHEN~S?>PZJp`y9nk4sb4C@~@NS1&|@c~L@wQ^*I zrQW5@d)kc53T|E)W?2SHhXIxC74KeEF z;N0JO{3wH`OLx%a`Mn~>UR=r(IiEQCd*)D~aZ1}A>DTq~A?P6QeJIF#fA#L(3i13r zUd|l5b|aQ2!>U{eF#0h$U{nH*+oAD-pga}I%m+f<<$x|ms2^X02+jWS+#us45O@7i z>Em3))=mp7bUZy3DAZ4^vGVa`XT%B|Fpz07DDjuaev{m<6PoNf48$CFA`=nA6o9H~ z*LM@9@%=?9fQD+|d5>ttDmCNP?~_H^=+W4oU?1AefTyzn(~kfrioascisg)H!RJoa z;qhv@=@cXsbs5$e;yzN>oovX=k!LndSR`Qphd_A07j+X7-d9DukCdy_O~3uSU4Ktz zGsD$SOVlg%gXh(MeFX~de!WX}7psiuVeivWvM?4U(A0{{)0Hv5%G1|uQ;~Q3k9!{8 z)WnYYdG%?@!?!gW6%mVC#TJ&VG{jc9d9}o?(kH$Dw!#?0Hh8QFgf^0whHME{9dSQ= zlR$I*uHpI5a#R$P8*(dzRw-7F`SXlsv-N|5){TU>_(7C*2luBv3_!o0RiAi+cH2U6@5a36wUU<#s-r+d~V29I>n z!h~U&O%9UqBkU%2?NA8AvZ4YmONlCXiM^?$Mb(4EhRP76e1F7|&BHBzq{hp`?eLA7 zCjz)W@X--G9-l+~Kyo_duRnqs???P}?1Ol~KsYnDIi$>R=Cu#Cge6`~fydx+3Qd=f zQ{=;GGqg>29}33%lY=@3QVagYEIq%dkxl+F7+Sz)>PI*r$NTTiu1-(UNfB!*u6Y>sil z!?zW|D-xk7EqCuKikac&<&3sfs$GLE9mWaU*Daw+&sUp-I-?{f#(=PY-N7C=U*(BU zUI*6iJ&T)y7$U}`jsYL3-ZfZfn5`V^+ZyANZWe7!{}(8hY4y9=2Gl9<-&EweWBIC} z$kQqC-Nw=FZxi3YSf(1beT-;`%&*e1WEo_+cOIm>R_Vse8ig!-XPZQ6B) z%?&SqmJ=JL-Ur$kXgfj1bd|J-)I)GJPmHDDBR13ZEX6C1Xoi8yf{KIxw_yTr$ROwb z)Xgbl8QmwCLwdn>^hb~F>U{Kb|9Io9Oyua?LMD1rU|6f<_Vk?Fj=-QY%(eW%_l1F+kdIkplwZ3yB>9{aa5g19BL6e9+7F0kI*4V$Iodjnhl`m-Bh>2}1g^Wp(QHz3b}@nznzg4a zZMye-QV6+vktNn$H#=VDmQX4CO-l0fRi_qG1&Wy=T1N;E8Dx0@;5@x%}(MHpImyYYt7sL?R-L)u6QwKs7h(<5a z`Yw!_K4c#|x~MKoo$x^!_ovqwroJL)e@)MC%a>W!E%(K~sxkssS3?JKs9=i@gFfWb zO9)WtqDt_Gt>+I*m&=h^(0KY3fu}#la#;Sih3<~kCDqX zg&&(*?3vH%WQubf2o7UL-+6p&M8O_Oi0GM1?wGdPOFtd|eg5+MU|LOnHABIZuRg^Z zH?8u|VGr`5u1Ah|4{|DHDyKuos zU8Myh zaK8LESE$0{4|}S0#Jc2f-c)J%8({URO(1>KVbM`X#1y5tDahuI^_yLKPOUhXVz1b4 zvY;?8($yJ4#H}1JzD`1+^`^y@3O-ZRf~l1}vlwe=9~EO@^)fr4UxZyckfu}X)$X!? z_j(To7FVgwYU}g?s!ot}|E3{EWj1$|E64SV0*z3t(iK`YY3yY>_Cx*NPi|&YngOUb z5UO+>?Y>QND>*ckC$omxDo1t^4PgShok&Ra0&S;vmY&dzrc}=%${vldG=5a#P?Y)2 zS3NUGM~iLhYlzK=9em#3HfkgtXgyA6^!4qOU~wrNb?5gW2eKa}{7p!t+qn%xmvJZr?3D66w*ClRkuX1; z=Yt=JPLokoXcgvmx@A5tD6(wChfvu0VFcEV@agJ2?5JP}UBbEk{I5rN9V2em>3r%e zrS=IgnbTZx<`s?-&bjMnd`y7`CUP?8&)t33g`@GF*hWm2ey`qmUj6x!a+UG$UCryi z+Y{?l+}oK&V`TQCqy+Zsbe6-uQwTp4@SWLA@TA9Ljoj7bb74Nqz$Tc%be!$Bj zX*?pr>UqxcSN+hr9>9BJx&Xw8jWyE5$mh?Hw*8|{k~GFYK>`VrIl4|j ztoU@bE`slpjEwemgsIWjA;}s!9W9PafjGK;c1Q35_zt72Ge%HTF7MO>{gPi0XI8zA zjv=;+I7c=&WQ(K@uzy{%-v;K-GL|ng!XmPJ-w>LJF@nns*}{;QDTuqm&@_?T`-ZDm zInVxb!S;27vw}n+ib0K{bH&Xq+jX6aXA6EG(q5E-)r(Y#z5QicU3l^J997tDk_hMg zMS&QI+jPQQ;k(gRx)Iwp()!4=uS#qtJp67?RK+@jb0r}LLX4~*TQ-mBxss(=?(B`> z;rqmSos}7}(NxJQT>Uh43i~DjH=%}5M>1!UK2nc66i?Rk{rT;jN7GNqU4i65Idrqd^Vnw509ZJ8dgzyd+`T&|agK=uI# zsW@u1qfXy>_Fc z)3NK3{K?Vt^+M-5B@f5piyaqiM?jyB4(l*7Z`**st10HmT0(L|XqAWWYFuuZ-Q={D z9_)gW$Ym+y79M}75fRFnW%s%z)Pa0v$@8?vP`e~5mt|RJx+g5IQ=BcX(>~ARcQv=) z?9v)(E-aqq)Kx$OxZEHH+Ko@gmKkCLMsrLK`64NrA3CJ_-&K8AtO~Oi3D>S`Fjztz z@O2=|Em>iSIk+GG?=5Y&>HEF|o)7o!cfZ+}%s;8)xa4R4#M0bF{9>FX#GED$ ziAPn>kyzZhV;%>LpeM^?Cmn}5g;Dwh(&gE*yv(pM9cO(Cz>b#0gwq@RBV^4*&i_4x zD|58;`JopC-&TmWKPvOcKQT|~5jQ!G79Kz5d52HvPYfw!!e~BdOlc=@Fb0qh=3NKn z^|46i#ByGz9f*#`nqxA9k>RU92s9doZsS}I3voIo_PgKp?8GE+YWf!H62>91>CWFd zu}L{QhLQ`ktxH~))A`nLJi)D|?;+>kM>0oo<1ki;dr$O9M{0THhz6QXV6k#Ulk}*3 z-C;CMfYxAUj@5O^cHMISrpA&wl>IKSd1xtTmST~Sl}Xfgeq(5xmbz)lqQzH=y)s;V zS+IHEVuAThhSq`YLqlNZC6N43eLY4gLLeBqc~ z=ZF!uC`D|Ko^wvR;h-H^qOV9KYHhiLsoQuzoVebRoP-W{R7 zKTDPBF%MIqoqDTYXn%U8UfCsAFzY()sW?p@l6ZT(f#!YK0XpU&j1_e45etgbiPw+& zBS~p`z{{rMrh3L{u&0-g3a!)b;mq^SCX2J#<%|ll92IPbt#vtNf^{Ebw#qP91&=>8 zG__L9(@x0tp&@#um^s$BE!i?H651l|Vp*57d%GuYlJq+&Ts_Fmw-j?jCWfX4FG@MHgpE?U!2A=3GnV!18Zm})RnTr)HrsUb&tBx@GfQR@*j4R4 zZtif-(Cj?gNja-3Ws&4re5QzTWDARrk^Q@t>cNv2hH{p$5?5q6?;|n5{MsQFOd-So zi%vFVf7>S7u1h}TA*S|b+jzn*AO?yuL%s6&P*W@{8in1~BUYFd>7uEch?z;UWt=&x zy;9w!VC^ztch^!B4iRC!OKp|k1pKzeWWr*Vr)(b-Gy(lFXc8)0rv;_OXF2MX=H3&U z2g1QqKwKxFczJAfcsxm<$P)=dFOHu+JSsbF1@wY`iC*y6eX2{6k1Va_16CM^MZ~rp z@Cs`MqiM(lrzZ!NoBlN=D7b((GCL;-~}p$PlLg3T9qE@)*wW zGl(M}j{Z9A#y;-M^DI-g)xr)5XRB}@Q=FRMV58UCG6m+no;H6%+CS2x4yWHC8ZW9I zv+g+WG!Q(RUFBWoK@T%U!*6X%K2oaQ12Udv8G&FiZWfNeixWI z!QNQvO@o_TVhpI4q?Oe~DqoY&Z6ZXpi5W3_;n>|)XaMUB)oq>jLNY?1MaJTcLM^Czu(eUk=e|384$EpD4_CfS}Jso%v!`I z=0RLU9)7oDw`;Ijmtd+S!S?*qIiXv3&U4Egs5hSdMrq!p_4%x{w82w*SbdUY~BOBdIblQ)@7mmP_bMv)7AtItbDqZ~XaF}!BOW(!! z8PkMtteNIuqWtSdBd*Tjn*Al**2@HIYaq8qp2d!8mtJ-V*n#)tZ28Mtg!elcp0NyeO{0)B#DOY z!8kc!KUD8p+I@?e8_H`(o?Eol2~Af;Ps*V4L0O+HAoZA{aUtNJCZ&r_|=-5|H`l$#ea{pces!BO80>2*&2!_bwOkjSg2+hjwn0Vhrv2eHx)ENWPqMsl-ggN94>HZv0cd zAPjnf;h#B`5{Kof7$JB=@qEtqeNC1{ibWtcfy_CAD!ZVRWkf`2wyBs7jS||()n_H; zGNW00s$Ej`P#>`_ZLn)5EWe!L*J*q!RUj{2+NJ9!0mAOKB`XgdguxVs2FK>xJ>|Ti zSURp>lsw)x1Xb2`pfC}WC!9u%&~5_Thn5##&na_Dy9+$N4gH8f3`r*|GuXN9y=9sv z;AYP<_Uks;&je-h%&~uLD3&Eggb-73cFvIHmh#Hc)*)@8YqDFEj!rgPB{ki)yGGWJ zp7pyLcVP6WV4NWUb?Xr)XrokhB>Im2DZ=$<$;xs4t|BWl7B?Be2b%Yh*{UR83U}YG zait|M9mUFG^Av212)-RWE9mBqd4AKAKMqk#bf6^;mBpfu!Z9klyKfnD(zDsk$b!K< z$*4N9HNBW*^aG=+Q4OWd5bHaZS?^okm+*s7;R!f>RFvx(*_1=DciB))8%Y8Eew#py z)jS`pXb-`tdvAM?W|u+IB+CZOL&m!!qp_I}T@@_Td_D$!ohv_T(QizD)^kFa6ENVP zapa{R=s@&LCowv_D!HKcIpxqsCp!a+4E#DRo9-dQNZF{(!UDQl3!akZ)@CVLN+&;LfPGWBoo}yC7`>B z_}i9h<7qqV+~v!RYTfeq?SRwfD~GX`P$z`~GfNd)@skk`-W=aP@4KB$V28 zT(eohZrkAI4ntslR}uEg&1WSypF8fpZxY)zH;995;m|7SVeQtbcy-!ZiZZRJ+rqG~ zBY9!iZEETVPx&lEEv#>ARF!9+%(2E0s!obR1d}IgTAvxJIwIEKA3T{ccvV81X6R8P z)}_lfY&6Nj&umh&EYb#K`>x{Q*E`CUqs$YHZ2g!#Ny>$=-PE+ZfGr(l!hYYj;IskoKFP|A*gZtW7tk(bF>+}v8ze~uWm_w%S)sOoMHC4(Y|U1A6_&j$t( zW>{3CQ#+86BT|g|BP#pLza~H8cmLV{To4#G7mjZmx=ur;Nk(H5R(3Ts$=eTwheNguGJMgL-)UUp0U|(@r~kg2QIObR-cs=OUwHAHL;1rMmr=+ z$(I({BwfIKVQFF{bbE10(mj%krQNi&ZDf1bVysZi9J|{FzxAjQ%I7(=mpRQQQopMR zb;M?nU8QkZyNA#QoJ**fuL4(}<)|_2-Y4Qx!qWrg%%&xBV`-Z}HiuRsyL*qF3(dAA z)PfDB4~h@(Y7oIX!R>Z+k`I{~LZ>7d5uSZDW4ml=w*iepd6QGD(#*`{2CdV4BB)@C z&M|Nsh^?}H)3A71;8vDUCDlxgAZnOBPo?N?+u~*dF;W&nQ`h9VqkLH~e^uhQ&^9eq z)u!E(+_J9(n+q>~QlcIcdjXIUT)(PcnAbaTO}3;Ov-mBTspL zU$DC~M)1BR^qc5Hl=Vj*TsRtw3=u7a28re)SOtHgCS>Ht9*=ESM?u<&ay(pHq`K+k zk2ga{XGWMttI%{NM^+e<5mO?MFzXCDo6v2PA4EE1^0l9I7+!~s_3@}POuL=Tb>RK_ zVdxki|DUtL{y2$9ckxJf4~Vt>o9!RJ>#whKV=5VmBp!EKdV!!dW_^9=k~pN3Cij## z1=VAll!mQAB5b~|xvK)ptBgE1*k#(q@Bu4l%q-I;L z92()f|FR{^(m=MUednMzR2FeG8@0gI=Q-`p^Z8$2QC?@P?{+kg>0-!cIoZsx`ZQ0X zUl{DY$JYU4gnFA!Vp9bq3kf*Nz!gH_GGdtozI+H&8^zwIyI{BXXi##s#P0r zYB;#}cU%7M_o1sMAja6qVb3XS zoyu-t^QMNFJfCc4shfleTbqi1AwdgO-4J6$4frSbn)Tbabz*gumSz{B(f&H~d*5wS3hIOq1aXG-ZHq?b>UoB$BrIfZiLKJ^l*P4W z|9V3>NQ1HkZZD38rmgKMznsySARbGwf1n$YzJr)9gq?lw3$hEx6vn=j@2bUq4&G58 z#iU^VP9?M* zN1v^Yf^SW~wd`BSoif+h3o71MNtJmQ5@;KmZgk<~58p%={(teuJi)f>)8@eh?0|m= zm?PD3+l{DVhm#yPPR^P^?cV8D$`LZU*8A$FQ?2d7~*Ff&JEVI&n6 zbPK3*maKbX0(r(_YQ*S0_8g?gJ9MI7HGFu{L9k7^j4x?FI-C0JsE*~~hd-O!nzd~( zBHVnIBtVF14l5#5w|h`c{z;j^H;KmUa)V%qArd@1-qx7RP^>I3zMNwVc>hh+jglkt z>nwSC{C=0%Th=7SbP<}JPh=CTxK)m?mGvTbav=Z!AOJ~3K~(oU6eYafla~(b48?Vp zsNY#)QHT-Rbwg7JbnUtMdQQCy#5SE%R~TXylHZ9}{9|OhYq|NelJY8}*#&lYX)nY@ ze_*N{OkR{~9dM-~D>}LHE{epUxExF-WJ`m_B(>f=CheclCi&vk%Nedn+u)n-Lu!b` zZ93cYd4_6avu(kEdL=dylXo-Cy(gkc3V!Ag1IVet9-l~@5M3JM>4uDAn^J`^*3Q%iKMDQl~=D`psKuidq*3Ee|*fRvnJr* zJlhk2@ArA1Kw?+nzg#taOK*X1?(@kTh8X#`pPO#iGF*JaZ$4*v38ffY@^BZBObJjPcqKC~bHlxa%5oJ9VWNu%gRTF@Cn-ILeu zw9=Nd5+A2ynschhzN=#*r})`%em-}W1o&V6*Z-MszWrh71xIvU9fMsQI|(1@UyXif z#)e|Ony#{X@$*jOY%-fVYGOtLjpsxfRnGFD&v}+)cXw#r;5C93{0{P&K}^z(DxMc) zrAai|pky=0-S0QN`l2LSAzBBeU}vtoZz7xf3QtVd7y{O2n2tWbyy}**+dv4O*a*2z zxP&&)+$Mvla%st&1uIF?L>2EN#v68bEp^+X8nKyS`AOQ1yZ>RIia-OaxlM80q*$D< z1luipw`-3#Db~-Ij>T1mYpZ}DWO*7_)mz_>AT%mAOaA9sA!*~gjgY0*Oa!vb44cI< zX};_p8i)|K$@4c`T5f(er`e@Ib@$r}mm98L2&I*J^OxH=4gF#yx#h$%!_l5CM1w=+n7#ORXRKctV=Df4*?Nn z*Q8Fv%dkjht-%;W+j<0L>ka#ug3w*eFetA+eU2);eS6FO-tvAo?>~_<>AHFK>2uoF zbAP|a2l(apf#vlxn%1BF4ue^KbdDH%PuXnNd7U5nJo_(}Jfi&X7iaH1hBp>N)FTqv z0i)=wjN|AvtT{9DGDp{M_q=njb)KXlC+>s?itlmIb+a!hW{=Z8`jE6tIRG-3=(F7i zF(V40D^~+Od*o3c!jbez_vPuCX_%^9o&@Nr+V72R#@`iNQI8uLBK{ zY-y31!R`$>A^J$QZM((ql%zE%rhw&5!OE7bU+?fu#BU?U30Yx?Z4y=7bV}OB2qAd1 zQL@tYlOP)tR^GIp*{2qF*e>n!tVuw1Rv3Q%A70Y#LsAwEigQA}3#{MN>~;$(B!2<;HnMrI{l)Rw&sGFYdh~}KgL*4iV`*-a z7kWx`4$U=X+bf&qdbvZaAvS3~=&Z81eol~Z6zH`B99Jir|L4RG^)P}OMO>FJM?X7n z&Y+@b3{ND052*frpsP6?PH}H1oY(t@&1l@!Nst)B_4SH3Z{H&#{Q4p99#22NzFP41 zT@q^h)%#-dWf%jiWn$gkKWsn)|9ESAPUitApU+Clvf%C8TdWBGuqpbx(TqB~sRq-O zM}U*6nNOTIA~G{$BMH9kglVIb7@mHbbfHx z9fo%JR@96(-ACG1+L1|&oDwsR$FRyVjrVX-kGIQp%CI`wI`2kcBYT0K>UZ2(9qrS| z(F4;&qE9E1LxMV&NDk8c-Sr=K0f(j~J14lzVY2R+O;X5CWBW*3hjjQ=cY=ZvH-Q)$ z@}cOrwY5Ci9YY!%2&PHIjZ;365ec{tSV0GUnJhcvd`d3%Uk+urB(11F~iu8s3 z{C~J6RB1bL{X+tWs=H(qr3yB)%vKhc8x}WNs$i-BHz^FnOwuAuRJOma!GK*F7FX$u z&95E4N)>O|DaH!z-m|@}(g$|w)Vso9XSQbu1m8&_J4coof`_p0HaShx_xGU+R8@mK z(^1gUlktY04b*3n%E`qQrUp+>i8kt=CUK14PY*^?QThDyPf%6fzPn3fI8~xX-oCx< zZ;b!`i<+SDfBuk^6JNi1kFzOU{LPnpi~(m7wf8^%W6AB^V}CP+2!Hd1C#o`^Iez(C zdDz3_dduT_o6Kue`1j9uJnms%!5YUSjyG@b`qz0r5B%A)2Je&7=YPJNVMQmulRNmu z3!BDT`lpKA|B`=XDEgHIMlvK;GctSfBfO*O{O#u*t12)M^A5>+*Xfx0ksoaj3deuu zZ)~Cmse`tc4hp@KZbDA2WJRVf=i^1j*tyfm5l?rz?lE*KQ;n;q6G@CmugxHGI-fi0 z*5QrfgYx3bMe@-xuz6Rf5z;>49>i497d9DbZFUXD3guPC>Sd9Zp&tUxKGN?>$^G6?Ps;Qxq`uY^{KUdhCv7PL%FgT}PA4nn@n+200SZm`zkZobYbmKH+Ftot`<4B}g#-Xt?T z`{^=ePp^b3CS4>8!30ch2u&(ad=sEaNd_Qh5%rN64)gZNol0sCj zKFO2!guuh=r0`p=9A%m8757`8*jhTskE0NLz-ESWl~I0@5g#ruA3fD|JcU_I22DT8 z5?4Pk_RKoJaa?pjIgde79gPAGRh93)?=h>Z2TgTg+1c*#o&+!yO~lwq?04^1 zWP&rvIH_w^he}zLLSp|qQ8jsONBZBLXR%*CJS4iz2s)Xuo*X14Q$eK=rOs3WRp}JpM=u~^sUd~vJx1;d(ek(`#g~D`L*9F*f zo9Nj{Ji0&chY^-=qW;{ICPoaxcJs}sLyEY?PlitZj2)s(gwy0KTT92@DzPQ_W|SnS z%2oZjGJ?zI12YhN#GpT)NSb?G}t>t4t5`1=aqDBEAIhu1GnqWXK~*c_ zVpUvTKTwvcgczb7D{)UvH7O-6$o`Fg8)a@POI>z_;&Hg&TwN*`F^#l4MHq zB!S!|wnAtko8Rt`XJam2+EDAgGBAm8ak>V3w6mZi78NHO%sTF5fVSRD{(BIXQ?g<; zs2JDF-(hXyMMa6cdGo#>TjfUit7la*{%Ho9fCnu)E9ZIq^koserA+*PJD5kNI3FC8ONm;U(IReH8baU z^Xol6DA^)0t|T+iDyEJ2_YHNOItQ`B^REipIwZUBhc*?$S*q;C2!0pI7RkJhQ>CCUkY8K!Jf|#O$A*je#{tM{sR%J)EW0;VVpm1wldtC3Ot}4hjc?Kkc1wdT z(lS}~CP4+NN>wSYFwCwk`IVyxj_S5$ck2^;@GJrSZuxxHf3ZzS8{>Z6aQC-cLL13S z!(yJi4XOs(HjRs}zbaD&*(l9AEum=e?B3QypPU7se>O+GvUzu~I2D{7%mi-VHVI!5 zXde~Pgo(6W>1jvR+2X1TCIOmFDwV|=f@o)GB?Qja)SKJC1Q)2RgTxvPv)4_Qu z5c2rsxpeQ;cLh9`fJS}-QDl|XtA<3lBv8BHC<;pUgqVAE4W z>*K=ZpL*Q%FVFdnIygz{1zjlzY??#z zwTFRFzv*myR?=Y4aI7qCjub2t_F*RhS%}#FI_}0corsnj!R2_&JbiZUcdbDS`=7hfEbi(FLk9bbC`1z-D){q;ZWxUII#Zd{6Y z4w{GLO&)`?{Ja2TsH;F*dD;r*&vKeNVH>;03cHXbLK>jmrRr&RT_QFmg@@PMr1oJT zo8=v2)#EFOjc2~d2~EU`VP|S&m!t-YnFUE_&@NNrYIl)``y@5rR6eaF1SKO+<5J-E zZPktLV7|%-RbX93R1<_zTxDGSyug-bh_zMSB1V|aEmy0K!yJTt-EB55G8#=3OP6&t zOM%B9JjMw5!t(6rbJ{BDS?%67xLKN;z5D&PuX6Ij5F#x9a@F4y)nl8IKpU}#Kxn{- z>(9R5CTg%MTz#I5<~N%L?<2I3<>}1F2&^yaDQg`ZZe{J${A2EFr_X^U7eYY z$;FCM2XUX%V5vOebSRS}D>LCI&kdP{tC>rSM}Td&UC2mT$Q}qV#vpNOXm#)j z33QSN-6%`Mq(Winkcm+VT>^=tjklsm5+?EB!ghE(hr<-=uw*zMiAYBw)pI?@ADBn< z(irk=?$9HB%BeWGp15Uvq%PM)jLc4%O>#Mv9VcDGbQyFyN;;KBKVFbKK4Rf%yW>k> zet&%d(T<1!aX3!5_zGJ;^yXvr{=Po|F;9=G&Yl4|{fUV5SV~r|x&$+QG1W-3e;7tn zo4YSQN^>Smt71r~G7#&BlsW4VXhWF-+L?;~ z64UBq62~ddp(l^_taOp7>TWms8cT7>#0Wz=(EEJm(9wH|m{C=EWZQY9-P2dE|AYd2 z!T>$;hR8Z5$l>_T8cH3u&kd6bJ9NfTzCG$>MqN;%f_{nip6E(lJ^azJbQygx>k7o2 zcN2`Eq1`|B-+i;a?OAZkmw$HZUw`=C;(ipF1Y5qEFn-bkZ~E`jrUg75C5obZ_FBPp zf{A0?#>#Z;dZ6I8kzVRXMkJ_75LR&NCqdkr(~CcJ%Y$u{NyqxZFL$i;AV;GiIg{$n z5myd(*QKsp$LuK`jl9NSmkbMu#vG;Hb8N0rNprY=6Ih!B6`Y~$Y-QK48~k1mdP2!R zUOOq0Zolr~ZNv61eTUlkjzX=x{KcHBPg8&nRd;7QaP!292(7aIc25Y2L{u&v#t6-( zWpkGpvdd>V)G0<*^)S6qXF95IT6vJ}2D3Bm@sf9UZFg@9xlMw)+9=O|QX*EUwvlQb zyA_Ru+h|mZm1Xs5hP(f5x_GKhpxt+->v`wzaDWd+%C2H$a5qDe36&i$1P#65c;{!V zi@7zg6E2^hUo{k=-91chq;`APU$)ueIWC`HNMcQznIERg z^Dp~AC7CCLfbF`2vP^+5bUI*%090nSUa^$!{Zeat*d z<7nWffBbRNSt$(th$nQi8uEvj;p(NYZ~}PKbz{A1uEOKdVdSP`Voh7f^g3qnq|XdV zt@X%e-i%~;J8~o%5-u|C0j2K=4W=98F0<3lK}JH3-~8@-%K0qe4RZQv^+ZiqPEE*U zTE5AVqv2E6o{q;?XGkp5-cpX=?!54#rr(Wqn#%02$*Wj@k&u%}yP+ z<@(ipC?xC97kAZeQ1M=xykD4hi!^mIPKJ4No$NR?!t7bjw(($v)wN@Jonfue)JnCF zi41WLJv^3uPF+Wy1Pk@Y-zZ~C@X!9cMSm4n>oosRRqD=yQ4B0rSznd64{d*Ol{c;j zU-$P-q67=L!eX4@D`-{WX5{L3=uIzL&&mhbR!@6$TtG}lMVO{++V6%aQ>Cjj9gv3k7H;M+GzZTI?W2og;a(4^=v;MHoFV;^pw3Bjq0-M&-i4YTy-SMxGi zUWU+7FQwxs2$+O*(Wc#?17&}ld-gSCIh1+AZ}NHf^N~)Z$x;w){@KH zhaxrcD3?ayHYSVWrS+FRz4?F{($N^|(x_^TSs4aA>zJq@Cj-5Y8r}_^k|xCjIxA&8 z3e-kUN6t!@@XqX;7^WhlNej+TKi9Qj~{!XD}v75XBH^+ko@kc6jCt`E_~|-=w9NGo2?znKsaO4}RET zyB-6^L%4`>cnxQT<(C-*c=*0yah-KBFwk`J#Q@i@=Bb^FP}kiwd=Fzz=VFb*TZwS7K={$2 zR?p!FdU-4SgXT|{gHqHm2wFb1RQShAB^oZ^QxNJM&G!A-V_m=g<)z8}lt}=v9>#Em zkx7MbyCuHZjdKL3W3nOr`O2Qijkj&;LdI{=o&n%b+MT21u0WfeIb=P}T6GmB$8p=h zDm%K)6t;K2q1|Oqbg6PGH*zk)U843L{YQQ2w`AJYs7`&B*YAEk8u^;z!yC5GyT2`l zyZb$&X&STqvY=R`1>5zThI*e0sM*R=%##D*ZqrhA=1|4V;hbf+4#W_Xlu$_8Z???P zePXXXJk)(rSk7(#{mxdluLx|B_gIdGG-?vy{@YHTM3u$!te0=`ejsa9>qzyO62k0d z#_ZF?rhW7OZu;MGxsXYUs}hvzArYTeU(6^pn^484djB7|;m1Zr7n^v2Prja|D!E${ zJm81*E;64d(`I{}b6sXVxV_sqDInQF$PqE@Z(9_o_j_i`thdVzbyu2K5%pbVvJAsa zda@v)Pb7}>Gp=)*RrThF)1O~lAUu6=>_xJ_|8DfSV#c@i$beh{wtv_Es9LYdoWpe^ zL~A?yS(E;6x{toy4WPL>61{tU8~aXWur`&G$~vj>8X|E_2AdQY2UP)k0M+#%W1Zet zN&j{_cu64ex`Ps~uR1yM5f-v}_p7NI@4xsTInzI!2Y;W;@J~zwFM-%mk8;td!PcXr zI!PLOc`z_V3jTx*o}3J^y8oR|B;)&Pp!ULvtm09UJNYf0vaQY#ypEo8h7oo&rt>~k zbgP#+?M`X7p7Ob&eC8;hxfF+DdbM`fqD^F$TTCvP!r;Bfs9;pc#S%4HcZY402Dwwhd>0!RCe+f41mW0Im$Yus#(^dW1j7=m}jRkh|e^ zDzClj@gd%t<8Cw#8OjYzL!KD z95wG}@4-unq%XZD3W{+URUJP^#|w=|B$d(bkjs=8U(Wi@#P0)al3rDG(r=~je&2N8 zl^}VCHN@oc;W`Op4e4Z?u1aVtPt$FVlNnrBM4N2rK<|IQ?T>l&NkQDFJH@C_7Q-fK zJF-QtZ}9hK)_&4=BxT^OtdZ0x@}ql)RaSH(!eM-^P0%n7?~WgqZ$?CjGUS%x0-?EtaW!_{rZ~5yP;_q@CJcK40?oAJWdm4}ZI1`D}n*>h<6&zIdJ| z=FPPwyB_4^-~4Jj9FLOd#RB)=?>pBmm=%tz&&s6NBJr#!;g8(_*USI-IJMjlIu>5G zw0-J5j;qHImEFGOYE_^LUwqOvWPa!t=kud@(B0^66cDQJ`dTbHe8dUH>SQDQu&-dw zpwFhW$ulO+X%EYS{~vR2(qmbYrH6gT?9T5!A7aj-sbo-4V;*l?(Y0uk3$(Uj={1pVAbBQawap(TWS} zJaTjdyE-8OAIx=R?|bV@=(q^y^GO9P;om|(=KwU_7Ij@c6132F{!CRDpgc5^-q9rg}WV^dWaM+@7#7!b1qx>p)1 z3@K0dK=q`2P!gL5gVTNph%4pQRpEu5rn4_|DXq}%A_19KE(|EgCqHhnxxNGl*ncyK zYpdEsPbOGU&}?} zT$dY#s~`JCI_-O$-kLOpyh&q6*RNU;O6Y(!Y_EX6^jH&%8Kw5nID2-H%J|~N2E*+D zx6r>jpt#U+vll@&ZQdKqa4_s1MN|CVj^mNkXj4CLD<_9o%`o+!&}k!{Jh7?VoMK#KJY0FClOK^ zG)oQ)exT;g@?bJ^re(#F>4LNIUs|8c4?u?%;oYxJc>37})m7lPdOyL;7Q+`aHWwwT zR-)}Y!H=~_&>4-ar5R2zli#_!i-FIlSV zMqvu-oz4Jd<1hMro?~Vji5vmA*Hwm zXMaDU_+Fc79c((_(?8urgTZHxVZ8UA@BY@JD0Td(>rWb?m25-4yG03?Nt*R< zylyWrLvMUBUsqlWc$qf=0rr%%yr)yvI@AvB<^nV92k%Q7;f$b~v^PF+&#Dg~w*Ynt z8V4fuw_nHY$IR%iK1rXeR2I&8iSr;&Gd|%`K&B6B+z-X%yJOaZsqq!{oj7L|(S@sIB?0cHkHks(Dw=jWh z?E2FNTdrf1|9F!!k>i~e`>HPeXPggSh!5}sz@PldE>yl z@ssl9?{FL+t_^(%Vw-0a;uT@4F*WYL>%}Ch!~B8W&EMtQS9Xt-Z^-4@zRob1kpjL= zm%Bv1@9%w7w(Ww^3b%GhcT@lXAOJ~3K~!LuXpP~yb%@c2sHd(qtYsK5O6>P;q}7Wi9^TuHnBkfBOH0 z4_~kE_kUwX8S(+8T1F<~#w?e7)p)mdhBd>ZPPW`U&4San!fR31JJjv-?CI)9GLVPe z$owA#m9RJeC(6zb^)1(GETEbSx+Cp5OiQ6z_9TaD%_Rb-ZHn~g&iN@ZStmvH!Yk_|Ng zRimN8gR%^u*3h+I=+oy15P4+S#q$cAO@)GgM`M*8(0!t#QJIYaO`%spfq*eY93TB@ z7z!lM<#PA!5a0LYrFSSi0nJ65(yos1?JwSk77XL^+BbA|Pg;y;Pu#@|9cZ}N?I!bF z#`i>&_K*Nl!2V?5=&>>qKN^M5Dl7ird*29{>- zGM}R}BftDzWrKvOeGc6;56$s|zY-WW_A;j7@Gz&KN6q?5yPQRUmVQJlGGxkFcC&{2 zsv|F8Eh~rS*fY}lJ;G6Ov)+`@l|uEAAAY`mUd4H+{%(f34PfI^1GUC!??0og7)9$Z za=iBrm2?4J5iUM$Fa~Ch{a1tM`C?$&8)3WZMgjM;M>PJu3v}02Kx@vZv+K8~l;*lD z<2BA;=u;(UI=W~#yJrpRj~hQr)@U>v9s2Z-NN6%Mbm<4Wpnz#_@yQ?UVl&mv4$~<$ zs#WEO$;Q)+;r$d-=8_1_h5u4J0{eHKQ5RnisEXtSN-j`e_{@eKF!jN4glp+8stD^G zgOV5E#jDCrMHR8*JKqJqxYWR59mVr^Hq}2&Ug$6m#}CwZWjtE67un|#?0EZuG}=Km z&mpPc)(ANMj)BGSuF54CXGXWQrWtY!^!<`u%F={;?3Tj^%yV}BNCg$YfGSZ1tVJNh z3!FcpQuoC-z7gNl33*lKx0lI{u64cjs$Z(xkHBXBo^B=?*Lgbs&4*pSv#Fjv17jkFfJg8;>kfq3spJ?#h?%oZm^BOw0EgFE`p}-u%<+R>-$NZ8 zex&3TKZm}bBgu38HH~9>{UeC3@8L+Q+Lxf1fvWNu!|tOdl06Q+!8AF%d+QxW+YwL! z=tAN8RfFyiIxsw$W3%(449&H-rE$#$ z#_;vvOZ!tQBeDaoe^i4u8l-@4|L-#vd_lR@DC^YlHz$WCh=yK#+Qib=&>NgiGftsp zP~f+|hE%@lpf77|p6giNSjY^N1`clw+HDbjr=TkZ!^x1Ie{&9lZouwY88?9&CX9=L zYf5xGB@hnhTkl29VZz*-$PM)5#m3Jy1Z|Mx-lZM|d3n|0cEa!uu&s)g&khc5a?s5d zy8Gw@##e4y2b&EUIn2Z9!;S6-&SwS36}lbnJ5D;uDlgO8J$&au%(W>9j}!7efH=~J z$@JD7RF9d^G;EdB2;)E+0pIR@1YABT!G*@83C?=Dl)5MZFs$|sQa`6kLK9+8vu9(r zDn*gM7YK|0X1$Z&!zzoZ=nT2|`%P%4KLK2JNhHo zOM=gTx`i&u+u@RM^Z5zorT+{Vz)lvss8pk&yz=Y#z29&2U;W&Ge9<-YsuKwgAZXh#y=&{;p@K!@j zk0_Kq@`LY{cNN^$@D;r~E`DlYK( zIK)zqFZWb1Z2WU_HX}s@u3xsXoIH&-_E(9u|8M#3(>ayFX2A97``armAFz!vD7qJ^ zOv#pU`^7m7&k>&gY#X21{p&vVfa7Nbr=~aFkQZU5;y!2=-F!KttPAK;LxoC z#&9xdx&rO4!o_6^Cg8B|0djEK+dj;|ruCvZx>dln-)7U%W>fLNcrfw)uEPj}n;b|3 zw_gsC(6#Lf9KIUkGdB(((y$X_`?7(qJl=bJH^TM?^T9XMyO$bITmKx);7M!&2Sw!7 zE>!{gv%mO^7akUK@}Y~fjNK=7fS1kCr@^fWULhasBB zrYjQi&M}^T(t*PC^t;aoIKxr%qj^#QE{MZS9H~Qy7~=qt*HJ=yRiJE?m)k7}Z~oH5 z&wjT1L;StnPan?|*5#{g*E{E6rZY4L<3RLC#*s9WnLkvdVrY93krihRceQyDJK0L9 zv@ZNGMfi}~;g?^3jeq~Y{d*`yC@UWoxLRTN4=zE9&|RmLbbmia9R+e07f(_j>U^HE zB%h&eI$ZrYd1mBrEsJoCXUbJ!rh`P}3owdKqv&+xHoN<>j|jSYtFe7iC*$;W_}voC zXW}InPj~U>%)t4O8mMI}XADMjj%&4h(k8V(0#1h^MWC)oJqrR($3E^?*8^@&-`8Cg zD<1O{d2BvPsl6E;_HWX)z50_~f;G<$$G5|y{SKuRs!h6&!|gflqjKZ<;9>*Wn0OD{ z%gR6V1%;EX3vmH*I_P^~j96No8l3m#-XS z_o|8i9^Ulgxin97T*L94=xCxL3g6dWl_=^kbEXN$FSGAoxA2Q}7F0n{bqW~gvr8F| zWlRC>Ns4g!q7g`>eaIS!fM!#QVMiN_9)#^HZ)g{-_Vbsg82?lk3MvG*bI-6Q1-fQV zaZ-C(pt;a7n7aGrIg!?4C0XO zFpdVp*=t~Pa2!M&hsFx6Fik$GR<_QJAme-=%Q{3| zjQekfc$n?v@apgHf}N{DnKCIzdwbI=*Rc#ZIg@=yb#tB z4PL)!;jF_*zSe&_j%lOX3OP6D;dG7<((RFLOrX8gscvfJwEN~&9shoMKVm$ZxS>D# zlhj8U4m0|@86q5CqF<#@ZmI<1yFFzQFQM$ptWjn~NPPXW6aPLQ$7IlKEgHth^ErLa znZX9AFEn&T7*8gVAa?=c2fvYTza8S?(1jA>U^XkI=t`lvNPJ2CH%aoC6i{ELtRgo) ze!bFXZl6~o;y-^o$ueA?66n09!qA-xy&Q_V(D8HbQ=_tKHJU&{O9b40m7Jo|gsMr` zYOFMHyHAqC?!P*VXrsPPreiuuo+gtuId?Crm^qRn?0=J#4b?i4D$);B>E{lXyPl3t zym&aIdn{^&&1G84_p5u{WP@>KTO_Bi35R#-V#`vpv8p=3sd%QmD~|DGViMkN3+RF( z6Spd*a%U{BE5hNMGgO$%QKjJ(6r-8qs&NA*`hdmI9vH!Y{o<%7_)g=mK%4HIm zFdl6T)+cK-&M%5(I#R&pbs2R;KtQ!Eed{1(ptrvrW9vXy-d-2AXJ~)(^CNWW1Ky%k zp#Sv0`-sa%qX?K>c0S!&irY9`z~<4aZ@l({iK=>aSNKI-M5V0X*xvhbXzKXi&G!@RISs?K&x%ATZG7srETowc zze86F-IFp>#vZ;LVo4x2xLj7}(z(GQAC-p}&PNv*eHr7~rp;-Ai)VE-mdD%Km+%6z ztgJPPG8qq>vF%oy0?kz!o7(+X$&jl8C@)k@kcOkI!{>8%yH|BSPlwajV~mU+7@k5l zQ1m9dwt>_8MEVRg+Y)tK#3KCp-gu)B*09}GX?Q6!0$|4F4_nxY(Z8QO(?KT8tt#0` zWh0SJe6)glwQf0On_)yn=w(PW0wQarY+cL* z6e(175ql!KO?Y8z9FA{hJSrYWz~zfN1Z9N7?Hv0ZO8F9btX6_>{b>{Laqi{tVR4b> zL{2x8XBA&cjh9u-itT7azr_E!d|Jnn9s?N1Ah z4ivr{?HertA~xR6SW1&BZ!BqG(LrPeij7LmMF*JPiHjT$CK}_5=Z)vh4}b1n_pl)Y z@^r=NFk2@XZ7+Y&`u8$0-i|P5<0;M=Xr8J#?QCa;nS$q43eE&};h>JUyR0H74V1qh zXM)qSEF$^CH+^dIF{9d+tH?Gj%zSdbHcY^5tzY0QEOv&&HLy5{x}@l!ND=n0XXq+v zbeA>7^`k&{{+O|0Mx;WBk@+q&IHfemHmgUUZzee7LSq;xx0PtnXYGZkKDj)o$(l^m zibO=$bP8=?5@q&=HR9%H#_?S$p;Qft$T5%1m;q6TvIVk!-py8Tj=NTH&atlM}tzVw>K$e?5r%Y_^i3ZaU2| zLhp8EEX@&sVd4yinKCqHV7IG9=B1nT_hE0)-!$ zQ`TzElKHy4$n-lLRCKxe^~F_KbevS~fbN~5aMjDu=3Lu?qg zUyi6QGm6k5-S@>OT`Z3~$C&n6z>vvr>q3ETCWz&Ll3c8J=}yP&5Da|%^FxgCNfFvm zE&>D2IDgiHbGUld#l7MjV>WqZ#l`hen$T^ksJdt!<9IYNvry$q@$F>dj5HO5i;ufF z7BL@e8tNv%m5G^?o#gZ{SEQlEBDLWd^iTiCA9K~}NLr+8N}P)9y$y%-_5SNVQdT%- z)Z6mW{vwf&+l_TgDBnG(nZJ(R%ai{)0{D&1H!)lx~zF+~3S1B4wL0$*R*n>x)pq zRIVWn=naX+=G~X+d%KHLjKJi^hMBRuN=9s)W!pVJkab<4$O0H$0i;uQ^6nRB!FG@v z)~eNLcd3MM|89pHU;#V zUYx6CyuTel|K-2?1D+S}PKch(+BAo;-PJHdNa+-yN(a&k#0)cYO3&FFo~5Dg9B}or zi5r{%^hXC9qE|ON5uIGTYEU+*xoOUvyrg3kSBaPZbTeTHnT>PoBQu?TKc3Rqeo-nk zU6S2p2aI!?7@w_6r8WRFgKPOUtfG(DcbDM zvxKTTNPXOF(5SvxoL`VL?j7uu!kUH6GaBon5U^L}GJ?!aA=dQuFOJ#s^hP!RW3v0b zc-D&FO=~5pZ1}EeyrNn}2AyY^%)zKy)P#`J+g6(b^<~P;`kPtSys8yY!+yZ10w^yk zp{w%xmq(EeG+AlLj8>eJ%U4~3_7)n$Fs8LrQUHVv;xlp14}tO8!RI|TmpLvi8`sZX zBq|~%;C!@?t}y_VS<0$3VV{+#jA4*X8El>z69H|f#eOZ?v{v)%RXF2Xm2$3RxSiuU z*M&k=>(~rl5U1&qWdLd5V!6906<&SP#d7xH-bVDP$344@pOL)yQ@D`h!Rs4EIyeq* zNsE&LG(}zrYSEG}RAkBpfODT^#45;J1Ov~8G44%ts!9>aD5#*pzI#>)n{e~>IaWn1 zGp=8BaE?(F1Z!;w?t}eqO7C<72xkAA1E}!xYPwJ%Fk#T2{hQCCG}2@p9DBSuJ4Uyy zV!CV$V;r+l`@nK(X6JA4Y~m_0Gq$hV*i!(2>EOlPee@!6j%<}z&sq)zoNyd!Q~D^8 zf&I-G9fwa}m9LkEtj3J#cg`{{o_BuH*)z!+huykZq)_AykKZtBat+C2gMhvM4b)Bw7*M*4Mr)lhtM(_l9Ht;ZY z#|-S>4H0R0{c;m47LFNaoZ~%_A{3WR?3=pD;qcWdBAcqV$N(UOqE=%6kxP=dZg%Kz z{2T~rLUU1~dsatk3~L!v5bk2<`zMqo1?J>pHd3?-S3hnOoBHVR{Xx0i<;;2Z2VpdGLgC~p(`JJ+sR`8`7vs!D;0VmSl&RPo>=NYb- zhha$GNmWW#hI``;OK943&uZvO`OLt0>@u6wNY7JWwo1%n6mVXPK>P2%zaQfRU;x@> zYG`5Mmr2{QO0x)HfV4v0l~Mb*A0|-`&L1p0#(cJMBTz_dmn~$JnH*R5 zT#*PEhpab1ihNCaIq;K=PS+E}lVcIde)OYGKnCw_GMWWqP&V_fKqxX++xy!=lnm4g zX1!cD0pQW%;^S5r{dvrgS(6oI4m&1XG&|tplR8G(q`Z`8o{ep;Q`v7g8;s|ytW)cd zaV_gDGpt;E-Wi7>Be(;>H+z@g6Qn_PQVFlW>C@S;j3+nNRTXz)4_TBS4SVvE-cTD ziX&KNaw6E(g+lkF&iWlLmI4`!sZSLPXB?)Z%mT`oL9r)E-02vUlG32i$7NSBTO*hb(aO zqKRjolxGX}=q$!`wwQx_xStELm`4lxvw!y)lk(*UGq_k1YP+mi7dWrPCbcrknb`#v zTL1cIFPoT#vtt~O4rUG!E87g}#3)EZ1tSV(9F7yF(Z*3{jtya@2zAIpmgK}u4$ZcRmwWeaOeG4(*gnZfBPWBZP7bzc zOBkD`S^Jv-Zca7msx9N}1+#a~oLf?t!Z|m)P#;d4XZO4ojJ`SK(~hz>?#{uHhd)n# z+6rg-_U9Q~*D|g?s(Fe|%#|t#^>qe7*c+VQWm*xn3VV#>Jb}s-rFO3x5lobIA!MIV?`N^b zd4G!3YFJSr@+kRiJM}F>Z6!t0lf&_yhq*7)+dg~9A;>NUE@h`vsgr#_cj>DwgLnI{ zGX!2qB9kl1G_Rsch3-iuN`vLnPg35gpKho4tes6zU5_|ZF~B9|`&`D_2)i%40#%ow zyu*6~(o6Z>V7Dp!^Co|tmR0PvIOAz&7Ne*u!dTh};!q{|Y?nNPFDV@ZZBoE=KPFTn z5mXb{034&J6?7KNC`Fjzz;*#>5UK#4RjsR|>mVm4_jcZ@9nvP?mYZ5idZd^qnBF2;@) z<9#YERht5rpLTfnYo9)o@DLel-~Rj{QD)c03U({m0XEMnF$kC& zQdJP%{N*vtIjEJek@nd4sKVK4)Vo4ldv0itZzqv0o^Qwac?_W1YLUftmxbt=s7i_t z<>f{*I=ub-7=1*$D-xC;z&tQ)79cdc!k2{sFgY)!N?Ct#NJ6$mgz>J=j47emXpt%B z+;!f^XTizLB7%3;m%DQ(qOzdC@+<;~=DL=9=xnoD90FNJ9rpJk&6+Qha&pYKuVxUZ zY`4-y?1PX}AgyDCz)lv^UY0y{s|2!6BSq>na-lt-jEZa?6f;dO^-AC+Xen!)pT{BC zPexJuf!d|-;%3Hho4^WHsn9h_z=@Z8U!I!C69ezMs00{e(N`k!=W^PQ zG2?>*>Z{Tt7&%bNoD-Oa;l-|&fnTKvC>7{m{;z+;N)z7yrjMQds@14kg{svdT{bx0 zO)#^AQVMmg(Oj0Xkpg(`dK=1I%)odwp!{&X>7%}G(JTjVf$ys9wG34j5ObN%dB?#E zj(-G|6zX>VAlf;pkBw)}&`FHVRprZ20e)9qE9gc6&Kr^UzdC!x!v&UHkRYMcg-V8n zf%du#{SN={qE4t8QiQ|1F_lS(aJm~~w7~2m-DS%c6``ooCLyIjnRF!u2ebTsJX_p+ zeoE1U4u*(ROK0lSf$Ae5;Fk%uX;>bnMRix?tjrm&J0KQv`R2+Udk}(_2-*O z5Zeu>Sv*R;;+mZ?r^8kdnrw&-F3>mRM%Kw@fht$rwHd$x4A?Fi;X-K%4IL%q)DFfE zU1r%1Y4Y`RhS#umDT8%j*o=avsbur_yb}CTMu{HDsqaNbvU}ACsBiz?h~eDp6%x&^ z7=ZPH8gu|Y_5l|F03ZNKL_t&&qc2S?!xDf>%UKy!m66NL&KBcsR&rB-%768iu z#1N4{w>ih?hiqRNCHh$XIHvxhV{D$+-gwRa-*%Q6m0ErlY_l$u=$Y-FHv%?oW+UO) z`Rf6UwZpv!>!5AzMf z!N3G#4fc3_GbgB9wb5}CG#ibg%qTvz_FgiJPI8#);q8F_Zu0#Yczu$pQIVs^4@6~# zzXrcC|^d%db`unrGAKG%%@2l(y}XJgy4-t8Ph+@EK*>t$q!^L0zH$1nQdy8 zyHFZfIQp%Lvn!s>H>Vib4_Uv6+*f z52JvLs#?VfW^Y7-0nMArko}y+h!B8jcCnGp;r9#A76F)z#W+u*EVp@9i5_%+o33Zu zX%zWkSc!cp!$Nv>sEqi1sR}U^rwW}Z3f6Bo2X_b&n>?v$i&hDut+3|d|Vg|)a zC@17)vnkMKS)Iw4y8*zJ8Jj2tz49#BC@z)YtczS=OX=v8_^o3BVs~7PcQ+F$A-~8tzu1(6foXf zm@#D$m)k-_FcwObtF+~e4x4Z;=TyaEMy<=V*$GfZA+n18eGfa?z;DISou5!%u+_>@ zOpE>Z%LuGcO7Qkfqr+@c?L#fkQbP1{7Gxe~NiJ9?TsyPO4oDN;|MnQ4Av5FRWg~h% znn@zYR&r;<VV$HYDBnqy`_9PU*+1uUBm@@_dpMfgTtGfKC!TD~Ea-`Ko z22>$$L~=Bbo8^4U*iXVKmAgV_lzS@zn5rS!8#OWm+`Ono|6~8nkbwah?KZ){wI-Yn zR%8-|mPl!9(_9xAXm+J2iQ2(Mt}g=5@9J4U@NaPd(c`ww$(aSW^rQFX9R#9s5nI3G=%lT*sCK`fJnpe2Hb z8jbFPkhyDXmqcRbvL~ZGoz!L{a8uWp$Kho`-X z!^)1G7prp8i6E;?bk{Z7s|0Q^y~A)!XSD28a8${NmaW`7cdt)z9nEObZL0`EQHAo& zXv#9f95q--PAsJ6#mhc`nEf~#8L;%Oaigf2D8u1clx(~SL_v#%Zno6@wt+Oz=b*EJ5Ki^KN=@OcHW#G?;^5qZ_ zZfYcHa`KHd8#XEj@<5fP?9Hw~vkmoq_6QPZoJb*;l+|S{lXl`*svC}@7(`Na0bQre zX6g+%3$m+L!_H~u!VldbQUEx|*uH9Fnns#%_qB{T+ie-sXi`9bv_e#g!UoHohc!+# zp*PpHh{8M*C{9MBwZK z`YReYVE3eoXPFeC*)=iZwTAKSFK@F zsr>?CX2|y;q#jK_WaS|OXq3PZXE@F-Fawt#x2X>R!ufuRPJ{t;n*!Y~m7jH`QMOfd zo5i(W|y30Y@SwW=0yR+(ZGa^#yLjQ6{t6U-o*E#3!LwVXj`ZA3?u+7 zbfHkTMVzJM0FH`)p?~&2{{gcL@UF8J_;FPbv?jlq7V7e#JI?HXzj<2vzDC%*{eF(# z+N*UbXr+8}DIle$D1+-Yuyt-Qt)wep$Jjk@V@gIuUNmY91tiC)E)|L{LvNXYm&W6N z*fCD;2Qd_=>VVH)${Qym2CUZo8aJ_!gWNu=Jlcu#sAffLoken_e6*R*X_Vzkn1}&m z5|sea%6VwQ`CVcMB?5LYD-l(fP3eVVmZteTnMyQWCHfxoWW_oVk)MRlSw{<%wAaHy z;RH^BRV*TRwk+Yva<0(#&U%?)Q7=zs?4yN0um1j}_{{VD6bT%cd7S4Twb@!S+N&;_ zJJJfT|MDjB9x>zk=|&hsGuo(M^P!T5ELQ<#Euq-QUano!%DxTH^0QB;S@LUHfCo9{ zo%aFk%=q*lU5hz{cb^|K>id4sa7ZXMr3mBMNu3A0F&`!aWkxa??AG(}V%C6#R<3 zb27*$BRAKZL_5U5{kI1({MXiH-kV2Jsf1VzC9M2Bs6u&AOvV&24e7p$N};_hBW;qi zjPW$bL0KO}I?NLbDyZ1oQNTRd3?k0xE-PGp{Ijw zx8EpKTOAPuy3imz2 z7z%aGqLhdmXQb@rDKCRjFqkZzoHePhqicodKikEq-Z{qI*JoiUo`2km(m>gkf`N7a z_KYE;l!zMi**%|EQ5N%uZ6}3HrpTtGtz-0)G5Z|$T(u!*y&$Czy5HKBNDbhRVv=-yp$c#jjKyf+8q8<$Ljp1su z051r~x4qa0`}eD9b$X~*bqw)-0eooV$ma)Ao z(QS343Msk@MN`ITWI7wX{mp%ZyJL!+DSBv`A}gOh8pILmnYS(h;d6V7*IqND&Yjg0Z^9z^Q-`W*9l2?jp- z}gT5 zHGT4oQhe-$zv6TlPbHQOR=Ks%}IInJBa0WBper8NF|-=={8a zn~>*pN_(EHeDk|mk_e6`$^BK<3cJfD%U)UB8#|yV3~~WB+iD53K3UOAbIh1?K#U?3 znRt}1I!GnUs?%b97Q>lQg5mtzqi`%2&nt1>jRe^F=6D9}HKW6n?PD(sYX61Ad59Ms$=E-$T|^Hffz5 zdm_pOO=^z@bv9p8R0`8!_IgT`)&q4BOI=k%P?}Sp#`tM>`WOGxAF#72^7mdxq1x!U zu}Kkz!;CRBb-eL)CY!2`7Ly2{IO5~^Cs}(7rZd5`DD8OXB5WhGY z%_bRKGZ~)}&S^lgs!ER{pk-D;qiB@C)DLGPQpR!>am}+64Wss=KzmU{gb@*Nc-uz^ zGZ8TK35K_JLL3^9Q*WZM9XrOWpKitGAMQP0KV`;2Rgw~Wx|>B0quJCVx^~9lblVGK zQ`fR-*j`t{W188C2CcJWxBn9-Z<^67-Hh$`Vp>>fA)o4074?_f;-p*o@d^*p2dzh|_?tRuKul?l@cf!fclMfowvvE+$3S(~S1cV_4%y&N1D?=pgzybt9M1q5D znIFrU7K%cN?1ljpn?huerITX;b*DT`K64@vK^LRh+Pk7wVINyx^yOtEBDu7yxHBd#Wme4={w?F2k&Q&%F?PcL- zB|;W5o@R{4InIX+XNTd;DQeU;v%z}htMs1)JyStCmXqlc|64_p_X&Lmz- zNq$f=pE`bT;(`$Qp~_6^97+MxkTeyV)|cB{rZQLsjpYv+1|q`vwuc*1xvae?gyRE% z9+FzWyO1S1(?5)+rmTMeX1x5tg)n00qbJ%-8;POy3TIy{a2EBt(5uP~Urr;xG~`7z zjWrCG1Z|366KS+hzd4Fh2{Ul@O4jgK6+$$fLXK)C1)MT%5+V}R6wJWI%T_?S-Rv;+ z@_wp%1&`E(GAp-%fpIULjQK#&A)3s*c2p8Rt12x}2j*n({Kttsmo(v<|Laa@@ldIJ zl$qJ)qL5JW;Vw-h6M)V05_L9f!H#kFr9_s^ca!XyX@xR#O!ak%&BrbB4t2kuWhOE@ zZ%}zv`pn#jaV9wt^5{)xWX-jED%D4yJkLvYg!9dSa|Sv?f`wngmkQjj_3+1q#y#*3LEr=e#d0s3JA{nNkr z2`h4_y1v0ER|+nhkY?v2h1^+~z?-#9SZnPUPXbZ2V9qQm1 z+v9^eU9(F%9yUY^oGHGwJC!n~kljqDyh-Qzq;lbw>*pPst`udQ*O(Ck zhRJT>WXgIvM}zH!#P6T)WRttB;N^{%@7a~mZ9ew_3^#HL-HuX{mPk&$`)GU;*J7tt zIgbe4Q#m_v{h|{0JnUy2UJo*b+0`p*d0wd;r_IPh_%7{6=&WIDwF;k}X1I1SroFXxK&)`V%2qKK{Cdm}+ z*q0EOra1_+HKP3MjAy46js_X=Co{^5#Cfb5jk45PcFmY?v%LUd91Z$R%Al30G|y^u zud))x=rHFf8zPuPK&xaAMn+DA$<6|HJDr?lzAXstbuFCe?y~f9lbj63yT3X}dikA{ z8&#SG6qZOD0|0pPhpkBS=d(k9D~;8(UqMS1iHMRd zf>_IS`k)BqwYGZC7LB0lTQlLF`4Ilyg0@9^~` zo=LG$DC(rS<7UR#&!RuwUKhSMx}ahY6F3L3IL7ryo6Mdw`tuy5JOVEv6qGCc{MtYM zZ$Du+4$ZR~+aGkHz)T)#FeD9MB7&P7++YQf9=jx|K>!R(M2(%PB?u#q%u&UfKJwvi#&=9$glC9GrD6!`?T~WIa<;)i_^`N9+veHZZ61F zmMW=qg$Vq~pI&)lzbpcr`&5!r8Zd`6`5o(&xs76n*%{S^~Wzv4tCwcanESZ9UH~--zUQ=Hc z55NZIBzr~MSG6#L)8ueGPNLt?Y-FjcC_I;4{<-6=Ok2;VQHnNEps>lx*1IQF;)4s% z>h84!GPKXi6*L#<-%SE_rB`L!YNKHWBL;EzUwAILMao$zLcNoKhvWS@f+Uz3Wm}0U zeLvqO&%@@bM%~IFc7HFOr$PbcwAed`y?j>o#BkYkyDkY;CzTclBJvWnk_3>&tOo$x-kwEPSd<>(m#^9LA9f;Ief`({1JqgjtduqVnIANT z&npADeO990F|t3R%n9dsgK ze=lLI3Q9UA2R!|xU7^$*hJzLLo$lo-qBo3b@2S`OlOLG+!9Tjpi~!;A?I4XnIE?vy zlx-oD=|~ao-X6r>D4SAnnFVaDM5FC0(Z2%-ceiKBIt&HnEus{@g0fGt32It-jqE#v2gWH zqq&rk+55M>Flbr>RZXG>*L9N4nrFZqSu{5H`(D(gRS-goXfOv{f7E#R=|XxqGhY9^ zPZ1`2l0}`>Fo^*45+O8CjGQ@w2zdILdP%D;lK>WK=fH8OQx3 zHrwW+lupPwPvw%81!z{VE9bGlmk>^#9uoCE`J@ri_1)K#L_#svHCy?xpe3wh~b# z5#exHMUiI~JXajb2H#~M!NBg*MjT`_THJlri?@9G4==>MvIE|KF2A4bLzr%JC7bWZ zeJ>!=%#7x;Ss85yHmR)YEaT}%o0uVT_}M(In1WG0D9w4Uwyd{z%W^+5#KifM$*rA8 zu3G4`ZaJjujKkBPY;gC*7&)Tq%M#toT9m;0ug-$IOBF!#R10L_cwWg5taNe!AGnoy z=HVE(zc>pgLU?5Msa$0dm86Lw1&oIk8^-J%LjF9iUbUhTZf6!u4MafI6c3=uvfS%= z#;R=+s~X==Fd2mlJD|Q)f@#={3^U7pY_0t4dh6}CE+|x22*=kWrh|l+69D=r|N1ko zJB{7T68*iwboOb?aAzd+_5$kRa=i{8wffOin zIcOrxvlW~`48WaaBg|TdY*l zF}+O`D7wWwg_AE0a=W*61!H3UE7AdO=oFMxq@<#p|u(^PmY z-^q1UTGD6}yu@;DRFx)ASCbpeiC4pegzHsf{q*_q!M(N5wYY3E;z6)5uc%Sj0nh$W z&Y}$OXQ4jn*8~q7@2X9NVy7NtcM%#IOS!4c9c$J1i)KrH@G7U>vJ9|der7TsACl-B201uqV_IV}F04c)VFV4b{F3=KHQLKOnE+5sj>ofzmSKH5ogZ9X zQB1u=w3tWhny~$-7R}z%&4hkGizwpLe{d-d#jrOxz8gh^;CH-yu-#MHEM*I3dr)@( z03ZNKL_t*PJP6QbA=XV-%1fhW-%pkvq4su|=T+3`DhcFQjB#9{b?%&ice>d@$;1Lz zAGIsiUc#GSo#f9RVf!@(a#FigxcaeduFm@j)2(dwbsy;m46bv((k{0w(rXZK{ljLZ zbqn18s{d}o2s~i*)t!0(J)e6gB3B}yzmv2gbyuLhC`B*o?QdkZx2Rf*b#f0c>G~%d z5%!TL9DgmHNb^*S>m&mDy|n0$l_9QwP{*o)8yNFRLP$T*|Myu5NzSWcEBB#UW$A#Q zj2AtqD>?E}!rwTH`CQeFUnXt9X(E zj&FVNpZ8$v9f<)a(1IkhVpXw~Z}=+V{lhXaDR4SLG^V9UWBR z59}t$I#Q?}9Pec*3PhpvpBAntC2#(8w77V-axm*ikszb#;AzjjH^7^KWO0_ghC!AR zn!!fub3gY1Tz}MMr7ptp{p6#d>Oo3w9g_TNcu?C6c?I%w2kS_+zE&&AUtl`( zcSb>~AY6S~i}&^K<_E)CkEYWrqo^wKk&-yr?%|BiY6hWfG`1_0(9IVQdm-J0M0h=j z7#Y}o(n$1+A{>8t5JP`OODI=Tu4ZJIb!0uQr?m+eucYTYeKS5Xq0J9M>otR|Zj}KE zJNCpJM0_M_BqH=#L=m9CAv+4mW#<-&DX}5(C!U6{;BEf5z zZ7PQ|Glu(Fbj_F<)oQqNnZw8{BF?ZVLlOuEE~>yrz{JR62>Ifwd{9{_H#*GhCDPLI zUiMsy4Mp(5vKQ~Z=rNvh!7aw-vJ&^~X6HHbmfnnGY%WSc`(!PHe)i`txU5Muey)B{ z`TFm|OJ%)O=mTTB;C}S{e!@-ECV*9lA zWBi=hM*IDY@wB4B-jyO-aV)fbJOpx6pnWb=?bB~0C4wqF-@c3rNjMJzFi-N@l_Fez zTtE2P;j2NSH^5@O7Mg1Tj|5O|^#j|v9#9+Z=S;rUU-PiaY5;m*lrNu_0yod>hmm9? z1KfTt%Q=rmi^a+)0&qq>a9Hamb5Sa^8+kz2bS8hBMv({@_mT+FGW$vT?=XtYz_VAi zFrGvdOQ!K$d@((Un#+zJoQ=E@8cPqWeu<~lkf4&wCz9K0VKi7kFbHL6=Q!iDA`G|l z1Fo+1wKGFbs3V9st>`r#v{m4z_w$!E8!h(MxVO0cq?MVM0;Yp315!aKwt0ntaP#Yv z=&b;OgKG7xr-RHayKN!BEMQ=oS1vS?~EYOS&h= z*gdIJzvyTG^f{NM0$aw5KWflk$uf|cy_pdC5bbVNW%!IWzsRs%lqe#5&xE?3OGSzz5c;UA0!O%=jX{i1;Gv2DY7Jz(JZ| zW-181h{pbe$V?>n9p#xd(%b zI>&f)C?8Dp6LR`vV`Rr8&5NJs?D_QDsE6b%1~q=jz4t6)w4G&IVOgPrc`E?WH2!#= zj^GpVYf2HyS@``b^K3s|e^Et_jjMR?RhQaS? zz%0U9L^ofBdAdWC5%1S7ibTpqGInG8Fux>$Na!qjEYI@jc>~rzR92A&?!Io0;Jt|or)I_#7LvRtkcY!RAcOGY-a(Z{D$EL^!>UNy-bjbCQBCOsu*xsIM z(RpMu1Fb0lv!NayW-9qHM_DY>F$Xd`H+cTHMKEZ_TY~pd8K1CG&n~loBaF419;l%Z zfov496FD;~k44WcHc_lmOwexIlG z!ehXLfcaUdL*@58uKy5tz{7QsXYPS?X~HnwBgo$zJ;uhdM0y`tNH+jRN4b~QMGbZy z&wg97#GZ{cp>hgyEi}%uuYzRmXbj`XsoR88@rZ!=dCK-i(}sW83(1DrEDeo^2Xq-5 zBEtL6E0%AF(KVYHlxIosnftdrH=NNKAx*gW8Lt57cM-77LN5^jZvUYQ4WdVI4aaCH zGKguW!@a%-*O*3)*UWohd6q|t0f5ssDA6YctX{WZ38)Cb=a=b&96AmfasxXjE|P2V%thTy9gpA<(~r^8yecb3s{E>cq%9efor-97*jct91J4WxVf zr)|&_J<`@ml+*R2(5HVWe4u~%fBnkalS-;_Hm?eitl_|sW@=0po^G^+hx4&Vs5N2x zHlk_vbkS)^ZR`;qax2u03`CZCKY&!la;VX2vOtK?LGauVNtP*Kzh~&Z0zHM?A0xOmt{(zpH~eCu1@{ zoZ#mHxZXyk!X9TYW{i$%YRk2@9AA$(3V{bUo2a@iQJjyi_&9*&tCH=<=Em~9md2`? zVWrS`3mzsih-SeX7T^47%Oa7}X61*yJFtl2;>Uo9^C;(O@LZH4tXC~71y`BkAkx_r z4t)g1JSxiRRt{NImF0{dqu`V7QEz$moPi65oq6X$g+3kGg3V1E%oRCEPaP`Z4(G@i zI+knGzxdZLJutSlGsJNo-L?-V$tgpapQlj`e<(?CKxGL$iZYUQD568vdECEl*aAo# z_2sLQC6-q2BaiT)WO-VBac)pvB~c|%C|hta&}J4Iymx=tGEQ|C(@~EE56O#`3}KRL zWT(TZFwUf>C}6X_$M#*v4qW`Yd{u@~BLSQ1fqgDEgx-0aM_wTjFl@s@a+QZ34gl=# zI;?NnFyWl4V9?QcfL#b$9ytGG#*A;<3ROjsA%q8J(O{&piLhgTs-o*aXIc4FIy1oNPJh@vkG6E#74?f0dvVFz~%A_=)58iMywvm{V;CL+B3 zYRe`>W~B~{A<z3?S~nf6$6+o}*M-$#E(m=(RHej#p_+YPg zn*n81CD&Iyl9R?}?>%N^9)O4+{E>c+^MgZegVNZ}pEUD&?8jC_bf@wMA*|#6O`y<6 zEBEeogJ-XbQTBg-59e1JoBRFT_0xslm#;bN(PEr{nyH7JP@Wr>mFqIQCOkwo2#f+rJ&bpSA5WXyY9uO8va06^U{ zY3%YU3&*AUu@gR?HSJQ*EQs%U$ejuZZMkIP0P3;kxWr9jg02RH-!-NUJ>TpOMx& zb(2hH_^s6~Gx%{q0~}D_cM%oHt8!fDSso0Lv`ene;x(hL?xnLKT%IS-JnGq5B#YxcbjI^dRmIouP}OHQ4!#}t z)6>75v%h^CX`UsyLUEo1az%abu)b~sFwlx{{=5wAl5;>?N7O3_$z{&Y{p!ng_`8`7 zw8DUKfLzQRjOQSX;%sBlZ^!)JI)fJhq0H|JdQ#*1rOQ}!BR603UB_n;ovb3?~Mq7=-}Ztu3paB zHH!y06noy<|#L9LUR`^H!v;Su`22i)xG?zWXZYpz2)r`(gBV_V&EYp4mPk9 z5-R}FnwB$Oikz0b!faPHyhuVafa`$)Lz)}bssHB(5MaB0oDs|v2gm!Bus<9JkWoeT z#QROgxz#a%P$)YKYc0BNV9$eT&$(~c!_K`w{hgs&)&^5yDyIok_=mC@IKwV*M z5>(tFjnTBb&PXT&tDa6Gq3M|yz#reZJ2|gJ+b^)3?3jbIs@=9 z883IPB@a+4>8&j<;Wc9dx>-Nahvj7wjtu~?z3))R<fat}9|8{v8KL0i?EUFbzyk0<|V$$Ac&trgdXoyRRtY+wGaWM|^~%Q{eV0D#3) zK6dy1T@#M{1u(zJ#$JQdYw3rF0d9xAnH#7)T!(Jcqq%9AK~ACwl@!60`Ulrg1QF|T z^;-@i&CZ^5Y>(nobS*aGEOZ#F(K{Nj&%LW`7{Zkyi9^(B5OTX?;B=> zE}j?1?=$&GNGBOTKbtrwstMIy%g%h<=;}Q%zu*p?DWaU>|M-7==0lEL2UE)cpdT!g z(ICZ#*So=wUDQz&lSLZ=9?UpS8NDG2dzB(wJ567a8o$H#=61mFAjxwx-YmjTD8z0Bk#;TZg}Ga*gH7f?u}% zci%Luq`5p#kVF8oTgd=YMoD?+91|uaO)v`%Ae(P~7(jr>0mw)(wQy0iH+z~PixTWZ zAI`ErTu;2m{NUlckor{#;rz3ldFt0+)QENUm(RJAc>k_p4%6Z?=aqcDg^MU$MG6!( z-q^vRtAzEA=uoAAe5qLpz0T8cdlLofyodXH|K*mgPjSX`#eEazamT1x2V#vQAQDU& zMGjkw_3MT)En0AfV#o3DtYfb4Co zGQBJSLqW29^~E}D`rC)|u@P2g^j3mFT1k)3}U%Aj};+`p~arn-1hGEcm1gih!So~zmX!xrB1 zlG&I)J<>>w`r?sB8}ZcM1LwaeS=pukk;(Ie5m1IV=Jl0j>*KvZVS$g9rSS0`Kg1g9 zh=eLa3W9QD%#mVZpd!eQ=-jXiD$flQ!6XH|{(n|XHDdXcR|+=ka8xTiFnhv5Kq`;6 zj`tYh{W5mN%piE*g2qHTNKea zfT8Z7^E8Zx6$g>0znbIvPrFbPZ)1@!!nrX?P7Fj2rLdU#Z81C7aDGglduL&L3zMfX*?EFyYcY)FQx6wh+2i!7i&rTY zXAci$XdQ09ZqRn&?2WS*850w``L1T0^ZaRXJe0>_^?RQ0hm0N(aR0|Oi;nUcKS1fB zF5Le>BxF6B+nO1K3kf`Sf_L2ToPr1*FH&Sn!w=EhE~E$c!)9!xsq_BZ9qSL!Msedv zk_3krjb40>hdcuFkoI-qdH&E4sf-SXTc^0byYv$>aBFqvlq_=s;0ooWNR(CP*^BlZv-9Z;T&)_|e zR4E!O4KG)urR8Y+0(x-OvtF0(-XV?Tdaiym!}aI8N8XQTvpj6)f`L?{H*bR+j(4MK zZoHNzQ|Q9EPh;Ca>w@Rw_aKtT+G}+OQ>2juiGqtX)2@D5;`&d!;~BVknnG)W_2Jm! zGy}Bfy+a)=27NMHXc$2|*WrFSe_22$2|E+Jw>x2D0OrKNH`@^u%t?egoKXKUqmw0} z^vB{VMcdjSVeh;LIRfqNAOWau90og}3p!D2(Esp%{yNNa^^SXjd*Fy)Pyc4dKKu6f zJH~}7MOZvb*;?FuSF!KBd{HvayN{DZ0CbsxOxW<)+%!z0U<41Ih)sp2qOnh(cZxPQ zH7d>9q!fVY3x@Q^Z|A_t(`dGdd&UVYMXLgl}hAX>N z3_#xf{gxYcApx(nV#)TT)X1Vf4W)?DF~I0K$G=nG^P-4E;_5w6oM~n}Ov#_69~|3X z+xHFXRVw$5WDiIF%-q^*5P8S(ha`gzt*dC~n zcVBQWdv?LSatS=VAHAyB*k(@@%dNcqyNv+GVDCxb0RW2^d?1qq9snM~+tb5z-wBb1 zVw6o*s$g!zG5Rq4w_NWcrCQ+4->*fwi2;ZoXFWUyK+RBHHvc*8wul_{3b zQJ$cDY)E)z7CexpnjPG#8pO4ij9%3?{Cqsk*gAD<8wm*RDM7(OvVz#X79vbX9&KV7 zeU}PGj{^u$-_$}?n+zh7(X;T(>}f^Nngif=J8*jSk?Z->L4+X0!{eHg03xx?Aq5ln zvk-w|Sz!Wp?{>`Se+WbZRS@Eh&0{#i*NHSg-_5#1yA>1$p5-upa2Q$-8x>+Dg+^L( zLz`bJKF|5!B~K-T=)=jN`Lmn@PpUZwEl>kvl86I}PLx>M`TsTW@E*vYaOr{F+m?y1 zDa9qL5BECGGEl)r>R0?A)Zn0yCK|CFsOw>zJQ;7WK?QSA2!z|WHCz8|VUR`1;GuEo zcRZ4P_9}mru>*iY=<=>Lk2+PA@P>9Lman z=#`yoRPTmIQAr9O5q!fbf{Kj2@)QTSlS|=-fq_VIRd5iYky2uyt{ejq4PpQ?YU#NE zM4HYb%@rT(OThg%TV@CsPcy#HD#x6HJlAYo!T_LKbqpAl;LUqCib$URR!Ro8;`Fvx zfM*qn7Q5G>P18`&%g9c+!ye%F$L>Ofj&zowuZLioD>?^6ax~tKb8*y(oz9mjit`M2 z-)w>o{>}Ra^k4liKl8DXV^If2rPx5$17q9%>RXQN5+xu3$5hlIfk(FqWraT!cAfHf z#|>a@IHL35sl6)Lrl_t55xf?q@Sq;))e(Ry<=2`h4Mj1p&TIFH2-`ROP?!ZbiUdFl zo?S0UXQUI)Me>%Fps~~T9ju#@JP9wVde7I@XhNCmAHA*sPz&ptY5_pBX2}IoLImOg zv*hb4MIaxuuHHig5Xob%yLLahF9`=$3BM1aXltk}>q{D)4NgB^{frk`z(M?bC!Fo- z`%VO5z2wn1oo&5`W-xUhm#qlkfs?H#u7YcYzG(D1SA+O2yrFUZza0FjY$ z^sJ&$1`%NQZ70rN(Q~2jLIRP>iw+ZuMyA$Ph(_9NkLIL;lK$nt`PK0!dhLRw&xiOr zDRgz#p}B2-G+#G$7$wdwPW*i6F#eYW9@5$p5w>r)oVU~@MhWJT;4x+B>Ux0W{QeLh z`rxq`q%&R&u!{i112~@>4E;Fv`1E_F>ZHq;1@|DONqZB9uDR}c&&-seyEKB5!Ps=j zjLPq0>SnML;VwqH5vylU!qdDfDSoR+e;mB#7v_Ahsxh z2mw~eZQ0H;W$CH4mDY6%M5IXMF9sq%pD`N~fQSKT??ZPhJh~{My5n|M3B7iQ5fHKM zn+bs9JI^ZXyz{vF%}mT&*6V&;o{vfN5D`cV9Nk;a(Zv-5e=Y;}ao`bG4vaj0d6BXZ zTk?=U20TP6V!yT?!1820ohCMamDK2UfFcQ!l$b%DGIDn7*=*~vvtK@lT`zQ)7rZg+ z{@bkp6v;TrOgM->%2jxUprrD!=Bt~QbJ#}qGX0OQ>Yb)_O2S{{)$i$nANl&ITeY&G z6M@w_R)XEtV`+12By^!+8~da0!ERgt&STQP8>jmzp2Uq4|0B35CVArr{~+srjJO=G ze$6AP`Bj4LHE*2Dg-XKBz2KR*K%C0csfM$Tt1Ekl<}J-flf#y>j`?|@+EK9vyJ7RtRdbWp$NN3QvC2xRYs5VkX`ujKjmB;-@Tm1A8fUk&^?hUn@&L}!{T9NE1`p(yMxY-6*K!)Q zm8cdUjr`reEKs8=9*VwJsL!&)>ihrZ#Toe2gGUcLr` z*jvdR2gv;(^QFQ1t{3+pi{zAojfRF1jlBc0hSYI@QCxa_?T}vylI@Rtl@~dx`-VmP zZr3p*m(4Wld&i1#y2i06g!Eo1JCe;=ecNF9X%?MX64$3~2Bwm+mWVk^0012zNklAM}kj^r;>~H>X z8){tbZNcK4+n*-Nb(lg=M9X5B1DNqTPR~K}zD3tNbbE*LxO!d_8`nt+*uCzA2WHoRLfYX;H^WYiK61QQeK;5r|)VkL9z!5O^4k@-mh}80TTc#x1|npd#AeY79}C zVIe?g8afLnw{34~44ZiE6_ht1#EsGXrb0a=z8YG93kd`VK6ET*&wy1>yfUMx-1G-^g zQY1-EsH$FMB}s_zT_5)1kS2Wp@9**HKRXZZFJF#&Sj{?gvaY|Y@#JL@&K|c8?WRU? zRt5m|;&+#@y~FiatMHtz8Z0hCMxfaDEY+L-NAJOI=U`F_%E!}0Ax#uEy8-k+|GQs% zDeCCAc2s0^!Q6UmZ)&L6#w!Bl3HN?6Dx!uJE*|BX5&3KvKLfW^DC|?L$n8v$5QC^fUXwwxfZ-R&s)!?)&W3y zCIh-__&T5cEEoDqfcx(o(c6{im8KeJvOH#;z4yTYpyTs?QizmCFKAsA&v>=oD3vl{ zkOkkQS+`6l3f@C6d9}`Ph(J8BI8kGk3_U5Zu5|#|HG?<@BuQno5Hu`DUR_cb5F9mU zJxlm{=ke)3KW9zALu*B&i$32=0cu-1?T+%_l8g>+H@>mAUxeC|or zbfV`N4`Bibw&QDO3cXi%<}xeI{yCoRoucQ>dho#V1wTZ0-);i^q~m^^r!eQdS+!d6 z17|cLpP3(y5OC7-5MAJ`FxZI=g%becA9>~v^S>$@6fm!-fgkeJi?nAgyH-pHy(jlCGOn#v(7rOHPRB4wGNsyS2Q z3j%hL1`-j@UKK1?csQRFoyYmp4DEHO3FjJ%$^mJlIIw-&U~{u$rTuR3$kGsS>br4V zMl7hA&l9v&&-W9JVxsZ;edpM7v39Jm%uiAjkE-1mI*WG8m0Q(36F0n6XIw0ec;H0v zaAUHDd2hEJ=b-l-yfGm?KJ=FIQAeP&0SmR+EP5u`kI;dG9CtlRlPpd-UtiP)Sx42D?M}{H#T}Vj>3NX`@87p2!n`0YaIxYwxe!)i|3 zdniu~M6#<4?M(kd>9=|2I)& zRo(Z<<|c3)4r=F3Wgi?z57esx&1S&m&qm6P{-=NYD}NYWTdf*4dwF?L@Tvyu(RWrn z3=--~-kJy442C03CU}Y_AwD{EBJ@1W`sLxpIQmioJ=Wagf#?5t!9*E}fZJ~?@xGr3 zRYK`36U$QXzuTgXuF*S>vnvjqws+`$LOJDW2r8}BMxeivREd<2v)l+yt~UX+^UM-^ z=egdR2cG}UQgkwIzuk#@>QZPz&Chb)nGE3i%N2$w>ha#={E9bw5dphZFJ8;xvpON9 z`=n%BTi%Tf;Nn%r!PW!Y+g5xI)ym2sOx&1n?%QLc{q$VE{Oct%YJKCFg#96^6r<(a zPW;VcDHMuWhus}#1Y)Che1Bm?XP^-(1(QMt%Cbiz+dCnu1+IQkh>pVMeZ!vR6o}9S zGqGED;yw{U1VD8sNURtRA^;eO9HZ3>-hUy1$l>{MXMwki4|EAcpQw2_?rWd9=h5x9WoG5 zEECLrnXuX=;#=VMg9Lh~2uLdvwk4 zlbgAcLW#|KRn5V}`!VSycEbt|?=ZM=oNDaxb{^DvRz7KaFP_@xf4vlY1FCm5>(PVv zIJ=s`#v{5F;pR^p?o}BL+dG)(n@rB@!HIxsBbRKJXNlZ>yyN#zim-f{i6y$~9rtGH zjYGekn2#YmyH1k4upZ|xa#4PU$&K$l8j*gPppwe-a^kZj8f~JVS_bx?=QU-}#7=5W z*xhv~mON>j6pBS5egKd_C=*w}jxR&Cs>CQ{c2Qz?TTRk+W=TQgV7=?b5d%ZZtFoG1 zk7utI;ZQ0M%u0prnn!*&U$#gxUSVh*;NqeNJ?eu=<@3Ez;E|OHjFc<>AlC&g?@$0RHPI7 zcES^$_{r|B`zU)ZRdD&K8sH<{8hO6$AX6D1i7TW=%CCAGZl=LZl&X{bya&mc6-K-q z*Lqa9(QNMCj{}=hBT|xL4%;N?1*$DedJ*W=j7JqcfMUTN#_U|7dd~$Ql~J%AfB)S# zYdm|kWY0FsMuQeUf5OlbloBGs)-e!CE)4oR{+o$bB8Uuw7eQnUdj(cyGcXW25F7C_ z>iM{aF^Fv5w=k&+lGgx45OEHuRu1J-vAvj|X|(HbHWASXBwhVLxe)>P?<)`i&wqAU z_tELgOG27?>^2TW1e3tPJCEWbec-rH>4t45dOB&TM-j8=u(l1K_y#}nlTw-6=3NaP zQAN$xiN=#ALjNi7$ma$ZpXO}A>N`1-(i5eW{aQXWv-6o?GzjZ=GI-=!DtMS)1P>xY z*YGf18$s4&?*L4BrCQ*Tt6N##x_)GG@yHEtI_433=dpa6L21G^Qi{zAEsAXp2RbP_ z_QTc*=aS$uxx_M_qm8`;N^-8mMCe-J$8G1t660c?pvbwQv<~Qceor@FG|-9-S?@ag@pq6pWfT01BWRs^F=T`8601n}@b2|S$jc=p+B z&sT@t+11@3j9ncg54lu#4<6CK<+EJ8p3S@M@%t&)M-P3rQ0xXs0qxqNj;q!P=&ON^ zbal?->C1(`shTU_ALQgD(ck<_pbB$(YSuusl^f-GW`kwoD70Sy(+=K0^XWw4~$Z|nH zZ8u=~+XVyJVws>>^*nzBV5kN$x9bLZ?R(4Fn(cij?>7RG%TBIm~0as8DEEA5i`m=EnYpRr#fN%xeM#3gsF6-zrcJoA3Z12$Kz6z|Z{J@kA;%V3>&u=HU> zX~YDYbSz18&W}9r;ri!B^rQz_aRlw#8eWKmiez3liOo134VZ-$68pAy zOcMwI@-o5ll2;z>woYDuZ9zglz-0%uL6YJk?xcm`m!sV|EUMcB-)j!n1@6vz! zzwPIN_^~8Ul21-jjm1R{lkiZqsU57aw#LXSYb8Av1@yOrXofmFkq0nSu9_0PlzcAt zp@`r?K>Oz7z@rx&DKX}?s8Gzhp5`iltr21erV1n^W#>PiG0ihzuY@W@L$0;V1JZg7fhBL& zdB+6&4#3#gURS3diwzwjSk^l;wa(5w_co(`6pWW+axImt`s@Kf8Nb$g>|Db~|B&g5LKvMblE# zLgVs99*RBEnA^Jfx`830Q8t5V$v8ZJwS>}P2P)AB9M18c53L80G8v2-CvL^RvD+Ih zp)|A|WbiokdKEqJalIWt!e~C*c~mRTNv6w`OB(~2FATCzGI68V@7rT?)gHjjdqC*O zhX+jR(ZpU00o_UtCoewBu}n(#`OS9?-oCBEe9(R)N_i?Gz-hVXMP*YnD(qfHB>IyM ztjOWWZHu7kCuw;J#C590sKiW2TzKdHix*Jz6Up4;DHp($6!EeheCTTkk_Nz7877OH zCM96u0viSG5aMWQsSn#-gQwLMZ+ecR(u-jyW8ht6A%%_dn6kT!(9`SE#S&ISnZ)dX$g zWE8Q3lZPE;dx1&f&#&zUQRilUrnw{OJ(MCCBU7Q>of84){=O2a;$mjRbj{)-MKR}H z>(%{$^?UA(tAvm)CQ5S~8HAfw-Xm$DFnc0*YQOut9j8M)kYC9X=(hEu!;lmjximw2 zaHH;%A+)uY){qjX{%j3JalH@`Ltb=8ZN zUZ{hUhiV`IJ2lJtZ8~tg4?7DO`Xzsw$b+)1 zJaa`U-UI~zeP_p^KoW=B%UWwik%%;zG;=1V{1_rk@IT&voaW&nLi`w&20uaRwUxsR z)7M18z4^h5`pf?uE5eImHQqgf9q&JDcVccKrqLv_s!yXzf>#)@9d!P6a$yGOcj z^67hz{Aq^WyN(&2Y_3>RQ5nMOD|sxV$<_F*gIhHB8B>d%ersw z+p#%OD2X!(VRg?N>&i00sd4&kZQF}cf%oI#j7Q9S4?O#<6l=`8+QIc+ zOm=1GV`nP^*3OG`PPZ>rjj0^(fPA4vYuT(O=&=hk&D{%q4Bi37MIzEpQ}QB`4Ehfn z@s9wH|Aeop-!BV7Rmlp$G||hF>{4iFL5EKKb z`HPH23q*wVUBhM~91eF@$Wk0-IYuNbCsBLRSP_vdX$~+t*fJ`+x*hFS3?j~Y%${c0y>Iy*H!_HH)qvb^ zI$0@_LBs>~x<*nY&=EyTO6{9%T@ZME@ZgVm0y&{O&SR9T8T!EsQWPUalFbC6Kuvi2cU!i= z-t9SE$tVn7Y`pW%WAP#rq}K_X`yU1m$*U4+k`I8#{e2}@86|um)?rg#ep+x3NfF+B zQH!!FO4AsXNjOnk)-!R42(=;Hf6pbO{RFaX-pKC!;#mf5WJ&mD)9{FbfT6b-Ze*Uw zz;n>^z}2gn7_oQ{tXCiB?LyHc8udH5Cqii}diqlx?eL>vkopi=CLm{sVtIG^T_`Q^)IdxqY^Nm?Xslzf>g?e!n9U(%nn&F~ker2L*% z{c{X{0`?La>;BL4WmDB}M3XWlCedgsh`k766aavXffu@i=>x_(%ZwO-Pemclc^IR| zA#Q#&(8mEv3D8$uk-~cqD2N3(@Z$_{wr>ZI>Rxt;(p(=0C!N0T{@6@J?H<`#hVm(Q zR)%Uo%LZ`~Y}LbDDyW2lO|JmVuMFDV^x5D68iAA=rKFfmBi#S7dOVft_mPueZikJ7 n$|x-B_v5)p6rryk7U%y3#_a>bW!E>b00000NkvXXu0mjfPZ=lG literal 0 HcmV?d00001 diff --git a/mods/buildings_etc/my_cottage_doors/textures/mycdoors_door1.png b/mods/buildings_etc/my_cottage_doors/textures/mycdoors_door1.png new file mode 100644 index 0000000000000000000000000000000000000000..64b9298b4d6672cb25e2c78cd1ae836db6281000 GIT binary patch literal 8001 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 D0MESh literal 0 HcmV?d00001 diff --git a/mods/buildings_etc/my_cottage_doors/textures/mycdoors_door1_inv.png b/mods/buildings_etc/my_cottage_doors/textures/mycdoors_door1_inv.png new file mode 100644 index 0000000000000000000000000000000000000000..1cef8dc5c0524d1d276f874ec96056e7884d7fc7 GIT binary patch literal 3701 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 TaF$d800000NkvXXu0mjfkz3>n literal 0 HcmV?d00001 diff --git a/mods/buildings_etc/my_cottage_doors/textures/mycdoors_door2.png b/mods/buildings_etc/my_cottage_doors/textures/mycdoors_door2.png new file mode 100644 index 0000000000000000000000000000000000000000..ff80191711cbd5f66b7dc3cfaed2e5c2118378fe GIT binary patch literal 5943 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 QG5`Po07*qoM6N<$g1PW$X8-^I literal 0 HcmV?d00001 diff --git a/mods/buildings_etc/my_cottage_doors/unlocked.lua b/mods/buildings_etc/my_cottage_doors/unlocked.lua new file mode 100644 index 0000000..ca6ca41 --- /dev/null +++ b/mods/buildings_etc/my_cottage_doors/unlocked.lua @@ -0,0 +1,39 @@ +local cdoor_list = { --Number , Description , Inven Image , Image +-- {"Cottage Door 1" , "door1"}, + {"Cottage Door 2" , "door2"}, +} + + +for i in ipairs(cdoor_list) do + local desc = cdoor_list[i][1] + local img = cdoor_list[i][2] + + +doors.register_door("my_cottage_doors:"..img, { + description = desc, + inventory_image = "mycdoors_"..img.."_inv.png", + groups = {choppy=2,cracky=2,door=1}, + tiles = {{name="mycdoors_"..img..".png", backface_culling = true}}, + protected = false, +}) +end + +-- Crafts + +minetest.register_craft({ + output = "my_cottage_doors:door1 1", + recipe = { + {"my_door_wood:wood_yellow", "my_door_wood:wood_yellow", "default:steel_ingot"}, + {"my_door_wood:wood_yellow", "my_door_wood:wood_yellow", ""}, + {"my_door_wood:wood_yellow", "my_door_wood:wood_yellow", "default:steel_ingot"} + } +}) + +minetest.register_craft({ + output = "my_cottage_doors:door2 1", + recipe = { + {"my_door_wood:wood_red", "my_door_wood:wood_red", ""}, + {"my_door_wood:wood_red", "my_door_wood:wood_red", ""}, + {"my_door_wood:wood_red", "my_door_wood:wood_red", ""} + } +}) diff --git a/mods/buildings_etc/my_door_wood/depends.txt b/mods/buildings_etc/my_door_wood/depends.txt new file mode 100644 index 0000000..567219e --- /dev/null +++ b/mods/buildings_etc/my_door_wood/depends.txt @@ -0,0 +1,3 @@ +default +stairs? +moreblocks? \ No newline at end of file diff --git a/mods/buildings_etc/my_door_wood/description.txt b/mods/buildings_etc/my_door_wood/description.txt new file mode 100644 index 0000000..609e7c0 --- /dev/null +++ b/mods/buildings_etc/my_door_wood/description.txt @@ -0,0 +1 @@ +Wood that is used to make doors. diff --git a/mods/buildings_etc/my_door_wood/init.lua b/mods/buildings_etc/my_door_wood/init.lua new file mode 100644 index 0000000..f3babaa --- /dev/null +++ b/mods/buildings_etc/my_door_wood/init.lua @@ -0,0 +1,62 @@ +local door_wood = { -- color, desc, image + {"red", "Red Stained", "red"}, + {"grey", "Grey Stained", "grey"}, + {"dark_grey", "Dark Grey Stained", "dark_grey"}, + {"brown", "Brown Stained", "brown"}, + {"white", "White Stained", "white"}, + {"yellow", "Clear Stained", "yellow"}, + {"black", "Black", "black"}, +} +local function my_door_wood_block_stairs(nodename, def) + local mod = string.match (nodename,"(.+):") + local name = string.match (nodename,":(.+)") + minetest.register_node(nodename,def) + if minetest.get_modpath("moreblocks") then + stairsplus:register_all( + mod, + name, + nodename, + { + description = def.description, + tiles = def.tiles, + groups = def.groups, + sounds = def.sounds, + } + ) + elseif minetest.get_modpath("stairs") then + stairs.register_stair_and_slab(name,nodename, + def.groups, + def.tiles, + ("%s Stair"):format(def.description), + ("%s Slab"):format(def.description), + def.sounds + ) + end +end +for i in ipairs(door_wood) do + local color = door_wood[i][1] + local desc = door_wood[i][2] + local img = door_wood[i][3] + +my_door_wood_block_stairs("my_door_wood:wood_"..color, { + description = desc.." Wood", + drawtype = "normal", + paramtype = "light", + tiles = {"mydoors_"..img.."_wood.png"}, + paramtype = "light", + groups = {cracky = 2, choppy = 2}, + sounds = default.node_sound_wood_defaults(), + +}) + +-- Crafts + +minetest.register_craft({ + output = "my_door_wood:wood_"..color, + recipe = { + {"default:wood", "", ""}, + {"dye:"..color, "", ""}, + {"", "", ""} + } +}) +end diff --git a/mods/buildings_etc/my_door_wood/mod.conf b/mods/buildings_etc/my_door_wood/mod.conf new file mode 100644 index 0000000..c4ec911 --- /dev/null +++ b/mods/buildings_etc/my_door_wood/mod.conf @@ -0,0 +1 @@ +name = my_door_wood diff --git a/mods/buildings_etc/my_door_wood/screenshot.png b/mods/buildings_etc/my_door_wood/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..364ee4d3a4d4e6b026ad384a6f9eb4dad1a5f45a GIT binary patch literal 93373 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 SV?%*1VeoYIb6Mw<&;$TF=Tb`m literal 0 HcmV?d00001 diff --git a/mods/buildings_etc/my_door_wood/textures/mydoors_brown_wood.png b/mods/buildings_etc/my_door_wood/textures/mydoors_brown_wood.png new file mode 100644 index 0000000000000000000000000000000000000000..35f5f469de64e0e25a417f48b48bec449c9e966e GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`U7jwEAr-gIUOvs$svy$(P%ZYY zB46PIj)@)j{$I7ywYgn?;Q||<-G;S#`ia7^#hx=Z{EfW7U3}|CKF>;r3r}JMnE0mu z@LR>(@!jEL^FzIJkrFbpIdPQ?(M_`1;(ZGOK9@E4Y`A5}eLrF2Cx+W;Cw}zKH{)Eq ug6+PyDC5tAC2h0gZaw+=V1+3AABOoN#;1z@Y<&-O6@#a%pUXO@geCySqE5#E literal 0 HcmV?d00001 diff --git a/mods/buildings_etc/my_door_wood/textures/mydoors_dark_grey_wood.png b/mods/buildings_etc/my_door_wood/textures/mydoors_dark_grey_wood.png new file mode 100644 index 0000000000000000000000000000000000000000..918f0e5a3d47eccdceae9cff7b15fd9f802c2c80 GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa3-AeXm6DQ@mX?;0k&%^^m6MZ` zmzP&iP*7AR#v`NZq5l*>E-F-7{U>q?7_{;>n-AKoYr9M)a$D}>&m5=4F;Eb ze3jK_FI~FO;81sn^F+zaOv&8LOg#>_%8U$#?2HwLVs5i0Wi5!v%8;7F$WU-z!}E`v R86VJ822WQ%mvv4FO#r+dEe!ww literal 0 HcmV?d00001 diff --git a/mods/buildings_etc/my_door_wood/textures/mydoors_grey_wood.png b/mods/buildings_etc/my_door_wood/textures/mydoors_grey_wood.png new file mode 100644 index 0000000000000000000000000000000000000000..9a2572ae9e0e48a2235c315fa71deaba5cc97611 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UALOfj@LnOj`&l>VI889#$VD>Wn zp%MJ=zpPhFQfv&5Y()M}y`KTRn`XwAH%>pK5M^ue&f!y|^y?l`Ckbyu;V*2K@ zyDKz;T$r*hey?A7!X@4LVswk#KId6qmPfvLn6)yfvG(FUp5+mjCG#IQGKD;H5{U@T z6Z6@^8RPJq{T9!TgUp^vAHMi-t$4S(IrudssGt`a8!Ns@Y}fWph}yC z+>Y7dkJQVr$vpIR{Iy}jfz1C7^AB=PKC)19X36__`&$(cSZ$)L8okU+!hvpN@O1Ta JS?83{1OQ+DRj2>} literal 0 HcmV?d00001 diff --git a/mods/buildings_etc/my_door_wood/textures/mydoors_swood.png b/mods/buildings_etc/my_door_wood/textures/mydoors_swood.png new file mode 100644 index 0000000000000000000000000000000000000000..83eb38fef1dc5592c45ae533228f560e5620dd0e GIT binary patch literal 324 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP~C$p%8KC>Nf98l<@r;B5V#p$Dye7#r<1zPu4d2Y9D zZvLjQqu6x$hkxZCn085|DR!Ni|FWxl%MQcMFWWRLCVXg}9`1Vc^RZ9C^9vXBCVhWr z^M&a__WL!{lvMvu-@nK5sma18mc8C43cTrmx?IY>_PJ!5LNnuW z;XQc|3wbMBGBy6r*S<4%W?Dfk^Z5@y1Lxdg@MTVOE!QsW)ZZof?E(9)8b5)LT=%yC PJ;&hb>gTe~DWM4ft$}>E literal 0 HcmV?d00001 diff --git a/mods/buildings_etc/my_door_wood/textures/mydoors_white_wood.png b/mods/buildings_etc/my_door_wood/textures/mydoors_white_wood.png new file mode 100644 index 0000000000000000000000000000000000000000..7b3d37612279f43bf33f6aa443905a8e84d2e178 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`37#&FAr*{QCmC`baNuD1{C{~A zhnSeyqytR?VjDXZm&|a=llbtV;QM4lrG<5ap&#Jjnja3F?hQAxvX`&K{Gq1I`aDKQY e^1#j)4f>NmcRpNMl2H$IID@CFpUXO@geCw{, YEAR. +# French translation for 3D ARMOR MOD +# Copyright (C) 2018 by Stuart Jones +# This file is distributed under the same license as the 3D ARMOR MOD package. +# fat115 , 2017. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-08-06 18:20+0200\n" -"PO-Revision-Date: 2017-08-06 18:20+0200\n" +"POT-Creation-Date: 2018-07-23 21:24+0200\n" +"PO-Revision-Date: 2018-07-23 21:30+0200\n" "Last-Translator: fat115 \n" "Language-Team: \n" "Language: fr\n" @@ -18,22 +18,18 @@ msgstr "" "X-Generator: Poedit 1.8.12\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#: ../3d_armor/api.lua +msgid "3d_armor: Player reference is nil @1" +msgstr "3d_armor : Référence au joueur non trouvée @1" + #: ../3d_armor/api.lua msgid "3d_armor: Player name is nil @1" msgstr "3d_armor : Nom du joueur non trouvé @1" -#: ../3d_armor/api.lua -msgid "3d_armor: Player inventory is nil @1" -msgstr "3d_armor : Inventaire du joueur non trouvé @1" - #: ../3d_armor/api.lua msgid "3d_armor: Detached armor inventory is nil @1" msgstr "3d_armor : Inventaire détaché pour l'armure non trouvé @1" -#: ../3d_armor/api.lua -msgid "3d_armor: Player reference is nil @1" -msgstr "3d_armor : Référence au joueur non trouvée @1" - #: ../3d_armor/armor.lua msgid "Admin Helmet" msgstr "Casque d'admin" @@ -254,34 +250,6 @@ msgstr "Armure 3d" msgid "Armor not initialized!" msgstr "Armure non initialisée !" -#: ../hazmat_suit/init.lua -msgid "hazmat_suit: Mod loaded but unused." -msgstr "hazmat_suit : Mod chargé mais non utilisé." - -#: ../hazmat_suit/init.lua -msgid "Hazmat Helmet" -msgstr "Casque 'Hazmat'" - -#: ../hazmat_suit/init.lua -msgid "Hazmat Chestplate" -msgstr "Cuirasse 'Hazmat'" - -#: ../hazmat_suit/init.lua -msgid "Hazmat Sleeve" -msgstr "Manches 'Hazmat'" - -#: ../hazmat_suit/init.lua -msgid "Hazmat Leggins" -msgstr "Jambières 'Hazmat'" - -#: ../hazmat_suit/init.lua -msgid "Hazmat Boots" -msgstr "Bottes 'Hazmat'" - -#: ../hazmat_suit/init.lua -msgid "Hazmat Suit" -msgstr "Combinaison 'Hazmat'" - #: ../shields/init.lua msgid "Admin Shield" msgstr "Bouclier d'admin" @@ -325,60 +293,3 @@ msgstr "Bouclier en mithril" #: ../shields/init.lua msgid "Crystal Shield" msgstr "Bouclier en cristal" - -#: ../technic_armor/init.lua -msgid "technic_armor: Mod loaded but unused." -msgstr "technic_armor : Mod chargé mais non utilisé." - -#: ../technic_armor/init.lua -msgid "Lead" -msgstr "plomb" - -#: ../technic_armor/init.lua -msgid "Brass" -msgstr "laiton" - -#: ../technic_armor/init.lua -msgid "Cast Iron" -msgstr "fonte" - -#: ../technic_armor/init.lua -msgid "Carbon Steel" -msgstr "acier au carbone" - -#: ../technic_armor/init.lua -msgid "Stainless Steel" -msgstr "acier inoxydable" - -#: ../technic_armor/init.lua -msgid "Tin" -msgstr "étain" - -#: ../technic_armor/init.lua -msgid "Silver" -msgstr "argent" - -#: ../technic_armor/init.lua -msgid "Helmet" -msgstr "Casque" - -#: ../technic_armor/init.lua -msgid "Chestplate" -msgstr "Cuirasse" - -#: ../technic_armor/init.lua -msgid "Leggings" -msgstr "Jambières" - -#: ../technic_armor/init.lua -msgid "Boots" -msgstr "Bottes" - -#: ../technic_armor/init.lua -msgid "Shield" -msgstr "Bouclier" - -#. Translators: @1 stands for material and @2 for part of the armor, so that you could use a conjunction if in your language part name comes first then material (e.g. in french 'Silver Boots' is translated in 'Bottes en argent' by using '@2 en @1' as translated string) -#: ../technic_armor/init.lua -msgid "@1 @2" -msgstr "@2 en @1" diff --git a/mods/character/3d_armor/3d_armor/locale/it.po b/mods/character/3d_armor/3d_armor/locale/it.po index 9e44322..5d6f46b 100644 --- a/mods/character/3d_armor/3d_armor/locale/it.po +++ b/mods/character/3d_armor/3d_armor/locale/it.po @@ -1,14 +1,14 @@ -# ITALIAN LOCALE FILE FOR THE 3D ARMOR MODULE -# Copyright (C) 2012-2017 Stuart Jones -# This file is distributed under the same license as the 3D ARMOR package. +# Italian translation for 3D ARMOR MOD +# Copyright (C) 2018 by Stuart Jones +# This file is distributed under the same license as the 3D ARMOR MOD package. # Hamlet , 2017. # msgid "" msgstr "" "Project-Id-Version: Italian localization file for the 3D Armor module\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-08-06 18:20+0200\n" -"PO-Revision-Date: 2017-08-18 00:36+0100\n" +"POT-Creation-Date: 2018-07-23 21:24+0200\n" +"PO-Revision-Date: 2018-07-23 21:30+0200\n" "Last-Translator: H4mlet \n" "Language-Team: ITALIANO\n" "Language: it\n" @@ -18,22 +18,18 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.6.10\n" +#: ../3d_armor/api.lua +msgid "3d_armor: Player reference is nil @1" +msgstr "3d_armor: Il riferimento alla/al giocatrice/tore è nullo @1" + #: ../3d_armor/api.lua msgid "3d_armor: Player name is nil @1" msgstr "3d_armor: Il nome della/del gicatrice/tore è nullo @1" -#: ../3d_armor/api.lua -msgid "3d_armor: Player inventory is nil @1" -msgstr "3d_armor: L'inventario della/del giocatrice/tore è nullo @1" - #: ../3d_armor/api.lua msgid "3d_armor: Detached armor inventory is nil @1" msgstr "3d_armor: L'inventario staccato dell'armatura è nullo @1" -#: ../3d_armor/api.lua -msgid "3d_armor: Player reference is nil @1" -msgstr "3d_armor: Il riferimento alla/al giocatrice/tore è nullo @1" - #: ../3d_armor/armor.lua msgid "Admin Helmet" msgstr "Elmo dell'amministratrice/tore" @@ -254,34 +250,6 @@ msgstr "Armatura 3D" msgid "Armor not initialized!" msgstr "Armatura non inizializzata!" -#: ../hazmat_suit/init.lua -msgid "hazmat_suit: Mod loaded but unused." -msgstr "hazmat_suit: Mod caricato ma inutilizzato." - -#: ../hazmat_suit/init.lua -msgid "Hazmat Helmet" -msgstr "Elmo hazmat" - -#: ../hazmat_suit/init.lua -msgid "Hazmat Chestplate" -msgstr "Corazza hazmat" - -#: ../hazmat_suit/init.lua -msgid "Hazmat Sleeve" -msgstr "Manica hazmat" - -#: ../hazmat_suit/init.lua -msgid "Hazmat Leggins" -msgstr "Gambali hazmat" - -#: ../hazmat_suit/init.lua -msgid "Hazmat Boots" -msgstr "Stivali hazmat" - -#: ../hazmat_suit/init.lua -msgid "Hazmat Suit" -msgstr "Completo hazmat" - #: ../shields/init.lua msgid "Admin Shield" msgstr "Scudo dell'amministratrice/tore" @@ -325,60 +293,3 @@ msgstr "Scudo di mithril" #: ../shields/init.lua msgid "Crystal Shield" msgstr "Scudo di cristallo" - -#: ../technic_armor/init.lua -msgid "technic_armor: Mod loaded but unused." -msgstr "technic_armor: Mod caricato ma inutilizzato." - -#: ../technic_armor/init.lua -msgid "Lead" -msgstr "Piombo" - -#: ../technic_armor/init.lua -msgid "Brass" -msgstr "Ottone" - -#: ../technic_armor/init.lua -msgid "Cast Iron" -msgstr "Ghisa" - -#: ../technic_armor/init.lua -msgid "Carbon Steel" -msgstr "Acciaio al carbonio" - -#: ../technic_armor/init.lua -msgid "Stainless Steel" -msgstr "Acciaio inossidabile" - -#: ../technic_armor/init.lua -msgid "Tin" -msgstr "Stagno" - -#: ../technic_armor/init.lua -msgid "Silver" -msgstr "Argento" - -#: ../technic_armor/init.lua -msgid "Helmet" -msgstr "Elmo" - -#: ../technic_armor/init.lua -msgid "Chestplate" -msgstr "Corazza" - -#: ../technic_armor/init.lua -msgid "Leggings" -msgstr "Gambali" - -#: ../technic_armor/init.lua -msgid "Boots" -msgstr "Stivali" - -#: ../technic_armor/init.lua -msgid "Shield" -msgstr "Scudo" - -#. Translators: @1 stands for material and @2 for part of the armor, so that you could use a conjunction if in your language part name comes first then material (e.g. in french 'Silver Boots' is translated in 'Bottes en argent' by using '@2 en @1' as translated string) -#: ../technic_armor/init.lua -msgid "@1 @2" -msgstr "@2 di @1" diff --git a/mods/character/3d_armor/3d_armor/locale/ms.po b/mods/character/3d_armor/3d_armor/locale/ms.po index c86546f..518e438 100644 --- a/mods/character/3d_armor/3d_armor/locale/ms.po +++ b/mods/character/3d_armor/3d_armor/locale/ms.po @@ -1,39 +1,35 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. +# Malay translation for 3D ARMOR MOD +# Copyright (C) 2018 by Stuart Jones +# This file is distributed under the same license as the 3D ARMOR MOD package. +# MuhdNurHidayat (MNH48) , 2018. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-08-06 18:20+0200\n" -"PO-Revision-Date: 2018-02-07 13:25+0800\n" +"POT-Creation-Date: 2018-07-23 21:21+0200\n" +"PO-Revision-Date: 2018-07-23 21:30+0200\n" +"Last-Translator: MuhdNurHidayat (MNH48) \n" "Language-Team: \n" +"Language: ms\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.0.6\n" -"Last-Translator: MuhdNurHidayat (MNH48) \n" "Plural-Forms: nplurals=1; plural=0;\n" -"Language: ms\n" + +#: ../3d_armor/api.lua +msgid "3d_armor: Player reference is nil @1" +msgstr "3d_armor: Rujukan pemain tiada nilai @1" #: ../3d_armor/api.lua msgid "3d_armor: Player name is nil @1" msgstr "3d_armor: Nama pemain tiada nilai @1" -#: ../3d_armor/api.lua -msgid "3d_armor: Player inventory is nil @1" -msgstr "3d_armor: Inventori pemain tiada nilai @1" - #: ../3d_armor/api.lua msgid "3d_armor: Detached armor inventory is nil @1" msgstr "3d_armor: Inventori perisai terpisah tiada nilai @1" -#: ../3d_armor/api.lua -msgid "3d_armor: Player reference is nil @1" -msgstr "3d_armor: Rujukan pemain tiada nilai @1" - #: ../3d_armor/armor.lua msgid "Admin Helmet" msgstr "Helmet Pentadbir" @@ -255,34 +251,6 @@ msgstr "Perisai 3d" msgid "Armor not initialized!" msgstr "Perisai tidak diasalkan!" -#: ../hazmat_suit/init.lua -msgid "hazmat_suit: Mod loaded but unused." -msgstr "hazmat_suit: Mods dimuatkan tetapi tidak digunakan." - -#: ../hazmat_suit/init.lua -msgid "Hazmat Helmet" -msgstr "Helmet Keselamatan" - -#: ../hazmat_suit/init.lua -msgid "Hazmat Chestplate" -msgstr "Perisai Dada Keselamatan" - -#: ../hazmat_suit/init.lua -msgid "Hazmat Sleeve" -msgstr "Perisai Tangan Keselamatan" - -#: ../hazmat_suit/init.lua -msgid "Hazmat Leggins" -msgstr "Perisai Kaki Keselamatan" - -#: ../hazmat_suit/init.lua -msgid "Hazmat Boots" -msgstr "But Keselamatan" - -#: ../hazmat_suit/init.lua -msgid "Hazmat Suit" -msgstr "Pakaian Keselamatan" - #: ../shields/init.lua msgid "Admin Shield" msgstr "Perisai Pegang Pentadbir" @@ -326,61 +294,3 @@ msgstr "Perisai Pegang Mithril" #: ../shields/init.lua msgid "Crystal Shield" msgstr "Perisai Pegang Kristal" - -#: ../technic_armor/init.lua -msgid "technic_armor: Mod loaded but unused." -msgstr "technic_armor: Mods dimuatkan tetapi tidak digunakan." - -# 'Lead' here is the chemical compound so the translation is 'plumbum', not 'pimpin' (act of leading). -#: ../technic_armor/init.lua -msgid "Lead" -msgstr "Plumbum" - -#: ../technic_armor/init.lua -msgid "Brass" -msgstr "Loyang" - -#: ../technic_armor/init.lua -msgid "Cast Iron" -msgstr "Besi Tuang" - -#: ../technic_armor/init.lua -msgid "Carbon Steel" -msgstr "Keluli Karbon" - -#: ../technic_armor/init.lua -msgid "Stainless Steel" -msgstr "Keluli Tahan Karat" - -#: ../technic_armor/init.lua -msgid "Tin" -msgstr "Timah" - -#: ../technic_armor/init.lua -msgid "Silver" -msgstr "Perak" - -#: ../technic_armor/init.lua -msgid "Helmet" -msgstr "Helmet" - -#: ../technic_armor/init.lua -msgid "Chestplate" -msgstr "Perisai Dada" - -#: ../technic_armor/init.lua -msgid "Leggings" -msgstr "Perisai Kaki" - -#: ../technic_armor/init.lua -msgid "Boots" -msgstr "But" - -#: ../technic_armor/init.lua -msgid "Shield" -msgstr "Perisai Pegang" - -#. Translators: @1 stands for material and @2 for part of the armor, so that you could use a conjunction if in your language part name comes first then material (e.g. in french 'Silver Boots' is translated in 'Bottes en argent' by using '@2 en @1' as translated string) -#: ../technic_armor/init.lua -msgid "@1 @2" -msgstr "@2 @1" diff --git a/mods/character/3d_armor/3d_armor/locale/ru.po b/mods/character/3d_armor/3d_armor/locale/ru.po new file mode 100644 index 0000000..4beee8a --- /dev/null +++ b/mods/character/3d_armor/3d_armor/locale/ru.po @@ -0,0 +1,294 @@ +# Russian translation for 3D ARMOR MOD +# Copyright (C) 2018 by Stuart Jones +# This file is distributed under the same license as the 3D ARMOR MOD package. +# CodeXP , 2018. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 3d_armor\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-07-23 21:21+0200\n" +"PO-Revision-Date: 2018-07-23 21:30+0200\n" +"Last-Translator: CodeXP \n" +"Language-Team: \n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../3d_armor/api.lua +msgid "3d_armor: Player reference is nil @1" +msgstr "3d_armor: Ссылка игрока является nil @1" + +#: ../3d_armor/api.lua +msgid "3d_armor: Player name is nil @1" +msgstr "3d_armor: Имя игрока является nil @1" + +#: ../3d_armor/api.lua +msgid "3d_armor: Detached armor inventory is nil @1" +msgstr "3d_armor: Отдельный инвентарь брони является nil @1" + +#: ../3d_armor/armor.lua +msgid "Admin Helmet" +msgstr "шлем админа" + +#: ../3d_armor/armor.lua +msgid "Admin Chestplate" +msgstr "бронежилет админа" + +#: ../3d_armor/armor.lua +msgid "Admin Leggings" +msgstr "гамаши админа" + +#: ../3d_armor/armor.lua +msgid "Admin Boots" +msgstr "ботинки админа" + +#: ../3d_armor/armor.lua +msgid "Wood Helmet" +msgstr "деревянный шлем" + +#: ../3d_armor/armor.lua +msgid "Wood Chestplate" +msgstr "деревянный бронежилет" + +#: ../3d_armor/armor.lua +msgid "Wood Leggings" +msgstr "деревянные гамаши" + +#: ../3d_armor/armor.lua +msgid "Wood Boots" +msgstr "деревянные ботинки" + +#: ../3d_armor/armor.lua +msgid "Cactus Helmet" +msgstr "кактусовый шлем" + +#: ../3d_armor/armor.lua +msgid "Cactus Chestplate" +msgstr "кактусовый бронежилет" + +#: ../3d_armor/armor.lua +msgid "Cactus Leggings" +msgstr "кактусовые гамаши" + +#: ../3d_armor/armor.lua +msgid "Cactus Boots" +msgstr "кактусовые ботинки" + +#: ../3d_armor/armor.lua +msgid "Steel Helmet" +msgstr "стальной шлем" + +#: ../3d_armor/armor.lua +msgid "Steel Chestplate" +msgstr "стальной бронежилет" + +#: ../3d_armor/armor.lua +msgid "Steel Leggings" +msgstr "стальные гамаши" + +#: ../3d_armor/armor.lua +msgid "Steel Boots" +msgstr "стальные ботинки" + +#: ../3d_armor/armor.lua +msgid "Bronze Helmet" +msgstr "бронзовый шлем" + +#: ../3d_armor/armor.lua +msgid "Bronze Chestplate" +msgstr "бронзовый бронежилет" + +#: ../3d_armor/armor.lua +msgid "Bronze Leggings" +msgstr "бронзовые гамаши" + +#: ../3d_armor/armor.lua +msgid "Bronze Boots" +msgstr "бронзовые ботинки" + +#: ../3d_armor/armor.lua +msgid "Diamond Helmet" +msgstr "алмазный шлем" + +#: ../3d_armor/armor.lua +msgid "Diamond Chestplate" +msgstr "алмазный бронежилет" + +#: ../3d_armor/armor.lua +msgid "Diamond Leggings" +msgstr "алмазные гамаши" + +#: ../3d_armor/armor.lua +msgid "Diamond Boots" +msgstr "алмазные ботинки" + +#: ../3d_armor/armor.lua +msgid "Gold Helmet" +msgstr "золотой шлем" + +#: ../3d_armor/armor.lua +msgid "Gold Chestplate" +msgstr "золотой бронежилет" + +#: ../3d_armor/armor.lua +msgid "Gold Leggings" +msgstr "золотые гамаши" + +#: ../3d_armor/armor.lua +msgid "Gold Boots" +msgstr "золотые ботинки" + +#: ../3d_armor/armor.lua +msgid "Mithril Helmet" +msgstr "мифриловый шлем" + +#: ../3d_armor/armor.lua +msgid "Mithril Chestplate" +msgstr "мифриловый бронежилет" + +#: ../3d_armor/armor.lua +msgid "Mithril Leggings" +msgstr "мифриловые гамаши" + +#: ../3d_armor/armor.lua +msgid "Mithril Boots" +msgstr "мифриловые ботинки" + +#: ../3d_armor/armor.lua +msgid "Crystal Helmet" +msgstr "кристалловый шлем" + +#: ../3d_armor/armor.lua +msgid "Crystal Chestplate" +msgstr "кристалловый бронежилет" + +#: ../3d_armor/armor.lua +msgid "Crystal Leggings" +msgstr "кристалловые гамаши" + +#: ../3d_armor/armor.lua +msgid "Crystal Boots" +msgstr "кристалловые ботинки" + +#: ../3d_armor/init.lua ../3d_armor_ui/init.lua +msgid "Radiation" +msgstr "излучение" + +#: ../3d_armor/init.lua ../3d_armor_ui/init.lua +msgid "Level" +msgstr "уровень" + +#: ../3d_armor/init.lua ../3d_armor_ui/init.lua +msgid "Heal" +msgstr "исцеление" + +#: ../3d_armor/init.lua ../3d_armor_ui/init.lua +msgid "Fire" +msgstr "огонь" + +#: ../3d_armor/init.lua +msgid "Your @1 got destroyed!" +msgstr "твой(и) @1 был(и) разрушен(ы)!" + +#: ../3d_armor/init.lua +msgid "3d_armor: Failed to initialize player" +msgstr "3d_armor: не смог подготовить игрока" + +#: ../3d_armor/init.lua +msgid "[3d_armor] Fire Nodes disabled" +msgstr "[3d_armor] блоки огня отключены" + +#: ../3d_armor_ip/init.lua +msgid "3d_armor_ip: Mod loaded but unused." +msgstr "3d_armor_ip: мод загружен но не используется." + +#: ../3d_armor_ip/init.lua +msgid "Back" +msgstr "назад" + +#: ../3d_armor_ip/init.lua ../3d_armor_sfinv/init.lua ../3d_armor_ui/init.lua +msgid "Armor" +msgstr "бронь" + +#: ../3d_armor_sfinv/init.lua +msgid "3d_armor_sfinv: Mod loaded but unused." +msgstr "3d_armor_sfinv: мод загружен но не используется." + +#: ../3d_armor_stand/init.lua +msgid "Armor stand top" +msgstr "стойка для брони (верх)" + +#: ../3d_armor_stand/init.lua +msgid "Armor stand" +msgstr "стойка для брони" + +#: ../3d_armor_stand/init.lua +msgid "Armor Stand" +msgstr "стойка для брони" + +#: ../3d_armor_stand/init.lua +msgid "Locked Armor stand" +msgstr "защищенная стойка для брони" + +#: ../3d_armor_stand/init.lua +msgid "Armor Stand (owned by @1)" +msgstr "стойка для брони (принадлежит @1)" + +#: ../3d_armor_ui/init.lua +msgid "3d_armor_ui: Mod loaded but unused." +msgstr "3d_armor_ui: мод загружен но не используется." + +#: ../3d_armor_ui/init.lua +msgid "3d Armor" +msgstr "3D бронь" + +#: ../3d_armor_ui/init.lua +msgid "Armor not initialized!" +msgstr "бронь не подготовлена!" + +#: ../shields/init.lua +msgid "Admin Shield" +msgstr "щит админа" + +#: ../shields/init.lua +msgid "Wooden Shield" +msgstr "деревянный щит" + +#: ../shields/init.lua +msgid "Enhanced Wood Shield" +msgstr "улучшенный деревянный щит" + +#: ../shields/init.lua +msgid "Cactus Shield" +msgstr "кактусный щит" + +#: ../shields/init.lua +msgid "Enhanced Cactus Shield" +msgstr "улучшенный кактусный щит" + +#: ../shields/init.lua +msgid "Steel Shield" +msgstr "стальной щит" + +#: ../shields/init.lua +msgid "Bronze Shield" +msgstr "бронзовый щит" + +#: ../shields/init.lua +msgid "Diamond Shield" +msgstr "алмазный щит" + +#: ../shields/init.lua +msgid "Gold Shield" +msgstr "золотой щит" + +#: ../shields/init.lua +msgid "Mithril Shield" +msgstr "мифриловый щит" + +#: ../shields/init.lua +msgid "Crystal Shield" +msgstr "кристалловый щит" diff --git a/mods/character/3d_armor/3d_armor/locale/template.pot b/mods/character/3d_armor/3d_armor/locale/template.pot index 20b7504..0b0222c 100644 --- a/mods/character/3d_armor/3d_armor/locale/template.pot +++ b/mods/character/3d_armor/3d_armor/locale/template.pot @@ -1,6 +1,6 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. +# LANGUAGE translation for 3D ARMOR MOD +# Copyright (C) 2018 by Stuart Jones +# This file is distributed under the same license as the 3D ARMOR MOD package. # FIRST AUTHOR , YEAR. # #, fuzzy @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-08-06 18:20+0200\n" +"POT-Creation-Date: 2018-07-23 21:24+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,22 +17,18 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" +#: ../3d_armor/api.lua +msgid "3d_armor: Player reference is nil @1" +msgstr "" + #: ../3d_armor/api.lua msgid "3d_armor: Player name is nil @1" msgstr "" -#: ../3d_armor/api.lua -msgid "3d_armor: Player inventory is nil @1" -msgstr "" - #: ../3d_armor/api.lua msgid "3d_armor: Detached armor inventory is nil @1" msgstr "" -#: ../3d_armor/api.lua -msgid "3d_armor: Player reference is nil @1" -msgstr "" - #: ../3d_armor/armor.lua msgid "Admin Helmet" msgstr "" @@ -253,34 +249,6 @@ msgstr "" msgid "Armor not initialized!" msgstr "" -#: ../hazmat_suit/init.lua -msgid "hazmat_suit: Mod loaded but unused." -msgstr "" - -#: ../hazmat_suit/init.lua -msgid "Hazmat Helmet" -msgstr "" - -#: ../hazmat_suit/init.lua -msgid "Hazmat Chestplate" -msgstr "" - -#: ../hazmat_suit/init.lua -msgid "Hazmat Sleeve" -msgstr "" - -#: ../hazmat_suit/init.lua -msgid "Hazmat Leggins" -msgstr "" - -#: ../hazmat_suit/init.lua -msgid "Hazmat Boots" -msgstr "" - -#: ../hazmat_suit/init.lua -msgid "Hazmat Suit" -msgstr "" - #: ../shields/init.lua msgid "Admin Shield" msgstr "" @@ -324,60 +292,3 @@ msgstr "" #: ../shields/init.lua msgid "Crystal Shield" msgstr "" - -#: ../technic_armor/init.lua -msgid "technic_armor: Mod loaded but unused." -msgstr "" - -#: ../technic_armor/init.lua -msgid "Lead" -msgstr "" - -#: ../technic_armor/init.lua -msgid "Brass" -msgstr "" - -#: ../technic_armor/init.lua -msgid "Cast Iron" -msgstr "" - -#: ../technic_armor/init.lua -msgid "Carbon Steel" -msgstr "" - -#: ../technic_armor/init.lua -msgid "Stainless Steel" -msgstr "" - -#: ../technic_armor/init.lua -msgid "Tin" -msgstr "" - -#: ../technic_armor/init.lua -msgid "Silver" -msgstr "" - -#: ../technic_armor/init.lua -msgid "Helmet" -msgstr "" - -#: ../technic_armor/init.lua -msgid "Chestplate" -msgstr "" - -#: ../technic_armor/init.lua -msgid "Leggings" -msgstr "" - -#: ../technic_armor/init.lua -msgid "Boots" -msgstr "" - -#: ../technic_armor/init.lua -msgid "Shield" -msgstr "" - -#. Translators: @1 stands for material and @2 for part of the armor, so that you could use a conjunction if in your language part name comes first then material (e.g. in french 'Silver Boots' is translated in 'Bottes en argent' by using '@2 en @1' as translated string) -#: ../technic_armor/init.lua -msgid "@1 @2" -msgstr "" diff --git a/mods/character/3d_armor/3d_armor/tools/README.md b/mods/character/3d_armor/3d_armor/tools/README.md new file mode 100644 index 0000000..6aa7ffe --- /dev/null +++ b/mods/character/3d_armor/3d_armor/tools/README.md @@ -0,0 +1,7 @@ +# Intllib tool + +please consider using the intllib tool to update locale files: + +```../../intllib/tools/xgettext.sh ../**/*.lua``` + +make sure you are in `3d_armor` derectory before running this command diff --git a/mods/character/3d_armor/3d_armor/tools/updatepo.sh b/mods/character/3d_armor/3d_armor/tools/updatepo.sh old mode 100644 new mode 100755 index 21ca5b5..52de990 --- a/mods/character/3d_armor/3d_armor/tools/updatepo.sh +++ b/mods/character/3d_armor/3d_armor/tools/updatepo.sh @@ -12,7 +12,6 @@ xgettext --from-code=UTF-8 \ --keyword=S \ --keyword=NS:1,2 \ --keyword=N_ \ - --keyword=F \ --add-comments='Translators:' \ --add-location=file \ -o locale/template.pot \ diff --git a/mods/character/3d_armor/README.md b/mods/character/3d_armor/README.md index 9cff8a0..088ed22 100644 --- a/mods/character/3d_armor/README.md +++ b/mods/character/3d_armor/README.md @@ -1,4 +1,4 @@ -Modpack - 3d Armor [0.4.11] +Modpack - 3d Armor [0.4.12] =========================== ### Table of Contents @@ -17,7 +17,7 @@ Modpack - 3d Armor [0.4.11] [mod] Visible Player Armor [3d_armor] ------------------------------------- -Minetest Version: 0.4.16 +Minetest Version: 0.4.16 - 0.4.17.1 Game: minetest_game and many derivatives diff --git a/mods/character/3d_armor/preview_gen.py b/mods/character/3d_armor/preview_gen.py old mode 100644 new mode 100755 diff --git a/mods/flora_fauna/crops/.luacheckrc b/mods/flora_fauna/crops/.luacheckrc deleted file mode 100644 index 15eed66..0000000 --- a/mods/flora_fauna/crops/.luacheckrc +++ /dev/null @@ -1,15 +0,0 @@ -unused_args = false -allow_defined_top = true - -read_globals = { - "DIR_DELIM", - "minetest", "core", - "dump", - "vector", "nodeupdate", - "VoxelManip", "VoxelArea", - "PseudoRandom", "ItemStack", - "intllib", - "default", - table = { fields = { "copy", "getn" } } -} - diff --git a/mods/flora_fauna/mob_horse/init.lua b/mods/flora_fauna/mob_horse/init.lua index 51edd6f..ee68d3b 100644 --- a/mods/flora_fauna/mob_horse/init.lua +++ b/mods/flora_fauna/mob_horse/init.lua @@ -41,7 +41,7 @@ mobs:register_mob("mob_horse:horse", { water_damage = 1, makes_footstep_sound = true, drops = { - {name = "mobs:meat_raw", chance = 1, min = 2, max = 3} + {name = "mobs:leather", chance = 1, min = 0, max = 2} }, do_custom = function(self, dtime) diff --git a/mods/flora_fauna/mob_horse/readme.md b/mods/flora_fauna/mob_horse/readme.md new file mode 100644 index 0000000..952bc2e --- /dev/null +++ b/mods/flora_fauna/mob_horse/readme.md @@ -0,0 +1,18 @@ +# MOB Horse + +### Spawning +There are three different horse textures (white, brown, black) which will spawn on green grassy areas and dry dirt areas in Ethereal mapgen. + +--- +### Taming +Horses can be tamed with 10x wheat or apples which then allows the player to pick up the horse using a lasso and ride by right-clicking with a saddle. + +--- +### Horseshoes +Horseshoes can be crafted using steel, bronze, mese and diamond (4x ingots - 2 down either side with 1x block top middle) and placed on a horse by punching with the item. These can make horses run faster or jump higher depending on tier. + +--- +### Dead Horse +When riding a horse monsters will generally attack the horse first to get to player riding it, when horse dies the player is dismounted and it will drop any shoes or saddles in use as well as some horse meat. + +#### Lucky Blocks: 4 diff --git a/mods/flora_fauna/mobs_animal/bee.lua b/mods/flora_fauna/mobs_animal/bee.lua index 7c3de76..582bcf0 100644 --- a/mods/flora_fauna/mobs_animal/bee.lua +++ b/mods/flora_fauna/mobs_animal/bee.lua @@ -165,7 +165,7 @@ minetest.register_craft({ -- beehive workings minetest.register_abm({ nodenames = {"mobs:beehive"}, - interval = 6, + interval = 12, chance = 6, catch_up = false, action = function(pos, node) @@ -184,7 +184,7 @@ minetest.register_abm({ local honey = inv:get_stack("beehive", 1):get_count() -- is hive full? - if honey > 19 then + if honey > 11 then return end diff --git a/mods/flora_fauna/mobs_animal/bunny.lua b/mods/flora_fauna/mobs_animal/bunny.lua index 123dd1d..01c63b3 100644 --- a/mods/flora_fauna/mobs_animal/bunny.lua +++ b/mods/flora_fauna/mobs_animal/bunny.lua @@ -31,7 +31,7 @@ stepheight = 0.6, jump_height = 6, drops = { {name = "mobs:rabbit_raw", chance = 1, min = 1, max = 1}, - {name = "mobs:rabbit_hide", chance = 1, min = 1, max = 1}, + {name = "mobs:rabbit_hide", chance = 1, min = 0, max = 1}, }, water_damage = 1, lava_damage = 4, @@ -74,6 +74,7 @@ stepheight = 0.6, self.type = "monster" self.health = 20 + self.passive = false return end diff --git a/mods/flora_fauna/mobs_animal/chicken.lua b/mods/flora_fauna/mobs_animal/chicken.lua index 1ffa436..9797493 100644 --- a/mods/flora_fauna/mobs_animal/chicken.lua +++ b/mods/flora_fauna/mobs_animal/chicken.lua @@ -34,8 +34,8 @@ stepheight = 0.6, runaway = true, runaway_from = {"player", "mobs_animal:pumba"}, drops = { - {name = "mobs:chicken_raw", chance = 1, min = 2, max = 2}, - {name = "mobs:chicken_feather", chance = 3, min = 1, max = 2}, + {name = "mobs:chicken_raw", chance = 1, min = 1, max = 1}, + {name = "mobs:chicken_feather", chance = 1, min = 0, max = 2}, }, water_damage = 1, lava_damage = 5, diff --git a/mods/flora_fauna/mobs_animal/cow.lua b/mods/flora_fauna/mobs_animal/cow.lua index ed77836..fe372ff 100644 --- a/mods/flora_fauna/mobs_animal/cow.lua +++ b/mods/flora_fauna/mobs_animal/cow.lua @@ -8,6 +8,7 @@ mobs:register_mob("mobs_animal:cow", { type = "animal", passive = false, attack_type = "dogfight", + attack_npcs = false, reach = 2, damage = 4, hp_min = 5, @@ -28,9 +29,10 @@ mobs:register_mob("mobs_animal:cow", { run_velocity = 2, jump = true, jump_height = 6, + pushable = true, drops = { {name = "mobs:meat_raw", chance = 1, min = 1, max = 3}, - {name = "mobs:leather", chance = 1, min = 1, max = 2}, + {name = "mobs:leather", chance = 1, min = 0, max = 2}, }, water_damage = 1, lava_damage = 5, @@ -83,7 +85,8 @@ mobs:register_mob("mobs_animal:cow", { local inv = clicker:get_inventory() - inv:remove_item("main", "bucket:bucket_empty") + tool:take_item() + clicker:set_wielded_item(tool) if inv:room_for_item("main", {name = "mobs:bucket_milk"}) then clicker:get_inventory():add_item("main", "mobs:bucket_milk") diff --git a/mods/flora_fauna/mobs_animal/init.lua b/mods/flora_fauna/mobs_animal/init.lua index 69e6c73..0325b81 100644 --- a/mods/flora_fauna/mobs_animal/init.lua +++ b/mods/flora_fauna/mobs_animal/init.lua @@ -17,6 +17,7 @@ dofile(path .. "/bee.lua") -- KrupnoPavel dofile(path .. "/bunny.lua") -- ExeterDad dofile(path .. "/kitten.lua") -- Jordach/BFD dofile(path .. "/penguin.lua") -- D00Med +dofile(path .. "/panda.lua") -- AspireMint dofile(path .. "/lucky_block.lua") diff --git a/mods/flora_fauna/mobs_animal/kitten.lua b/mods/flora_fauna/mobs_animal/kitten.lua index 948add9..0ea1177 100644 --- a/mods/flora_fauna/mobs_animal/kitten.lua +++ b/mods/flora_fauna/mobs_animal/kitten.lua @@ -1,13 +1,19 @@ local S = mobs.intllib - +local hairball = minetest.settings:get("mobs_hairball") -- Kitten by Jordach / BFD mobs:register_mob("mobs_animal:kitten", { stepheight = 0.6, type = "animal", - passive = true, +specific_attack = {"mobs_animal:rat"}, +damage = 1, +attack_type = "dogfight", +attack_animals = true, -- so it can attack rat +attack_players = false, +reach = 1, + passive = false, hp_min = 5, hp_max = 10, armor = 200, @@ -26,11 +32,12 @@ stepheight = 0.6, random = "mobs_kitten", }, walk_velocity = 0.6, + walk_chance = 15, run_velocity = 2, runaway = true, jump = false, drops = { - {name = "farming:string", chance = 1, min = 1, max = 1}, + {name = "farming:string", chance = 1, min = 0, max = 1}, }, water_damage = 1, lava_damage = 5, @@ -41,15 +48,60 @@ stepheight = 0.6, stand_end = 192, walk_start = 0, walk_end = 96, + stoodup_start = 0, + stoodup_end = 0, }, follow = {"mobs_animal:rat", "ethereal:fish_raw", "mobs_fish:clownfish", "mobs_fish:tropical"}, view_range = 8, + on_rightclick = function(self, clicker) if mobs:feed_tame(self, clicker, 4, true, true) then return end if mobs:protect(self, clicker) then return end if mobs:capture_mob(self, clicker, 50, 50, 90, false, nil) then return end - end + + -- by right-clicking owner can switch between staying and walking + if self.owner and self.owner == clicker:get_player_name() then + + if self.order ~= "stand" then + self.order = "stand" + self.state = "stand" + self.object:set_velocity({x = 0, y = 0, z = 0}) + mobs:set_animation(self, "stand") + else + self.order = "" + mobs:set_animation(self, "stoodup") + end + end + end, + + do_custom = function(self, dtime) + + if hairball == "false" then + return + end + + self.hairball_timer = (self.hairball_timer or 0) + dtime + if self.hairball_timer < 10 then + return + end + self.hairball_timer = 0 + + if self.child + or math.random(1, 250) > 1 then + return + end + + local pos = self.object:get_pos() + + minetest.add_item(pos, "mobs:hairball") + + minetest.sound_play("default_dig_snappy", { + pos = pos, + gain = 1.0, + max_hear_distance = 5, + }) + end, }) @@ -67,7 +119,7 @@ mobs:spawn({ interval = 60, chance = 10000, -- 22000 min_height = 5, - max_height = 200, + max_height = 50, day_toggle = true, }) @@ -76,3 +128,40 @@ mobs:register_egg("mobs_animal:kitten", S("Kitten"), "mobs_kitten_inv.png", 0) mobs:alias_mob("mobs:kitten", "mobs_animal:kitten") -- compatibility + + +local hairball_items = { + "default:stick", "default:coal_lump", "default:dry_shrub", "flowers:rose", + "mobs_animal:rat", "default:grass_1", "farming:seed_wheat", "dye:green", "", + "farming:seed_cotton", "default:flint", "default:sapling", "dye:white", "", + "default:clay_lump", "default:paper", "default:dry_grass_1", "dye:red", "", + "farming:string", "mobs:chicken_feather", "default:acacia_bush_sapling", "", + "default:bush_sapling", "default:copper_lump", "default:iron_lump", "", + "dye:black", "dye:brown", "default:obsidian_shard", "default:tin_lump" +} + +minetest.register_craftitem(":mobs:hairball", { + description = S("Hairball"), + inventory_image = "mobs_hairball.png", + on_use = function(itemstack, user, pointed_thing) + + local pos = user:get_pos() + local dir = user:get_look_dir() + local newpos = {x = pos.x + dir.x, y = pos.y + dir.y + 1.5, z = pos.z + dir.z} + local item = hairball_items[math.random(1, #hairball_items)] + + if item ~= "" then + minetest.add_item(newpos, {name = item}) + end + + minetest.sound_play("default_place_node_hard", { + pos = newpos, + gain = 1.0, + max_hear_distance = 5, + }) + + itemstack:take_item() + + return itemstack + end, +}) diff --git a/mods/flora_fauna/mobs_animal/lucky_block.lua b/mods/flora_fauna/mobs_animal/lucky_block.lua index 94befc3..c519a4c 100644 --- a/mods/flora_fauna/mobs_animal/lucky_block.lua +++ b/mods/flora_fauna/mobs_animal/lucky_block.lua @@ -15,6 +15,7 @@ if minetest.get_modpath("lucky_block") then {"dro", {"mobs:bucket_milk"}, 8}, {"spw", "mobs:kitten", 2}, {"exp"}, + {"dro", {"mobs:hairball"}, 3}, }) if minetest.registered_nodes["default:nyancat"] then diff --git a/mods/flora_fauna/mobs_animal/models/mobs_panda.b3d b/mods/flora_fauna/mobs_animal/models/mobs_panda.b3d new file mode 100644 index 0000000000000000000000000000000000000000..397be0c1da3ec87b50854d8772fa104ee1c55a1e GIT binary patch literal 102237 zcmeF4cUTk4_qZcqLF~Pw609f|5P?k&qGIp8fW24jo!ATZ-bD!Zij|N6_IjUG*I$e_xgQmKMlwrN$F(Y!ru z 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 VC#{wjIBB)Kz)7p+1x{M+{{cT|5E1|Y literal 0 HcmV?d00001 diff --git a/mods/flora_fauna/mobs_animal/panda.lua b/mods/flora_fauna/mobs_animal/panda.lua new file mode 100644 index 0000000..6bdc8a9 --- /dev/null +++ b/mods/flora_fauna/mobs_animal/panda.lua @@ -0,0 +1,86 @@ + +local S = mobs.intllib + + +-- Panda by AspireMint (CC BY-SA 3.0) + +mobs:register_mob("mobs_animal:panda", { +stepheight = 0.6, + type = "animal", + passive = false, + attack_type = "dogfight", + group_attack = false, + owner_loyal = true, + attack_npcs = false, + reach = 2, + damage = 3, + hp_min = 10, + hp_max = 24, + armor = 200, + collisionbox = {-0.4, -0.45, -0.4, 0.4, 0.45, 0.4}, + visual = "mesh", + mesh = "mobs_panda.b3d", + textures = { + {"mobs_panda.png"}, + }, + makes_footstep_sound = true, + sounds = { + random = "mobs_panda", + attack = "mobs_panda", + }, + walk_chance = 5, + walk_velocity = 0.5, + run_velocity = 1.5, + jump = false, + jump_height = 6, + follow = {"ethereal:bamboo"}, + view_range = 8, + drops = { + {name = "mobs:meat_raw", chance = 1, min = 1, max = 2}, + }, + water_damage = 1, + lava_damage = 5, + light_damage = 0, + fear_height = 6, + animation = { + speed_normal = 15, + stand_start = 130, + stand_end = 270, + stand1_start = 0, + stand1_end = 0, + stand2_start = 1, + stand2_end = 1, + stand3_start = 2, + stand3_end = 2, + walk_start = 10, + walk_end = 70, + run_start = 10, + run_end = 70, + punch_start = 80, + punch_end = 120, + -- 0 = rest, 1 = hiding (covers eyes), 2 = surprised + }, + on_rightclick = function(self, clicker) + + if mobs:feed_tame(self, clicker, 20, true, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 5, 50, false, nil) then return end + end, +}) + +if minetest.get_modpath("ethereal") then + + mobs:spawn({ + name = "mobs_animal:panda", + nodes = {"ethereal:bamboo_dirt"}, + neighbors = {"group:grass"}, + min_light = 14, + interval = 60, + chance = 8000, -- 15000 + min_height = 10, + max_height = 80, + day_toggle = true, + }) +end + +mobs:register_egg("mobs_animal:panda", S("Panda"), "wool_green.png", 1) diff --git a/mods/flora_fauna/mobs_animal/readme.md b/mods/flora_fauna/mobs_animal/readme.md index e8f434e..275193d 100644 --- a/mods/flora_fauna/mobs_animal/readme.md +++ b/mods/flora_fauna/mobs_animal/readme.md @@ -17,7 +17,7 @@ Wanders around eating grass/wheat and can be right-clicked with empty bucket to --- ### Kitten -Found on green grass these cute cats walk around and can be picked up and placed in inventory as pets or right-clicked with 4x live rats or raw fish (found in ethereal) and tamed. +Found on green grass these cute cats walk around and can be picked up and placed in inventory as pets or right-clicked with 4x live rats or raw fish (found in ethereal) and tamed. They can sometimes leave you little gifts of a hairball. --- ### Rat @@ -36,6 +36,10 @@ Warthogs unlike pigs defend themselves when hit and give 1-3 raw pork when kille These little guys can be found in glacier biomes on top of snow and have the ability to swim if they fall into water. --- -*Note: After breeding animals need to rest for 4 minutes, baby animals take 4 minutes to grow up and feeding them helps them grow quicker...* +### Panda +These monochrome cuties spawn in Ethereal's bamboo biome and can be tamed with bamboo stalks :) Remember they have claws though. -#### Lucky Blocks: 14 +--- +*Note: After breeding, animals need to rest for 4 minutes and baby animals take 4 minutes to grow up, also feeding them helps them grow quicker...* + +#### Lucky Blocks: 15 diff --git a/mods/flora_fauna/mobs_animal/sheep.lua b/mods/flora_fauna/mobs_animal/sheep.lua index afbb42e..8df5107 100644 --- a/mods/flora_fauna/mobs_animal/sheep.lua +++ b/mods/flora_fauna/mobs_animal/sheep.lua @@ -49,6 +49,7 @@ stepheight = 0.6, runaway = true, jump = true, jump_height = 6, + pushable = true, drops = { {name = "mobs:mutton_raw", chance = 1, min = 1, max = 2}, {name = "wool:"..col[1], chance = 1, min = 1, max = 1}, diff --git a/mods/flora_fauna/mobs_animal/sounds/mobs_panda.ogg b/mods/flora_fauna/mobs_animal/sounds/mobs_panda.ogg new file mode 100644 index 0000000000000000000000000000000000000000..1c4c7d2a6ae83e2af60abd0c23b21c7142d0edea GIT binary patch literal 9971 zcmch6XH-*Nu;@fqR1Aci+8l-F4Ud_4Yd1+2_ojK6_?Pa@Nhw48XxZqXqUlj=KDP zHKz|I47=nT;OIf5K7bvuq<#S)ocs5?6n2)1`JaP|34`vGR_=SV@AdBem(fb|mkuig zHgdS+dO}GKeNqmspuhw@5P?1}K2E;QE&=Kg(1{9EhJeQqULKBr@qD2zfgXWgF6ytI zzKnjAL*tClb#--d3M3+A5t=3j#+pVlI875BO&MsVi;zU<=~5RmdIoqibA++3uDOB9 z85zs72HLu2GFk?B9WyE(;*y6?po5zWBEZGTH^AA$#|=Sr@q(y&`1;7{LM$Bu0zHU< z>N>u`K3={K&ImK#AfNxrdH-I=*NrNLflr`IfR6(e*TD;6re}>X@^B1r2nZFX67q5k z@>X{b4D?fxmk$mOmfOd4hA`!ve7&hwF~@6a8=6=cYw6Dx%dRQs8a=iRP^!icJLyqBD7o_ z0*EIesE)3gHr@bdZgAE_9q$|J;1w8(&c^0m59?Lu1pqJ`qxH&ohAwDUThsdtXo>Wu17vH(4zZBes>gpG0j<6u+pc`iACjQ$H{3qVo#MRA>p_b=v!Rz-r) zs)V}oM%N_=^eRKES;TdGz{3+%D6bn^01K5$8Vx}m@O_BZcOiB$6YD&THosbef?#N003M?I`h)}>jFkmem?D7 zJm)!P9xcIx+Co~r+NG4}X;iF)(|}pICZp)(74?nD@Rh$V;D92MOX)^byEvn0j3d`k z9sm0XX!S+hx+`>Eobf|6ht|`a@a}pDW8V~zjxC574lQU8G@*)8@%pIy8IJL&c0pnf zx*ZXH;MjbAiit{RQL>3jmv|u=?}@76GBc|B!sAp?Gm=BB)I>QYqT6`?&m^{Q21sEJ zdOqhQNWd7beWC#nJ;A?fK|pF&64b?up9v5@lPunuEMt(O*8P}z84u|gb6X5sc#p1o zUs(5^8g`jlcX>bTa{i9XhZ^tmBj?YL2L1PIUv&~KAdx>qR);Qqa*;mszH^dbfCG>U zmEu3?L;fI3*d$AO+;I!NQyiLA5+}UB1#%2zHE59T?Ym9f=FWYOyke@e%gW;KmzI@X z%)0OKzhCeI(FXuPXGy5tU+|2-V7ot6t9=V2XaE8LZBs$r0Gak=MMFr(L7l!|=S)uq znOS-N>jY>Eb+i-JpsN!y1++*}GZ<7f{(rovhJ^zt_&8FMuqIVjdZ;$>Cw5XrTq#50 zB^i!JD$Au>^eBe<>sV1r{@~;>N)rA+cyWeS2k+N{=p=OPqtS6S00^vb@t2Hs<#72iQHaB%d z1yw;AxoBK5JZ|72TQuV6A=@_M_y*OMa~xF>d&g0_wDp~1_lcSeB1DSIsSnkb=UHCg zo)fK5F`Pr_R&LD*@2Q&0AhIVDQz248c!FWYa2DagiIf3?M@3r_A%V&~0quq-$dtBP z6XMaW8N>wH(SE{1h=*B%ayub9xoX{x@PJAxz5*hpaI!s56P5MVFXsr0>LdJ@-zYP_C457*O`0V%j^<@QYGe>4bVH<~Eczgon z=VS9FfgD(=(%0sAkBXuJJcp~Rbp^%|)nn6-Qq$ourgv6TrLj+lg8i-U?Dkqf` zkD)OXGFT}z#KRLkn?*=KLjV-2Eg9=o(VAuJrTh?~IOSEPX5~`rEL`u}|Gv|dcYI&U43!Yd*q>4D5Aa1<2 zIN>*lW<410{Ye6dGFkD58lLR@S9gQ@^wZhs9R3@?Z^0Yj{`yK>9(Y>yf6J zqd#dsnd~26ESkOmt%sUJD7GP6sm^Z8Nx`9@aK;^j!Ucz&%^`ANnM70ZSgdFa9wG%D zSUB|n3n)tPFhBz7{uRh6=XkFub1tP9FJ4+WV(N*c@Ea!PwpoTR)(`TBd)J>z#ojC( zA$xY$4^Mg+tJeua0;xg*sXpRhX0>4gpP@t!NsvM8<%{K|*75`RL~3b|hsr&q8x;VR z8VCRdV=`3kV>qz$RQXVpKnPHfidUIKK=Pq-A#qWZRHz~|Q*)IU*I16dcu9X!8o)s9 zoc#fcf`Q6q@5$4m~462PXIh3@o+i-G0NQclAG&V5Azamyg0r>`|Ue#3!O5 z3&x|{pe9ALmDj0PnL*SE0w7|Nr~nSF`5Y)MGKvOL0WlmZbNP_6jF1x4iv2$+p#)Wt z{aXJ2e}Y7X{PN$YqoAYiC9GxdMH`=Gaxe3lXcnq7V`u!P_HI~L~IhCNi>bDGLKBf;iV)}2b7VN7%nUpm6oKXUmBQ-M@pno zH>csT`VwgzSmxX!b1ZXdkvX0*H!w--s6B-6CJ zaHjQjL&|imJWiKast!YK0V5pH#?S&@1Tq5#=ouKr7~n!MS~hP$iek)UI>21;LQ@i` zVRZEAKpa#2K&%|2=+(f3&OcgW51q<;Iupa@{kPfT0N-IC2?q`yeA{DTea_z5-ODd9 z5=>EW9F#F#KXvSdvzOR!0d5@*O zuTmRKk8kZW^00q~Ad8%WtirJqI%>yNG*wP(sH&@KYa1$PYFcV&+L@T+t*k9Aa3;op znQeav&;OP<2n0z#L_mnWgDS{>0WXEu?L=HVqy3?= zVZC14rj|7FJ6i49V}wgk$<>C04pchhxU^f z(B=JbNE|9g`K6aIFi@^vI=iscwA(FMVyU|cyG>#0LaK6ISd57eXszlk zKO9{Dj9c@wMVi$4+9^I5LQu_4)ziA>Gnj@;o~4-Uu%i9qPMsU+zTH1IgAIXsNnQAe zwdELEc(glZDeRf|ZRJVBkKf_O?EeU=)>+01tXWyEe9G>PH6|LpD!O~?hoX&!vOk3G zglAv>bXi!MycD#!f*!{{ai$O|)MtzPUYQDT?6!w~rL`yGjBmgISLiT<$CwpQSmubl zJU?Zwp7rroQI^?mFsy9!)K~cM(rDg?aM`IaEa%x}0O=X}8aQp3U^TitN zXIej(@xYD@>et8BRhkfQQ z@JGt!$+~gyq&_$AyegS%J(2UtcLRRpNl9D2QBT*lkg2@)vpCq`$f@P8#B5(;*JGi| z$XAOHUVM!Ml6CCYDZs2yp}FTRgGV7 z-*7K8i{0%O&}X3{&oQ;kKFWX+L#FRsmuP~}hiv87Z$ErElks>Qzh#NNe)|&5eRQ){ z<4>}|x3Xa7gT>!Rjw$$AP*IB^zK=4w+mT>#6Lm}MWzys8YLY^fhht^_@SChoC)EbZ z2ordXT(?V#wzmBjtk|?p`D@^s@iJTiH6bO^|A;=DZ*#B^cnwho3naHnh#`7h=&3$} z5jJR0saW5yQLMSA*tSaV`;1(+9&r{2NwcVUj#kM6@bl5huDk$h#f5A#_20_s=(-4;rEi6$CU7pk3Y!QopHV*GN2mk99cKL?wsY0PfB8i5 z<+pn9{3E>G+y^8>bGNq_D#@X_K6)=@k1J>v_A}2u1a}X$1CaGD&aT}1D)ZH?%QUqv zCV}ClEuLfG7#%5zd?0P6powQIA^j*h_}Uv}Dw#ZTnIUuO9_IKwTP$sW$Y`znoN~iM zI`+y)d@%CG?YOZ!jcU(*&+@-m%6*eQ^5zX4xY98;f|>us>NN$7TAksoc`#7-mLrHo zwPEXU`_JZ$Q>f07<2a-2vB0SB7-v6uf6l{9N#%OioaUv6=Tu(RJLo8XD7NmO?4QU>GjDWfHMQ*_OVj`or8ArP| zu{5)M5|$Ya4|*^5@xjX)8il*6F`Tnrd{Mv3>=@p&E5IjtRm7tbcIdZ0(`Q&VGhC9z ztsB6S(mv_CvWo~s;^@V^AAe|?s`Rc$JbepiDcC7;iU>XF`)E_d(7A2Fjd%8)WFN|x zZ^`Y3tLhy(=x8dy^ET@_G?}-eldgo)bX*V;hvP2r^uJ)hh#NZ>`B-jRQdYlDY+o)I z7x#Oya9fzp`W+2M_Vn4X4hOd|)qfdgAJdW$s70|%$dlJy#$*B`>3b>0DI8|e@r50zz}k6RVU@NF?|9>oG)F>e6k zEFK%G+=?_79zF0;EZ8wk5%UGv^ry3b@tTVfx6 zw)1(qA0CF2cK<;AvIbw4IU;tGzF~_#tXVdRbg^m#fR4422BwhbVJI1!Bx#{B#Tqzf z;z0Il^$F?NMly4qI~wENCYAI>CFJ43q{!o;A|wTNg7YosuoK{2aPuJm@=6y*?I-%< z@`a}miqEF5x z+&%Zmw)CjR=YTCo@55cRd!Y(oa^6N3Gq@-)KenBZkO}GH1oO=?R&_N^Oj#2LkeelS zHFxzyK^I48w(|PdbVTkgPuDn->iL6&dVYCBa=fIUhIGki4b>CV!x$SF*kvSCU=GcS zJi1(#4A)QO1b&@^Z`}^p?2Pt_?VN7An=3CM5_?a4L!e^(cDRbV@tej*bQ<%`X|=mj z6O)#@LrtDSy^ZCU6ug@1D#3n-NUKv$ZQ1~!c8HKs!L38L7NpJb=H@s{Jl50{XK7<~ z4v)v5HM6#~vc?%%;0#T$CPqfaCOFfx#zw}*yYrd9F!*)>>nW06{v5{O3G}mHZLZRx z?!1lMdsdSgasq#{p$g!C^)5MB?1$XiQkd`5f?4NdL4A1rM)%Ft zB@1%OR2eg9Dp{z6KQpIUjGRf4we-?XhLb3r(HAd$d-~q@Y;$8p&*}TfYdHE}XCfu$ z$hSLKGRa@#jtRNxgBDM+>xGn=j63o=Q|DPuD7I@yB(6d2KTBRorU|D01bxP+lm9bu zm?{`Cg0{tl>dQ1OxiY|w9XgfFpKrOJ z6hC%4Zn?Dm`oJaHm1#s^>? z2syy@XcV9@EXj0E`nkwZyQ_WZ;55Yr%4T&mLN<00eH)8}Lwj49m*1Wn_KfOnd%tcO zf43?8viuhw}zdb z@Yigv!GvLyo0!U;YvD(;<0=HcSJ2Ma(1t~LvI0^~_S>Mi|-Ei^IjrD-M^332vJs{-@CPvyT?Nd91q$sS+;W%t=%DqqB#qs#P*{_`W@z&U>JVYb$VU-kSX@TdH0NkAuU{KhKhH zzm#ogvrV(B4SXwsTMKw}=ggz64dq!OZm^3SkI(N6XXA=B4e8*g-ywPekZW7kU>v{cgMe=FM7F!Huo~)lUAJ>#$pDXYKQD zr2lyA7^mU<+7s9@m9ek|Hlj2$1^PcOCvB?_XMo;ISY?LHN^rS(}vR{QAxZ1e) zP4>EX|FqQ|;_3>2|AjSIIMdO<-uuH_>Ql)P;*$2a(@3}DeXg(E+hFI^rrqWJI^6Ph zs^uqrZ6vTe-a`MJwdE@fFtr+(n_XKe{EU_Hm1VHd;LgANu`m}YMVPj0UwlC8UW8;w zA3Ys+bH-@#n})ETiYSIm1GZxF-SV=*jb;7AM}Qq~77rr!3S5}KE^GM%eTg@Q zla6#$?uPcVwNqsB&+w-ab6lny^E9w@8?O8g<1ayRRh8O1UGXDQ^?BU)8Kc5lM-Fcd zG^E>HU)fV2#`^w zERvWH6gAbnzP2u@RghIKr38iyt=uZ0CwEQo^B{mB*K6VHEXezHN0Yy=pDHOQp;pfo9R4txk@;vTN zn{L1nt+x|ZpC1e2=MOsUoMru`fMc1@IOVqCA9|W;;Y$HuYV@N=A(mGh87e{EyM@Co z$Te_2fF}I8pDHL4NIFJ`;rUiXcqm9VEGX$?<5s+OLi-@$RMmYYoYKQr21TJeO1baJ zdxd3XRqh)}50l;)Eq`dtJKfNLC&^3a!>M(`BT44@LGREXNwtSt;7N!Dntb|a0`+?` zT#4g^rMXjvy4t_udRj(Tb1%_}$sBfdAYIVv(h2Ey6IZ| zGEs7+BP_9m2H0hcRfDqA_FvmC&8hg=!mlmRw4Bv4d$qa!vGa_G-9&xRsPRijUOWjo zGVLZb4N|e5TYEgM_AZrzik|F0{F)-Fw?=n1rWo$2NGY*RcWir*tbE`a8Oo_qgFo1- z*I^8>Fn^%84pZ=JKgI0J7FLuqn%CR7L~(xJ!7Zb((>W+Q4)PC+?(T}&rWnmFiMCh< zTej)OuUcO{|CRG&p_~I-qpRSe`@(cWGK#lVnA2fXLa6i~Uq8 zKeMB=skzyZoCL?*q&w#}ggzN`e{4>qj9y@9tHyVydSa-fUwC)t}GL zdB&8EBxvjcfL%$ZYd^br7SmyhMgghf3v;ox7TwIFZX)bHmWCOC<7=A#taTue z-jcoWLioer3?}QT+6b?vX(sV8U*R-5NnK9}wTiPsua7iXk!6)$$txpS@ zL&aXYg^?K?^ux7%`_Ps>dx>T3Zad4|VH*;B@LcH`GYbLSljoL26h)Uz50b@MvC3gp z!P5ggLeK1L&25r@T7h-YRJ`CZZ8gjUKRm8v?0FyX&VCPR|K6@5qI}%f+c~H1gg7i~ z`pd^Zn@3ogk{k-=XXZy3z+i2${76>yHrs%or)z)7FG714I16v8Ln%&w?T;E>bIrCY zbru0D2`!O>?8e&&2cm5|lIi`~H_Wc|i6(1>&aIk`dD=23Zw?*hbL6&v?WP-%Icj6* zbRaFaT7R7ANJr`eP3;TM@mJWA4eRnvWv-kKLL$R5Y)si+2lG)SeY*zn# z6}Ku+ULdD2i1wD)vB@^;dn~(EiJm+gn6}8NJ0j2$Y<@nkeZk*;bO+?I0as^cp!|Na zN$j0QhKX<=+|$rvF` z1y`uDL-vXTKk4Dtji`K(%wz)lzB}_ca^?E^s}ZkH5_X~f*Nxe*l%fgGzA(9u)#6oe z`Ci%n=x0sw4XN~13&nZZ2Ps$x8+>ek`!2ts7-m=egXi5aFQXt6*Kq@8(wAS^5ss(p zJH184WZ&G87PCChXR}nL0FYsaIgcQSKLV4r%)-xI`Sr7{_OO#4;VWIL0p(0xy*~1G z0FSgHm@K}XDrV&Yd*<{w|8RB>1Hz2YRz!tMOxE!C=h`8y3$tP;SG^ydxpc}e_G;L9 zPF})oo+tE*wwn`+PY6f-nwUbv?>sv-Bf{C`QlR+z84_G+uM*s}5RGaSS|0UJ^Qr;% z-J1sdw)}U=LzgLol_}F|rrXADPYT!aH0-%lR+rt@vett>Wpw{o$3AzQ?p4cxD;C)f z+_q~tUF0)T#*6@V#Z{ag5*$m;ciCx3IgBFU;Vn1+nN<~YCsW?E?03IT8XGf|ei8qC z<&IRu%k%zu^@04Z+80blZ}ydalZcPop<$gNgzM(7$nR`w@Ogr~;wk`6Pb)4fdE+{J z;H2N0(e^7-p(#mLE_VLrhWOhe!K9|9?aA7Vu~)30?{ta>d@@y8k@l@UYDxSkJEn0l z&V}E2PF!>W3j z^KNqfC^l#P@tss~;T$X1+aY+ti?tvXlct2=lAm4=m7v4^meViF{-|$F6!e41226ox zqR}I=##=SGdenGMp&Z8Jzaf~6Nl?9Uqxals6wke7=a`?tXO>DIs=g8-keeyiK^xO7 z4{x7aoh=pIt(zf;O$Wf;lp#At5VuiOJYTj-3%zRmjh-X{t_L>g~~;-t!$o z|9ZV$pVZqAY!33I_g6R!B>SzYM#idBUEhzTy`v*FDArz#4%!kRlu%p8=qx#@!CL4~ zJtiJ}5<>W}ur@{?K~4eOSxd|eN9~FVV;6F|G#Uz8GuOpY6&syJk-lJ(tmVvv40g7B zzfV?mTOwpN_Ve7M38_V7GGoDAOp_FqMS~DexrZT%Ww|x7b}gCTc++lG8ll_AKs<$k z$dBVjJY#Hnq-rz%6TMD+LMsx$-FIgIy3Krc-F>oFB7;AU_XWNRK2x1b{8j(}002ov JPDHLkV1k&~l)3-_ literal 0 HcmV?d00001 diff --git a/mods/flora_fauna/mobs_animal/textures/mobs_panda.png b/mods/flora_fauna/mobs_animal/textures/mobs_panda.png new file mode 100644 index 0000000000000000000000000000000000000000..dbdc55c2dc0f2e4eecfcd8fb35ac03b386eb777c GIT binary patch literal 1402 zcmV-=1%>*FP)mLX%F4>l&d$=((%9J8 z+}zyV-QD2e;N#=tlz;=<4d~?d|RE?(XmJ@9^;O^z`)h_V)St`TF|$`}_O+ z{QUp_{}3PI(EtDhkV!;AR7iMhun{7FID5Mw2vqvd)7R%1Cn~_y2#|^p*@~ zb9X+UKS`e+Hqct@y>r+4xt~v`{vREk#&dsfd_(VPFFSeQiLKi``^hd^1a93QptUn$ z3i`W@XWQ3o?A~mDv)d*?fnB75Hy79h`@|PIIomVM55tKrjaDh9M|bd0q6s9eeChoQ z4I-vhCDZ2AxI0Td#mR+hZnqfRmShlcRl8T)n=xLPai&}zT`N+thQYgncLu+(*ePiC zOm|Nwd*OTsw;-TV6?e_yRETf_S_?)d@srk>jmo*}M9o=oUi^XJ#?^ABt2HTFrZrj= z{G?1P`!oy6N=Sv;!F36ejG=U>`AGusq|W3Pp>00w)7a=?PIx*3HIvA#<=lBurC&G_ zTh-Vd6Jg=dy$DSIdz{D4ch>#+`Q_#LnX%u)LnRn8B)SJm)`xII0rzljhzJOvo%Pb7 zO*1g)7f2KLbc4q)^wZRaq8+AV-xSx8`oN?$XB_XC&$y!svWGsH?Bg9}AD6s+9Fd zN}1CQai}DBx>w-z6Q_E*P#<>3MOBgt?_iM9jq|WDk|j^LpRe%Y0ai3YozGYEdnPjj zzX#7M80}ItFV(u1bH0IV_z3Iu{3EXCJfE-ENFBm=YyVRF&M<>hZbJ0(_3e$$HyvJI zbs|&hew@=T`OU>oH1LV=Rogc@zJ4QUyunGl=*4h69FE81K~C!E>hRC;Fw#H=5G8AB zbE3oNG$QOMt#BOw=7WHSA;Z-p7E!j0<96KMlJMhxzu)b5zwP#a(qy;aG^}s*k zIp+Yg9}w?wv-xAQ*)YryA)DQ7hWPof&vf41BBAeD%y#_s7m+uPwCMwUkR}t53sUf= zv;klkZfj$4+>;7-cXy-(Vc#Gxvp_P4>&eUlG161V2#09Hv>O>SwuQrhfm(|K6*!%^PyErj!Qk04|p2b(yDxw!tx7=M#LZ22r zs(2+}TCH3eXWom#^ddKx?WO#Mau+;#o)^ys+i?+37SBg*3fY&{Dl3@0pj)X**DQr! zed3_83yTG=zP3^o`Nzp&KW>8}{e*l>7-J||j-|_}2741_eHKtjbr}ZL;%7N3V=|Ft z526dMRrBc=t3zugAMI~>B%^ccb0&=&ZEpS@}r(z)cSBzsQ#GX z_3b5`Gvh)!_e0e54ERjDnpF9odnELy-wixJtLP_s`?(z*sJJn6sN{4|Cg^m)lY^IU z@G&SCUWQr>!gB?#)DidMatR9>7NB2T@dZz`s4uq~HCs2f){BVo%2MXelFr2f77Gi- zc>SwGH4p`Vm>3ReMR@hn1*G_LN!YG={lE`@s{T=c5vz=%w}(uyE}9!H@z+Bqo}HsM zGuczo!`n_x+$fmWSsI^E%8uf0x9U^NP*24|zx30@z0T180kV*g)Cs}%=>Px#07*qo IM6N<$g3Oe_Pyhe` literal 0 HcmV?d00001 diff --git a/mods/flora_fauna/mobs_animal/warthog.lua b/mods/flora_fauna/mobs_animal/warthog.lua index d1f028d..c8d3362 100644 --- a/mods/flora_fauna/mobs_animal/warthog.lua +++ b/mods/flora_fauna/mobs_animal/warthog.lua @@ -11,6 +11,7 @@ stepheight = 0.6, attack_type = "dogfight", group_attack = true, owner_loyal = true, + attack_npcs = false, reach = 2, damage = 2, hp_min = 5, @@ -31,6 +32,7 @@ stepheight = 0.6, run_velocity = 3, jump = true, jump_height = 6, + pushable = true, follow = {"default:apple", "farming:potato"}, view_range = 10, drops = { diff --git a/mods/flora_fauna/mobs_balrog/README.md b/mods/flora_fauna/mobs_balrog/README.md new file mode 100644 index 0000000..70af4c6 --- /dev/null +++ b/mods/flora_fauna/mobs_balrog/README.md @@ -0,0 +1,23 @@ +### Mobs Balrog +![Mobs Balrog's screenshot](screenshot.png) +**_Adds balrogs._** + +**Source code's license:** LGPL v2.1 +**Media (Textures, Models, Sounds) license:** CC-BY-SA 3.0 Unported + +**Dependencies:** default, tnt (found in Minetest Game), mobs (Mobs Redo) + + +### Installation + +Unzip the archive, rename the folder to mobs_balrog and place it in +../minetest/mods/ + +If you only want this to be used in a single world, place it in +../minetest/worlds/WORLD_NAME/worldmods/ + +GNU+Linux - If you use a system-wide installation place it in +~/.minetest/mods/ + +For further information or help see: +https://wiki.minetest.net/Help:Installing_Mods diff --git a/mods/flora_fauna/mobs_balrog/changelog.md b/mods/flora_fauna/mobs_balrog/changelog.md new file mode 100644 index 0000000..85aec1e --- /dev/null +++ b/mods/flora_fauna/mobs_balrog/changelog.md @@ -0,0 +1,35 @@ +# Changelog +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) +and this project adheres to [Semantic Versioning](https://semver.org/). + + +## [Unreleased] + + - No further addition planned. + + +## [0.3.5] - 2018-08-23 +### Changed + + - fixed deprecated lua api calls + - minor code improvements + +### Removed + + - balrog_model.b3d (identical to mobs_balrog.b3d) + + + +## [0.3.4] - 2018-07-10 +### Added + + - changelog.md + +### Changed + + - fixed the knock_back bug + - increased the jump height to 16 nodes (was 4) + - moved constant values into entity's definition/spawner function + - README.txt -> README.md diff --git a/mods/flora_fauna/mobs_balrog/description.txt b/mods/flora_fauna/mobs_balrog/description.txt index 31c99bd..8df5803 100644 --- a/mods/flora_fauna/mobs_balrog/description.txt +++ b/mods/flora_fauna/mobs_balrog/description.txt @@ -1,2 +1 @@ -Adds a balrog mob. -Aggiunge un balrog. \ No newline at end of file +Adds balrogs. \ No newline at end of file diff --git a/mods/flora_fauna/mobs_balrog/init.lua b/mods/flora_fauna/mobs_balrog/init.lua index 8ada00c..19e54e2 100644 --- a/mods/flora_fauna/mobs_balrog/init.lua +++ b/mods/flora_fauna/mobs_balrog/init.lua @@ -1,7 +1,7 @@ --[[ - Mobs Balrog - Adds a balrog mob. - Copyright (C) 2018 Hamlet + Mobs Balrog - Adds balrogs. + Copyright © 2018 Hamlet Authors of source code: ----------------------- @@ -39,52 +39,41 @@ ]]-- --- --- General variables --- - -local minetest_log_level = minetest.settings:get("debug_log_level") -local mod_load_message = "[Mod] Mobs Balrog [v0.3.3] loaded." - - -- -- Balrog's spawn settings -- -local SPAWN_ON = {"group:cracky"} --- Rocks, cobbles, etc. - -local MAX_LIGHT = tonumber(minetest.setting_get("mobs_balrog_max_light")) +local MAX_LIGHT = tonumber(minetest.settings:get("mobs_balrog_max_light")) if (MAX_LIGHT == nil) then MAX_LIGHT = 14 end -local MIN_LIGHT = tonumber(minetest.setting_get("mobs_balrog_min_light")) +local MIN_LIGHT = tonumber(minetest.settings:get("mobs_balrog_min_light")) if (MIN_LIGHT == nil) then MIN_LIGHT = 0 end -local INTERVAL = tonumber(minetest.setting_get("mobs_balrog_interval")) +local INTERVAL = tonumber(minetest.settings:get("mobs_balrog_interval")) if (INTERVAL == nil) then INTERVAL = 60 end -local CHANCE = tonumber(minetest.setting_get("mobs_balrog_chance")) +local CHANCE = tonumber(minetest.settings:get("mobs_balrog_chance")) if (CHANCE == nil) then CHANCE = 500000 end -local MAX_NUMBER = tonumber(minetest.setting_get("mobs_balrog_aoc")) +local MAX_NUMBER = tonumber(minetest.settings:get("mobs_balrog_aoc")) if (MAX_NUMBER == nil) then MAX_NUMBER = 1 end -local MIN_HEIGHT = tonumber(minetest.setting_get("mobs_balrog_min_height")) +local MIN_HEIGHT = tonumber(minetest.settings:get("mobs_balrog_min_height")) if (MIN_HEIGHT == nil) then MIN_HEIGHT = -30912 end -local MAX_HEIGHT = tonumber(minetest.setting_get("mobs_balrog_max_height")) +local MAX_HEIGHT = tonumber(minetest.settings:get("mobs_balrog_max_height")) if (MAX_HEIGHT == nil) then MAX_HEIGHT = -1800 end @@ -94,75 +83,32 @@ end -- Balrog's attributes -- -local MIN_HP = tonumber(minetest.setting_get("mobs_balrog_min_hp")) +local MIN_HP = tonumber(minetest.settings:get("mobs_balrog_min_hp")) if (MIN_HP == nil) then MIN_HP = 200 end -local MAX_HP = tonumber(minetest.setting_get("mobs_balrog_max_hp")) +local MAX_HP = tonumber(minetest.settings:get("mobs_balrog_max_hp")) if (MAX_HP == nil) then MAX_HP = 600 end -local ARMOR_STRENGHT = 100 --- Default = 100, lower values make it stronger - -local WALKING_SPEED = 3.5 --- Default = 4, Player's walking speed = 4 - -local RUNNING_SPEED = 5.2 --- Default = 5.2 --- (Player's walking speed (4)) * 1.3 --- 1.3 = HBSprint's default multiplier - -local WALK_CHANCE = tonumber(minetest.setting_get("mobs_balrog_walk_chance")) +local WALK_CHANCE = tonumber(minetest.settings:get("mobs_balrog_walk_chance")) if (WALK_CHANCE == nil) then WALK_CHANCE = 50 end -local CAN_JUMP = true - -local JUMP_HEIGHT = 4 --- Default = 16, a map block. - -local STEP_HEIGHT = 2.2 --- Default = 2.2, twice a mob's default step height. - -local VIEW_RANGE = tonumber(minetest.setting_get("mobs_balrog_view_range")) +local VIEW_RANGE = tonumber(minetest.settings:get("mobs_balrog_view_range")) if (VIEW_RANGE == nil) then VIEW_RANGE = 32 end -local DAMAGE = tonumber(minetest.setting_get("mobs_balrog_damage")) +local DAMAGE = tonumber(minetest.settings:get("mobs_balrog_damage")) if (DAMAGE == nil) then DAMAGE = 20 end -local KNOCK_BACK = false - -local FEAR_HEIGHT = 0 - -local FALL_DAMAGE = 0 - -local WATER_DAMAGE = 7 --- Default: 7, if it has 400hp it will die in 60secs. - -local LAVA_DAMAGE = 0 - -local LIGHT_DAMAGE = 0 - -local CAN_SUFFOCATE = false - -local CAN_SWIM_INTO_WATER = 0 - -local HIT_RANGE = 5 --- Player's default = 4 - -local ATTACK_ANIMALS = true - -local GROUP_ATTACK = true - -local PATH_FINDER = tonumber(minetest.setting_get("mobs_balrog_pathfinding")) +local PATH_FINDER = tonumber(minetest.settings:get("mobs_balrog_pathfinding")) if (PATH_FINDER == nil) then PATH_FINDER = 1 end @@ -177,25 +123,25 @@ mobs:register_mob("mobs_balrog:balrog", { type = "monster", hp_min = MIN_HP, hp_max = MAX_HP, - armor = ARMOR_STRENGHT, - walk_velocity = WALKING_SPEED, - run_velocity = RUNNING_SPEED, + armor = 100, + walk_velocity = 3.5, + run_velocity = 5.2, walk_chance = WALK_CHANCE, - jump = CAN_JUMP, - jump_height = JUMP_HEIGHT, - stepheight = STEP_HEIGHT, + jump_height = 16, + stepheight = 2.2, view_range = VIEW_RANGE, damage = DAMAGE, - fear_height = FEAR_HEIGHT, - fall_damage = FALL_DAMAGE, - water_damage = WATER_DAMAGE, - lava_damage = LAVA_DAMAGE, - light_damage = LIGHT_DAMAGE, - suffocation = CAN_SUFFOCATE, - floats = CAN_SWIM_INTO_WATER, - reach = HIT_RANGE, - attack_animals = ATTACK_ANIMALS, - group_attack = GROUP_ATTACK, + knock_back = false, + fear_height = 0, + fall_damage = 0, + water_damage = 7, + lava_damage = 0, + light_damage = 0, + suffocation = false, + floats = 0, + reach = 5, + attack_animals = true, + group_attack = true, attack_type = "dogfight", blood_amount = 0, pathfinding = PATH_FINDER, @@ -391,7 +337,7 @@ minetest.register_tool("mobs_balrog:balrog_whip", { mobs:spawn({name = "mobs_balrog:balrog", - nodes = SPAWN_ON, + nodes = {"group:cracky"}, max_light = MAX_LIGHT, min_light = MIN_LIGHT, interval = INTERVAL, @@ -415,8 +361,11 @@ mobs:alias_mob("mobs:balrog", "mobs_balrog:balrog") -- Minetest engine debug logging -- -if (minetest_log_level == nil) or (minetest_log_level == "action") or - (minetest_log_level == "info") or (minetest_log_level == "verbose") then +if (minetest.settings:get("debug_log_level") == nil) +or (minetest.settings:get("debug_log_level") == "action") +or (minetest.settings:get("debug_log_level") == "info") +or (minetest.settings:get("debug_log_level") == "verbose") +then - minetest.log("action", mod_load_message) + minetest.log("action", "[Mod] Mobs Balrog [v0.3.5] loaded.") end diff --git a/mods/flora_fauna/mobs_balrog/mod.conf b/mods/flora_fauna/mobs_balrog/mod.conf index 04eee75..014138e 100644 --- a/mods/flora_fauna/mobs_balrog/mod.conf +++ b/mods/flora_fauna/mobs_balrog/mod.conf @@ -1,7 +1,7 @@ name = mobs_balrog title = Mobs Balrog author = Hamlet -description = Adds a balrog mob. Aggiunge un balrog. +description = Adds balrogs. license = LGPLv2.1 - CC BY-SA 3.0 Unported forum = https://forum.minetest.net/viewtopic.php?f=9&t=18459 -version = 0.3.3 \ No newline at end of file +version = 0.3.5 \ No newline at end of file diff --git a/mods/flora_fauna/mobs_goblins/goblins.lua b/mods/flora_fauna/mobs_goblins/goblins.lua index 06ccdcc..e4810af 100644 --- a/mods/flora_fauna/mobs_goblins/goblins.lua +++ b/mods/flora_fauna/mobs_goblins/goblins.lua @@ -1,6 +1,3 @@ - --- Npc by TenPlus1 converted for FLG Goblins :D - --[[ Goblins' spawn ranges by Hamlet These values have been chosen for dfcaverns' biomes @@ -46,6 +43,8 @@ local gDia_max = -380 local gKin_min = -2700 local gKin_max = -400 +-- Npc by TenPlus1 converted for FLG Goblins :D + mobs_goblins.goblin_tunneling = function(self, type) -- Types are available for fine-tuning. if type == nil then diff --git a/mods/flora_fauna/mobs_monster/dirt_monster.lua b/mods/flora_fauna/mobs_monster/dirt_monster.lua index 2586f40..3bf5fbd 100644 --- a/mods/flora_fauna/mobs_monster/dirt_monster.lua +++ b/mods/flora_fauna/mobs_monster/dirt_monster.lua @@ -30,7 +30,7 @@ mobs:register_mob("mobs_monster:dirt_monster", { run_velocity = 3, jump = true, drops = { - {name = "default:dirt", chance = 1, min = 3, max = 5}, + {name = "default:dirt", chance = 1, min = 0, max = 2}, }, water_damage = 1, lava_damage = 5, diff --git a/mods/flora_fauna/mobs_monster/dungeon_master.lua b/mods/flora_fauna/mobs_monster/dungeon_master.lua index b840092..044f106 100644 --- a/mods/flora_fauna/mobs_monster/dungeon_master.lua +++ b/mods/flora_fauna/mobs_monster/dungeon_master.lua @@ -7,17 +7,17 @@ local S = mobs.intllib mobs:register_mob("mobs_monster:dungeon_master", { type = "monster", passive = false, - damage = 4, + damage = 6, attack_type = "dogshoot", dogshoot_switch = 1, dogshoot_count_max = 12, -- shoot for 10 seconds dogshoot_count2_max = 3, -- dogfight for 3 seconds reach = 3, - shoot_interval = 2.5, + shoot_interval = 2.2, arrow = "mobs_monster:fireball", shoot_offset = 1, - hp_min = 12, - hp_max = 35, + hp_min = 22, + hp_max = 45, armor = 60, collisionbox = {-0.7, -1, -0.7, 0.7, 1.6, 0.7}, visual = "mesh", @@ -37,10 +37,11 @@ mobs:register_mob("mobs_monster:dungeon_master", { jump = true, view_range = 15, drops = { - {name = "default:mese_crystal_fragment", chance = 1, min = 1, max = 3}, - {name = "default:diamond", chance = 4, min = 1, max = 1}, - {name = "default:mese_crystal", chance = 2, min = 1, max = 2}, - {name = "default:diamondblock", chance = 30, min = 1, max = 1}, + {name = "default:mese_crystal_fragment", chance = 1, min = 0, max = 2}, + {name = "mobs:leather", chance = 2, min = 0, max = 2}, + {name = "default:mese_crystal", chance = 3, min = 0, max = 2}, + {name = "default:diamond", chance = 4, min = 0, max = 1}, + {name = "default:diamondblock", chance = 30, min = 0, max = 1}, }, water_damage = 1, lava_damage = 1, @@ -82,13 +83,40 @@ mobs:register_arrow("mobs_monster:fireball", { visual = "sprite", visual_size = {x = 1, y = 1}, textures = {"mobs_fireball.png"}, - velocity = 6, + collisionbox = {-0.1, -0.1, -0.1, 0.1, 0.1, 0.1}, + velocity = 7, tail = 1, tail_texture = "mobs_fireball.png", tail_size = 10, glow = 5, expire = 0.1, + on_activate = function(self, staticdata, dtime_s) + -- make fireball indestructable + self.object:set_armor_groups({immortal = 1, fleshy = 100}) + end, + + -- if player has a good weapon with 7+ damage it can deflect fireball + on_punch = function(self, hitter, tflp, tool_capabilities, dir) + + if hitter and hitter:is_player() and tool_capabilities and dir then + + local damage = tool_capabilities.damage_groups and + tool_capabilities.damage_groups.fleshy or 1 + + local tmp = tflp / (tool_capabilities.full_punch_interval or 1.4) + + if damage > 6 and tmp < 4 then + + self.object:set_velocity({ + x = dir.x * self.velocity, + y = dir.y * self.velocity, + z = dir.z * self.velocity, + }) + end + end + end, + -- direct hit, no fire... just plenty of pain hit_player = function(self, player) player:punch(self.object, 1.0, { diff --git a/mods/flora_fauna/mobs_monster/lava_flan.lua b/mods/flora_fauna/mobs_monster/lava_flan.lua index eb3d27f..6a38744 100644 --- a/mods/flora_fauna/mobs_monster/lava_flan.lua +++ b/mods/flora_fauna/mobs_monster/lava_flan.lua @@ -80,8 +80,8 @@ mobs:register_mob("mobs_monster:lava_flan", { mobs:spawn({ name = "mobs_monster:lava_flan", nodes = {"default:lava_source"}, - chance = 1000, - active_object_count = 2, + chance = 1500, + active_object_count = 1, max_height = 0, }) @@ -159,7 +159,7 @@ minetest.register_tool(":mobs:pick_lava", { groupcaps={ cracky = {times={[1]=1.80, [2]=0.80, [3]=0.40}, uses=40, maxlevel=3}, }, - damage_groups = {fleshy=6}, + damage_groups = {fleshy=6,fire=1}, }, }) diff --git a/mods/flora_fauna/mobs_monster/lucky_block.lua b/mods/flora_fauna/mobs_monster/lucky_block.lua index 38065b6..c9aecea 100644 --- a/mods/flora_fauna/mobs_monster/lucky_block.lua +++ b/mods/flora_fauna/mobs_monster/lucky_block.lua @@ -1,7 +1,30 @@ if minetest.get_modpath("lucky_block") then + local web = {name = "mobs:cobweb"} + local web_trap = { + size = {x = 3, y = 3, z = 3}, + data = { + web, web, web, + web, web, web, + web, web, web, + + web, web, web, + web, web, web, + web, web, web, + + web, web, web, + web, web, web, + web, web, web, + }, + } + + lucky_block:add_schematics({ + {"webtrap", web_trap, {x = 1, y = 0, z = 1}}, + }) + lucky_block:add_blocks({ + {"sch", "webtrap", 1, true}, {"spw", "mobs:dungeon_master", 1, nil, nil, 3, "Billy"}, {"spw", "mobs:sand_monster", 3}, {"spw", "mobs:stone_monster", 3, nil, nil, 3, "Bob"}, diff --git a/mods/flora_fauna/mobs_monster/mese_monster.lua b/mods/flora_fauna/mobs_monster/mese_monster.lua index 4fb6d14..40a99b2 100644 --- a/mods/flora_fauna/mobs_monster/mese_monster.lua +++ b/mods/flora_fauna/mobs_monster/mese_monster.lua @@ -35,8 +35,8 @@ mobs:register_mob("mobs_monster:mese_monster", { fall_speed = -6, stepheight = 2.1, drops = { - {name = "default:mese_crystal", chance = 9, min = 1, max = 3}, - {name = "default:mese_crystal_fragment", chance = 1, min = 1, max = 9}, + {name = "default:mese_crystal", chance = 9, min = 0, max = 2}, + {name = "default:mese_crystal_fragment", chance = 1, min = 0, max = 2}, }, water_damage = 1, lava_damage = 1, diff --git a/mods/flora_fauna/mobs_monster/models/mobs_spider.b3d b/mods/flora_fauna/mobs_monster/models/mobs_spider.b3d new file mode 100644 index 0000000000000000000000000000000000000000..e1b1662fc308d88e0d4599ea375f64036d8c8347 GIT binary patch literal 103645 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 C8VaER literal 0 HcmV?d00001 diff --git a/mods/flora_fauna/mobs_monster/oerkki.lua b/mods/flora_fauna/mobs_monster/oerkki.lua index 26aa298..7cb40fe 100644 --- a/mods/flora_fauna/mobs_monster/oerkki.lua +++ b/mods/flora_fauna/mobs_monster/oerkki.lua @@ -30,7 +30,8 @@ mobs:register_mob("mobs_monster:oerkki", { view_range = 10, jump = true, drops = { - {name = "default:obsidian", chance = 3, min = 1, max = 2}, + {name = "default:obsidian", chance = 3, min = 0, max = 2}, + {name = "default:gold_lump", chance = 2, min = 0, max = 2}, }, water_damage = 2, lava_damage = 4, diff --git a/mods/flora_fauna/mobs_monster/readme.md b/mods/flora_fauna/mobs_monster/readme.md index eb79726..8a02c17 100644 --- a/mods/flora_fauna/mobs_monster/readme.md +++ b/mods/flora_fauna/mobs_monster/readme.md @@ -25,9 +25,9 @@ Sand Monster - The hot deserts are home to these guys who spawn at any time of the day to attack players. They drop 3-5 desert sand when killed. -Spider +Spiders -- Found in dark holes inside desertstone (crystal biomes in ethereal), spiders wait for prey to amble past and strike. They are mostly docile during the day though unless hit. Will drop string when killed. +- Snowy spiders are found on higher cold areas, Tarantula's in higher jungle, Cave spider below -20 and Mese spider near areas containing the ore and Crystal spiders only in Ethereal's crystal biomes. Some are docile during the daytime and will drop string when killed. Stone Monster diff --git a/mods/flora_fauna/mobs_monster/spider.lua b/mods/flora_fauna/mobs_monster/spider.lua index bf1f03d..fb70849 100644 --- a/mods/flora_fauna/mobs_monster/spider.lua +++ b/mods/flora_fauna/mobs_monster/spider.lua @@ -2,26 +2,30 @@ local S = mobs.intllib --- Spider by AspireMint (fishyWET (CC-BY-SA 3.0 license for texture) +-- Spider by AspireMint (CC-BY-SA 3.0 license) mobs:register_mob("mobs_monster:spider", { - docile_by_day = true, + --docile_by_day = true, group_attack = true, type = "monster", passive = false, attack_type = "dogfight", reach = 2, damage = 3, - hp_min = 20, - hp_max = 40, + hp_min = 10, + hp_max = 30, armor = 200, - collisionbox = {-0.9, -0.01, -0.7, 0.7, 0.6, 0.7}, + collisionbox = {-0.8, -0.5, -0.8, 0.8, 0, 0.8}, + visual_size = {x = 1, y = 1}, visual = "mesh", - mesh = "mobs_spider.x", + mesh = "mobs_spider.b3d", textures = { - {"mobs_spider.png"}, + {"mobs_spider_mese.png"}, + {"mobs_spider_orange.png"}, + {"mobs_spider_snowy.png"}, + {"mobs_spider_grey.png"}, + {"mobs_spider_crystal.png"}, }, - visual_size = {x = 7, y = 7}, makes_footstep_sound = false, sounds = { random = "mobs_spider", @@ -33,8 +37,7 @@ mobs:register_mob("mobs_monster:spider", { view_range = 15, floats = 0, drops = { - {name = "farming:string", chance = 1, min = 1, max = 2}, - {name = "ethereal:crystal_spike", chance = 15, min = 1, max = 2}, + {name = "farming:string", chance = 1, min = 0, max = 2}, }, water_damage = 5, lava_damage = 5, @@ -42,42 +45,91 @@ mobs:register_mob("mobs_monster:spider", { animation = { speed_normal = 15, speed_run = 20,--15, - stand_start = 1, - stand_end = 1, - walk_start = 20, - walk_end = 40, - run_start = 20, - run_end = 40, - punch_start = 50, - punch_end = 90, + stand_start = 0, + stand_end = 0, + walk_start = 1, + walk_end = 21, + run_start = 1, + run_end = 21, + punch_start = 25, + punch_end = 45, }, + -- what kind of spider are we spawning? + on_spawn = function(self) + + local pos = self.object:get_pos() ; pos.y = pos.y - 1 + + -- snowy spider + if minetest.find_node_near(pos, 1, + {"default:snow", "default:snowblock", "default:dirt_with_snow"}) then + self.base_texture = {"mobs_spider_snowy.png"} + self.object:set_properties({textures = self.base_texture}) + self.docile_by_day = true + -- tarantula + elseif minetest.find_node_near(pos, 1, + {"default:dirt_with_rainforest_litter", "default:jungletree"}) then + self.base_texture = {"mobs_spider_orange.png"} + self.object:set_properties({textures = self.base_texture}) + self.docile_by_day = true + -- grey spider + elseif minetest.find_node_near(pos, 1, + {"default:stone", "default:gravel"}) then + self.base_texture = {"mobs_spider_grey.png"} + self.object:set_properties({textures = self.base_texture}) + -- mese spider + elseif minetest.find_node_near(pos, 1, + {"default:mese", "default:stone_with_mese"}) then + self.base_texture = {"mobs_spider_mese.png"} + self.object:set_properties({textures = self.base_texture}) + elseif minetest.find_node_near(pos, 1, + {"ethereal:crystal_dirt", "ethereal:crystal_spike"}) then + self.base_texture = {"mobs_spider_crystal.png"} + self.object:set_properties({textures = self.base_texture}) + self.docile_by_day = true + self.drops = { + {name = "farming:string", chance = 1, min = 0, max = 2}, + {name = "ethereal:crystal_spike", chance = 15, min = 1, max = 2}, + } + end + + return true -- run only once, false/nil runs every activation + end, }) -local spawn_on = "default:desert_stone" - -if minetest.get_modpath("ethereal") then - spawn_on = "ethereal:crystal_dirt" -else - minetest.register_alias("ethereal:crystal_spike", "default:sandstone") -end - +-- above ground spawn mobs:spawn({ name = "mobs_monster:spider", - nodes = {spawn_on}, + nodes = { + "default:dirt_with_rainforest_litter", "default:snowblock", + "default:snow", "ethereal:crystal_dirt" + }, min_light = 0, - max_light = 12, + max_light = 8, chance = 7000, active_object_count = 1, - min_height = -50, + min_height = 25, max_height = 31000, }) +-- below ground spawn +mobs:spawn({ + name = "mobs_monster:spider", + nodes = {"default:stone_with_mese", "default:mese", "default:stone"}, + min_light = 0, + max_light = 7, + chance = 7000, + active_object_count = 1, + min_height = -31000, + max_height = -40, +}) + mobs:register_egg("mobs_monster:spider", S("Spider"), "mobs_cobweb.png", 1) -mobs:alias_mob("mobs:spider", "mobs_monster:spider") -- compatibility +mobs:alias_mob("mobs_monster:spider2", "mobs_monster:spider") -- compatibility +mobs:alias_mob("mobs:spider", "mobs_monster:spider") -- cobweb diff --git a/mods/flora_fauna/mobs_monster/stone_monster.lua b/mods/flora_fauna/mobs_monster/stone_monster.lua index bc6f6b8..43fb97f 100644 --- a/mods/flora_fauna/mobs_monster/stone_monster.lua +++ b/mods/flora_fauna/mobs_monster/stone_monster.lua @@ -32,9 +32,9 @@ mobs:register_mob("mobs_monster:stone_monster", { floats = 0, view_range = 10, drops = { - {name = "default:torch", chance = 2, min = 3, max = 5}, - {name = "default:iron_lump", chance = 5, min = 1, max = 2}, - {name = "default:coal_lump", chance = 3, min = 1, max = 3}, + {name = "default:cobble", chance = 1, min = 0, max = 2}, + {name = "default:coal_lump", chance = 3, min = 0, max = 2}, + {name = "default:iron_lump", chance = 5, min = 0, max = 2}, }, water_damage = 0, lava_damage = 1, diff --git a/mods/flora_fauna/mobs_monster/textures/mobs_spider_crystal.png b/mods/flora_fauna/mobs_monster/textures/mobs_spider_crystal.png new file mode 100644 index 0000000000000000000000000000000000000000..c7b5e5ff5c74b42d5766bcf53e0dd84197c84b19 GIT binary patch literal 4663 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 jSpv0ELxS(Mtk#Aq3F63sFO<*aZI%8f^Fk literal 0 HcmV?d00001 diff --git a/mods/flora_fauna/mobs_monster/textures/mobs_spider_grey.png b/mods/flora_fauna/mobs_monster/textures/mobs_spider_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..906acb80a0d3785ace6c1b083806b4542bbe2ddb GIT binary patch literal 8013 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 P00000NkvXXu0mjfQY6Nb literal 0 HcmV?d00001 diff --git a/mods/flora_fauna/mobs_monster/textures/mobs_spider_mese.png b/mods/flora_fauna/mobs_monster/textures/mobs_spider_mese.png new file mode 100644 index 0000000000000000000000000000000000000000..5cda614bcc9c11c30f74a75f3e31f16e7621777d GIT binary patch literal 3193 zcmV-<42JWGP)}E z-+y;L{_cGbz}e05WUS}V#KmI>GT^hGw3>Osec+_Q5TOs9Xj&Rs7I0k7mH!kGYO0`e;F5#fS+T93z*V5xqcdi86Q8!kxAnx z+{HBmAr3OW7a8&WiHlhg2vc7NT8e>juaK0PkSP$9G(~{8X%$W!KvV?6Baxks#x&Gq z!lZ-dA}(lQ%0{~ZeI^N_VFHK|hq$>9e$n8&N#iHn#Wf=g(cbzI-+!zp86fG7h)KXF zdNe*3=8frSE)mT+bQ`L5$cjWpDpE8c?y-@GiAMfqROF*Ui!XJ;&U7s|XTrzjCsS;T zWx?G-91#;9!Tra2k|QHCBqg%o3l75ek6=NWejeIn3F47JbQ^H%BJ?@Xq~qMlLI3k; z2f}3S3ay2fIW9yB2;|NA=!;y1k$YdXf{=0Xn9qKRcW45$Rr$u;UM;v1jw3(7VOLU&^joGuM=p5Y$0+$diK_s)?)e4&Dyb=@55P4?9 zlbik!&rC=C2Pj&^{2+&zu12y4GG?K4gX2S_dXD+8LG#2M6ZV9N5ThcQ`#V}DLCj2o zvHUwAX0J!u-;nn&v++8)#;KTYrcX!ee8)HEeiaK32m%OR{|%^ED8HermTp1d1t~N~ zpJJ*yxH(gF&YXkF&1U0ua&7ty8Lu+k{A85lL$s8}yw0On!gs!a)qfN^sQi%E&Qe-q zsY#q%&xQ#J(4cuD1!9c~-$tU@46$klw9}!Rg`Gbe0MP+kVeh_y>Pz66p!SNGretNK zJe^5{P!1=b#qu`=a~|scvSj<4(+r}VvT-ZRa;%bVCCHFkiX7s1R(^bqqqf5ARc!Xk zIA^yHx3YF&NE~Y&Qr%5eBh@^Vu~WWD*%HP2R~E8{<7<}qJ|s~HM3TTLv2S>>nAP1> zHB!w(89U{hlr4R{lQkSyzYgBqrm8OaS;S6)W(x8bp?N*<_^)Wba3ORv5&diSTDAaP z{;=w7J4!!sSP=V6tZ7KT@`9GN5luSQQfy3P?M2Erqas+tanmXZqRt)Jo+w_Ys@{jn zAmE2jVf5sJnMj|CtYxaCspy@L?wunJ@q5b?hXGLt$`rLJ=2YafHeyUPYbjFTPSLO? zV^$<T_7DvD<(nfed2jZWJ$KA7osDx)@c*Zd8*w6GUgXqM3;M4N7*ZioAhQ6Knm@`Cljo zqW!ltS**!O{;|6lEG>8OxUvNLml&ho5PThu_9&Q^!RM_lK5IT|{sfvoqGA@VPzV}5 zx!w<58=w?(4&5uX3nN(TFg2RB5jEkkyvti;wa56-L!`XDEQdkV zy`v_t=QZz5cI~K%cznFi8o!9NMpH|l&)fc%@8h*#EiE&=sdmh=@1D&$xQJDXv9S`w zWPvZMrd>R8RVdxArnpgm04Xn`DO}YS=KI!;T++mrG~bEZ&N2gYG{eWt#|8bJ87**#U)lF}fBof5# zWiZW9j5%Akyog$2q6jg%k+mAh%sIru*=Rh?G_h$nC>)zks~V1qKJiAnZ|6Q0MVo7$ z4C0MF>KY|OG?pVXNrHH^j5*4vNCvUybHOL7-w{?mO?e`@LeVF#@nabxIm%HJz2>i` zW#u2Jm21wVbkV1z03CP%OSiDiDa$Ebgsu}z6I&xd?yovlRk=&_iA`C)t>;ywp2nGM zabvKWRes70EF=_*&xXl5+m`CE1KQbWW4{MHt(%U{Ehs&p(ykYMVtbIPGhNmG9&~?V z--HrLmg^{`6*d&1z|yf-O$M7WjirRwf>f9Hn|JrN**a{)5@kp>bA8ChiK={ z#HL`GPZUJ*iSj&g;W}E@5Uf^4E6iq-b-+D0&Te-WApb8o{achAM*U$mr8pXQR`%)V zpzMg~6U)!|mM%ldV%*-vzDaYinkqjfLA35i$l;QMdk-_y2^_Ca}ba3=&| zD}G>F51;?+AW3vb?fb~{!qvrWL1zG37eE>P#QqSQy>Q0|RhwaL%LI``toBHR-WMB; zp3KJdIzZ?xrSuc~L)5;^erf9CcbmvG(P!E(FT84oILJNQ){}~8g;~M6^bf>L!2r0X z*|_l@v@e;zlGAu`z>(1@pP^I!HRu#j62$&yYg&wuNdq7m?43w@64F>6L@y zKrNFnreXEUshc_^KOkO?+?V$V8sEQgK#EsqOWKTM!ZpGbk_@}H49*M?8Lvy`PT zG$y;I$sXZ8CR$9df6k5S7sK zvejs?+n7)UL>G^D-$2Wifj4;`j*)KiY&Dv1^0eRbvfCoNCv$d`R+x*2&qDFhX3Ooy z)lDcUm2Nj~H=x>prT@kt&DRm@5;-VD{`9~Au{`)(Sc<+{)Kz2srXhZL%SYUo!16%# z6Z=EFbVHKd8w}#LDm0lOK7uhki1#JMd7$z{7Z3h0(Dh0*SD~l@!MAa|8%J*=;cJ+> zm_=6?nI8rk2E^e|ceqxViwA!!Eu{t7H&M}!W4CesD-?Ahr<+-Hb`gq=5Fbl>1ko-; z;Q`4GBU8F>+n~LLoOWDm!i^f#RN#6AY7Gz{kThSoQ8=Px$2Qp^|FmZ=KW-5|^VDW0 z)`xlCG0mAjs@sqUeHOawMU;f^=9j3siaS-fa2y4x!u^JiAlie-9~!UCfj$n6SJ2(U zAojMQp#hZ{=*Y+RuNXx3%#^d+M%ghqL^(M542LC0*?-0n%RU#6+&CnrAvp=9=_pM> ztqG0wjAKt5^u_2g;hPd%N)$Em5k%V%6V4$k2jv94C_6Q!iS?h+fRb|DZe^3janPN51aVM^^hywG zV#Uj^9z}d6bY;vZiucoGpu4c&2XTDXV}5X;gPZd`2bKrPoT*A7bEZLMII@q4@9IxO z>n{5$wsUi&mBB3Ci(%s$NIdrFhbayj^?pmcZVHyH1Izk7cG zzc|l6JJw!%?Gqv=BZ`KMj|>9?gC;H}qyYV!4gJwWgoXY_ui!a_fuTec7vfiPo!?J) zOG{HuIkZ^5Y_%vaTe{pSZ2~WD=hi!d1X%@G#Sk@TVf(S^Q=h|;>0$C;(0qP(yG8H5 z{+9qnr0>r)kTFQ-!B3 zo9qjUHUKZT<-wV90#}!@>~=1@!D2SLhy8T8SZeIik8>_=mrJMkF)jAiKrx=?mU+Wz zKn=bhzo;!odL}Q;<;rvnsW44fV~spi*3`Q7V!nA1jobK_*QR*Y)c)viQf>A*A9Iar^uGm1@Jg=ku1VNki+-&ClX; zpR4|2#G+M`Ymgj>kCVs~lNjI}O>S-(@H8pbpQ$)JoQBu&zWcH4`PiiEZL>>oSw?c# z1+gmMFCcl1j-(Fr^;sY+I!A!nQj1eZO(MCt=G|Ho68gg$Q%+ti&h(6zA>&Oapj4Jl zlH0`q(zY)sD;vn`X|RgqSs2`>@T(fk?8C=rH664&d}^60pxAU3AG}O^tia-3bDm`f zFbnHhId&BS7vRAskC@0asf#JG#7*JQewQN?C&9wPBDgg>m)V!NEaD2$DRL@G)k#>c{TJp+4>k2gt@isAga5vKEo6wf5Gd*L@oC;^)gx znR^9hxoR>J@4Ngyd3oI)m0t{dKkWF-uz}j0 z6(H4{Y0Sw`C(q5?gFz8PUob7xBF|G~%u9cDGTy44VOH=L;fn*g3RYjEcgk zPBZfy@yF|{ak6MZ9E-O=tP%3Xe80l$oYGejG8kbT07vDVGqI3`ediEcQA8ch1{gv9 zmxTJp#^m^U4t|?5S`pD$)LK{pl4MkBRxcz3Px|vmMcJl*Fm1Wj%-HFMnVgDU__}p; zZd&BNZ1&)Oo)GXHhW@)8=1MO<@$ zJU91Y+Fz1$AdbsLJu~=c5x3 zkRQ3oq)J2dxJLmv-2B08*RLa&Ddbl|*>L)2^JtOWv5+(}ffYwbEQTt^elj#$C zqpAU1GR1XUq3)K?LnP6j!N8%yzjs8QVD{hB2QFDp&4+V<#DS6??F?h*2_%Ous@-k# zo38d;wua3hrIYl8Ia5`m44u@wUjc-4nc$n!0bI}E3AF}{X-^}M-#7VGwpo<&v65@+|uusZq)p~-D#mkctc z$PL^gyb6X@E@WHzT(yT4AFc2g#)HwvljmU%>kg#LI_R_VhZ>1>foWx~T%#}UugAO- zWu?eh{0)#`^uA{C`OA=`njW;CG=Xo4=e#;cHl-~!*=_Ifx@OKj+-C7wD=dY~ViZC+ z)_>`6t>cZ&CQwGnubwwv8*on7GuciqjE-J|X>*KxN{)fdFH(Fx*Uqy-+}@cP;A^Kl z4`_)`kyd{Y56x2Pc%3JkqY(>6FmZ%=7b6CPoe*Z8w;U!eM@)UamE`=2$D4mW$H9rS znahwreX;N~pfyFRSGOU!+mlD2@^=!w69BzNiyPi)0M*i>*AS3*{_wX$0XhdGqM=nD zUA^t#!p0^%4qD*E)iTZyMv^aQSH;>YL<(FSM09sNN6*tqyd;F);}c{yEnh+@d}m_i z3p#?ZI|)ZLHXAl={2(EXfgvP!xF4GGK8S?uf^;S+WKr-`A5hro&labrS-H4|)3q|- zp!S0&C$m$Zr`StY+WcUAOo_m1z9mhn36eEOWL*A`^dW~)Q~c-#R=zlq&!|23X#8)o z#Mo*2o-p9no4qrrJ)*}C**X&mk%}AtxCIjkF}K4hn;SM14u~6>IBmMqou3Uhxawwi z@=6I=E24TiOd8q1V-^N0+F8KQ- z0NenJ(^9X06p?V|2YMALl=m-SQ0Xy)$0>!Z6s0?KCVKH(g>h^fwN%x42;pkv(pL(c$ua5AvHWc3Q#k-X>gieqhxZay?>->?wVI(Z zU_yvg`$cs=lZCc(W=AfIISUU^5Hyh_5m~05cZpLR9cD8`I#%B~j>U=`na?A7Jqutt zQ8(|&ZJ(r^K$DI_6MErD-K&Zzh^=T0g~EQE=f6Fo0Q-jFr=#6_r9i}GOyg<;Y|qou z^=n5`+5u$mapMVW4Vmpmc=$tAXMV`@f5>iP zrqU|2TE|&xVr>7*fO%&09Xki0`~S3uYjS5B&_VrCA3P`s&Fc?6Sep9l@B_{flg|$_T zzT0lux<{{8J?gA^E3QkaaJf^m)2&AZzb2Oxgy7=R@}F7psHw`@uC47{Y?Q_D2l)G_ zu{pq#0`q(yGhMZ!MiuGH3CQMFzQ58}b2&Wakt(!-IMB;6X70@Q=FxUaH^p007o}4^ zc-isqI6q_ya1$tOiJaHk93D&+JFJ>k&0{VbfDK|G{xEdB_8W}RE`TxWw1$|Sz4IQ0$d zfY|lGB6rrn9wB-nSLbyA1*JXAcY|jyp32xL5NXshRrzJ`!_m)B3^@awE0aiwicR2oJ|EEwJLv*W=Fpl>=0ZwIN(`N3|2a91 ztJ^nJ)SqADhWQOq3;>17-PuF>tRoIsj{h=bqRoV?p=!x9SA+n$`(C8ku{g`oFI%az z%0KZQl5q{CChXGlR-azb$4+iB9w#1S6-!15X~u`gq}2%yNR=v$5S#olL@6W`J*G_( z^p=>I4V!|UnfsIWnLq4!_FH{)l8|WXlpH8Ct(@%~YvA^cTs>}hD@zhXsdjuJCYxvI z6lcY3?0%BQ3NfQAbkPfn>NgW~TQ*Cwew%2`mMG!nu?a(Sdk2A2r7j-LYn{nt2$utl zbna=WNDLOmf1CJ3fDccqen(l-5I^TSaQ+lAIkfj*UK4+?@I3QR>A4uROleLdB@rrT z%zH2JhD4nT6(x+1rr{*D7cW>K}-?L(HidkSJgZL#u>%7i7o90J4nyL@29?EPhf~M%x@`U ziwSj`#r=-!PD&q1B<+QbgsRG9Pvejd(A}|PEzG9F)0pSvj+_umRhg>B5hJ`DrT{PJ zQA56hmBuUU99zKV{jmSKj-q>ksyn6{)%AtZ&yRJaX2y_j>}fBzjldT*yu&wg&x*2S zfQ1?Eu>8#+FhHtcI2YHrF^363UcQ3rIgHfB$rMwRAhFP(IHoWOz{-k{fIzd={k*>) zaYwXc`ztxI(nXW*?BxAYdRTiStLv>^E+prC?wlctbi4LB_w4g9d3Ew#;SP8<95jI{ zn15U^o@gS8Xb;*ztQ{(+Qi>gAZ@WsOG|=$o6VRIB2nZR+vd=48w?eKlsf5a_94Vfh zzVhzfCqpO2bv2#*e>(FKV)0gAy9+KeP@W zs10OX1gSrv-V~L*Z_|WN##RjDAXR@VzB<|vpQJyTz#O9>B5r6?p}pA$67`CZOu53i z*QezNHRtgUS6!y{ysadzm(lm3&z7?hbQJ?YZJkNB1OhVYL)lJh%tT=?Ti*mHN8tM# zJ%d5OMHbq^%%*h8{N&X1DdEdyu0QSo={%TL8!_Pk;GKL<$DyN%hlJ7A^(6LK#bYpDP>854DzW>+m2ZDH z{%lLw>2uj5y-jQba5IxWtAo%G1C!Jjw(v@(UgbLaS0XRES!EUty7;|$ zLZp8^K3BI$X2vW%NQ#=(JR>=I>)@c*>@*}?r3xc*qPNcQ*LuryV3gGrXz_HZ+2#6` zvlDM4<>?^A^O9C_iG9u8GA8cmYH*wzuGdMQ&<9aG2JUZ4C|rOu4nT`3=R;gC*K5hr z{L6~IulSfWEmlR!DH>00I=_Chq5~!oj&1AYG;HOxe)2j=s-q!vQx|MvWwgIIeFxqZ zZFi8r0VYj-u`*nQvoQ3iAH9B<*6HjjzQ3eH(Pex6{x!){Yx^@E4|>f9oq$EWH{ft2 z2{~x7S>7DIK`+;7{3?A4R`K>HIcS}%&hr~wN}+~qfdvHxi%{5hX;pNqM&5(c5YiKW zI%kEos3Pb1-N57BodS+nR1JAd{bOUJjJ^(Nmd8VH;pcv2fArx|0=4i7+ zqWgk72e4EznuXbe7(aRO&l>>WA_XA^C2pZW>lPX$o|eqIG_)L4b;OAq^AkO<`I^8z zm(cCR7XnU`Dpp@hfX02zb#-->l`)C&uM!}2Be~=92}LIDGhIqu28_8F3~T%#l7jGd zjabA1*l$JZs<@6Hp~>j!%4>B-BA9OJIAoxTFywa)7-G*^J}fUU$0?V?o39*Zv=8h0 zh)n1CNfv0s@cHvc_nqzS7(^HU7pGusx{j4hy+R^^l|H%;$=&MQIjZ>24EfR- zW`vBmr7KtO(V#*HN1_-bwj`$S3dp3M6IrlXtUnbYP=>^qcfacvFqEtDrESZ$D)>Dm z_z)WASNSF}r)ZF7Eyh`JAeiF}r=FH)|B4-T#Kcc09_P$`$D&9cw7e?~Qeb@hl+YzV zeU^Uf0e>viOskym*-4_@3^7+J%yh1Nm3oCWZ~_qdV70 zs}--u$`twHoDg+faDZoMzNb!<4hRk2Zv|1xKeznoHO&81)>F_Nb=R`>vhhHAvWu;NzI<^fvpBJ|!ms=@ za(I^wX|sq>phFz^7o}I-vL1(t2h|&*k|4d4TZxq7FeW}$fJjWu&~ z%aXF9o&BAi{&i{-3@9%78x_*)^Z&buWnHQzX1uwuJItDs^ml1T}SOKSiOAQaj z#IWOrdOqA3Oxe@ZJ`N0t7W$v|4oyesMQ`2m& zw*-jNTUF^?zc?I%#(-N^QfTX%3z|DG+?#P|akc9l0iK?v8Hvp(S)L&m5fM>aR|gx--m>DIDHcy8l&?T}FlTwO{i%QTLRGgjT{ercQsJ%ghowVlM9DECG|*zho|1^&hm;`gy23zl7v;udF17W ziY-`N`ol}3d_Wmv0{xcLgxuHbtTJ03ekcp6%J<1q{A*L2w>D(pl<}VB0I)=wCo^Br zGAk~|{)Ou&nb7q9=EY`nQ@)gZjy$RtMZ%d|D^Gb45@!c!FU$>{729OK$MruJ5%V

f{r9$R=cW^nN=q8l^bfGS*BD#7{_%R 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 literal 0 HcmV?d00001 diff --git a/mods/flora_fauna/mobs_monster/textures/mobs_spider_snowy.png b/mods/flora_fauna/mobs_monster/textures/mobs_spider_snowy.png new file mode 100644 index 0000000000000000000000000000000000000000..3c66c94d71deccd31f3fa4abbdd26d5dcf826c49 GIT binary patch literal 8481 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 **_Adds the Snow Walkers mobs, and an obsidian sword._** -**Version:** 0.1.2
+**Version:** 0.1.3
**Source code's license:** GPL v3.0
**Multimedia files' license:** LGPL v2.1 - CC BY-SA v4.0 International **Dependencies:** default (found in Minetest Game) mobs (Mobs Redo)
+**Supported:** mobs_humans **Obsidian Sword's recipe:** diff --git a/mods/flora_fauna/mobs_others/depends.txt b/mods/flora_fauna/mobs_others/depends.txt old mode 100644 new mode 100755 index cbfbcdb..326c40b --- a/mods/flora_fauna/mobs_others/depends.txt +++ b/mods/flora_fauna/mobs_others/depends.txt @@ -1,2 +1,3 @@ default -mobs \ No newline at end of file +mobs +mobs_humans? \ No newline at end of file diff --git a/mods/flora_fauna/mobs_others/description.txt b/mods/flora_fauna/mobs_others/description.txt old mode 100644 new mode 100755 diff --git a/mods/flora_fauna/mobs_others/init.lua b/mods/flora_fauna/mobs_others/init.lua old mode 100644 new mode 100755 index ec9a6d6..51e9a35 --- a/mods/flora_fauna/mobs_others/init.lua +++ b/mods/flora_fauna/mobs_others/init.lua @@ -22,32 +22,7 @@ -- local minetest_log_level = minetest.settings:get("debug_log_level") -local mod_load_message = "[Mod] Mobs Others [v0.1.2] loaded." - - --- --- Constants --- - -local ARMOUR = "mobs_others_chestplate_crystal.png" .. - "^" .. "mobs_others_leggings_crystal.png" .. - "^" .. "mobs_others_boots_crystal.png" - -local ARMOUR_HELMET = "mobs_others_helmet_crystal.png" .. - "^" .. "mobs_others_chestplate_crystal.png" .. - "^" .. "mobs_others_leggings_crystal.png" .. - "^" .. "mobs_others_boots_crystal.png" - -local ARMOUR_SHIELD = "mobs_others_chestplate_crystal.png" .. - "^" .. "mobs_others_leggings_crystal.png" .. - "^" .. "mobs_others_boots_crystal.png" .. - "^" .. "mobs_others_shield_crystal.png" - -local ARMOUR_HELMET_SHIELD = "mobs_others_helmet_crystal.png" .. - "^" .. "mobs_others_chestplate_crystal.png" .. - "^" .. "mobs_others_leggings_crystal.png" .. - "^" .. "mobs_others_boots_crystal.png" .. - "^" .. "mobs_others_shield_crystal.png" +local mod_load_message = "[Mod] Mobs Others [v0.1.3] loaded." -- @@ -95,6 +70,26 @@ local function random_appearence() "mobs_others_crystal_axe.png" } + local ARMOUR = "mobs_others_chestplate_crystal.png" .. + "^" .. "mobs_others_leggings_crystal.png" .. + "^" .. "mobs_others_boots_crystal.png" + + local ARMOUR_HELMET = "mobs_others_helmet_crystal.png" .. + "^" .. "mobs_others_chestplate_crystal.png" .. + "^" .. "mobs_others_leggings_crystal.png" .. + "^" .. "mobs_others_boots_crystal.png" + + local ARMOUR_SHIELD = "mobs_others_chestplate_crystal.png" .. + "^" .. "mobs_others_leggings_crystal.png" .. + "^" .. "mobs_others_boots_crystal.png" .. + "^" .. "mobs_others_shield_crystal.png" + + local ARMOUR_HELMET_SHIELD = "mobs_others_helmet_crystal.png" .. + "^" .. "mobs_others_chestplate_crystal.png" .. + "^" .. "mobs_others_leggings_crystal.png" .. + "^" .. "mobs_others_boots_crystal.png" .. + "^" .. "mobs_others_shield_crystal.png" + local armours = { ARMOUR, ARMOUR_HELMET, @@ -170,6 +165,7 @@ mobs:register_mob("mobs_others:snow_walker", { attack_animals = true, group_attack = true, attack_type = "dogfight", + specific_attack = {"player", "mobs_humans:human"}, blood_amount = 0, pathfinding = 0, immune_to = { @@ -239,7 +235,7 @@ mobs:spawn({name = "mobs_others:snow_walker", max_light = 15, min_light = 0, interval = 60, - chance = 7000, + chance = 3500, active_object_count = 2, min_height = 1, max_height = 31000, diff --git a/mods/flora_fauna/mobs_others/mod.conf b/mods/flora_fauna/mobs_others/mod.conf old mode 100644 new mode 100755 index 1262560..99dfd6d --- a/mods/flora_fauna/mobs_others/mod.conf +++ b/mods/flora_fauna/mobs_others/mod.conf @@ -4,4 +4,4 @@ author = Hamlet description = Adds the Snow Walkers mobs, and an obsidian sword. license = GPLv3 - LGPLv2.1 - CC BY-SA 4.0 International forum = https://forum.minetest.net/viewtopic.php?f=9&t=19921 -version = 0.1.2 \ No newline at end of file +version = 0.1.3 \ No newline at end of file diff --git a/mods/flora_fauna/mobs_others/screenshot.png b/mods/flora_fauna/mobs_others/screenshot.png old mode 100644 new mode 100755 diff --git a/mods/flora_fauna/mobs_redo/api.lua b/mods/flora_fauna/mobs_redo/api.lua new file mode 100644 index 0000000..7a7a930 --- /dev/null +++ b/mods/flora_fauna/mobs_redo/api.lua @@ -0,0 +1,3949 @@ + +-- Intllib and CMI support check +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP .. "/intllib.lua") +local use_cmi = minetest.global_exists("cmi") + +mobs = { + mod = "redo", + version = "20180915", + intllib = S, + invis = minetest.global_exists("invisibility") and invisibility or {}, +} + +-- creative check +local creative_cache = minetest.settings:get_bool("creative_mode") +function mobs.is_creative(name) + return creative_cache or minetest.check_player_privs(name, {creative = true}) +end + + +-- localize math functions +local pi = math.pi +local square = math.sqrt +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 + --error("atan bassed NaN") + return 0 + else + return atann(x) + end +end + + +-- Load settings +local damage_enabled = minetest.settings:get_bool("enable_damage") +local mobs_spawn = minetest.settings:get_bool("mobs_spawn") ~= false +local peaceful_only = minetest.settings:get_bool("only_peaceful_mobs") +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 creative = minetest.settings:get_bool("creative_mode") +local spawn_protected = minetest.settings:get_bool("mobs_spawn_protected") ~= false +local remove_far = minetest.settings:get_bool("remove_far_mobs") ~= false +local difficulty = tonumber(minetest.settings:get("mob_difficulty")) or 1.0 +local show_health = minetest.settings:get_bool("mob_show_health") ~= false +local max_per_block = tonumber(minetest.settings:get("max_objects_per_block") or 99) +local mob_chance_multiplier = tonumber(minetest.settings:get("mob_chance_multiplier") or 1) + +-- Peaceful mode message so players will know there are no monsters +if peaceful_only 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 + +-- calculate aoc range for mob count +local aoc_range = tonumber(minetest.settings:get("active_block_range")) * 16 + +-- 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_fire = "fire:basic_flame" +local node_permanent_flame = "fire:permanent_flame" +local node_ice = "default:ice" +local node_snowblock = "default:snowblock" +local node_snow = "default:snow" +mobs.fallback_node = minetest.registered_aliases["mapgen_dirt"] or "default:dirt" + + +-- play sound +local mob_sound = function(self, sound) + + if sound then + minetest.sound_play(sound, { + object = self.object, + gain = 1.0, + max_hear_distance = self.sounds.distance + }) + end +end + + +-- attack player/mob +local do_attack = function(self, player) + + if self.state == "attack" then + return + end + + self.attack = player + self.state = "attack" + + if random(0, 100) < 90 then + mob_sound(self, self.sounds.war_cry) + end +end + + +-- calculate distance +local get_distance = function(a, b) + + local x, y, z = a.x - b.x, a.y - b.y, a.z - b.z + + return square(x * x + y * y + z * z) +end + + +-- collision function based on similar from jordan4ibanez' open_ai mod +local collision = function(self) + + local pos = self.object:get_pos() + local vel = self.object:get_velocity() + local x, z = 0, 0 + local width = -self.collisionbox[1] + self.collisionbox[4] + 0.5 + + for _,object in ipairs(minetest.get_objects_inside_radius(pos, width)) do + + if object:is_player() + or (object:get_luaentity()._cmi_is_mob == true and object ~= self.object) then + + local pos2 = object:get_pos() + local vec = {x = pos.x - pos2.x, z = pos.z - pos2.z} + + x = x + vec.x + z = z + vec.z + 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() + + return (v.x * v.x + v.z * v.z) ^ 0.5 +end + + +-- set and return valid yaw +local set_yaw = function(self, yaw, delay) + + if not yaw or yaw ~= yaw then + yaw = 0 + end + + delay = delay or 0 + + if delay == 0 then + self.object:set_yaw(yaw) + return yaw + end + + self.target_yaw = yaw + self.delay = delay + + return self.target_yaw +end + +-- global function to set mob yaw +function mobs:yaw(self, yaw, delay) + set_yaw(self, yaw, delay) +end + + +-- set defined animation +local set_animation = function(self, anim) + + if not self.animation + or not anim then return end + + self.animation.current = self.animation.current or "" + + -- only set different animation for attacks when setting to same set + if anim ~= "punch" and anim ~= "shoot" + and string.find(self.animation.current, anim) then + return + end + + -- check for more than one animation + local num = 0 + + for n = 1, 4 do + + if self.animation[anim .. n .. "_start"] + and self.animation[anim .. n .. "_end"] then + num = n + end + end + + -- choose random animation from set + if num > 0 then + num = random(0, num) + anim = anim .. (num ~= 0 and num or "") + end + + if anim == self.animation.current + or not self.animation[anim .. "_start"] + or not self.animation[anim .. "_end"] then + return + end + + self.animation.current = anim + + self.object:set_animation({ + x = self.animation[anim .. "_start"], + y = self.animation[anim .. "_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 mobs:set_animation(self, anim) + set_animation(self, anim) +end + + +-- check line of sight (by BrunoMine, tweaked by Astrobe) +local line_of_sight = function(self, pos1, pos2, stepsize) + + if not pos1 or not pos2 then return end + + stepsize = stepsize or 1 + + local stepv = vector.multiply(vector.direction(pos1, pos2), stepsize) + + 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 + + -- 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 +-- or minetest.registered_nodes[nn].drawtype == "nodebox") do + + npos1 = vector.add(npos1, stepv) + + if get_distance(npos1, pos2) < stepsize then return true end + + -- 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 + +-- global function +function mobs:line_of_sight(self, pos1, pos2, stepsize) + + return line_of_sight(self, pos1, pos2, stepsize) +end + + +-- are we flying in what we are suppose to? (taikedz) +local flight_check = function(self, pos_w) + + local def = minetest.registered_nodes[self.standing_in] + + if not def then return false end -- nil check + + if type(self.fly_in) == "string" + and self.standing_in == self.fly_in then + + return true + + elseif type(self.fly_in) == "table" then + + for _,fly_in in pairs(self.fly_in) do + + if self.standing_in == fly_in then + + return true + end + end + end + + -- stops mobs getting stuck inside stairs and plantlike nodes + if def.drawtype ~= "airlike" + and def.drawtype ~= "liquid" + and def.drawtype ~= "flowingliquid" then + return true + end + + return false +end + + +-- custom particle effects +local effect = function(pos, amount, texture, min_size, max_size, radius, gravity, glow) + + 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 + + minetest.add_particlespawner({ + amount = amount, + time = 0.25, + minpos = pos, + maxpos = pos, + minvel = {x = -radius, y = -radius, 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 + + +-- update nametag colour +local update_tag = function(self) + + local col = "#00FF00" + local qua = self.hp_max / 4 + + if self.health <= floor(qua * 3) then + col = "#FFFF00" + end + + if self.health <= floor(qua * 2) then + col = "#FF6600" + end + + if self.health <= floor(qua) then + col = "#FF0000" + end + + self.object:set_properties({ + nametag = self.nametag, + nametag_color = col + }) + +end + + +-- drop items +local item_drop = function(self) + + -- check for nil or no drops + if not self.drops or #self.drops == 0 then + return + end + + -- no drops if disabled by setting + if not mobs_drop_items then return end + + -- no drops for child mobs + if self.child then return end + + -- was mob killed by player? + local death_by_player = self.cause_of_death and self.cause_of_death.puncher + and self.cause_of_death.puncher:is_player() or nil + + local obj, item, num + local pos = self.object:get_pos() + + for n = 1, #self.drops do + + if random(1, self.drops[n].chance) == 1 then + + num = random(self.drops[n].min or 0, self.drops[n].max or 1) + item = self.drops[n].name + + -- cook items on a hot death + if self.cause_of_death.hot 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 + + -- only drop rare items (drops.min=0) if killed by player + if death_by_player then + obj = minetest.add_item(pos, ItemStack(item .. " " .. num)) + + elseif self.drops[n].min ~= 0 then + obj = minetest.add_item(pos, ItemStack(item .. " " .. num)) + 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, cmi_cause) + + -- has health actually changed? + if self.health == self.old_health and self.health > 0 then + return + end + + self.old_health = self.health + + -- still got some health? play hurt sound + if self.health > 0 then + + mob_sound(self, self.sounds.damage) + + -- make sure health isn't higher than max + if self.health > self.hp_max then + self.health = self.hp_max + 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 + + self.cause_of_death = cmi_cause + + -- drop items + item_drop(self) + + mob_sound(self, self.sounds.death) + + local pos = self.object:get_pos() + + -- execute custom death function + if self.on_die then + + self.on_die(self, pos) + + if use_cmi then + cmi.notify_die(self.object, cmi_cause) + end + + self.object:remove() + + return true + end + + -- default death function and die animation (if defined) + if 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 + local length = max(frames / speed, 0) + + self.attack = nil + self.v_start = false + self.timer = 0 + self.blinktimer = 0 + self.passive = true + self.state = "die" + set_velocity(self, 0) + set_animation(self, "die") + + minetest.after(length, function(self) + + if use_cmi and self.object:get_luaentity() then + cmi.notify_die(self.object, cmi_cause) + end + + self.object:remove() + end, self) + else + + if use_cmi then + cmi.notify_die(self.object, cmi_cause) + end + + self.object:remove() + end + + effect(pos, 20, "tnt_smoke.png") + + return true +end + + +-- is mob facing a cliff +local is_at_cliff = function(self) + + if self.fear_height == 0 then -- 0 for no falling protection! + 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 + + if 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} + , 1) then + + return true + end + + return false +end + + +-- get node but use fallback for nil or unknown +local node_ok = function(pos, fallback) + + fallback = fallback or mobs.fallback_node + + local node = minetest.get_node_or_nil(pos) + + if node and minetest.registered_nodes[node.name] then + return node + end + + return minetest.registered_nodes[fallback] +end + + +-- 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 standing inside ignore node + if self.standing_in == "ignore" then + self.object:remove() + return + end + + -- is mob light sensative, or scared of the dark :P + if self.light_damage ~= 0 then + + local light = minetest.get_node_light(pos) or 0 + + if light >= self.light_damage_min + and light <= self.light_damage_max then + + self.health = self.health - self.light_damage + + effect(pos, 5, "tnt_smoke.png") + + if check_for_death(self, {type = "light"}) then return end + end + end + + local nodef = minetest.registered_nodes[self.standing_in] + + pos.y = pos.y + 1 -- for particle effect position + + -- water + if self.water_damage + and nodef.groups.water then + + if self.water_damage ~= 0 then + + self.health = self.health - self.water_damage + + effect(pos, 5, "bubble.png", nil, nil, 1, nil) + + if check_for_death(self, {type = "environment", + pos = pos, node = self.standing_in}) then return end + end + + -- lava or fire or ignition source + elseif self.lava_damage + and nodef.groups.igniter then +-- and (nodef.groups.lava +-- or self.standing_in == node_fire +-- or self.standing_in == node_permanent_flame) 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, {type = "environment", + pos = pos, node = self.standing_in, hot = true}) then return end + end + + -- damage_per_second node check + elseif nodef.damage_per_second ~= 0 then + + self.health = self.health - nodef.damage_per_second + + effect(pos, 5, "tnt_smoke.png") + + if check_for_death(self, {type = "environment", + pos = pos, node = self.standing_in}) then return end + end +--[[ + --- suffocation inside solid node + if self.suffocation ~= 0 + and nodef.walkable == true + and nodef.groups.disable_suffocation ~= 1 + and nodef.drawtype == "normal" then + + self.health = self.health - self.suffocation + + if check_for_death(self, {type = "environment", + pos = pos, node = self.standing_in}) then return end + end +]] + 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 + 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) + +--print ("standing on:", nod.name, pos.y) + + 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? + local nod = node_ok({ + x = pos.x + dir_x, + y = pos.y + 0.5, + z = pos.z + dir_z + }) + + -- thin blocks that do not need to be jumped + if nod.name == node_snow then + return false + end + +--print ("in front:", nod.name, pos.y + 0.5) + + if self.walk_chance == 0 + or minetest.registered_items[nod.name].walkable then + + if not nod.name:find("fence") + and not nod.name:find("gate") 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 self.object:get_luaentity() then + + self.object:set_acceleration({ + x = v.x * 2,--1.5, + y = 0, + z = v.z * 2,--1.5 + }) + end + end, self, v) + + if get_velocity(self) > 0 then + mob_sound(self, self.sounds.jump) + end + else + self.facing_fence = true + end + + return true + end + + return false +end + + +-- blast damage to entities nearby (modified from TNT mod) +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 = get_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 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 240 seconds before growing into adult + if self.child == true then + + self.hornytimer = self.hornytimer + 1 + + if self.hornytimer > 240 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 40 seconds, + -- afterwards horny animal cannot mate again for 200 seconds + if self.horny == true + and self.hornytimer < 240 then + + self.hornytimer = self.hornytimer + 1 + + if self.hornytimer >= 240 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 <= 40 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 <= 40 then + num = num + 1 + end + + -- found your mate? then have a baby + if num > 1 then + + self.hornytimer = 41 + ent.hornytimer = 41 + + -- spawn baby + minetest.after(5, function(self, ent) + + if not self.object:get_luaentity() then + return + end + + -- custom breed function + if self.on_breed then + + -- when false skip going any further + if self.on_breed(self, ent) == false then + return + end + else + effect(pos, 15, "tnt_smoke.png", 1, 2, 2, 15, 5) + end + + local mob = minetest.add_entity(pos, self.name) + local ent2 = mob:get_luaentity() + local textures = self.base_texture + + -- using specific child texture (if found) + if self.child_texture then + textures = self.child_texture[1] + end + + -- and resize to half height + mob:set_properties({ + textures = textures, + visual_size = { + x = self.base_size.x * .5, + y = self.base_size.y * .5, + }, + collisionbox = { + 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, + }, + selectionbox = { + 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, + }, + }) + -- tamed and owned by parents' owner + ent2.child = true + ent2.tamed = true + ent2.owner = self.owner + end, self, ent) + + 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 mobs_griefing + or 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 + + if #minetest.find_nodes_in_area(pos, pos, what) > 0 then + +-- print ("replace node = ".. minetest.get_node(pos).name, pos.y) + + local oldnode = {name = what} + local newnode = {name = with} + 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 + + minetest.set_node(pos, {name = with}) + + -- when cow/sheep eats grass, replace wool and milk + if self.gotten == true then + self.gotten = false + self.object:set_properties(self) + 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 self.object:get_luaentity() then + + if has_lineofsight then + self.path.following = false + end + 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 self.object:get_luaentity() then + + if has_lineofsight then + self.path.following = false + end + 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 self.object:get_luaentity() then + + if has_lineofsight then + self.path.following = false + end + end + end, self) + end + + if 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.y = floor(s.y + 0.5) - sheight + 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 = 6 + if self.fear_height ~= 0 then dropheight = self.fear_height end + + self.path.way = minetest.find_path(s, p1, 16, self.stepheight, dropheight, "Dijkstra") + +--[[ + -- show path using particles + if self.path.way and #self.path.way > 0 then + print ("-- path length:" .. tonumber(#self.path.way)) + for _,pos in pairs(self.path.way) do + minetest.add_particle({ + pos = pos, + velocity = {x=0, y=0, z=0}, + acceleration = {x=0, y=0, z=0}, + expirationtime = 1, + size = 4, + collisiondetection = false, + vertical = false, + texture = "heart.png", + }) + end + end +]] + + 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 = 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 second + self.path.stuck_timer = stuck_timeout - 2 + + -- frustration! cant find the damn path :( + mob_sound(self, self.sounds.random) + else + -- yay i found path + mob_sound(self, self.sounds.war_cry) + 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 + + +-- general attack function for all mobs ========== +local general_attack = function(self) + + -- return if already attacking, passive or docile during day + if self.passive + or self.state == "attack" + or day_docile(self) then + return + end + + local s = self.object:get_pos() + local objs = minetest.get_objects_inside_radius(s, self.view_range) + + -- remove entities we aren't interested in + for n = 1, #objs do + + local ent = objs[n]:get_luaentity() + + -- are we a player? + if objs[n]:is_player() then + + -- if player invisible or mob not setup to attack then remove from list + if self.attack_players == false + or (self.owner and self.type ~= "monster") + or mobs.invis[objs[n]:get_player_name()] + or not specific_attack(self.specific_attack, "player") then + objs[n] = nil +--print("- pla", n) + end + + -- or are we a mob? + elseif ent and ent._cmi_is_mob then + + -- remove mobs not to attack + if self.name == ent.name + or (not self.attack_animals and ent.type == "animal") + or (not self.attack_monsters and ent.type == "monster") + or (not self.attack_npcs and ent.type == "npc") + or not specific_attack(self.specific_attack, ent.name) then + objs[n] = nil +--print("- mob", n, self.name, ent.name) + end + + -- remove all other entities + else +--print(" -obj", n) + objs[n] = nil + end + end + + local p, sp, dist, min_player + local min_dist = self.view_range + 1 + + -- go through remaining entities and select closest + for _,player in pairs(objs) do + + p = player:get_pos() + sp = s + + dist = get_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 that isnt self + if dist ~= 0 + and dist < min_dist + and line_of_sight(self, sp, p, 2) == true then + min_dist = dist + min_player = player + end + end + + -- attack closest player or mob + 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 then + return + end + + local s = self.object:get_pos() + local p, sp, dist, pname + local player, obj, min_player, 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 + + pname = objs[n]:get_player_name() + + if mobs.invis[pname] + or self.owner == pname then + + name = "" + else + player = objs[n] + name = "player" + end + else + obj = objs[n]:get_luaentity() + + if obj then + player = obj.object + 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 = get_distance(p, s) + + -- choose closest player/mob 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.state ~= "runaway" then + + local s = self.object:get_pos() + local players = minetest.get_connected_players() + + for n = 1, #players do + + if get_distance(players[n]:get_pos(), s) < self.view_range + and not 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.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 + if self.following + and self.following:is_player() + and follow_holding(self, self.following) == false 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 = get_distance(p, s) + + -- dont follow if out of range + if dist > self.view_range 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 + + yaw = set_yaw(self, yaw, 6) + + -- anyone but standing npc's can move along + if dist > self.reach + and self.order ~= "stand" then + + set_velocity(self, self.walk_velocity) + + if self.walk_chance ~= 0 then + set_animation(self, "walk") + 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_velocity({x = 0, y = -5, z = 0}) + + set_animation(self, "stand") + + return + elseif self.state == "flop" then + self.state = "stand" + 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 + + +-- execute current state (stand, walk, run, attacks) +local do_states = function(self, dtime) + + local yaw = self.object:get_yaw() or 0 + + if self.state == "stand" then + + if random(1, 4) == 1 then + + local lp = nil + local s = self.object:get_pos() + local objs = minetest.get_objects_inside_radius(s, 3) + + 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 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") + + -- mobs ordered to stand stay standing + if self.order ~= "stand" + and self.walk_chance ~= 0 + and self.facing_fence ~= true + and random(1, 100) <= self.walk_chance + and is_at_cliff(self) == false then + + set_velocity(self, self.walk_velocity) + self.state = "walk" + set_animation(self, "walk") + end + + 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 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"}) + end + + if lp then + + -- if mob in water or lava then look for land + if (self.lava_damage + and minetest.registered_nodes[self.standing_in].groups.lava) + or (self.water_damage + and minetest.registered_nodes[self.standing_in].groups.water) then + + lp = minetest.find_node_near(s, 5, {"group:soil", "group:stone", + "group:sand", node_ice, node_snowblock}) + + -- 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 jump/move in that direction + yaw = set_yaw(self, yaw, 6) + do_jump(self) + set_velocity(self, self.walk_velocity) + else + yaw = yaw + random(-0.5, 0.5) + end + + else + + 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 + 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 in front + local temp_is_cliff = is_at_cliff(self) + + if self.facing_fence == true + or temp_is_cliff + or random(1, 100) <= 30 then + + set_velocity(self, 0) + self.state = "stand" + set_animation(self, "stand") + 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(self) + or self.order == "stand" then + self.runaway_timer = 0 + set_velocity(self, 0) + self.state = "stand" + set_animation(self, "stand") + else + set_velocity(self, self.run_velocity) + set_animation(self, "walk") + end + + -- attack routines (explode, dogfight, shoot, dogshoot) + elseif self.state == "attack" then + + -- calculate distance from mob and enemy + local s = self.object:get_pos() + local p = self.attack:get_pos() or s + local dist = get_distance(p, s) + + -- stop attacking if player invisible or out of range + if dist > self.view_range + or not self.attack + or not self.attack:get_pos() + or self.attack:get_hp() <= 0 + or (self.attack:is_player() and mobs.invis[ self.attack:get_player_name() ]) then + +-- print(" ** stop attacking **", dist, self.view_range) + 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 + + 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) + + 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, self.sounds.fuse) +-- print ("=== explosion timer started", self.explosion_timer) + + -- stop timer if out of reach or direct line of sight + elseif self.allow_fuse_reset + and self.v_start + and (dist > self.reach + or not line_of_sight(self, s, p, 2)) then + self.v_start = false + self.timer = 0 + self.blinktimer = 0 + self.blinkstatus = false + self.object:settexturemod("") + end + + -- walk right up to player unless the timer is active + if self.v_start and (self.stop_to_explode or dist < 1.5) 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 + self.object:settexturemod("") + else + self.object:settexturemod("^[brighten") + end + + self.blinkstatus = not self.blinkstatus + end + +-- print ("=== explosion timer", self.timer) + + if self.timer > self.explosion_timer then + + local pos = self.object:get_pos() + + -- dont damage anything if area protected or next to water + if minetest.find_node_near(pos, 1, {"group:water"}) + or minetest.is_protected(pos, "") then + + node_break_radius = 1 + end + + self.object:remove() + + if minetest.get_modpath("tnt") and tnt and tnt.boom + and not minetest.is_protected(pos, "") then + + tnt.boom(pos, { + radius = node_break_radius, + damage_radius = entity_damage_radius, + sound = self.sounds.explode, + }) + else + + minetest.sound_play(self.sounds.explode, { + pos = pos, + gain = 1.0, + max_hear_distance = self.sounds.distance or 32 + }) + + entity_physics(pos, entity_damage_radius) + effect(pos, 32, "tnt_smoke.png", nil, nil, node_break_radius, 1, 0) + end + + return + 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) + + -- 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(self) then + + set_velocity(self, 0) + set_animation(self, "stand") + 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, self.sounds.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 = get_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) + + set_velocity(self, 0) + + if self.shoot_interval + and self.timer > self.shoot_interval + and random(1, 100) <= 60 then + + self.timer = 0 + set_animation(self, "shoot") + + -- play shoot attack sound + mob_sound(self, self.sounds.shoot_attack) + + local p = self.object:get_pos() + + p.y = p.y + (self.collisionbox[2] + self.collisionbox[5]) / 2 + + if minetest.registered_entities[self.arrow] then + + local obj = minetest.add_entity(p, self.arrow) + local ent = obj:get_luaentity() + local amount = (vec.x * vec.x + vec.y * vec.y + vec.z * vec.z) ^ 0.5 + local v = ent.velocity or 1 -- or set to default + + ent.switch = 1 + ent.owner_id = tostring(self.object) -- add unique owner id to arrow + + -- 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) + + obj:set_velocity(vec) + end + end + end + end +end + + +-- falling and fall damage +local falling = function(self, pos) + + if self.fly then + return + 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 + + -- in water then float up + if self.standing_in + and minetest.registered_nodes[self.standing_in].groups.water then + + if self.floats == 1 then + + self.object:set_acceleration({ + x = 0, + y = -self.fall_speed / (max(1, v.y) ^ 8), -- 8 was 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 + + self.health = self.health - floor(d - 5) + + effect(pos, 5, "tnt_smoke.png", 1, 2, 2, nil) + + if check_for_death(self, {type = "fall"}) then + return + end + end + + self.old_y = self.object:get_pos().y + end + end +end + + +-- is Took Ranks mod active? +local tr = minetest.get_modpath("toolranks") + +-- deal damage and effects when mob punched +local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) + + -- mob health check + if self.health <= 0 then + return + end + + -- custom punch function + if self.do_punch + and self.do_punch(self, hitter, tflp, tool_capabilities, dir) == false then + return + 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 + + -- is mob protected? + if self.protected and hitter:is_player() + and minetest.is_protected(self.object:get_pos(), hitter:get_player_name()) then + minetest.chat_send_player(hitter:get_player_name(), S("Mob has been protected!")) + return + end + + local weapon = hitter:get_wielded_item() + local weapon_def = weapon:get_definition() or {} + local punch_interval = 1.4 + + -- 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 + + if use_cmi then + damage = cmi.calculate_damage(self.object, hitter, tflp, tool_capabilities, dir) + else + + 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 + end + + -- check for tool immunity or special damage + for n = 1, #self.immune_to do + + if self.immune_to[n][1] == weapon_def.name then + + damage = self.immune_to[n][2] or 0 + break + + -- if "all" then no tool does damage unless it's specified in list + elseif self.immune_to[n][1] == "all" then + damage = self.immune_to[n][2] or 0 + end + end + + -- healing + if damage <= -1 then + self.health = self.health - floor(damage) + return + end + +-- print ("Mob Damage is", damage) + + if use_cmi + and cmi.notify_punch(self.object, hitter, tflp, tool_capabilities, dir, damage) then + return + end + + -- add weapon wear + punch_interval = tool_capabilities.full_punch_interval or 1.4 + + -- toolrank support + local wear = floor((punch_interval / 75) * 9000) + + if mobs.is_creative(hitter:get_player_name()) then + + if tr then + wear = 1 + else + wear = 0 + end + end + + if tr then + if weapon_def.original_description then + weapon:add_wear(toolranks.new_afteruse(weapon, hitter, nil, {wear = wear})) + end + else + weapon:add_wear(wear) + end + + hitter:set_wielded_item(weapon) + + -- only play hit sound and show blood effects if damage is 1 or over + if damage >= 1 then + + -- weapon sounds + if weapon_def.sounds then + + local s = random(0, #weapon_def.sounds) + + minetest.sound_play(weapon_def.sounds[s], { + object = self.object, + max_hear_distance = 8 + }) + else + minetest.sound_play("default_punch", { + object = self.object, + max_hear_distance = 5 + }) + end + + -- blood_particles + if not disable_blood and self.blood_amount > 0 then + + local pos = self.object:get_pos() + + pos.y = pos.y + (-self.collisionbox[2] + self.collisionbox[5]) * .5 + + -- do we have a single blood texture or multiple? + if type(self.blood_texture) == "table" then + + local blood = self.blood_texture[random(1, #self.blood_texture)] + + effect(pos, self.blood_amount, blood, nil, nil, 1, nil) + else + effect(pos, self.blood_amount, self.blood_texture, nil, nil, 1, nil) + end + end + + -- do damage + self.health = self.health - floor(damage) + + -- exit here if dead, check for tools with fire damage + local hot = tool_capabilities and tool_capabilities.damage_groups + and tool_capabilities.damage_groups.fire + + if check_for_death(self, {type = "punch", + puncher = hitter, hot = hot}) then + return + end + + --[[ add healthy afterglow when hit (can cause hit lag with larger textures) + minetest.after(0.1, function() + + if not self.object:get_luaentity() then return end + + self.object:settexturemod("^[colorize:#c9900070") + + core.after(0.3, function() + self.object:settexturemod("") + end) + end) ]] + + end -- END if damage + + -- knock back effect (only on full punch) + if self.knock_back + and tflp >= punch_interval then + + local v = self.object:get_velocity() + local kb = damage or 1 + 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} + + -- use tool knockback value or default + kb = tool_capabilities.damage_groups["knockback"] or (kb * 1.5) + + self.object:set_velocity({ + x = dir.x * kb, + y = up, + z = dir.z * kb + }) + + self.pause_timer = 0.25 + end + + -- if skittish then run away + if self.runaway == true + and self.order ~= "stand" 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 + and self.attack_players == true + and hitter:get_player_name() ~= self.owner + and not mobs.invis[ name ] then + + -- attack whoever punched mob + self.state = "" + do_attack(self, hitter) + + -- 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 and obj._cmi_is_mob then + + -- only alert members of same mob + if obj.group_attack == true + and obj.state ~= "attack" + and obj.owner ~= name + and obj.name == self.name then + do_attack(obj, hitter) + 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 + + +-- get entity staticdata +local mob_staticdata = function(self) + + -- remove mob when out of range unless tamed + if remove_far + and self.remove_ok + and self.type ~= "npc" + and self.state ~= "attack" + and not self.tamed + and self.lifetimer < 20000 then + + --print ("REMOVED " .. self.name) + + self.object:remove() + + return ""-- nil + end + + self.remove_ok = true + self.attack = nil + self.following = nil + self.state = "stand" + + -- used to rotate older mobs + if self.drawtype + and self.drawtype == "side" then + self.rotate = math.rad(90) + end + + if use_cmi then + self.serialized_cmi_components = cmi.serialize_components(self._cmi_components) + end + + local tmp = {} + + for _,stat in pairs(self) do + + local t = type(stat) + + if t ~= "function" + and t ~= "nil" + and t ~= "userdata" + and _ ~= "_cmi_components" then + tmp[_] = self[_] + end + end + + --print('===== '..self.name..'\n'.. dump(tmp)..'\n=====\n') + 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 peaceful_only then + + 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 def.textures and type(def.textures[1]) == "string" then + def.textures = {def.textures} + end + + self.base_texture = def.textures and 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 + + -- 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 + + -- mob defaults + self.object:set_armor_groups({immortal = 1, fleshy = self.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 = "air" + + -- 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 + + if use_cmi then + self._cmi_components = cmi.activate_components(self.serialized_cmi_components) + cmi.notify_activate(self.object, dtime) + end +end + + +-- handle mob lifetimer and expiration +local mob_expire = function(self, pos, dtime) + + -- when lifetimer expires remove mob (except npc and tamed) + if self.type ~= "npc" + and not self.tamed + and self.state ~= "attack" + and remove_far ~= true + and self.lifetimer < 20000 then + + self.lifetimer = self.lifetimer - dtime + + if self.lifetimer <= 0 then + + -- only despawn away from player + local objs = minetest.get_objects_inside_radius(pos, 15) + + for n = 1, #objs do + + if objs[n]:is_player() then + + self.lifetimer = 20 + + return + end + end + +-- minetest.log("action", +-- S("lifetimer expired, removed @1", self.name)) + + effect(pos, 15, "tnt_smoke.png", 2, 4, 2, 0) + + self.object:remove() + + return + end + end +end + + +-- main mob function +local mob_step = function(self, dtime) + + if use_cmi then + cmi.notify_step(self.object, dtime) + end + + local pos = self.object:get_pos() + local yaw = 0 + + -- get node at foot level every quarter second + self.node_timer = (self.node_timer or 0) + dtime + + if self.node_timer > 0.25 then + + self.node_timer = 0 + + local y_level = self.collisionbox[2] + + if self.child then + y_level = self.collisionbox[2] * 0.5 + end + + -- what is mob standing in? + self.standing_in = node_ok({ + x = pos.x, y = pos.y + y_level + 0.25, z = pos.z}, "air").name +-- print ("standing in " .. self.standing_in) + + -- check for mob expiration (0.25 instead of dtime since were in a timer) + mob_expire(self, pos, 0.25) + end + + -- check if falling, flying, floating + falling(self, pos) + + -- smooth rotation by ThomasMonroe314 + + if self.delay and self.delay > 0 then + + local yaw = self.object:get_yaw() + + 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 + self.object:set_yaw(yaw) + end + + -- end rotation + + -- knockback timer + if self.pause_timer > 0 then + + self.pause_timer = self.pause_timer - dtime + + return + end + + -- 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 + + -- attack timer + self.timer = self.timer + dtime + + if self.state ~= "attack" 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, 100) == 1 then + mob_sound(self, self.sounds.random) + 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 + + self.env_damage_timer = 0 + + -- check for environmental damage (water, fire, lava etc.) + do_env_damage(self) + + -- node replace check (cow eats grass etc.) + replace(self, pos) + end + + general_attack(self) + + breed(self) + + follow_flop(self) + + do_states(self, dtime) + + do_jump(self) + + runaway_from(self) + +end + + +-- default function when mobs are blown up with TNT +local do_tnt = function(obj, damage) + + --print ("----- Damage", damage) + + obj.object:punch(obj.object, 1.0, { + full_punch_interval = 1.0, + damage_groups = {fleshy = damage}, + }, nil) + + return false, true, {} +end + + +mobs.spawning_mobs = {} + +-- register mob entity +function mobs:register_mob(name, def) + + mobs.spawning_mobs[name] = true + +minetest.register_entity(name, { + + stepheight = def.stepheight or 1.1, -- was 0.6 + name = name, + type = def.type, + attack_type = def.attack_type, + fly = def.fly, + fly_in = def.fly_in or "air", + owner = def.owner or "", + order = def.order or "", + on_die = def.on_die, + do_custom = def.do_custom, + jump_height = def.jump_height or 4, -- was 6 + drawtype = def.drawtype, -- DEPRECATED, use rotate instead + rotate = math.rad(def.rotate or 0), -- 0=front, 90=side, 180=back, 270=side2 + lifetimer = def.lifetimer or 180, -- 3 minutes + hp_min = max(1, (def.hp_min or 5) * difficulty), + hp_max = max(1, (def.hp_max or 10) * difficulty), + physical = true, + collisionbox = def.collisionbox or {-0.25, -0.25, -0.25, 0.25, 0.25, 0.25}, + 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 5, + walk_velocity = def.walk_velocity or 1, + run_velocity = def.run_velocity or 2, + damage = max(0, (def.damage or 0) * difficulty), + light_damage = def.light_damage or 0, + light_damage_min = def.light_damage_min or 14, + light_damage_max = def.light_damage_max or 15, + water_damage = def.water_damage or 0, + lava_damage = def.lava_damage or 0, + suffocation = def.suffocation or 2, + fall_damage = def.fall_damage or 1, + fall_speed = def.fall_speed or -10, -- must be lower than -2 (default: -10) + drops = def.drops or {}, + armor = def.armor or 100, + on_rightclick = def.on_rightclick, + arrow = def.arrow, + shoot_interval = def.shoot_interval, + sounds = def.sounds or {}, + animation = def.animation, + follow = def.follow, + jump = def.jump ~= false, + walk_chance = def.walk_chance or 50, + passive = def.passive or false, + knock_back = def.knock_back ~= false, + blood_amount = def.blood_amount or 5, + blood_texture = def.blood_texture or "mobs_blood.png", + shoot_offset = def.shoot_offset or 0, + floats = def.floats or 1, -- floats in water by default + 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, -- only used when state = "attack" + tamed = false, + pause_timer = 0, + horny = false, + hornytimer = 0, + child = false, + 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, + explosion_damage_radius = def.explosion_damage_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), + group_attack = def.group_attack or false, + attack_monsters = def.attacks_monsters or def.attack_monsters or false, + attack_animals = def.attack_animals or false, + attack_players = def.attack_players ~= false, + attack_npcs = def.attack_npcs ~= false, + specific_attack = def.specific_attack, + runaway_from = def.runaway_from, + owner_loyal = def.owner_loyal, + facing_fence = false, + pushable = def.pushable, + _cmi_is_mob = true, + + 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_activate = function(self, staticdata, dtime) + return mob_activate(self, staticdata, def, dtime) + end, + + get_staticdata = function(self) + return mob_staticdata(self) + end, + +}) + +end -- END mobs:register_mob function + + +-- count how many mobs of one type are inside an area +local count_mobs = function(pos, type) + + local num_type = 0 + local num_total = 0 + local objs = minetest.get_objects_inside_radius(pos, aoc_range) + + for n = 1, #objs do + + if not objs[n]:is_player() then + + local obj = objs[n]:get_luaentity() + + -- count mob type and add to total also + if obj and obj.name and obj.name == type then + + num_type = num_type + 1 + num_total = num_total + 1 + + -- add to total mobs + elseif obj and obj.name and obj.health ~= nil then + + num_total = num_total + 1 + end + end + end + + return num_type, num_total +end + + +-- global functions + +function mobs:spawn_abm_check(pos, node, name) + -- global function to add additional spawn checks + -- return true to stop spawning mob +end + + +function mobs:spawn_specific(name, nodes, neighbors, 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("[mobs] %s has spawning disabled", name)) + return + end + + minetest.log("action", + string.format("[mobs] Chance setting for %s changed to %s (total: %s)", name, chance, aoc)) + + end + + minetest.register_abm({ + + label = name .. " spawning", + nodenames = nodes, + neighbors = neighbors, + interval = interval, + chance = max(1, (chance * mob_chance_multiplier)), + catch_up = false, + + action = function(pos, node, active_object_count, active_object_count_wider) + + -- is mob actually registered? + if not mobs.spawning_mobs[name] + or not minetest.registered_entities[name] then +--print ("--- mob doesn't exist", name) + return + end + + -- additional custom checks for spawning mob + if mobs:spawn_abm_check(pos, node, name) == true then + return + end + + -- do not spawn if too many of same mob in area + if active_object_count_wider >= max_per_block + or count_mobs(pos, name) >= aoc then +--print ("--- too many entities", name, aoc, active_object_count_wider) + return + end + + -- if toggle set to nil then ignore day/night check + if day_toggle ~= nil then + + local tod = (minetest.get_timeofday() or 0) * 24000 + + if tod > 4500 and tod < 19500 then + -- daylight, but mob wants night + if day_toggle == false then +--print ("--- mob needs night", name) + return + end + else + -- night time but mob wants day + if day_toggle == true then +--print ("--- mob needs day", name) + return + end + end + end + + -- spawn above node + pos.y = pos.y + 1 + + -- are we spawning within height limits? + if pos.y > max_height + or pos.y < min_height then +--print ("--- height limits not met", name, pos.y) + return + end + + -- are light levels ok? + local light = minetest.get_node_light(pos) + if not light + or light > max_light + or light < min_light then +--print ("--- light limits not met", name, light) + return + end + + -- only spawn away from player + local objs = minetest.get_objects_inside_radius(pos, 10) + + for n = 1, #objs do + + if objs[n]:is_player() then +--print ("--- player too close", name) + return + end + end + + -- do we have enough height clearance to spawn mob? + local ent = minetest.registered_entities[name] + local height = max(0, math.ceil(ent.collisionbox[5] - ent.collisionbox[2]) - 1) + + for n = 0, height do + + local pos2 = {x = pos.x, y = pos.y + n, z = pos.z} + + if minetest.registered_nodes[node_ok(pos2).name].walkable == true then +--print ("--- inside block", name, node_ok(pos2).name) + return + end + end + + -- mobs cannot spawn in protected areas when enabled + if not spawn_protected + and minetest.is_protected(pos, "") then +--print ("--- inside protected area", name) + return + end + + -- spawn mob half block higher than ground + pos.y = pos.y + 0.5 + + local mob = minetest.add_entity(pos, name) +--[[ + print ("[mobs] Spawned " .. name .. " at " + .. minetest.pos_to_string(pos) .. " on " + .. node.name .. " near " .. neighbors[1]) +]] + if on_spawn then + + local ent = mob:get_luaentity() + + on_spawn(ent, pos) + end + end + }) +end + + +-- compatibility with older mob registration +function mobs:register_spawn(name, nodes, max_light, min_light, chance, + active_object_count, max_height, day_toggle) + + mobs:spawn_specific(name, nodes, {"air"}, min_light, max_light, 30, + chance, active_object_count, -31000, max_height, day_toggle) +end + + +-- MarkBu's spawn function +function mobs:spawn(def) + + mobs:spawn_specific( + def.name, + def.nodes or {"group:soil", "group:stone"}, + def.neighbors or {"air"}, + def.min_light or 0, + def.max_light or 15, + def.interval or 30, + def.chance or 5000, + def.active_object_count or 1, + def.min_height or -31000, + def.max_height or 31000, + def.day_toggle, + def.on_spawn + ) +end + + +-- register arrow for shoot attack +function 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, + drop = def.drop or false, -- drops arrow as registered item when true + collisionbox = def.collisionbox or {0, 0, 0, 0, 0, 0}, + timer = 0, + switch = 0, + owner_id = def.owner_id, + rotate = def.rotate, + automatic_face_movement_dir = def.rotate + and (def.rotate - (pi / 180)) or false, + + on_activate = def.on_activate, + + on_punch = def.on_punch or function(self, hitter, tflp, tool_capabilities, dir) + end, + + 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 then + + self.object:remove() ; -- print ("removed arrow") + + 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() ; -- print ("hit node") + + return + end + end + + if self.hit_player or self.hit_mob then + + for _,player in pairs(minetest.get_objects_inside_radius(pos, 1.0)) do + + if self.hit_player + and player:is_player() then + + self.hit_player(self, player) + self.object:remove() ; -- print ("hit player") + return + end + + local entity = player:get_luaentity() + + if entity + and self.hit_mob + and entity._cmi_is_mob == true + and tostring(player) ~= self.owner_id + and entity.name ~= self.object:get_luaentity().name then + + self.hit_mob(self, player) + + self.object:remove() ; --print ("hit mob") + + return + end + end + end + + self.lastpos = pos + end + }) +end + + +-- compatibility function +function mobs:explosion(pos, radius) + + local self = {sounds = {explode = "tnt_explode"}} + + mobs:boom(self, pos, radius) +end + + +-- no damage to nodes explosion +function mobs:safe_boom(self, pos, radius) + + 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 + }) + + entity_physics(pos, radius) + + effect(pos, 32, "tnt_smoke.png", radius * 3, radius * 5, radius, 1, 0) +end + + +-- make explosion with protection and tnt mod check +function mobs:boom(self, pos, radius) + + if mobs_griefing + and minetest.get_modpath("tnt") and tnt and tnt.boom + and not minetest.is_protected(pos, "") then + + tnt.boom(pos, { + radius = radius, + damage_radius = radius, + sound = self.sounds and self.sounds.explode, + explode_center = true, + }) + else + mobs:safe_boom(self, pos, radius) + end +end + + +-- Register spawn eggs + +-- Note: This also introduces the “spawn_egg” group: +-- * spawn_egg=1: Spawn egg (generic mob, no metadata) +-- * spawn_egg=2: Spawn egg (captured/tamed mob, metadata) +function mobs:register_egg(mob, desc, background, addegg, no_creative) + + local grp = {spawn_egg = 1} + + -- do NOT add this egg to creative inventory (e.g. dungeon master) + if creative and 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 new spawn egg containing mob information + minetest.register_craftitem(mob .. "_set", { + + description = S("@1 (Tamed)", desc), + inventory_image = invimg, + groups = {spawn_egg = 2, not_in_creative_inventory = 1}, + stack_max = 1, + + 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 not minetest.is_protected(pos, placer:get_player_name()) then + + if not minetest.registered_entities[mob] then + return + end + + pos.y = pos.y + 1 + + local data = itemstack:get_metadata() + local mob = minetest.add_entity(pos, mob, data) + local ent = mob:get_luaentity() + + -- set owner if not a monster + if ent.type ~= "monster" then + ent.owner = placer:get_player_name() + ent.tamed = true + end + + -- since mob is unique we remove egg once spawned + itemstack:take_item() + end + + return itemstack + end, + }) + + + -- register old stackable mob egg + minetest.register_craftitem(mob, { + + description = desc, + inventory_image = invimg, + groups = grp, + + 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 not minetest.is_protected(pos, placer:get_player_name()) then + + if not minetest.registered_entities[mob] then + return + end + + pos.y = pos.y + 1 + + local mob = minetest.add_entity(pos, mob) + 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 + + -- if not in creative then take item + if not mobs.is_creative(placer:get_player_name()) then + itemstack:take_item() + end + end + + return itemstack + end, + }) + +end + + +-- capture critter (thanks to blert2112 for idea) +function mobs:capture_mob(self, clicker, chance_hand, chance_net, chance_lasso, + force_take, replacewith) + + if self.child + or not clicker:is_player() + or not clicker:get_inventory() then + return false + end + + -- get name of clicked mob + local mobname = self.name + + -- if not nil change what will be added to inventory + if replacewith then + mobname = replacewith + end + + local name = clicker:get_player_name() + local tool = clicker:get_wielded_item() + + -- are we using hand, net or lasso to pick up mob? + if tool:get_name() ~= "" + and tool:get_name() ~= "mobs:net" + and tool:get_name() ~= "mobs:lasso" then + return false + end + + -- is mob tamed? + if self.tamed == false + and force_take == false then + + minetest.chat_send_player(name, S("Not tamed!")) + + return true -- false + end + + -- cannot pick up if not owner + if self.owner ~= name + and force_take == false then + + minetest.chat_send_player(name, S("@1 is owner!", self.owner)) + + return true -- false + end + + if clicker:get_inventory():room_for_item("main", mobname) then + + -- was mob clicked with hand, net, or lasso? + local chance = 0 + + if tool:get_name() == "" then + chance = chance_hand + + elseif tool:get_name() == "mobs:net" then + + chance = chance_net + + tool:add_wear(4000) -- 17 uses + + clicker:set_wielded_item(tool) + + elseif tool:get_name() == "mobs:lasso" then + + chance = chance_lasso + + tool:add_wear(650) -- 100 uses + + clicker:set_wielded_item(tool) + + end + + -- calculate chance.. add to inventory if successful? + if chance > 0 and random(1, 100) <= chance then + + -- default mob egg + local new_stack = ItemStack(mobname) + + -- add special mob egg with all mob information + -- unless 'replacewith' contains new item to use + if not replacewith then + + new_stack = ItemStack(mobname .. "_set") + + local tmp = {} + + for _,stat in pairs(self) do + local t = type(stat) + if t ~= "function" + and t ~= "nil" + and t ~= "userdata" then + tmp[_] = self[_] + end + end + + local data_str = minetest.serialize(tmp) + + new_stack:set_metadata(data_str) + end + + local inv = clicker:get_inventory() + + if inv:room_for_item("main", new_stack) then + inv:add_item("main", new_stack) + else + minetest.add_item(clicker:get_pos(), new_stack) + end + + self.object:remove() + + mob_sound(self, "default_place_node_hard") + + elseif chance ~= 0 then + minetest.chat_send_player(name, S("Missed!")) + + mob_sound(self, "mobs_swing") + end + end + + return true +end + + +-- protect tamed mob with rune item +function mobs:protect(self, clicker) + + local name = clicker:get_player_name() + local tool = clicker:get_wielded_item() + + if tool:get_name() ~= "mobs:protector" then + return false + end + + if self.tamed == false then + minetest.chat_send_player(name, S("Not tamed!")) + return true -- false + end + + if self.protected == true then + minetest.chat_send_player(name, S("Already protected!")) + return true -- false + end + + if not mobs.is_creative(clicker:get_player_name()) then + tool:take_item() -- take 1 protection rune + clicker:set_wielded_item(tool) + end + + self.protected = true + + local pos = self.object:get_pos() + pos.y = pos.y + self.collisionbox[2] + 0.5 + + effect(self.object:get_pos(), 25, "mobs_protect_particle.png", 0.5, 4, 2, 15) + + mob_sound(self, "mobs_spell") + + return true +end + + +local mob_obj = {} +local mob_sta = {} + +-- feeding, taming and breeding (thanks blert2112) +function 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 follow_holding(self, clicker) then + + -- if not in creative then take item + if not mobs.is_creative(clicker:get_player_name()) then + + local item = clicker:get_wielded_item() + + item:take_item() + + clicker:set_wielded_item(item) + end + + -- increase health + self.health = self.health + 4 + + if self.health >= self.hp_max then + + self.health = self.hp_max + + if self.htimer < 1 then + + minetest.chat_send_player(clicker:get_player_name(), + S("@1 at full health (@2)", + self.name:split(":")[2], tostring(self.health))) + + self.htimer = 5 + end + end + + self.object:set_hp(self.health) + + update_tag(self) + + -- make children grow quicker + if self.child == true then + + self.hornytimer = self.hornytimer + 20 + + 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 + + self.gotten = false + + if tame then + + if self.tamed == false then + minetest.chat_send_player(clicker:get_player_name(), + S("@1 has been tamed!", + self.name:split(":")[2])) + end + + 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, self.sounds.random) + end + + return true + end + + local item = clicker:get_wielded_item() + + -- if mob has been tamed you can name it with a nametag + if item:get_name() == "mobs:nametag" + and clicker:get_player_name() == self.owner then + + local name = clicker:get_player_name() + + -- store mob and nametag stack in external variables + mob_obj[name] = self + mob_sta[name] = item + + local tag = self.nametag or "" + + minetest.show_formspec(name, "mobs_nametag", "size[8,4]" + .. default.gui_bg + .. default.gui_bg_img + .. "field[0.5,1;7.5,0;name;" + .. minetest.formspec_escape(S("Enter name:")) .. ";" .. tag .. "]" + .. "button_exit[2.5,3.5;3,1;mob_rename;" + .. minetest.formspec_escape(S("Rename")) .. "]") + end + + return false +end + + +-- inspired by blockmen's nametag mod +minetest.register_on_player_receive_fields(function(player, formname, fields) + + -- right-clicked with nametag and name entered? + if formname == "mobs_nametag" + and fields.name + and fields.name ~= "" then + + local name = player:get_player_name() + + if not mob_obj[name] + or not mob_obj[name].object then + return + end + + -- make sure nametag is being used to name mob + local item = player:get_wielded_item() + + if item:get_name() ~= "mobs:nametag" then + return + end + + -- limit name entered to 64 characters long + if string.len(fields.name) > 64 then + fields.name = string.sub(fields.name, 1, 64) + end + + -- update nametag + mob_obj[name].nametag = fields.name + + update_tag(mob_obj[name]) + + -- if not in creative then take item + if not mobs.is_creative(name) then + + mob_sta[name]:take_item() + + player:set_wielded_item(mob_sta[name]) + end + + -- reset external variables + mob_obj[name] = nil + mob_sta[name] = nil + end +end) + + +-- compatibility function for old entities to new modpack entities +function 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_activate = function(self) + + if minetest.registered_entities[new_name] then + minetest.add_entity(self.object:get_pos(), new_name) + end + + self.object:remove() + end + }) +end diff --git a/mods/flora_fauna/mobs_redo/api.lua_testspawn b/mods/flora_fauna/mobs_redo/api.lua_testspawn new file mode 100644 index 0000000..471df35 --- /dev/null +++ b/mods/flora_fauna/mobs_redo/api.lua_testspawn @@ -0,0 +1,3985 @@ + +-- Mobs Api + +mobs = {} +mobs.mod = "redo" +mobs.version = "20180623" + + +-- Intllib +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP .. "/intllib.lua") +mobs.intllib = S + + +-- CMI support check +local use_cmi = minetest.global_exists("cmi") + + +-- Invisibility mod check +mobs.invis = {} +if minetest.global_exists("invisibility") then + mobs.invis = invisibility +end + + +-- creative check +local creative_mode_cache = minetest.settings:get_bool("creative_mode") +function mobs.is_creative(name) + return creative_mode_cache or minetest.check_player_privs(name, {creative = true}) +end + + +-- localize math functions +local pi = math.pi +local square = math.sqrt +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 + --error("atan bassed NaN") + return 0 + else + return atann(x) + end +end + + +-- Load settings +local damage_enabled = minetest.settings:get_bool("enable_damage") +local mobs_spawn = minetest.settings:get_bool("mobs_spawn") ~= false +local peaceful_only = minetest.settings:get_bool("only_peaceful_mobs") +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 creative = minetest.settings:get_bool("creative_mode") +local spawn_protected = minetest.settings:get_bool("mobs_spawn_protected") ~= false +local remove_far = minetest.settings:get_bool("remove_far_mobs") ~= false +local difficulty = tonumber(minetest.settings:get("mob_difficulty")) or 1.0 +local show_health = minetest.settings:get_bool("mob_show_health") ~= false +local max_per_block = tonumber(minetest.settings:get("max_objects_per_block") or 99) +local mob_chance_multiplier = tonumber(minetest.settings:get("mob_chance_multiplier") or 1) + +-- Peaceful mode message so players will know there are no monsters +if peaceful_only 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 + +-- calculate aoc range for mob count +local aosrb = tonumber(minetest.settings:get("active_object_send_range_blocks")) +local abr = tonumber(minetest.settings:get("active_block_range")) +local aoc_range = max(aosrb, abr) * 16 + +-- 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_fire = "fire:basic_flame" +local node_permanent_flame = "fire:permanent_flame" +local node_ice = "default:ice" +local node_snowblock = "default:snowblock" +local node_snow = "default:snow" +mobs.fallback_node = minetest.registered_aliases["mapgen_dirt"] or "default:dirt" + + +-- play sound +local mob_sound = function(self, sound) + + if sound then + minetest.sound_play(sound, { + object = self.object, + gain = 1.0, + max_hear_distance = self.sounds.distance + }) + end +end + + +-- attack player/mob +local do_attack = function(self, player) + + if self.state == "attack" then + return + end + + self.attack = player + self.state = "attack" + + if random(0, 100) < 90 then + mob_sound(self, self.sounds.war_cry) + end +end + + +-- move mob in facing direction +local set_velocity = function(self, v) + + -- do not move if mob has been ordered to stay + if self.order == "stand" then + self.object:setvelocity({x = 0, y = 0, z = 0}) + return + end + + local yaw = (self.object:get_yaw() or 0) + self.rotate + + self.object:setvelocity({ + x = sin(yaw) * -v, + y = self.object:getvelocity().y, + z = cos(yaw) * v + }) +end + + +-- calculate mob velocity +local get_velocity = function(self) + + local v = self.object:getvelocity() + + return (v.x * v.x + v.z * v.z) ^ 0.5 +end + + +-- set and return valid yaw +local set_yaw = function(self, yaw, delay) + + if not yaw or yaw ~= yaw then + yaw = 0 + end + + delay = delay or 0 + + if delay == 0 then + self.object:set_yaw(yaw) + return yaw + end + + self.target_yaw = yaw + self.delay = delay + + return self.target_yaw +end + +-- global function to set mob yaw +function mobs:yaw(self, yaw, delay) + set_yaw(self, yaw, delay) +end + + +-- set defined animation +local set_animation = function(self, anim) + + if not self.animation + or not anim then return 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"] then + return + end + + self.animation.current = anim + + self.object:set_animation({ + x = self.animation[anim .. "_start"], + y = self.animation[anim .. "_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 mobs:set_animation(self, anim) + set_animation(self, anim) +end + + +-- calculate distance +local get_distance = function(a, b) + + local x, y, z = a.x - b.x, a.y - b.y, a.z - b.z + + return square(x * x + y * y + z * z) +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 = get_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 + or minetest.registered_nodes[nn].drawtype == "nodebox") 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 = get_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 + + +-- are we flying in what we are suppose to? (taikedz) +local flight_check = function(self, pos_w) + + local def = minetest.registered_nodes[self.standing_in] + + if not def then return false end -- nil check + + if type(self.fly_in) == "string" + and self.standing_in == self.fly_in then + + return true + + elseif type(self.fly_in) == "table" then + + for _,fly_in in pairs(self.fly_in) do + + if self.standing_in == fly_in then + + return true + end + end + end + + -- stops mobs getting stuck inside stairs and plantlike nodes + if def.drawtype ~= "airlike" + and def.drawtype ~= "liquid" + and def.drawtype ~= "flowingliquid" then + return true + end + + return false +end + + +-- custom particle effects +local effect = function(pos, amount, texture, min_size, max_size, radius, gravity, glow) + + 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 + + minetest.add_particlespawner({ + amount = amount, + time = 0.25, + minpos = pos, + maxpos = pos, + minvel = {x = -radius, y = -radius, 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 + + +-- update nametag colour +local update_tag = function(self) + + local col = "#00FF00" + local qua = self.hp_max / 4 + + if self.health <= floor(qua * 3) then + col = "#FFFF00" + end + + if self.health <= floor(qua * 2) then + col = "#FF6600" + end + + if self.health <= floor(qua) then + col = "#FF0000" + end + + self.object:set_properties({ + nametag = self.nametag, + nametag_color = col + }) + +end + + +-- drop items +local item_drop = function(self, cooked) + + -- no drops if disabled by setting + if not mobs_drop_items then return end + + -- no drops for child mobs + if self.child 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 + + if random(1, self.drops[n].chance) == 1 then + + num = random(self.drops[n].min or 1, self.drops[n].max or 1) + item = self.drops[n].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 + obj = minetest.add_item(pos, ItemStack(item .. " " .. num)) + + if obj and obj:get_luaentity() then + + obj:setvelocity({ + 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) + + -- has health actually changed? + if self.health == self.old_health and self.health > 0 then + return + end + + self.old_health = self.health + + -- still got some health? play hurt sound + if self.health > 0 then + + mob_sound(self, self.sounds.damage) + + -- make sure health isn't higher than max + if self.health > self.hp_max then + self.health = self.hp_max + 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 + + -- dropped cooked item if mob died in lava + if cause == "lava" then + item_drop(self, true) + else + item_drop(self, nil) + end + + mob_sound(self, self.sounds.death) + + local pos = self.object:get_pos() + + -- execute custom death function + if self.on_die then + + self.on_die(self, pos) + + if use_cmi then + cmi.notify_die(self.object, cmi_cause) + end + + self.object:remove() + + return true + end + + -- default death function and die animation (if defined) + if 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 + local length = max(frames / speed, 0) + + self.attack = nil + self.v_start = false + self.timer = 0 + self.blinktimer = 0 + self.passive = true + self.state = "die" + set_velocity(self, 0) + set_animation(self, "die") + + minetest.after(length, function(self) + + if use_cmi and self.object:get_luaentity() then + cmi.notify_die(self.object, cmi_cause) + end + + self.object:remove() + end, self) + else + + if use_cmi then + cmi.notify_die(self.object, cmi_cause) + end + + self.object:remove() + end + + effect(pos, 20, "tnt_smoke.png") + + return true +end + + +-- check if within physical map limits (-30911 to 30927) +local within_limits = function(pos, radius) + + if (pos.x - radius) > -30913 + and (pos.x + radius) < 30928 + and (pos.y - radius) > -30913 + and (pos.y + radius) < 30928 + and (pos.z - radius) > -30913 + and (pos.z + radius) < 30928 then + return true -- within limits + end + + return false -- beyond limits +end + + +-- is mob facing a cliff +local is_at_cliff = function(self) + + if self.fear_height == 0 then -- 0 for no falling protection! + 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 + + if 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} + , 1) then + + return true + end + + return false +end + + +-- get node but use fallback for nil or unknown +local node_ok = function(pos, fallback) + + fallback = fallback or mobs.fallback_node + + local node = minetest.get_node_or_nil(pos) + + if node and minetest.registered_nodes[node.name] then + return node + end + + return minetest.registered_nodes[fallback] +end + + +-- 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 + self.object:remove() + return + end + + -- bright light harms mob + if self.light_damage ~= 0 +-- and pos.y > 0 +-- and self.time_of_day > 0.2 +-- and self.time_of_day < 0.8 + and (minetest.get_node_light(pos) or 0) > 12 then + + self.health = self.health - self.light_damage + + effect(pos, 5, "tnt_smoke.png") + + if check_for_death(self, "light", {type = "light"}) then return 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 + self.standing_in = node_ok(pos, "air").name +-- print ("standing in " .. self.standing_in) +]] + -- don't fall when on ignore, just stand still + if self.standing_in == "ignore" then + self.object:setvelocity({x = 0, y = 0, z = 0}) + end + + local nodef = minetest.registered_nodes[self.standing_in] + + pos.y = pos.y + 1 -- for particle effect position + + -- water + if self.water_damage + and nodef.groups.water then + + if self.water_damage ~= 0 then + + self.health = self.health - self.water_damage + + effect(pos, 5, "bubble.png", nil, nil, 1, nil) + + if check_for_death(self, "water", {type = "environment", + pos = pos, node = self.standing_in}) then return end + end + + -- lava or fire + elseif self.lava_damage + and (nodef.groups.lava + or self.standing_in == node_fire + or self.standing_in == node_permanent_flame) 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 end + end + + -- damage_per_second node check + elseif nodef.damage_per_second ~= 0 then + + self.health = self.health - nodef.damage_per_second + + effect(pos, 5, "tnt_smoke.png") + + if check_for_death(self, "dps", {type = "environment", + pos = pos, node = self.standing_in}) then return end + end +--[[ + --- suffocation inside solid node + if self.suffocation ~= 0 + and nodef.walkable == true + and nodef.groups.disable_suffocation ~= 1 + and nodef.drawtype == "normal" then + + self.health = self.health - self.suffocation + + if check_for_death(self, "suffocation", {type = "environment", + pos = pos, node = self.standing_in}) then return end + end +]] + 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 + 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:getvelocity().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) + +--print ("standing on:", nod.name, pos.y) + + 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? + local nod = node_ok({ + x = pos.x + dir_x, + y = pos.y + 0.5, + z = pos.z + dir_z + }) + + -- thin blocks that do not need to be jumped + if nod.name == node_snow then + return false + end + +--print ("in front:", nod.name, pos.y + 0.5) + + if self.walk_chance == 0 + or minetest.registered_items[nod.name].walkable then + + if not nod.name:find("fence") + and not nod.name:find("gate") then + + local v = self.object:getvelocity() + + v.y = self.jump_height + + set_animation(self, "jump") -- only when defined + + self.object:setvelocity(v) + + -- when in air move forward + minetest.after(0.3, function(self, v) + + if self.object:get_luaentity() then + + self.object:set_acceleration({ + x = v.x * 2,--1.5, + y = 0, + z = v.z * 2,--1.5 + }) + end + end, self, v) + + if get_velocity(self) > 0 then + mob_sound(self, self.sounds.jump) + end + else + self.facing_fence = true + end + + return true + end + + return false +end + + +-- blast damage to entities nearby (modified from TNT mod) +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 = get_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 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 240 seconds before growing into adult + if self.child == true then + + self.hornytimer = self.hornytimer + 1 + + if self.hornytimer > 240 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:setvelocity({ + x = 0, + y = self.jump_height, + z = 0 + }) + end + end + + return + end + + -- horny animal can mate for 40 seconds, + -- afterwards horny animal cannot mate again for 200 seconds + if self.horny == true + and self.hornytimer < 240 then + + self.hornytimer = self.hornytimer + 1 + + if self.hornytimer >= 240 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 <= 40 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 <= 40 then + num = num + 1 + end + + -- found your mate? then have a baby + if num > 1 then + + self.hornytimer = 41 + ent.hornytimer = 41 + + -- spawn baby + minetest.after(5, function(self, ent) + + if not self.object:get_luaentity() then + return + end + + -- custom breed function + if self.on_breed then + + -- when false skip going any further + if self.on_breed(self, ent) == false then + return + end + else + effect(pos, 15, "tnt_smoke.png", 1, 2, 2, 15, 5) + end + + local mob = minetest.add_entity(pos, self.name) + local ent2 = mob:get_luaentity() + local textures = self.base_texture + + -- using specific child texture (if found) + if self.child_texture then + textures = self.child_texture[1] + end + + -- and resize to half height + mob:set_properties({ + textures = textures, + visual_size = { + x = self.base_size.x * .5, + y = self.base_size.y * .5, + }, + collisionbox = { + 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, + }, + selectionbox = { + 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, + }, + }) + -- tamed and owned by parents' owner + ent2.child = true + ent2.tamed = true + ent2.owner = self.owner + end, self, ent) + + 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 mobs_griefing + or not self.replace_rate + or not self.replace_what + or self.child == true + or self.object:getvelocity().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 + + if #minetest.find_nodes_in_area(pos, pos, what) > 0 then + +-- print ("replace node = ".. minetest.get_node(pos).name, pos.y) + + local oldnode = {name = what} + local newnode = {name = with} + 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 + + minetest.set_node(pos, {name = with}) + + -- when cow/sheep eats grass, replace wool and milk + if self.gotten == true then + self.gotten = false + self.object:set_properties(self) + 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 self.object:get_luaentity() then + + if has_lineofsight then + self.path.following = false + end + 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 self.object:get_luaentity() then + + if has_lineofsight then + self.path.following = false + end + 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 self.object:get_luaentity() then + + if has_lineofsight then + self.path.following = false + end + 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.y = floor(s.y + 0.5) - sheight + 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 = 6 + if self.fear_height ~= 0 then dropheight = self.fear_height end + + self.path.way = minetest.find_path(s, p1, 16, self.stepheight, dropheight, "Dijkstra") +--[[ + -- show path using particles + if self.path.way and #self.path.way > 0 then + print ("-- path length:" .. tonumber(#self.path.way)) + for _,pos in pairs(self.path.way) do + minetest.add_particle({ + pos = pos, + velocity = {x=0, y=0, z=0}, + acceleration = {x=0, y=0, z=0}, + expirationtime = 1, + size = 4, + collisiondetection = false, + vertical = false, + texture = "heart.png", + }) + end + end +]] + + 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 = 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:setpos({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 second + self.path.stuck_timer = stuck_timeout - 2 + + -- frustration! cant find the damn path :( + mob_sound(self, self.sounds.random) + else + -- yay i found path + mob_sound(self, self.sounds.war_cry) + 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 creative + 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 mobs.invis[ objs[n]:get_player_name() ] 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 = get_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, dist + 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 + + dist = get_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 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 mobs.invis[ objs[n]:get_player_name() ] + or self.owner == objs[n]:get_player_name() 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 = get_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.state ~= "runaway" then + + local s = self.object:get_pos() + local players = minetest.get_connected_players() + + for n = 1, #players do + + if get_distance(players[n]:get_pos(), s) < self.view_range + and not 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.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 + if self.following + and self.following:is_player() + and follow_holding(self, self.following) == false 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 = get_distance(p, s) + + -- dont follow if out of range + if dist > self.view_range 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 + + yaw = set_yaw(self, yaw, 6) + + -- anyone but standing npc's can move along + if dist > self.reach + and self.order ~= "stand" then + + set_velocity(self, self.walk_velocity) + + if self.walk_chance ~= 0 then + set_animation(self, "walk") + 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:setvelocity({x = 0, y = -5, z = 0}) + + set_animation(self, "stand") + + return + elseif self.state == "flop" then + self.state = "stand" + 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 + + +-- execute current state (stand, walk, run, attacks) +local do_states = function(self, dtime) + + local yaw = self.object:get_yaw() or 0 + + if self.state == "stand" then + + if random(1, 4) == 1 then + + local lp = nil + local s = self.object:get_pos() + local objs = minetest.get_objects_inside_radius(s, 3) + + 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 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(self) == false then + + set_velocity(self, self.walk_velocity) + self.state = "walk" + set_animation(self, "walk") + + --[[ fly up/down randomly for flying mobs + if self.fly and random(1, 100) <= self.walk_chance then + + local v = self.object:getvelocity() + local ud = random(-1, 2) / 9 + + self.object:setvelocity({x = v.x, y = ud, z = v.z}) + end--]] + end + end + + 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 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"}) + end + + if lp then + + -- if mob in water or lava then look for land + if (self.lava_damage + and minetest.registered_nodes[self.standing_in].groups.lava) + or (self.water_damage + and minetest.registered_nodes[self.standing_in].groups.water) then + + lp = minetest.find_node_near(s, 5, {"group:soil", "group:stone", + "group:sand", node_ice, node_snowblock}) + + -- 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 jump/move in that direction + yaw = set_yaw(self, yaw, 6) + do_jump(self) + set_velocity(self, self.walk_velocity) + else + yaw = yaw + random(-0.5, 0.5) + end + + else + + 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 + 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 in front + local temp_is_cliff = is_at_cliff(self) + + if self.facing_fence == true + or temp_is_cliff + or random(1, 100) <= 30 then + + set_velocity(self, 0) + self.state = "stand" + set_animation(self, "stand") + 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(self) then + self.runaway_timer = 0 + set_velocity(self, 0) + self.state = "stand" + set_animation(self, "stand") + else + set_velocity(self, self.run_velocity) + set_animation(self, "walk") + end + + -- attack routines (explode, dogfight, shoot, dogshoot) + elseif self.state == "attack" then + + -- calculate distance from mob and enemy + local s = self.object:get_pos() + local p = self.attack:get_pos() or s + local dist = get_distance(p, s) + + -- stop attacking if player invisible or out of range + if dist > self.view_range + or not self.attack + or not self.attack:get_pos() + or self.attack:get_hp() <= 0 + or (self.attack:is_player() and mobs.invis[ self.attack:get_player_name() ]) then + +-- print(" ** stop attacking **", dist, self.view_range) + 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 + + 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) + + 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, self.sounds.fuse) +-- print ("=== explosion timer started", self.explosion_timer) + + -- stop timer if out of reach or direct line of sight + elseif self.allow_fuse_reset + and self.v_start + and (dist > self.reach + or not line_of_sight(self, s, p, 2)) then + self.v_start = false + self.timer = 0 + self.blinktimer = 0 + self.blinkstatus = false + self.object:settexturemod("") + end + + -- walk right up to player unless the timer is active + if self.v_start and (self.stop_to_explode or dist < 1.5) 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 + self.object:settexturemod("") + else + self.object:settexturemod("^[brighten") + end + + self.blinkstatus = not self.blinkstatus + end + +-- print ("=== explosion timer", self.timer) + + if self.timer > self.explosion_timer then + + local pos = self.object:get_pos() + + -- dont damage anything if area protected or next to water + if minetest.find_node_near(pos, 1, {"group:water"}) + or minetest.is_protected(pos, "") then + + node_break_radius = 1 + end + + self.object:remove() + + if minetest.get_modpath("tnt") and tnt and tnt.boom + and not minetest.is_protected(pos, "") then + + tnt.boom(pos, { + radius = node_break_radius, + damage_radius = entity_damage_radius, + sound = self.sounds.explode, + }) + else + + minetest.sound_play(self.sounds.explode, { + pos = pos, + gain = 1.0, + max_hear_distance = self.sounds.distance or 32 + }) + + entity_physics(pos, entity_damage_radius) + effect(pos, 32, "tnt_smoke.png", nil, nil, node_break_radius, 1, 0) + end + + return + 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:getvelocity() + + if flight_check(self, s) then + + if me_y < p_y then + + self.object:setvelocity({ + x = v.x, + y = 1 * self.walk_velocity, + z = v.z + }) + + elseif me_y > p_y then + + self.object:setvelocity({ + x = v.x, + y = -1 * self.walk_velocity, + z = v.z + }) + end + else + if me_y < p_y then + + self.object:setvelocity({ + x = v.x, + y = 0.01, + z = v.z + }) + + elseif me_y > p_y then + + self.object:setvelocity({ + 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) + + -- 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(self) then + + set_velocity(self, 0) + set_animation(self, "stand") + 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, self.sounds.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 = get_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) + + set_velocity(self, 0) + + if self.shoot_interval + and self.timer > self.shoot_interval + and random(1, 100) <= 60 then + + self.timer = 0 + set_animation(self, "shoot") + + -- play shoot attack sound + mob_sound(self, self.sounds.shoot_attack) + + local p = self.object:get_pos() + + p.y = p.y + (self.collisionbox[2] + self.collisionbox[5]) / 2 + + if minetest.registered_entities[self.arrow] then + + local obj = minetest.add_entity(p, self.arrow) + local ent = obj:get_luaentity() + local amount = (vec.x * vec.x + vec.y * vec.y + vec.z * vec.z) ^ 0.5 + local v = ent.velocity or 1 -- or set to default + + ent.switch = 1 + ent.owner_id = tostring(self.object) -- add unique owner id to arrow + + -- 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) + + obj:setvelocity(vec) + end + end + end + end +end + + +-- falling and fall damage +local falling = function(self, pos) + + if self.fly then + return + end + + -- floating in water (or falling) + local v = self.object:getvelocity() + + if v.y > 0 then + + -- apply gravity when moving up + self.object:setacceleration({ + x = 0, + y = -10, + z = 0 + }) + + elseif v.y <= 0 and v.y > self.fall_speed then + + -- fall downwards at set speed + self.object:setacceleration({ + x = 0, + y = self.fall_speed, + z = 0 + }) + else + -- stop accelerating once max fall speed hit + self.object:setacceleration({x = 0, y = 0, z = 0}) + end + + -- in water then float up + if minetest.registered_nodes[self.standing_in].groups.water then + + if self.floats == 1 then + + self.object:setacceleration({ + x = 0, + y = -self.fall_speed / (max(1, v.y) ^ 8), -- 8 was 2 + z = 0 + }) + end + else + + -- fall damage onto solid ground + if self.fall_damage == 1 + and self.object:getvelocity().y == 0 then + + local d = (self.old_y or 0) - self.object:get_pos().y + + if d > 5 then + + self.health = self.health - floor(d - 5) + + effect(pos, 5, "tnt_smoke.png", 1, 2, 2, nil) + + if check_for_death(self, "fall", {type = "fall"}) then + return + end + end + + self.old_y = self.object:get_pos().y + 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 + + -- mob health check +-- if self.health <= 0 then +-- return +-- 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 + + -- is mob protected? + if self.protected and hitter:is_player() + and minetest.is_protected(self.object:get_pos(), hitter:get_player_name()) then + minetest.chat_send_player(hitter:get_player_name(), S("Mob has been protected!")) + return + end + + + -- weapon wear + local weapon = hitter:get_wielded_item() + local punch_interval = 1.4 + + -- 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 + + if use_cmi then + damage = cmi.calculate_damage(self.object, hitter, tflp, tool_capabilities, dir) + else + + 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 + 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 + + -- if "all" then no tool does damage unless it's specified in list + elseif self.immune_to[n][1] == "all" then + damage = self.immune_to[n][2] or 0 + end + end + + -- healing + if damage <= -1 then + self.health = self.health - floor(damage) + return + end + +-- print ("Mob Damage is", damage) + + if use_cmi then + + local cancel = cmi.notify_punch(self.object, hitter, tflp, tool_capabilities, dir, damage) + + if cancel then return end + end + + -- add weapon wear + if tool_capabilities then + punch_interval = tool_capabilities.full_punch_interval or 1.4 + end + + if weapon:get_definition() + and weapon:get_definition().tool_capabilities then + + weapon:add_wear(floor((punch_interval / 75) * 9000)) + hitter:set_wielded_item(weapon) + end + + -- only play hit sound and show blood effects if damage is 1 or over + if damage >= 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 + }) + else + minetest.sound_play("default_punch", { + object = self.object, --hitter, + max_hear_distance = 5 + }) + end + + -- blood_particles + if self.blood_amount > 0 + and not disable_blood then + + local pos = self.object:get_pos() + + pos.y = pos.y + (-self.collisionbox[2] + self.collisionbox[5]) * .5 + + -- do we have a single blood texture or multiple? + if type(self.blood_texture) == "table" then + + local blood = self.blood_texture[random(1, #self.blood_texture)] + + effect(pos, self.blood_amount, blood, nil, nil, 1, nil) + else + effect(pos, self.blood_amount, self.blood_texture, nil, nil, 1, nil) + end + end + + -- do damage + self.health = self.health - floor(damage) + + -- exit here if dead, special item check + if weapon:get_name() == "mobs:pick_lava" then + if check_for_death(self, "lava", {type = "punch", + puncher = hitter}) then + return + end + else + if check_for_death(self, "hit", {type = "punch", + puncher = hitter}) then + return + end + end + + --[[ add healthy afterglow when hit (can cause hit lag with larger textures) + minetest.after(0.1, function() + + if not self.object:get_luaentity() then return end + + self.object:settexturemod("^[colorize:#c9900070") + + core.after(0.3, function() + self.object:settexturemod("") + end) + end) ]] + + -- knock back effect (only on full punch) + if self.knock_back + and tflp >= punch_interval then + + local v = self.object:getvelocity() + local r = 1.4 - min(punch_interval, 1.4) + local kb = r * 5 + 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 + + self.object:setvelocity({ + x = dir.x * kb, + y = up, + z = dir.z * kb + }) + + self.pause_timer = 0.25 + end + end -- END if damage + + -- if skittish then run away + if self.runaway == true 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 + and hitter:get_player_name() ~= self.owner + and not mobs.invis[ name ] then + + -- attack whoever punched mob + self.state = "" + do_attack(self, hitter) + + -- 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 + if obj.group_attack == true + and obj.state ~= "attack" + and obj.owner ~= name + and obj.name == self.name then + do_attack(obj, hitter) + 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 + + +-- get entity staticdata +local mob_staticdata = function(self) + + -- remove mob when out of range unless tamed + if remove_far + and self.remove_ok + and self.type ~= "npc" + and self.state ~= "attack" + and not self.tamed + and self.lifetimer < 20000 then + + --print ("REMOVED " .. self.name) + + self.object:remove() + + return ""-- nil + end + + self.remove_ok = true + self.attack = nil + self.following = nil + self.state = "stand" + + -- used to rotate older mobs + if self.drawtype + and self.drawtype == "side" then + self.rotate = math.rad(90) + end + + if use_cmi then + self.serialized_cmi_components = cmi.serialize_components(self._cmi_components) + end + + local tmp = {} + + for _,stat in pairs(self) do + + local t = type(stat) + + if t ~= "function" + and t ~= "nil" + and t ~= "userdata" + and _ ~= "_cmi_components" then + tmp[_] = self[_] + end + end + + --print('===== '..self.name..'\n'.. dump(tmp)..'\n=====\n') + 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 peaceful_only then + + 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 + + -- 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 + + -- mob defaults + self.object:set_armor_groups({immortal = 1, fleshy = self.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 = "air" + + -- 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 + + if use_cmi then + self._cmi_components = cmi.activate_components(self.serialized_cmi_components) + cmi.notify_activate(self.object, dtime) + end +end + + +-- main mob function +local mob_step = function(self, dtime) + + if use_cmi then + cmi.notify_step(self.object, dtime) + end + + local pos = self.object:get_pos() + local yaw = 0 + + -- when lifetimer expires remove mob (except npc and tamed) + if self.type ~= "npc" + and not self.tamed + and self.state ~= "attack" + and remove_far ~= true + and self.lifetimer < 20000 then + + self.lifetimer = self.lifetimer - dtime + + if self.lifetimer <= 0 then + + -- only despawn away from player + local objs = minetest.get_objects_inside_radius(pos, 15) + + for n = 1, #objs do + + if objs[n]:is_player() then + + self.lifetimer = 20 + + return + end + end + +-- minetest.log("action", +-- S("lifetimer expired, removed @1", self.name)) + + effect(pos, 15, "tnt_smoke.png", 2, 4, 2, 0) + + self.object:remove() + + return + end + end + + -- get node at foot level every quarter second + self.node_timer = (self.node_timer or 0) + dtime + + if self.node_timer > 0.25 then + + self.node_timer = 0 + + local y_level = self.collisionbox[2] + + if self.child then + y_level = self.collisionbox[2] * 0.5 + end + + -- what is mob standing in? + self.standing_in = node_ok({ + x = pos.x, y = pos.y + y_level + 0.25, z = pos.z}, "air").name +-- print ("standing in " .. self.standing_in) + end + + -- check if falling, flying, floating + falling(self, pos) + + -- smooth rotation by ThomasMonroe314 + + if self.delay and self.delay > 0 then + + local yaw = self.object:get_yaw() + + 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 + self.object:set_yaw(yaw) + end + + -- end rotation + + -- knockback timer + if self.pause_timer > 0 then + + self.pause_timer = self.pause_timer - dtime + + return + end + + -- 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 + + -- attack timer + self.timer = self.timer + dtime + + if self.state ~= "attack" 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, 100) == 1 then + mob_sound(self, self.sounds.random) + 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 + + self.env_damage_timer = 0 + + -- check for environmental damage (water, fire, lava etc.) + do_env_damage(self) + + -- node replace check (cow eats grass etc.) + replace(self, pos) + end + + monster_attack(self) + + npc_attack(self) + + breed(self) + + follow_flop(self) + + do_states(self, dtime) + + do_jump(self) + + runaway_from(self) + +end + + +-- default function when mobs are blown up with TNT +local do_tnt = function(obj, damage) + + --print ("----- Damage", damage) + + obj.object:punch(obj.object, 1.0, { + full_punch_interval = 1.0, + damage_groups = {fleshy = damage}, + }, nil) + + return false, true, {} +end + + +mobs.spawning_mobs = {} + +-- register mob entity +function mobs:register_mob(name, def) + + mobs.spawning_mobs[name] = true + +minetest.register_entity(name, { + + stepheight = def.stepheight or 1.1, -- was 0.6 + name = name, + type = def.type, + attack_type = def.attack_type, + fly = def.fly, + fly_in = def.fly_in or "air", + owner = def.owner or "", + order = def.order or "", + on_die = def.on_die, + do_custom = def.do_custom, + jump_height = def.jump_height or 4, -- was 6 + drawtype = def.drawtype, -- DEPRECATED, use rotate instead + rotate = math.rad(def.rotate or 0), -- 0=front, 90=side, 180=back, 270=side2 + lifetimer = def.lifetimer or 180, -- 3 minutes + hp_min = max(1, (def.hp_min or 5) * difficulty), + hp_max = max(1, (def.hp_max or 10) * difficulty), + physical = true, + collisionbox = def.collisionbox or {-0.25, -0.25, -0.25, 0.25, 0.25, 0.25}, + 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 5, + walk_velocity = def.walk_velocity or 1, + run_velocity = def.run_velocity or 2, + damage = max(0, (def.damage or 0) * difficulty), + light_damage = def.light_damage or 0, + water_damage = def.water_damage or 0, + lava_damage = def.lava_damage or 0, + suffocation = def.suffocation or 2, + fall_damage = def.fall_damage or 1, + fall_speed = def.fall_speed or -10, -- must be lower than -2 (default: -10) + drops = def.drops or {}, + armor = def.armor or 100, + on_rightclick = def.on_rightclick, + arrow = def.arrow, + shoot_interval = def.shoot_interval, + sounds = def.sounds or {}, + animation = def.animation, + follow = def.follow, + 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, + blood_amount = def.blood_amount or 5, + blood_texture = def.blood_texture or "mobs_blood.png", + shoot_offset = def.shoot_offset or 0, + floats = def.floats or 1, -- floats in water by default + 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, -- only used when state = "attack" + tamed = false, + pause_timer = 0, + horny = false, + hornytimer = 0, + child = false, + 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, + explosion_damage_radius = def.explosion_damage_radius, + explosion_timer = def.explosion_timer or 3, + allow_fuse_reset = def.allow_fuse_reset ~= false, + stop_to_explode = def.stop_to_explode ~= false, + custom_attack = def.custom_attack, + double_melee_attack = def.double_melee_attack, + dogshoot_switch = def.dogshoot_switch, + dogshoot_count = 0, + dogshoot_count_max = def.dogshoot_count_max or 5, + dogshoot_count2_max = def.dogshoot_count2_max or (def.dogshoot_count_max or 5), + attack_animals = def.attack_animals or false, + specific_attack = def.specific_attack, + runaway_from = def.runaway_from, + owner_loyal = def.owner_loyal, + facing_fence = false, + _cmi_is_mob = true, + + 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_activate = function(self, staticdata, dtime) + return mob_activate(self, staticdata, def, dtime) + end, + + get_staticdata = function(self) + return mob_staticdata(self) + end, + +}) + +end -- END mobs:register_mob function + + +-- count how many mobs of one type are inside an area +local count_mobs = function(pos, type) + + local num_type = 0 + local num_total = 0 + local objs = minetest.get_objects_inside_radius(pos, aoc_range) + + for n = 1, #objs do + + if not objs[n]:is_player() then + + local obj = objs[n]:get_luaentity() + + -- count mob type and add to total also + if obj and obj.name and obj.name == type then + + num_type = num_type + 1 + num_total = num_total + 1 + + -- add to total mobs + elseif obj and obj.name and obj.health ~= nil then + + num_total = num_total + 1 + end + end + end + + return num_type, num_total +end + + +-- global functions + +function mobs:spawn_abm_check(pos, node, name) + -- global function to add additional spawn checks + -- return true to stop spawning mob +end + + +local function player_near(pos, radius) + + local objs = minetest.get_objects_inside_radius(pos, radius) + + for n = 1, #objs do + + if objs[n]:is_player() then + return true + end + end + + return false +end + + +local function daycheck(day_toggle) + + if day_toggle ~= nil then + + local tod = (minetest.get_timeofday() or 0) * 24000 + + if tod > 4500 and tod < 19500 then + + if day_toggle == false then + return false -- mob requires night + end + else + if day_toggle == true then + return false -- mob requires day + end + end + end + + return true -- mob doesn't care +end + + +local function is_protected(pos) + + if not spawn_protected + and minetest.is_protected(pos, "") then + return true -- protected area + end + + return false -- mobs can spawn +end + + +local interval = 30 +local timer = 0 +local spawning_mobs = {} + +minetest.register_globalstep(function(dtime) + + if not mobs_spawn then + return + end + + timer = timer + dtime + if timer < interval then + return + end + timer = 0 + + for _,player in ipairs(minetest.get_connected_players()) do + + if player:get_hp() > 0 then + + local pos = player:getpos() + local area, pos2, light, obj, base + + for _,mob in ipairs(spawning_mobs) do + + area = nil + + if minetest.registered_entities[mob.name] + and random(1, mob.chance) == 1 then + + area = minetest.find_nodes_in_area_under_air( + {x = pos.x - 20, y = pos.y - 20, z = pos.z - 20}, + {x = pos.x + 20, y = pos.y + 20, z = pos.z + 20}, + mob.nodes) + end + + if area and #area > 0 then + + pos2 = area[math.random(1, #area)] + base = minetest.registered_entities[mob.name].collisionbox[5] + pos2.y = pos2.y + 1 + base + + light = minetest.get_node_light(pos2) or -1 + + if pos2.y >= mob.min_height + and pos2.y <= mob.max_height + and light >= mob.min_light + and light <= mob.max_light + and daycheck(mob.day_toggle) + and minetest.find_node_near(pos2, 1, mob.neighbors) + and count_mobs(pos2, mob.name) < mob.total + and not player_near(pos2, 10) + and not is_protected(pos2) then + +print ("--- Spawned ", mob.name, minetest.pos_to_string(pos2), mob.chance) + + obj = minetest.add_entity(pos2, mob.name) + + if mob.on_spawn then + mob.on_spawn(obj:get_luaentity(), pos2) + end + else +print ("--- Cannot spawn ", mob.name) + end + end + end + end + end +end) + + +function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, + interval, chance, aoc, min_height, max_height, day_toggle, on_spawn) + + -- 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("[mobs] %s has spawning disabled", name)) + return + end + + minetest.log("action", + string.format("[mobs] Chance setting for %s changed to %s (total: %s)", name, chance, aoc)) + end + + -- change old chance values to be more useable by new spawn routine + if chance > 999 then + chance = max(1, chance / 1000) + end + + -- adjust for mob chance multiplier + chance = max(1, chance * mob_chance_multiplier) + + -- add mob to table for spawning with routine above + table.insert(spawning_mobs, { + name = name, + nodes = nodes, + neighbors = neighbors, + chance = chance, + min_height = min_height, + max_height = max_height, + min_light = min_light, + max_light = max_light, + total = aoc, + day_toggle = day_toggle, + on_spawn = on_spawn, + }) +end + + +-- compatibility with older mob registration +function mobs:register_spawn(name, nodes, max_light, min_light, chance, active_object_count, max_height, day_toggle) + + mobs:spawn_specific(name, nodes, {"air"}, min_light, max_light, 30, + chance, active_object_count, -31000, max_height, day_toggle) +end + + +-- MarkBu's spawn function +function mobs:spawn(def) + + mobs:spawn_specific( + def.name, + def.nodes or {"group:soil", "group:stone"}, + def.neighbors or {"air"}, + def.min_light or 0, + def.max_light or 15, + def.interval or 30, + def.chance or 5000, + def.active_object_count or 1, + def.min_height or -31000, + def.max_height or 31000, + def.day_toggle, + def.on_spawn + ) +end + + +-- register arrow for shoot attack +function 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, + 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, + 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 + + self.object:remove() ; -- print ("removed arrow") + + 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() ; -- print ("hit node") + + return + end + end + + if self.hit_player or self.hit_mob then + + for _,player in pairs(minetest.get_objects_inside_radius(pos, 1.0)) do + + if self.hit_player + and player:is_player() then + + self.hit_player(self, player) + self.object:remove() ; -- print ("hit player") + return + end + + local entity = player:get_luaentity() + + if entity + and self.hit_mob + and entity._cmi_is_mob == true + and tostring(player) ~= self.owner_id + and entity.name ~= self.object:get_luaentity().name then + + self.hit_mob(self, player) + + self.object:remove() ; --print ("hit mob") + + return + end + end + end + + self.lastpos = pos + end + }) +end + + +-- compatibility function +function mobs:explosion(pos, radius) + local self = {sounds = {}} + self.sounds.explode = "tnt_explode" + mobs:boom(self, pos, radius) +end + + +-- no damage to nodes explosion +function mobs:safe_boom(self, pos, radius) + + 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 + }) + + entity_physics(pos, radius) + effect(pos, 32, "tnt_smoke.png", radius * 3, radius * 5, radius, 1, 0) +end + + +-- make explosion with protection and tnt mod check +function mobs:boom(self, pos, radius) + + if mobs_griefing + and minetest.get_modpath("tnt") and tnt and tnt.boom + and not minetest.is_protected(pos, "") then + + tnt.boom(pos, { + radius = radius, + damage_radius = radius, + sound = self.sounds and self.sounds.explode, + explode_center = true, + }) + else + mobs:safe_boom(self, pos, radius) + end +end + + +-- Register spawn eggs + +-- Note: This also introduces the “spawn_egg” group: +-- * spawn_egg=1: Spawn egg (generic mob, no metadata) +-- * spawn_egg=2: Spawn egg (captured/tamed mob, metadata) +function mobs:register_egg(mob, desc, background, addegg, no_creative) + + local grp = {spawn_egg = 1} + + -- do NOT add this egg to creative inventory (e.g. dungeon master) + if creative and 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 new spawn egg containing mob information + minetest.register_craftitem(mob .. "_set", { + + description = S("@1 (Tamed)", desc), + inventory_image = invimg, + groups = {spawn_egg = 2, not_in_creative_inventory = 1}, + stack_max = 1, + + 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 + + if not minetest.registered_entities[mob] then + return + end + + pos.y = pos.y + 1 + + local data = itemstack:get_metadata() + local mob = minetest.add_entity(pos, mob, data) + local ent = mob:get_luaentity() + + -- set owner if not a monster + if ent.type ~= "monster" then + ent.owner = placer:get_player_name() + ent.tamed = true + end + + -- since mob is unique we remove egg once spawned + itemstack:take_item() + end + + return itemstack + end, + }) + + + -- register old stackable mob egg + minetest.register_craftitem(mob, { + + description = desc, + inventory_image = invimg, + groups = grp, + + 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 + + if not minetest.registered_entities[mob] then + return + end + + pos.y = pos.y + 1 + + local mob = minetest.add_entity(pos, mob) + 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 + + -- if not in creative then take item + if not mobs.is_creative(placer:get_player_name()) then + itemstack:take_item() + end + end + + return itemstack + end, + }) + +end + + +-- capture critter (thanks to blert2112 for idea) +function mobs:capture_mob(self, clicker, chance_hand, chance_net, chance_lasso, force_take, replacewith) + + if self.child + or not clicker:is_player() + or not clicker:get_inventory() then + return false + end + + -- get name of clicked mob + local mobname = self.name + + -- if not nil change what will be added to inventory + if replacewith then + mobname = replacewith + end + + local name = clicker:get_player_name() + local tool = clicker:get_wielded_item() + + -- are we using hand, net or lasso to pick up mob? + if tool:get_name() ~= "" + and tool:get_name() ~= "mobs:net" + and tool:get_name() ~= "mobs:lasso" then + return false + end + + -- is mob tamed? + if self.tamed == false + and force_take == false then + + minetest.chat_send_player(name, S("Not tamed!")) + + return true -- false + end + + -- cannot pick up if not owner + if self.owner ~= name + and force_take == false then + + minetest.chat_send_player(name, S("@1 is owner!", self.owner)) + + return true -- false + end + + if clicker:get_inventory():room_for_item("main", mobname) then + + -- was mob clicked with hand, net, or lasso? + local chance = 0 + + if tool:get_name() == "" then + chance = chance_hand + + elseif tool:get_name() == "mobs:net" then + + chance = chance_net + + tool:add_wear(4000) -- 17 uses + + clicker:set_wielded_item(tool) + + elseif tool:get_name() == "mobs:lasso" then + + chance = chance_lasso + + tool:add_wear(650) -- 100 uses + + clicker:set_wielded_item(tool) + + end + + -- calculate chance.. add to inventory if successful? + if chance > 0 and random(1, 100) <= chance then + + -- default mob egg + local new_stack = ItemStack(mobname) + + -- add special mob egg with all mob information + -- unless 'replacewith' contains new item to use + if not replacewith then + + new_stack = ItemStack(mobname .. "_set") + + local tmp = {} + + for _,stat in pairs(self) do + local t = type(stat) + if t ~= "function" + and t ~= "nil" + and t ~= "userdata" then + tmp[_] = self[_] + end + end + + local data_str = minetest.serialize(tmp) + + new_stack:set_metadata(data_str) + end + + local inv = clicker:get_inventory() + + if inv:room_for_item("main", new_stack) then + inv:add_item("main", new_stack) + else + minetest.add_item(clicker:get_pos(), new_stack) + end + + self.object:remove() + + mob_sound(self, "default_place_node_hard") + + elseif chance ~= 0 then + minetest.chat_send_player(name, S("Missed!")) + + mob_sound(self, "mobs_swing") + end + end + + return true +end + + +-- protect tamed mob with rune item +function mobs:protect(self, clicker) + + local name = clicker:get_player_name() + local tool = clicker:get_wielded_item() + + if tool:get_name() ~= "mobs:protector" then + return false + end + + if self.tamed == false then + minetest.chat_send_player(name, S("Not tamed!")) + return true -- false + end + + if self.protected == true then + minetest.chat_send_player(name, S("Already protected!")) + return true -- false + end + + if not mobs.is_creative(clicker:get_player_name()) then + tool:take_item() -- take 1 protection rune + clicker:set_wielded_item(tool) + end + + self.protected = true + + local pos = self.object:get_pos() + pos.y = pos.y + self.collisionbox[2] + 0.5 + + effect(self.object:get_pos(), 25, "mobs_protect_particle.png", 0.5, 4, 2, 15) + + mob_sound(self, "mobs_spell") + + return true +end + + +local mob_obj = {} +local mob_sta = {} + +-- feeding, taming and breeding (thanks blert2112) +function 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 follow_holding(self, clicker) then + + -- if not in creative then take item + if not mobs.is_creative(clicker:get_player_name()) then + + local item = clicker:get_wielded_item() + + item:take_item() + + clicker:set_wielded_item(item) + end + + -- increase health + self.health = self.health + 4 + + if self.health >= self.hp_max then + + self.health = self.hp_max + + if self.htimer < 1 then + + minetest.chat_send_player(clicker:get_player_name(), + S("@1 at full health (@2)", + self.name:split(":")[2], tostring(self.health))) + + self.htimer = 5 + end + end + + self.object:set_hp(self.health) + + update_tag(self) + + -- make children grow quicker + if self.child == true then + + self.hornytimer = self.hornytimer + 20 + + 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 + + self.gotten = false + + if tame then + + if self.tamed == false then + minetest.chat_send_player(clicker:get_player_name(), + S("@1 has been tamed!", + self.name:split(":")[2])) + end + + 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, self.sounds.random) + end + + return true + end + + local item = clicker:get_wielded_item() + + -- if mob has been tamed you can name it with a nametag + if item:get_name() == "mobs:nametag" + and clicker:get_player_name() == self.owner then + + local name = clicker:get_player_name() + + -- store mob and nametag stack in external variables + mob_obj[name] = self + mob_sta[name] = item + + local tag = self.nametag or "" + + minetest.show_formspec(name, "mobs_nametag", "size[8,4]" + .. default.gui_bg + .. default.gui_bg_img + .. "field[0.5,1;7.5,0;name;" .. minetest.formspec_escape(S("Enter name:")) .. ";" .. tag .. "]" + .. "button_exit[2.5,3.5;3,1;mob_rename;" .. minetest.formspec_escape(S("Rename")) .. "]") + end + + return false +end + + +-- inspired by blockmen's nametag mod +minetest.register_on_player_receive_fields(function(player, formname, fields) + + -- right-clicked with nametag and name entered? + if formname == "mobs_nametag" + and fields.name + and fields.name ~= "" then + + local name = player:get_player_name() + + if not mob_obj[name] + or not mob_obj[name].object then + return + end + + -- make sure nametag is being used to name mob + local item = player:get_wielded_item() + + if item:get_name() ~= "mobs:nametag" then + return + end + + -- limit name entered to 64 characters long + if string.len(fields.name) > 64 then + fields.name = string.sub(fields.name, 1, 64) + end + + -- update nametag + mob_obj[name].nametag = fields.name + + update_tag(mob_obj[name]) + + -- if not in creative then take item + if not mobs.is_creative(name) then + + mob_sta[name]:take_item() + + player:set_wielded_item(mob_sta[name]) + end + + -- reset external variables + mob_obj[name] = nil + mob_sta[name] = nil + end +end) + + +-- compatibility function for old entities to new modpack entities +function 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 diff --git a/mods/flora_fauna/mobs_redo/api.txt b/mods/flora_fauna/mobs_redo/api.txt new file mode 100644 index 0000000..126de42 --- /dev/null +++ b/mods/flora_fauna/mobs_redo/api.txt @@ -0,0 +1,742 @@ + +Mobs Redo API +============= + +Welcome to the world of mobs in minetest and hopefully an easy guide to defining +your own mobs and having them appear in your worlds. + + +Registering Mobs +---------------- + +To register a mob and have it ready for use requires the following function: + + mobs:register_mob(name, definition) + +The 'name' of a mob usually starts with the mod name it's running from followed +by it's own name e.g. + + "mobs_monster:sand_monster" or "mymod:totally_awesome_beast" + +... and the 'definition' is a table which holds all of the settings and +functions needed for the mob to work properly which contains the following: + + 'nametag' contains the name which is shown above mob. + 'type' holds the type of mob that inhabits your world e.g. + "animal" usually docile and walking around. + "monster" attacks player or npc on sight. + "npc" walk around and will defend themselves if hit first, they + kill monsters. + 'hp_min' has the minimum health value the mob can spawn with. + 'hp_max' has the maximum health value the mob can spawn with. + 'armor' holds strength of mob, 100 is normal, lower is more powerful + and needs more hits and better weapons to kill. + 'passive' when true allows animals to defend themselves when hit, + otherwise they amble onwards. + 'walk_velocity' is the speed that your mob can walk around. + 'run_velocity' is the speed your mob can run with, usually when attacking. + 'walk_chance' has a 0-100 chance value your mob will walk from standing, + set to 0 for jumping mobs only. + 'jump' when true allows your mob to jump updwards. + 'jump_height' holds the height your mob can jump, 0 to disable jumping. + 'stepheight' height of a block that your mob can easily walk up onto, + defaults to 1.1. + 'fly' when true allows your mob to fly around instead of walking. + 'fly_in' holds the node name that the mob flies (or swims) around + in e.g. "air" or "default:water_source". + 'runaway' if true causes animals to turn and run away when hit. + 'pushable' when true mobs can be pushed by player or other mobs. + 'view_range' how many nodes in distance the mob can see a player. + 'damage' how many health points the mob does to a player or another + mob when melee attacking. + 'knock_back' when true has mobs falling backwards when hit, the greater + the damage the more they move back. + 'fear_height' is how high a cliff or edge has to be before the mob stops + walking, 0 to turn off height fear. + 'fall_speed' has the maximum speed the mob can fall at, default is -10. + 'fall_damage' when true causes falling to inflict damage. + 'water_damage' holds the damage per second infliced to mobs when standing in + water. + 'lava_damage' holds the damage per second inflicted to mobs when standing + in lava or fire or an ignition source. + 'light_damage' holds the damage per second inflicted to mobs when light + level is between the min and max values below + 'light_damage_min' minimum light value when mob is affected (default: 14) + 'light_damage_max' maximum light value when mob is affected (default: 15) + 'suffocation' when true causes mobs to suffocate inside solid blocks. + 'floats' when set to 1 mob will float in water, 0 has them sink. + 'follow' mobs follow player when holding any of the items which appear + on this table, the same items can be fed to a mob to tame or + breed e.g. {"farming:wheat", "default:apple"} + + 'reach' is how far the mob can attack player when standing + nearby, default is 3 nodes. + 'docile_by_day' when true has mobs wandering around during daylight + hours and only attacking player at night or when + provoked. + 'attack_monsters' when true mob will attack monsters. + 'attack_animals' when true mob will attack animals. + 'attack_npcs' when true mob will attack npcs within range. + 'attack_players' when true mob will attack players nearby. + 'owner_loyal' when true non-docile tamed mobs attack anything player + punches when nearby. + 'group_attack' when true has same mob type grouping together to attack + offender. + 'attack_type' tells the api what a mob does when attacking the player + or another mob: + 'dogfight' is a melee attack when player is within mob reach. + 'shoot' has mob shoot pre-defined arrows at player when inside + view_range. + 'dogshoot' has melee attack when inside reach and shoot attack + when inside view_range. + 'explode' causes mob to stop and explode when inside reach. + 'explosion_radius' the radius of explosion node destruction, + defaults to 1 + 'explosion_damage_radius' the radius of explosion entity & player damage, + defaults to explosion_radius * 2 + 'explosion_timer' number of seconds before mob explodes while its target + is still inside reach or explosion_damage_radius, + defaults to 3. + 'allow_fuse_reset' Allow 'explode' attack_type to reset fuse and resume + chasing if target leaves the blast radius or line of + sight. Defaults to true. + 'stop_to_explode' When set to true (default), mob must stop and wait for + explosion_timer in order to explode. If false, mob will + continue chasing. + 'arrow' holds the pre-defined arrow object to shoot when + attacking. + 'dogshoot_switch' allows switching between attack types by using timers + (1 for shoot, 2 for dogfight) + 'dogshoot_count_max' contains how many seconds before switching from + dogfight to shoot. + 'dogshoot_count2_max' contains how many seconds before switching from shoot + to dogfight. + 'shoot_interval' has the number of seconds between shots. + 'shoot_offset' holds the y position added as to where the + arrow/fireball appears on mob. + 'specific_attack' has a table of entity names that mob can also attack + e.g. {"player", "mobs_animal:chicken"}. + 'runaway_from' contains a table with mob names to run away from, add + "player" to list to runaway from player also. + 'blood_amount' contains the number of blood droplets to appear when + mob is hit. + 'blood_texture' has the texture name to use for droplets e.g. + "mobs_blood.png", or table {"blood1.png", "blood2.png"} + 'pathfinding' set to 1 for mobs to use pathfinder feature to locate + player, set to 2 so they can build/break also (only + works with dogfight attack and when 'mobs_griefing' + in minetest.conf is not false). + 'immune_to' is a table that holds specific damage when being hit by + certain items e.g. + {"default:sword_wood", 0} -- causes no damage. + {"default:gold_lump", -10} -- heals by 10 health points. + {"default:coal_block", 20} -- 20 damage when hit on head with coal blocks. + {"all"} -- stops all weapons causing damage apart from those on list. + + 'makes_footstep_sound' when true you can hear mobs walking. + 'sounds' this is a table with sounds of the mob + 'distance' maximum distance sounds can be heard, default is 10. + 'random' random sound that plays during gameplay. + 'war_cry' what you hear when mob starts to attack player. + 'attack' what you hear when being attacked. + 'shoot_attack' sound played when mob shoots. + 'damage' sound heard when mob is hurt. + 'death' played when mob is killed. + 'jump' played when mob jumps. + 'fuse' sound played when mob explode timer starts. + 'explode' sound played when mob explodes. + + 'drops' table of items that are dropped when mob is killed, fields are: + 'name' name of item to drop. + 'chance' chance of drop, 1 for always, 2 for 1-in-2 chance etc. + 'min' minimum number of items dropped, set to 0 for rare drops. + 'max' maximum number of items dropped. + Note: If weapon has {fire=1} damage group set then cooked items will drop. + + 'visual' holds the look of the mob you wish to create: + 'cube' looks like a normal node + 'sprite' sprite which looks same from all angles. + 'upright_sprite' flat model standing upright. + 'wielditem' how it looks when player holds it in hand. + 'mesh' uses separate object file to define mob. + 'visual_size' has the size of the mob, defaults to {x = 1, y = 1} + 'collisionbox' has the box in which mob can be interacted with the + world e.g. {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5} + 'selectionbox' has the box in which player can interact with mob + 'textures' holds a table list of textures to be used for mob, or you + could use multiple lists inside another table for random + selection e.g. { {"texture1.png"}, {"texture2.png"} } + 'child_texture' holds the texture table for when baby mobs are used. + 'gotten_texture' holds the texture table for when self.gotten value is + true, used for milking cows or shearing sheep. + 'mesh' holds the name of the external object used for mob model + e.g. "mobs_cow.b3d" + 'gotten_mesh" holds the name of the external object used for when + self.gotten is true for mobs. + 'rotate' custom model rotation, 0 = front, 90 = side, 180 = back, + 270 = other side. + 'double_melee_attack' when true has the api choose between 'punch' and + 'punch2' animations. [DEPRECATED] + + 'animation' holds a table containing animation names and settings for use with mesh models: + 'stand_start' start frame for when mob stands still. + 'stand_end' end frame of stand animation. + 'stand_speed' speed of animation in frames per second. + 'walk_start' when mob is walking around. + 'walk_end' + 'walk_speed' + 'run_start' when a mob runs or attacks. + 'run_end' + 'run_speed' + 'fly_start' when a mob is flying. + 'fly_end' + 'fly_speed' + 'punch_start' when a mob melee attacks. + 'punch_end' + 'punch_speed' + 'punch2_start' alternative melee attack animation. + 'punch2_end' + 'punch2_speed' + 'shoot_start' shooting animation. + 'shoot_end' + 'shoot_speed' + 'die_start' death animation + 'die_end' + 'die_speed' + 'die_loop' when set to false stops the animation looping. + + Using '_loop = false' setting will stop any of the above animations from + looping. + + 'speed_normal' is used for animation speed for compatibility with some + older mobs. + + Note: Up to 5 different animations can be used per action e.g. + stand_start, stand_end, stand1_start, stand1_end .. up to stand4_start + + +Node Replacement +---------------- + +Mobs can look around for specific nodes as they walk and replace them to mimic +eating. + + 'replace_what' group of items to replace e.g. + {"farming:wheat_8", "farming:carrot_8"} + or you can use the specific options of what, with and + y offset by using this instead: + { + {"group:grass", "air", 0}, + {"default:dirt_with_grass", "default:dirt", -1} + } + 'replace_with' replace with what e.g. "air" or in chickens case "mobs:egg" + 'replace_rate' how random should the replace rate be (typically 10) + 'replace_offset' +/- value to check specific node to replace + + 'on_replace(self, pos, oldnode, newnode)' is called when mob is about to + replace a node. + 'self' ObjectRef of mob + 'pos' Position of node to replace + 'oldnode' Current node + 'newnode' What the node will become after replacing + + If false is returned, the mob will not replace the node. + + By default, replacing sets self.gotten to true and resets the object + properties. + + +Custom Definition Functions +--------------------------- + +Along with the above mob registry settings we can also use custom functions to +enhance mob functionality and have them do many interesting things: + + 'on_die' a function that is called when the mob is killed the + parameters are (self, pos) + 'on_rightclick' its same as in minetest.register_entity() + 'on_blast' is called when an explosion happens near mob when using TNT + functions, parameters are (object, damage) and returns + (do_damage, do_knockback, drops) + 'on_spawn' is a custom function that runs on mob spawn with 'self' as + variable, return true at end of function to run only once. + 'after_activate' is a custom function that runs once mob has been activated + with these paramaters (self, staticdata, def, dtime) + 'on_breed' called when two similar mobs breed, paramaters are + (parent1, parent2) objects, return false to stop child from + being resized and owner/tamed flags and child textures being + applied. Function itself must spawn new child mob. + 'on_grown' is called when a child mob has grown up, only paramater is + (self). + 'do_punch' called when mob is punched with paramaters (self, hitter, + time_from_last_punch, tool_capabilities, direction), return + false to stop punch damage and knockback from taking place. + 'custom_attack' when set this function is called instead of the normal mob + melee attack, parameters are (self, to_attack). + 'on_die' a function that is called when mob is killed (self, pos) + 'do_custom' a custom function that is called every tick while mob is + active and which has access to all of the self.* variables + e.g. (self.health for health or self.standing_in for node + status), return with 'false' to skip remainder of mob API. + + +Internal Variables +------------------ + +The mob api also has some preset variables and functions that it will remember +for each mob. + + 'self.health' contains current health of mob (cannot exceed + self.hp_max) + 'self.texture_list' contains list of all mob textures + 'self.child_texture' contains mob child texture when growing up + 'self.base_texture' contains current skin texture which was randomly + selected from textures list + 'self.gotten' this is used for obtaining milk from cow and wool from + sheep + 'self.horny' when animal fed enough it is set to true and animal can + breed with same animal + 'self.hornytimer' background timer that controls breeding functions and + mob childhood timings + 'self.child' used for when breeding animals have child, will use + child_texture and be half size + 'self.owner' string used to set owner of npc mobs, typically used for + dogs + 'self.order' set to "follow" or "stand" so that npc will follow owner + or stand it's ground + 'self.nametag' contains the name of the mob which it can show above + + +Spawning Mobs in World +---------------------- + +mobs:register_spawn(name, nodes, max_light, min_light, chance, + active_object_count, max_height, day_toggle) + +mobs:spawn_specfic(name, nodes, neighbors, min_light, max_light, interval, + chance, active_object_count, min_height, max_height, day_toggle, on_spawn) + +These functions register a spawn algorithm for the mob. Without this function +the call the mobs won't spawn. + + 'name' is the name of the animal/monster + 'nodes' is a list of nodenames on that the animal/monster can + spawn on top of + 'neighbors' is a list of nodenames on that the animal/monster will + spawn beside (default is {"air"} for + mobs:register_spawn) + 'max_light' is the maximum of light + 'min_light' is the minimum of light + 'interval' is same as in register_abm() (default is 30 for + mobs:register_spawn) + 'chance' is same as in register_abm() + 'active_object_count' number of this type of mob to spawn at one time inside + map area + 'min_height' is the minimum height the mob can spawn + 'max_height' is the maximum height the mob can spawn + 'day_toggle' true for day spawning, false for night or nil for + anytime + 'on_spawn' is a custom function which runs after mob has spawned + and gives self and pos values. + +A simpler way to handle mob spawns has been added with the mobs:spawn(def) +command which uses above names to make settings clearer: + + mobs:spawn({name = "mobs_monster:tree_monster", + nodes = {"group:leaves"}, + max_light = 7, + }) + + +For each mob that spawns with this function is a field in mobs.spawning_mobs. +It tells if the mob should spawn or not. Default is true. So other mods can +only use the API of this mod by disabling the spawning of the default mobs in +this mod. + + +mobs:spawn_abm_check(pos, node, name) + +This global function can be changed to contain additional checks for mobs to +spawn e.g. mobs that spawn only in specific areas and the like. By returning +true the mob will not spawn. + + 'pos' holds the position of the spawning mob + 'node' contains the node the mob is spawning on top of + 'name' is the name of the animal/monster + + +Making Arrows +------------- + +mobs:register_arrow(name, definition) + +This function registers a arrow for mobs with the attack type shoot. + + 'name' is the name of the arrow + 'definition' is a table with the following values: + 'visual' same is in minetest.register_entity() + 'visual_size' same is in minetest.register_entity() + 'textures' same is in minetest.register_entity() + 'velocity' the velocity of the arrow + 'drop' if set to true any arrows hitting a node will drop as item + 'hit_player' a function that is called when the arrow hits a player; + this function should hurt the player, the parameters are + (self, player) + 'hit_mob' a function that is called when the arrow hits a mob; + this function should hurt the mob, the parameters are + (self, player) + 'hit_node' a function that is called when the arrow hits a node, the + parameters are (self, pos, node) + 'tail' when set to 1 adds a trail or tail to mob arrows + 'tail_texture' texture string used for above effect + 'tail_size' has size for above texture (defaults to between 5 and 10) + 'expire' contains float value for how long tail appears for + (defaults to 0.25) + 'glow' has value for how brightly tail glows 1 to 10 (default is + 0 for no glow) + 'rotate' integer value in degrees to rotate arrow + 'on_step' is a custom function when arrow is active, nil for + default. + 'on_punch' is a custom function when arrow is punched, nil by default + 'collisionbox' is hitbox table for arrow, {0,0,0,0,0,0} by default. + + +Spawn Eggs +---------- + +mobs:register_egg(name, description, background, addegg, no_creative) + +This function registers a spawn egg which can be used by admin to properly spawn in a mob. + + 'name' this is the name of your new mob to spawn e.g. "mob:sheep" + 'description' the name of the new egg you are creating e.g. "Spawn Sheep" + 'background' the texture displayed for the egg in inventory + 'addegg' would you like an egg image in front of your texture (1 = yes, + 0 = no) + 'no_creative' when set to true this stops spawn egg appearing in creative + mode for destructive mobs like Dungeon Masters. + + +Explosion Function +------------------ + +mobs:explosion(pos, radius) -- DEPRECATED!!! use mobs:boom() instead + +mobs:boom(self, pos, radius) + 'self' mob entity + 'pos' centre position of explosion + 'radius' radius of explosion (typically set to 3) + +This function generates an explosion which removes nodes in a specific radius +and damages any entity caught inside the blast radius. Protection will limit +node destruction but not entity damage. + + +Capturing Mobs +-------------- + +mobs:capture_mob(self, clicker, chance_hand, chance_net, chance_lasso, + force_take, replacewith) + +This function is generally called inside the on_rightclick section of the mob +api code, it provides a chance of capturing the mob by hand, using the net or +lasso items, and can also have the player take the mob by force if tamed and +replace with another item entirely. + + 'self' mob information + 'clicker' player information + 'chance_hand' chance of capturing mob by hand (1 to 100) 0 to disable + 'chance_net' chance of capturing mob using net (1 to 100) 0 to disable + 'chance_lasso' chance of capturing mob using magic lasso (1 to 100) 0 to + disable + 'force_take' take mob by force, even if tamed (true or false) + 'replacewith' once captured replace mob with this item instead (overrides + new mob eggs with saved information) + + +Feeding and Taming/Breeding +--------------------------- + +mobs:feed_tame(self, clicker, feed_count, breed, tame) + +This function allows the mob to be fed the item inside self.follow be it apple, +wheat or whatever a set number of times and be tamed or bred as a result. +Will return true when mob is fed with item it likes. + + 'self' mob information + 'clicker' player information + 'feed_count' number of times mob must be fed to tame or breed + 'breed' true or false stating if mob can be bred and a child created + afterwards + 'tame' true or false stating if mob can be tamed so player can pick + them up + + +Protecting Mobs +--------------- + +mobs:protect(self, clicker) + +This function can be used to right-click any tamed mob with mobs:protector item, +this will protect the mob from harm inside of a protected area from other +players. Will return true when mob right-clicked with mobs:protector item. + + 'self' mob information + 'clicker' player information + + +Riding Mobs +----------- + +Mobs can now be ridden by players and the following shows its functions and +usage: + + +mobs:attach(self, player) + +This function attaches a player to the mob so it can be ridden. + + 'self' mob information + 'player' player information + + +mobs:detach(player, offset) + +This function will detach the player currently riding a mob to an offset +position. + + 'player' player information + 'offset' position table containing offset values + + +mobs:drive(self, move_animation, stand_animation, can_fly, dtime) + +This function allows an attached player to move the mob around and animate it at +same time. + + 'self' mob information + 'move_animation' string containing movement animation e.g. "walk" + 'stand_animation' string containing standing animation e.g. "stand" + 'can_fly' if true then jump and sneak controls will allow mob to fly + up and down + 'dtime' tick time used inside drive function + + +mobs:fly(self, dtime, speed, can_shoot, arrow_entity, move_animation, stand_animation) + +This function allows an attached player to fly the mob around using directional +controls. + + 'self' mob information + 'dtime' tick time used inside fly function + 'speed' speed of flight + 'can_shoot' true if mob can fire arrow (sneak and left mouse button + fires) + 'arrow_entity' name of arrow entity used for firing + 'move_animation' string containing name of pre-defined animation e.g. "walk" + or "fly" etc. + 'stand_animation' string containing name of pre-defined animation e.g. + "stand" or "blink" etc. + +Note: animation names above are from the pre-defined animation lists inside mob +registry without extensions. + + +mobs:set_animation(self, name) + +This function sets the current animation for mob, defaulting to "stand" if not +found. + + 'self' mob information + 'name' name of animation + + +Certain variables need to be set before using the above functions: + + 'self.v2' toggle switch used to define below values for the + first time + 'self.max_speed_forward' max speed mob can move forward + 'self.max_speed_reverse' max speed mob can move backwards + 'self.accel' acceleration speed + 'self.terrain_type' integer containing terrain mob can walk on + (1 = water, 2 or 3 = land) + 'self.driver_attach_at' position offset for attaching player to mob + 'self.driver_eye_offset' position offset for attached player view + 'self.driver_scale' sets driver scale for mobs larger than {x=1, y=1} + + +mobs:line_of_sight(self, pos1, pos2, stepsize) + +This function is for use within the mobs definition for special use cases and +returns true if a mob can see the player or victim. + +...'self' mob information + 'pos1' position of mob + 'pos2' position of vistim or player + 'stepsize' usually set to 1 + + +External Settings for "minetest.conf" +------------------------------------ + + 'enable_damage' if true monsters will attack players (default is true) + 'only_peaceful_mobs' if true only animals will spawn in game (default is + false) + 'mobs_disable_blood' if false blood effects appear when mob is hit (default + is false) + 'mobs_spawn_protected' if set to false then mobs will not spawn in protected + areas (default is true) + 'remove_far_mobs' if true then untamed mobs that are outside players + visual range will be removed (default is true) + 'mobname' can change specific mob chance rate (0 to disable) and + spawn number e.g. mobs_animal:cow = 1000,5 + 'mob_difficulty' sets difficulty level (health and hit damage + multiplied by this number), defaults to 1.0. + 'mob_show_health' if false then punching mob will not show health status + (true by default) + 'mob_chance_multiplier' multiplies chance of all mobs spawning and can be set + to 0.5 to have mobs spawn more or 2.0 to spawn less. + e.g. 1 in 7000 * 0.5 = 1 in 3500 so better odds of + spawning. + 'mobs_spawn' if false then mobs no longer spawn without spawner or + spawn egg. + 'mobs_drop_items' when false mobs no longer drop items when they die. + 'mobs_griefing' when false mobs cannot break blocks when using either + pathfinding level 2, replace functions or mobs:boom + function. + +Players can override the spawn chance for each mob registered by adding a line +to their minetest.conf file with a new value, the lower the value the more each +mob will spawn e.g. + +mobs_animal:sheep_chance 11000 +mobs_monster:sand_monster_chance 100 + + +Rideable Horse Example Mob +-------------------------- + +mobs:register_mob("mob_horse:horse", { + type = "animal", + visual = "mesh", + visual_size = {x = 1.20, y = 1.20}, + mesh = "mobs_horse.x", + collisionbox = {-0.4, -0.01, -0.4, 0.4, 1.25, 0.4}, + animation = { + speed_normal = 15, + speed_run = 30, + stand_start = 25, + stand_end = 75, + walk_start = 75, + walk_end = 100, + run_start = 75, + run_end = 100, + }, + textures = { + {"mobs_horse.png"}, + {"mobs_horsepeg.png"}, + {"mobs_horseara.png"} + }, + fear_height = 3, + runaway = true, + fly = false, + walk_chance = 60, + view_range = 5, + follow = {"farming:wheat"}, + passive = true, + hp_min = 12, + hp_max = 16, + armor = 200, + lava_damage = 5, + fall_damage = 5, + water_damage = 1, + makes_footstep_sound = true, + drops = { + {name = "mobs:meat_raw", chance = 1, min = 2, max = 3} + }, + sounds = { + random = "horse_neigh.ogg", + damage = "horse_whinney.ogg", + }, + + do_custom = function(self, dtime) + + -- set needed values if not already present + if not self.v2 then + self.v2 = 0 + self.max_speed_forward = 6 + self.max_speed_reverse = 2 + self.accel = 6 + self.terrain_type = 3 + self.driver_attach_at = {x = 0, y = 20, z = -2} + self.driver_eye_offset = {x = 0, y = 3, z = 0} + self.driver_scale = {x = 1, y = 1} + end + + -- if driver present allow control of horse + if self.driver then + + mobs.drive(self, "walk", "stand", false, dtime) + + return false -- skip rest of mob functions + end + + return true + end, + + on_die = function(self, pos) + + -- drop saddle when horse is killed while riding + -- also detach from horse properly + if self.driver then + minetest.add_item(pos, "mobs:saddle") + mobs.detach(self.driver, {x = 1, y = 0, z = 1}) + end + + end, + + on_rightclick = function(self, clicker) + + -- make sure player is clicking + if not clicker or not clicker:is_player() then + return + end + + -- feed, tame or heal horse + if mobs:feed_tame(self, clicker, 10, true, true) then + return + end + + -- make sure tamed horse is being clicked by owner only + if self.tamed and self.owner == clicker:get_player_name() then + + 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}) + + -- add saddle back to inventory + if inv:room_for_item("main", "mobs:saddle") then + inv:add_item("main", "mobs:saddle") + else + minetest.add_item(clicker.getpos(), "mobs:saddle") + end + + -- attach player to horse + elseif not self.driver + and clicker:get_wielded_item():get_name() == "mobs:saddle" then + + self.object:set_properties({stepheight = 1.1}) + mobs.attach(self, clicker) + + -- take saddle from inventory + inv:remove_item("main", "mobs:saddle") + end + end + + -- used to capture horse with magic lasso + mobs:capture_mob(self, clicker, 0, 0, 80, false, nil) + end +}) diff --git a/mods/flora_fauna/mobs_redo/crafts.lua b/mods/flora_fauna/mobs_redo/crafts.lua new file mode 100644 index 0000000..0460f89 --- /dev/null +++ b/mods/flora_fauna/mobs_redo/crafts.lua @@ -0,0 +1,221 @@ + +local S = mobs.intllib + +-- name tag +minetest.register_craftitem("mobs:nametag", { + description = S("Name Tag"), + inventory_image = "mobs_nametag.png", + groups = {flammable = 2}, +}) + +if minetest.get_modpath("dye") and minetest.get_modpath("farming") then + minetest.register_craft({ + type = "shapeless", + output = "mobs:nametag", + recipe = {"default:paper", "dye:black", "farming:string"}, + }) +end + +-- leather +minetest.register_craftitem("mobs:leather", { + description = S("Leather"), + inventory_image = "mobs_leather.png", + groups = {flammable = 2}, +}) + +-- raw meat +minetest.register_craftitem("mobs:meat_raw", { + description = S("Raw Meat"), + inventory_image = "mobs_meat_raw.png", + on_use = minetest.item_eat(3), + groups = {food_meat_raw = 1, flammable = 2}, +}) + +-- cooked meat +minetest.register_craftitem("mobs:meat", { + description = S("Meat"), + inventory_image = "mobs_meat.png", + on_use = minetest.item_eat(8), + groups = {food_meat = 1, flammable = 2}, +}) + +minetest.register_craft({ + type = "cooking", + output = "mobs:meat", + recipe = "mobs:meat_raw", + cooktime = 5, +}) + +-- lasso +minetest.register_tool("mobs:lasso", { + description = S("Lasso (right-click animal to put in inventory)"), + inventory_image = "mobs_magic_lasso.png", + groups = {flammable = 2}, +}) + +if minetest.get_modpath("farming") then + minetest.register_craft({ + output = "mobs:lasso", + recipe = { + {"farming:string", "", "farming:string"}, + {"", "default:diamond", ""}, + {"farming:string", "", "farming:string"}, + } + }) +end + +minetest.register_alias("mobs:magic_lasso", "mobs:lasso") + +-- net +minetest.register_tool("mobs:net", { + description = S("Net (right-click animal to put in inventory)"), + inventory_image = "mobs_net.png", + groups = {flammable = 2}, +}) + +if minetest.get_modpath("farming") then + minetest.register_craft({ + output = "mobs:net", + recipe = { + {"group:stick", "", "group:stick"}, + {"group:stick", "", "group:stick"}, + {"farming:string", "group:stick", "farming:string"}, + } + }) +end + +-- shears (right click to shear animal) +minetest.register_tool("mobs:shears", { + description = S("Steel Shears (right-click to shear)"), + inventory_image = "mobs_shears.png", + groups = {flammable = 2}, +}) + +minetest.register_craft({ + output = 'mobs:shears', + recipe = { + {'', 'default:steel_ingot', ''}, + {'', 'group:stick', 'default:steel_ingot'}, + } +}) + +-- protection rune +minetest.register_craftitem("mobs:protector", { + description = S("Mob Protection Rune"), + inventory_image = "mobs_protector.png", + groups = {flammable = 2}, +}) + +minetest.register_craft({ + output = "mobs:protector", + recipe = { + {"default:stone", "default:stone", "default:stone"}, + {"default:stone", "default:goldblock", "default:stone"}, + {"default:stone", "default:stone", "default:stone"}, + } +}) + +-- saddle +minetest.register_craftitem("mobs:saddle", { + description = S("Saddle"), + inventory_image = "mobs_saddle.png", + groups = {flammable = 2}, +}) + +minetest.register_craft({ + output = "mobs:saddle", + recipe = { + {"mobs:leather", "mobs:leather", "mobs:leather"}, + {"mobs:leather", "default:steel_ingot", "mobs:leather"}, + {"mobs:leather", "default:steel_ingot", "mobs:leather"}, + } +}) + +-- mob fence (looks like normal fence but collision is 2 high) +default.register_fence("mobs:fence_wood", { + description = S("Mob Fence"), + texture = "default_wood.png", + material = "default:fence_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 1.9, 0.5}, + }, + }, +}) + +-- mob fence top (has enlarged collisionbox to stop mobs getting over) + minetest.register_node("mobs:fence_top", { + description = S("Mob Fence Top"), + drawtype = "nodebox", + tiles = {"default_wood.png"}, + paramtype = "light", + is_ground_content = false, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + node_box = { + type = "fixed", + fixed = {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, + }, + collision_box = { + type = "fixed", + fixed = {-0.4, -1.5, -0.4, 0.4, 0, 0.4}, + }, + selection_box = { + type = "fixed", + fixed = {-0.4, -1.5, -0.4, 0.4, 0, 0.4}, + }, +}) + +minetest.register_craft({ + output = "mobs:fence_top 12", + recipe = { + {"group:wood", "group:wood", "group:wood"}, + {"", "default:fence_wood", ""}, + } +}) + +-- items that can be used as fuel +minetest.register_craft({ + type = "fuel", + recipe = "mobs:nametag", + burntime = 3, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "mobs:lasso", + burntime = 7, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "mobs:net", + burntime = 8, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "mobs:leather", + burntime = 4, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "mobs:saddle", + burntime = 7, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "mobs:fence_wood", + burntime = 7, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "mobs:fence_top", + burntime = 2, +}) diff --git a/mods/flora_fauna/mobs_redo/depends.txt b/mods/flora_fauna/mobs_redo/depends.txt new file mode 100644 index 0000000..2f20802 --- /dev/null +++ b/mods/flora_fauna/mobs_redo/depends.txt @@ -0,0 +1,9 @@ +default +tnt? +dye? +farming? +invisibility? +intllib? +lucky_block? +cmi? +toolranks? diff --git a/mods/flora_fauna/mobs_redo/description.txt b/mods/flora_fauna/mobs_redo/description.txt new file mode 100644 index 0000000..919852a --- /dev/null +++ b/mods/flora_fauna/mobs_redo/description.txt @@ -0,0 +1 @@ +Adds a mob api for mods to add animals or monsters etc. \ No newline at end of file diff --git a/mods/flora_fauna/mobs_redo/init.lua b/mods/flora_fauna/mobs_redo/init.lua new file mode 100644 index 0000000..f63fb16 --- /dev/null +++ b/mods/flora_fauna/mobs_redo/init.lua @@ -0,0 +1,19 @@ + +local path = minetest.get_modpath("mobs") + +-- Mob API +dofile(path .. "/api.lua") + +-- Rideable Mobs +dofile(path .. "/mount.lua") + +-- Mob Items +dofile(path .. "/crafts.lua") + +-- Mob Spawner +dofile(path .. "/spawner.lua") + +-- Lucky Blocks +dofile(path .. "/lucky_block.lua") + +minetest.log("action", "[MOD] Mobs Redo loaded") diff --git a/mods/flora_fauna/mobs_redo/intllib.lua b/mods/flora_fauna/mobs_redo/intllib.lua new file mode 100644 index 0000000..6669d72 --- /dev/null +++ b/mods/flora_fauna/mobs_redo/intllib.lua @@ -0,0 +1,45 @@ + +-- Fallback functions for when `intllib` is not installed. +-- Code released under Unlicense . + +-- Get the latest version of this file at: +-- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua + +local function format(str, ...) + local args = { ... } + local function repl(escape, open, num, close) + if escape == "" then + local replacement = tostring(args[tonumber(num)]) + if open == "" then + replacement = replacement..close + end + return replacement + else + return "@"..open..num..close + end + end + return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl)) +end + +local gettext, ngettext +if minetest.get_modpath("intllib") then + if intllib.make_gettext_pair then + -- New method using gettext. + gettext, ngettext = intllib.make_gettext_pair() + else + -- Old method using text files. + gettext = intllib.Getter() + end +end + +-- Fill in missing functions. + +gettext = gettext or function(msgid, ...) + return format(msgid, ...) +end + +ngettext = ngettext or function(msgid, msgid_plural, n, ...) + return format(n==1 and msgid or msgid_plural, ...) +end + +return gettext, ngettext diff --git a/mods/flora_fauna/mobs_redo/license.txt b/mods/flora_fauna/mobs_redo/license.txt new file mode 100644 index 0000000..fec6f6a --- /dev/null +++ b/mods/flora_fauna/mobs_redo/license.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 TenPlus1 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/mods/flora_fauna/mobs_redo/locale/de_DE.po b/mods/flora_fauna/mobs_redo/locale/de_DE.po new file mode 100644 index 0000000..210990d --- /dev/null +++ b/mods/flora_fauna/mobs_redo/locale/de_DE.po @@ -0,0 +1,131 @@ +# Mobs Redo translation. +# Copyright (C) 2017 TenPlus1 +# This file is distributed under the same license as the mobs package. +# Wuzzy , 2017 +# +msgid "" +msgstr "" +"Project-Id-Version: mobs\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-07-02 16:48+0200\n" +"PO-Revision-Date: 2017-07-02 14:27+0200\n" +"Last-Translator: Wuzzy \n" +"Language-Team: \n" +"Language: de_DE\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.0.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: api.lua +msgid "** Peaceful Mode Active - No Monsters Will Spawn" +msgstr "" + +#: api.lua +msgid "Mob has been protected!" +msgstr "Kreatur wurde geschützt!" + +#: api.lua +msgid "@1 (Tamed)" +msgstr "@1 (Gezähmt)" + +#: api.lua +msgid "Not tamed!" +msgstr "Nicht gezähmt!" + +#: api.lua +msgid "@1 is owner!" +msgstr "@1 ist der Besitzer!" + +#: api.lua +msgid "Missed!" +msgstr "Daneben!" + +#: api.lua +msgid "Already protected!" +msgstr "Bereits geschützt!" + +#: api.lua +msgid "@1 at full health (@2)" +msgstr "@1 bei voller Gesundheit (@2)" + +#: api.lua +msgid "@1 has been tamed!" +msgstr "@1 wurde gezähmt!" + +#: api.lua +msgid "Enter name:" +msgstr "Namen eingeben:" + +#: api.lua +msgid "Rename" +msgstr "Umbenennen" + +#: crafts.lua +msgid "Name Tag" +msgstr "Namensschild" + +#: crafts.lua +msgid "Leather" +msgstr "Leder" + +#: crafts.lua +msgid "Raw Meat" +msgstr "Rohes Fleisch" + +#: crafts.lua +msgid "Meat" +msgstr "Fleisch" + +#: crafts.lua +msgid "Lasso (right-click animal to put in inventory)" +msgstr "Lasso (Rechtsklick auf Tier, um es zu nehmen)" + +#: crafts.lua +msgid "Net (right-click animal to put in inventory)" +msgstr "Netz (Rechtsklick auf Tier, um es zu nehmen)" + +#: crafts.lua +msgid "Steel Shears (right-click to shear)" +msgstr "Stahlschere (Rechtsklick zum Scheren)" + +#: crafts.lua +msgid "Mob Protection Rune" +msgstr "Kreaturschutzrune" + +#: crafts.lua +msgid "Saddle" +msgstr "Sattel" + +#: crafts.lua +msgid "Mob Fence" +msgstr "Kreaturen Zaun" + +#: spawner.lua +msgid "Mob Spawner" +msgstr "Kreaturenspawner" + +#: spawner.lua +msgid "Mob MinLight MaxLight Amount PlayerDist" +msgstr "Kreatur MinLicht MaxLicht Menge SpielerEntfng" + +#: spawner.lua +msgid "Spawner Not Active (enter settings)" +msgstr "Nicht aktiv (Einstellungen eingeben)" + +#: spawner.lua +msgid "Spawner Active (@1)" +msgstr "Spawner aktiv (@1)" + +#: spawner.lua +msgid "Mob Spawner settings failed!" +msgstr "Kreaturenspawner-Einstellungen gescheitert!" + +#: spawner.lua +msgid "" +"Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] " +"distance[1-20] y_offset[-10 to 10]”" +msgstr "" +"Syntax: „name min_licht[0-14] max_licht[0-14] max_mobs_im_gebiet[0 zum " +"Deaktivieren] distanz[1-20] y_versatz[-10 bis 10]“" diff --git a/mods/flora_fauna/mobs_redo/locale/es.po b/mods/flora_fauna/mobs_redo/locale/es.po new file mode 100644 index 0000000..849db66 --- /dev/null +++ b/mods/flora_fauna/mobs_redo/locale/es.po @@ -0,0 +1,128 @@ +# Mobs Redo translation. +# Copyright (C) 2017 TenPlus1 +# This file is distributed under the same license as the mobs package. +# Wuzzy , 2017 +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-07-16 16:48+0200\n" +"PO-Revision-Date: 2017-07-16 16:48+0200\n" +"Last-Translator: Aleks \n" +"Language-Team: \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: api.lua +msgid "** Peaceful Mode Active - No Monsters Will Spawn" +msgstr "" + +#: api.lua +msgid "Mob has been protected!" +msgstr "El mob ha sido protegido!" + +#: api.lua +msgid "@1 (Tamed)" +msgstr "@1 (Domesticado)" + +#: api.lua +msgid "Not tamed!" +msgstr "No domesticado!" + +#: api.lua +msgid "@1 is owner!" +msgstr "@1 es el dueño!" + +#: api.lua +msgid "Missed!" +msgstr "Perdido!" + +#: api.lua +msgid "Already protected!" +msgstr "Ya está protegido!" + +#: api.lua +msgid "@1 at full health (@2)" +msgstr "@1 con salud llena (@2)" + +#: api.lua +msgid "@1 has been tamed!" +msgstr "@1 ha sido domesticado!" + +#: api.lua +msgid "Enter name:" +msgstr "Ingrese nombre:" + +#: api.lua +msgid "Rename" +msgstr "Renombrar" + +#: crafts.lua +msgid "Name Tag" +msgstr "Nombrar etiqueta" + +#: crafts.lua +msgid "Leather" +msgstr "Cuero" + +#: crafts.lua +msgid "Raw Meat" +msgstr "Carne cruda" + +#: crafts.lua +msgid "Meat" +msgstr "Carne" + +#: crafts.lua +msgid "Lasso (right-click animal to put in inventory)" +msgstr "Lazo (click derecho en animal para colocar en inventario)" + +#: crafts.lua +msgid "Net (right-click animal to put in inventory)" +msgstr "Red (click derecho en animal para colocar en inventario)" + +#: crafts.lua +msgid "Steel Shears (right-click to shear)" +msgstr "Tijera de acero (click derecho para esquilar)" + +#: crafts.lua +msgid "Mob Protection Rune" +msgstr "Runa de protección de Mob" + +#: crafts.lua +msgid "Saddle" +msgstr "Montura" + +#: crafts.lua +msgid "Mob Fence" +msgstr "" + +#: spawner.lua +msgid "Mob Spawner" +msgstr "Generador de Mob" + +#: spawner.lua +msgid "Mob MinLight MaxLight Amount PlayerDist" +msgstr "Mob LuzMin LuzMax Cantidad DistJugador" + +#: spawner.lua +msgid "Spawner Not Active (enter settings)" +msgstr "Generador no activo (ingrese config)" + +#: spawner.lua +msgid "Spawner Active (@1)" +msgstr "Generador activo (@1)" + +#: spawner.lua +msgid "Mob Spawner settings failed!" +msgstr "Configuracion de generador de Mob falló!" + +#: spawner.lua +msgid "" +"Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] " +"distance[1-20] y_offset[-10 to 10]”" +msgstr "Sintaxis: “nombre luz_min[0-14] luz_max[0-14] max_mobs_en_area[0 para deshabilitar] " +"distancia[1-20] compensacion[-10 a 10]”" diff --git a/mods/flora_fauna/mobs_redo/locale/fr.po b/mods/flora_fauna/mobs_redo/locale/fr.po new file mode 100644 index 0000000..25b920c --- /dev/null +++ b/mods/flora_fauna/mobs_redo/locale/fr.po @@ -0,0 +1,129 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-07-29 09:13+0200\n" +"PO-Revision-Date: 2017-07-29 09:20+0200\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.12\n" +"Last-Translator: fat115 \n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Language: fr\n" + +#: api.lua +msgid "** Peaceful Mode Active - No Monsters Will Spawn" +msgstr "** Mode pacifique activé - Aucun monstre ne sera généré" + +#: api.lua +msgid "Mob has been protected!" +msgstr "L'animal a été protégé !" + +#: api.lua +msgid "@1 (Tamed)" +msgstr "@1 (apprivoisé)" + +#: api.lua +msgid "Not tamed!" +msgstr "Non-apprivoisé !" + +#: api.lua +msgid "@1 is owner!" +msgstr "Appartient à @1 !" + +#: api.lua +msgid "Missed!" +msgstr "Raté !" + +#: api.lua +msgid "Already protected!" +msgstr "Déjà protégé !" + +#: api.lua +msgid "@1 at full health (@2)" +msgstr "@1 est en pleine forme (@2) " + +#: api.lua +msgid "@1 has been tamed!" +msgstr "@1 a été apprivoisé ! " + +#: api.lua +msgid "Enter name:" +msgstr "Saisissez un nom :" + +#: api.lua +msgid "Rename" +msgstr "Renommer" + +#: crafts.lua +msgid "Name Tag" +msgstr "Étiquette pour collier" + +#: crafts.lua +msgid "Leather" +msgstr "Cuir" + +#: crafts.lua +msgid "Raw Meat" +msgstr "Viande crue" + +#: crafts.lua +msgid "Meat" +msgstr "Viande" + +#: crafts.lua +msgid "Lasso (right-click animal to put in inventory)" +msgstr "Lasso (clic droit sur l'animal pour le mettre dans l'inventaire)" + +#: crafts.lua +msgid "Net (right-click animal to put in inventory)" +msgstr "Filet (clic droit sur l'animal pour le mettre dans l'inventaire)" + +#: crafts.lua +msgid "Steel Shears (right-click to shear)" +msgstr "Ciseaux à laine (clic droit pour tondre)" + +#: crafts.lua +msgid "Mob Protection Rune" +msgstr "Rune de protection des animaux" + +#: crafts.lua +msgid "Saddle" +msgstr "Selle" + +#: crafts.lua +msgid "Mob Fence" +msgstr "Clôture à animaux" + +#: spawner.lua +msgid "Mob Spawner" +msgstr "Générateur de mob" + +#: spawner.lua +msgid "Mob MinLight MaxLight Amount PlayerDist" +msgstr "Mob MinLumière MaxLumière Quantité DistanceJoueur" + +#: spawner.lua +msgid "Spawner Not Active (enter settings)" +msgstr "Générateur non actif (entrez les paramètres)" + +#: spawner.lua +msgid "Spawner Active (@1)" +msgstr "Générateur actif (@1)" + +#: spawner.lua +msgid "Mob Spawner settings failed!" +msgstr "Echec des paramètres du générateur" + +#: spawner.lua +msgid "" +"Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] " +"distance[1-20] y_offset[-10 to 10]”" +msgstr "Syntaxe : “nom min_lumière[0-14] max_lumière[0-14] max_mobs_dans_zone[0 pour désactiver] distance[1-20] décalage_y[-10 à 10]“" diff --git a/mods/flora_fauna/mobs_redo/locale/it.po b/mods/flora_fauna/mobs_redo/locale/it.po new file mode 100644 index 0000000..a439f6d --- /dev/null +++ b/mods/flora_fauna/mobs_redo/locale/it.po @@ -0,0 +1,131 @@ +# ITALIAN LOCALE FILE FOR THE MOBS REDO MODULE +# Copyright (c) 2014 Krupnov Pavel and 2016 TenPlus1 +# This file is distributed under the same license as the MOBS REDO package. +# Hamlet , 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: Italian locale file for the Mobs Redo module\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-07-02 16:48+0200\n" +"PO-Revision-Date: 2017-08-18 12:18+0100\n" +"Last-Translator: H4mlet \n" +"Language-Team: \n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 1.6.10\n" + +#: api.lua +msgid "** Peaceful Mode Active - No Monsters Will Spawn" +msgstr "" + +#: api.lua +msgid "Mob has been protected!" +msgstr "Il mob è stato protetto!" + +#: api.lua +msgid "@1 (Tamed)" +msgstr "@1 (Addomesticat*)" + +#: api.lua +msgid "Not tamed!" +msgstr "Non addomesticat*!" + +#: api.lua +msgid "@1 is owner!" +msgstr "Proprietari* @1!" + +#: api.lua +msgid "Missed!" +msgstr "Mancat*!" + +#: api.lua +msgid "Already protected!" +msgstr "Già protett*!" + +#: api.lua +msgid "@1 at full health (@2)" +msgstr "@1 in piena salute (@2)" + +#: api.lua +msgid "@1 has been tamed!" +msgstr "@1 è stat* addomesticat*!" + +#: api.lua +msgid "Enter name:" +msgstr "Inserire il nome:" + +#: api.lua +msgid "Rename" +msgstr "Rinominare" + +#: crafts.lua +msgid "Name Tag" +msgstr "Targhetta" + +#: crafts.lua +msgid "Leather" +msgstr "Pelle" + +#: crafts.lua +msgid "Raw Meat" +msgstr "Carne cruda" + +#: crafts.lua +msgid "Meat" +msgstr "Carne" + +#: crafts.lua +msgid "Lasso (right-click animal to put in inventory)" +msgstr "Lazo (click di destro per mettere l'animale nell'inventario)" + +#: crafts.lua +msgid "Net (right-click animal to put in inventory)" +msgstr "Rete (click destro per mettere l'animale nell'inventario)" + +#: crafts.lua +msgid "Steel Shears (right-click to shear)" +msgstr "Cesoie d'acciaio (click destro per tosare)" + +#: crafts.lua +msgid "Mob Protection Rune" +msgstr "Runa di protezione per mob" + +#: crafts.lua +msgid "Saddle" +msgstr "Sella" + +#: crafts.lua +msgid "Mob Fence" +msgstr "" + +#: spawner.lua +msgid "Mob Spawner" +msgstr "Generatore di mob" + +#: spawner.lua +msgid "Mob MinLight MaxLight Amount PlayerDist" +msgstr "Mob LuceMin LuceMax Ammontare DistGiocat." + +#: spawner.lua +msgid "Spawner Not Active (enter settings)" +msgstr "Generatore inattivo (inserire le impostazioni)" + +#: spawner.lua +msgid "Spawner Active (@1)" +msgstr "Generatore attivo (@1)" + +#: spawner.lua +msgid "Mob Spawner settings failed!" +msgstr "Impostazioni del generatore di mob fallite!" + +#: spawner.lua +msgid "" +"Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] " +"distance[1-20] y_offset[-10 to 10]”" +msgstr "" +"Sintassi: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 per " +"disabilitare] distance[1-20] y_offset[-10 to 10]”" diff --git a/mods/flora_fauna/mobs_redo/locale/ms.po b/mods/flora_fauna/mobs_redo/locale/ms.po new file mode 100644 index 0000000..a2a31f3 --- /dev/null +++ b/mods/flora_fauna/mobs_redo/locale/ms.po @@ -0,0 +1,131 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-02-05 23:40+0800\n" +"PO-Revision-Date: 2018-02-05 23:51+0800\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.0.6\n" +"Last-Translator: MuhdNurHidayat (MNH48) \n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Language: ms\n" + +#: api.lua +msgid "** Peaceful Mode Active - No Monsters Will Spawn" +msgstr "** Mod Aman Diaktifkan - Tiada Raksasa Akan Muncul" + +#: api.lua +msgid "Mob has been protected!" +msgstr "Mob telah pun dilindungi!" + +#: api.lua +msgid "@1 (Tamed)" +msgstr "@1 (Jinak)" + +#: api.lua +msgid "Not tamed!" +msgstr "Belum dijinakkan!" + +#: api.lua +msgid "@1 is owner!" +msgstr "Ini hak milik @1!" + +#: api.lua +msgid "Missed!" +msgstr "Terlepas!" + +#: api.lua +msgid "Already protected!" +msgstr "Telah dilindungi!" + +#: api.lua +msgid "@1 at full health (@2)" +msgstr "Mata kesihatan @1 telah penuh (@2)" + +#: api.lua +msgid "@1 has been tamed!" +msgstr "@1 telah dijinakkan!" + +#: api.lua +msgid "Enter name:" +msgstr "Masukkan nama:" + +#: api.lua +msgid "Rename" +msgstr "Namakan semula" + +#: crafts.lua +msgid "Name Tag" +msgstr "Tanda Nama" + +#: crafts.lua +msgid "Leather" +msgstr "Kulit" + +#: crafts.lua +msgid "Raw Meat" +msgstr "Daging Mentah" + +#: crafts.lua +msgid "Meat" +msgstr "Daging Bakar" + +#: crafts.lua +msgid "Lasso (right-click animal to put in inventory)" +msgstr "Tanjul (klik-kanan haiwan untuk masukkan ke inventori)" + +#: crafts.lua +msgid "Net (right-click animal to put in inventory)" +msgstr "Jaring (klik-kanan haiwan untuk masukkan ke inventori)" + +#: crafts.lua +msgid "Steel Shears (right-click to shear)" +msgstr "Ketam Keluli (klik-kanan untuk mengetam bulu biri-biri)" + +#: crafts.lua +msgid "Mob Protection Rune" +msgstr "Rune Perlindungan Mob" + +#: crafts.lua +msgid "Saddle" +msgstr "Pelana" + +#: crafts.lua +msgid "Mob Fence" +msgstr "Pagar Mob" + +#: spawner.lua +msgid "Mob Spawner" +msgstr "Pewujud Mob" + +#: spawner.lua +msgid "Mob MinLight MaxLight Amount PlayerDist" +msgstr "Mob CahayaMin CahayaMax Amaun JarakPemain" + +#: spawner.lua +msgid "Spawner Not Active (enter settings)" +msgstr "Pewujud Mob Tidak Aktif (masukkan tetapan)" + +#: spawner.lua +msgid "Spawner Active (@1)" +msgstr "Pewujud Mob Aktif (@1)" + +#: spawner.lua +msgid "Mob Spawner settings failed!" +msgstr "Penetapan Pewujud Mob gagal!" + +#: spawner.lua +msgid "" +"Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] " +"distance[1-20] y_offset[-10 to 10]”" +msgstr "" +"Sintaks: \"nama cahaya_minimum[0-14] cahaya_maksimum[0-14] " +"amaun_mob_maksimum[0 untuk lumpuhkan] jarak[1-20] ketinggian[-10 hingga 10]\"" diff --git a/mods/flora_fauna/mobs_redo/locale/pt.po b/mods/flora_fauna/mobs_redo/locale/pt.po new file mode 100644 index 0000000..b52afd6 --- /dev/null +++ b/mods/flora_fauna/mobs_redo/locale/pt.po @@ -0,0 +1,133 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: mobs\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-07-02 16:48+0200\n" +"PO-Revision-Date: 2017-07-02 14:55+0200\n" +"Last-Translator: Wuzzy \n" +"Language-Team: \n" +"Language: pt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.0.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: api.lua +msgid "** Peaceful Mode Active - No Monsters Will Spawn" +msgstr "" + +#: api.lua +msgid "Mob has been protected!" +msgstr "" + +#: api.lua +msgid "@1 (Tamed)" +msgstr "" + +#: api.lua +msgid "Not tamed!" +msgstr "Indomesticado!" + +#: api.lua +msgid "@1 is owner!" +msgstr "Dono @1!" + +#: api.lua +msgid "Missed!" +msgstr "Faltou!" + +#: api.lua +msgid "Already protected!" +msgstr "" + +#: api.lua +msgid "@1 at full health (@2)" +msgstr "@1 em plena saude (@2)" + +#: api.lua +msgid "@1 has been tamed!" +msgstr "@1 foi domesticado!" + +#: api.lua +msgid "Enter name:" +msgstr "Insira um nome:" + +#: api.lua +msgid "Rename" +msgstr "Renomear" + +#: crafts.lua +msgid "Name Tag" +msgstr "Etiqueta" + +#: crafts.lua +msgid "Leather" +msgstr "Couro" + +#: crafts.lua +msgid "Raw Meat" +msgstr "Carne crua" + +#: crafts.lua +msgid "Meat" +msgstr "Carne" + +#: crafts.lua +#, fuzzy +msgid "Lasso (right-click animal to put in inventory)" +msgstr "Laço (clique-direito no animal para por no inventario)" + +#: crafts.lua +msgid "Net (right-click animal to put in inventory)" +msgstr "Net (clique-direito no animal para por no inventario)" + +#: crafts.lua +msgid "Steel Shears (right-click to shear)" +msgstr "Tesoura de Aço (clique-direito para tosquiar)" + +#: crafts.lua +msgid "Mob Protection Rune" +msgstr "" + +#: crafts.lua +msgid "Saddle" +msgstr "" + +#: crafts.lua +msgid "Mob Fence" +msgstr "" + +#: spawner.lua +msgid "Mob Spawner" +msgstr "Spawnador de Mob" + +#: spawner.lua +msgid "Mob MinLight MaxLight Amount PlayerDist" +msgstr "Mob LuzMinima LuzMaxima Valor DistJogador" + +#: spawner.lua +msgid "Spawner Not Active (enter settings)" +msgstr "Spawnador Inativo (configurar)" + +#: spawner.lua +msgid "Spawner Active (@1)" +msgstr "Spawnador Ativo (@1)" + +#: spawner.lua +msgid "Mob Spawner settings failed!" +msgstr "Configuraçao de Spawnador do Mob falhou!" + +#: spawner.lua +#, fuzzy +msgid "" +"Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] " +"distance[1-20] y_offset[-10 to 10]”" +msgstr "" +"> nome luz_min[0-14] luz_max[0-14] max_mobs_na_area[0 para desabilitar] " +"distancia[1-20] y_offset[-10 a 10]" diff --git a/mods/flora_fauna/mobs_redo/locale/ru.po b/mods/flora_fauna/mobs_redo/locale/ru.po new file mode 100644 index 0000000..6cde7ef --- /dev/null +++ b/mods/flora_fauna/mobs_redo/locale/ru.po @@ -0,0 +1,129 @@ +# Russian translation for the mobs_redo mod. +# Copyright (C) 2018 TenPlus1 +# This file is distributed under the same license as the mobs_redo package. +# Oleg720 , 2017. +# CodeXP , 2018. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-08-13 15:47+0200\n" +"PO-Revision-Date: 2018-03-23 22:22+0100\n" +"Last-Translator: CodeXP \n" +"Language-Team: \n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: api.lua +msgid "** Peaceful Mode Active - No Monsters Will Spawn" +msgstr "** Мирный модус активирован - монстры не спаунятся" + +#: api.lua +msgid "Mob has been protected!" +msgstr "Моб защищен!" + +#: api.lua +msgid "@1 (Tamed)" +msgstr "@1 (Прирученный)" + +#: api.lua +msgid "Not tamed!" +msgstr "Не прирученный" + +#: api.lua +msgid "@1 is owner!" +msgstr "@1 владелец" + +#: api.lua +msgid "Missed!" +msgstr "Промазал!" + +#: api.lua +msgid "Already protected!" +msgstr "Уже защищен!" + +#: api.lua +msgid "@1 at full health (@2)" +msgstr "@1 при полном здоровье (@2)" + +#: api.lua +msgid "@1 has been tamed!" +msgstr "@1 приручен" + +#: api.lua +msgid "Enter name:" +msgstr "Введите имя:" + +#: api.lua +msgid "Rename" +msgstr "Переименовать" + +#: crafts.lua +msgid "Name Tag" +msgstr "Новый тэг" + +#: crafts.lua +msgid "Leather" +msgstr "Кожа" + +#: crafts.lua +msgid "Raw Meat" +msgstr "Сырое мясо" + +#: crafts.lua +msgid "Meat" +msgstr "Мясо" + +#: crafts.lua +msgid "Lasso (right-click animal to put in inventory)" +msgstr "Лассо (Правый клик - положить животное в инвентарь)" + +#: crafts.lua +msgid "Net (right-click animal to put in inventory)" +msgstr "Сеть (Правый клик - положить животное в инвентарь)" + +#: crafts.lua +msgid "Steel Shears (right-click to shear)" +msgstr "Ножницы (Правый клик - подстричь)" + +#: crafts.lua +msgid "Mob Protection Rune" +msgstr "Защитная руна мобов" + +#: crafts.lua +msgid "Saddle" +msgstr "Седло" + +#: crafts.lua +msgid "Mob Fence" +msgstr "Забор от мобов" + +#: spawner.lua +msgid "Mob Spawner" +msgstr "Спаунер моба" + +#: spawner.lua +msgid "Mob MinLight MaxLight Amount PlayerDist" +msgstr "" + +#: spawner.lua +msgid "Spawner Not Active (enter settings)" +msgstr "Спаунер не активен (введите настройки)" + +#: spawner.lua +msgid "Spawner Active (@1)" +msgstr "Активные спаунер (@1)" + +#: spawner.lua +msgid "Mob Spawner settings failed!" +msgstr "Настройки спаунера моба провалились" + +#: spawner.lua +msgid "" +"Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] " +"distance[1-20] y_offset[-10 to 10]”" +msgstr "" diff --git a/mods/flora_fauna/mobs_redo/locale/template.pot b/mods/flora_fauna/mobs_redo/locale/template.pot new file mode 100644 index 0000000..af31440 --- /dev/null +++ b/mods/flora_fauna/mobs_redo/locale/template.pot @@ -0,0 +1,128 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-07-02 16:48+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: api.lua +msgid "** Peaceful Mode Active - No Monsters Will Spawn" +msgstr "" + +#: api.lua +msgid "Mob has been protected!" +msgstr "" + +#: api.lua +msgid "@1 (Tamed)" +msgstr "" + +#: api.lua +msgid "Not tamed!" +msgstr "" + +#: api.lua +msgid "@1 is owner!" +msgstr "" + +#: api.lua +msgid "Missed!" +msgstr "" + +#: api.lua +msgid "Already protected!" +msgstr "" + +#: api.lua +msgid "@1 at full health (@2)" +msgstr "" + +#: api.lua +msgid "@1 has been tamed!" +msgstr "" + +#: api.lua +msgid "Enter name:" +msgstr "" + +#: api.lua +msgid "Rename" +msgstr "" + +#: crafts.lua +msgid "Name Tag" +msgstr "" + +#: crafts.lua +msgid "Leather" +msgstr "" + +#: crafts.lua +msgid "Raw Meat" +msgstr "" + +#: crafts.lua +msgid "Meat" +msgstr "" + +#: crafts.lua +msgid "Lasso (right-click animal to put in inventory)" +msgstr "" + +#: crafts.lua +msgid "Net (right-click animal to put in inventory)" +msgstr "" + +#: crafts.lua +msgid "Steel Shears (right-click to shear)" +msgstr "" + +#: crafts.lua +msgid "Mob Protection Rune" +msgstr "" + +#: crafts.lua +msgid "Saddle" +msgstr "" + +#: crafts.lua +msgid "Mob Fence" +msgstr "" + +#: spawner.lua +msgid "Mob Spawner" +msgstr "" + +#: spawner.lua +msgid "Mob MinLight MaxLight Amount PlayerDist" +msgstr "" + +#: spawner.lua +msgid "Spawner Not Active (enter settings)" +msgstr "" + +#: spawner.lua +msgid "Spawner Active (@1)" +msgstr "" + +#: spawner.lua +msgid "Mob Spawner settings failed!" +msgstr "" + +#: spawner.lua +msgid "" +"Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] " +"distance[1-20] y_offset[-10 to 10]”" +msgstr "" diff --git a/mods/flora_fauna/mobs_redo/locale/tr.po b/mods/flora_fauna/mobs_redo/locale/tr.po new file mode 100644 index 0000000..10688e2 --- /dev/null +++ b/mods/flora_fauna/mobs_redo/locale/tr.po @@ -0,0 +1,133 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: mobs\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-07-02 16:48+0200\n" +"PO-Revision-Date: 2017-07-02 14:56+0200\n" +"Last-Translator: Wuzzy \n" +"Language-Team: \n" +"Language: tr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.0.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: api.lua +msgid "** Peaceful Mode Active - No Monsters Will Spawn" +msgstr "" + +#: api.lua +msgid "Mob has been protected!" +msgstr "" + +#: api.lua +msgid "@1 (Tamed)" +msgstr "" + +#: api.lua +msgid "Not tamed!" +msgstr "Evcil değil!" + +#: api.lua +msgid "@1 is owner!" +msgstr "Sahibi @1!" + +#: api.lua +msgid "Missed!" +msgstr "Kaçırdın!" + +#: api.lua +msgid "Already protected!" +msgstr "" + +#: api.lua +msgid "@1 at full health (@2)" +msgstr "@1 tam canında (@2)" + +#: api.lua +msgid "@1 has been tamed!" +msgstr "@1 tamamen evcilleştirilmiştir!" + +#: api.lua +msgid "Enter name:" +msgstr "İsim gir:" + +#: api.lua +msgid "Rename" +msgstr "Yeniden adlandır" + +#: crafts.lua +msgid "Name Tag" +msgstr "İsim etiketi" + +#: crafts.lua +msgid "Leather" +msgstr "Deri" + +#: crafts.lua +msgid "Raw Meat" +msgstr "Çiğ et" + +#: crafts.lua +msgid "Meat" +msgstr "Et" + +#: crafts.lua +#, fuzzy +msgid "Lasso (right-click animal to put in inventory)" +msgstr "Kement (hayvana sağ tıklayarak envantere koy)" + +#: crafts.lua +msgid "Net (right-click animal to put in inventory)" +msgstr "Ağ (hayvana sağ tıklayarak envantere koy)" + +#: crafts.lua +msgid "Steel Shears (right-click to shear)" +msgstr "Çelik makas (sağ tıklayarak kes)" + +#: crafts.lua +msgid "Mob Protection Rune" +msgstr "" + +#: crafts.lua +msgid "Saddle" +msgstr "" + +#: crafts.lua +msgid "Mob Fence" +msgstr "Canavar Yaratıcı" + +#: spawner.lua +msgid "Mob Spawner" +msgstr "Canavar Yaratıcı" + +#: spawner.lua +msgid "Mob MinLight MaxLight Amount PlayerDist" +msgstr "Mob MinIşık MaxIşık Miktar OyuncuMesafesi" + +#: spawner.lua +msgid "Spawner Not Active (enter settings)" +msgstr "Yaratıcı aktif değil (ayarlara gir)" + +#: spawner.lua +msgid "Spawner Active (@1)" +msgstr "Yaratıcı aktif (@1)" + +#: spawner.lua +msgid "Mob Spawner settings failed!" +msgstr "Yaratıcı ayarları uygulanamadı." + +#: spawner.lua +#, fuzzy +msgid "" +"Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] " +"distance[1-20] y_offset[-10 to 10]”" +msgstr "" +"> isim min_isik[0-14] max_isik[0-14] alandaki_max_canavar_sayisi[kapatmak " +"icin 0] mesafe[1-20] y_cikinti[-10 ve 10 arası]" diff --git a/mods/flora_fauna/mobs_redo/lucky_block.lua b/mods/flora_fauna/mobs_redo/lucky_block.lua new file mode 100644 index 0000000..ef7d59c --- /dev/null +++ b/mods/flora_fauna/mobs_redo/lucky_block.lua @@ -0,0 +1,18 @@ + +if minetest.get_modpath("lucky_block") then + + lucky_block:add_blocks({ + {"dro", {"mobs:meat_raw"}, 5}, + {"dro", {"mobs:meat"}, 5}, + {"dro", {"mobs:nametag"}, 1}, + {"dro", {"mobs:leather"}, 5}, + {"dro", {"default:stick"}, 10}, + {"dro", {"mobs:net"}, 1}, + {"dro", {"mobs:lasso"}, 1}, + {"dro", {"mobs:shears"}, 1}, + {"dro", {"mobs:protector"}, 1}, + {"dro", {"mobs:fence_wood"}, 10}, + {"dro", {"mobs:fence_top"}, 12}, + {"lig"}, + }) +end diff --git a/mods/flora_fauna/mobs_redo/mod.conf b/mods/flora_fauna/mobs_redo/mod.conf new file mode 100644 index 0000000..f3a3ad7 --- /dev/null +++ b/mods/flora_fauna/mobs_redo/mod.conf @@ -0,0 +1 @@ +name = mobs diff --git a/mods/flora_fauna/mobs_redo/mount.lua b/mods/flora_fauna/mobs_redo/mount.lua new file mode 100644 index 0000000..d1f5841 --- /dev/null +++ b/mods/flora_fauna/mobs_redo/mount.lua @@ -0,0 +1,448 @@ + +-- lib_mount by Blert2112 (edited by TenPlus1) + +local enable_crash = false +local crash_threshold = 6.5 -- ignored if enable_crash=false + +------------------------------------------------------------------------------ + +-- +-- Helper functions +-- + +local node_ok = function(pos, fallback) + + fallback = fallback or mobs.fallback_node + + 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() + default.player_attached[player:get_player_name()] = false + player:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) + default.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) + default.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() + default.player_set_animation(player, "sit" , 30) + end) + + --player:set_look_yaw(entity.object:get_yaw() - rot_view) + player:set_look_horizontal(entity.object:get_yaw() - rot_view) +end + + +function mobs.detach(player, offset) + + force_detach(player) + + default.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} + + minetest.after(0.1, function() + player:set_pos(pos) + end) +end + + +function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) + + local rot_steer, rot_view = math.pi/2, 0 + + if entity.player_rotation.y == 90 then + rot_steer, rot_view = 0, 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 + +--print ("---velo", get_v(velo)) + + local ctrl = entity.driver:get_player_control() + + -- move forwards + if ctrl.up then + + entity.v = entity.v + entity.accel / 10 + + -- move backwards + elseif ctrl.down then + + if entity.max_speed_reverse == 0 and entity.v == 0 then + return + end + + entity.v = entity.v - entity.accel / 10 + end + + -- fix mob rotation + entity.object:set_yaw(entity.driver:get_look_horizontal() - entity.rotate) + + 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 + + if velo.y == 0 then + velo.y = velo.y + entity.jump_height + acce_y = acce_y + (acce_y * 3) + 1 + end + end + + end + end + + -- if not moving then set animation and return + if entity.v == 0 and velo.x == 0 and velo.y == 0 and velo.z == 0 then + + if stand_anim then + mobs:set_animation(entity, stand_anim) + end + + return + end + + -- set moving animation + if moving_anim then + mobs:set_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 = {x = 0, y = 0, z = 0} + 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 + }) + + 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 + +--print("----------- crash", intensity) + + 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) + + 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 + local rot_steer, rot_view = math.pi / 2, 0 + + if entity.player_rotation.y == 90 then + rot_steer, rot_view = 0, math.pi / 2 + end + + 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_animation(entity, stand_anim) + else + -- moving animation + mobs:set_animation(entity, moving_anim) + end +end diff --git a/mods/flora_fauna/mobs_redo/readme.MD b/mods/flora_fauna/mobs_redo/readme.MD new file mode 100644 index 0000000..5066d82 --- /dev/null +++ b/mods/flora_fauna/mobs_redo/readme.MD @@ -0,0 +1,83 @@ + +MOBS REDO for MINETEST + +Built from PilzAdam's original Simple Mobs with additional mobs by KrupnoPavel, Zeg9, ExeterDad and AspireMint. + + +This mod contains the API only for adding your own mobs into the world, so please use the additional modpacks to add animals, monsters etc. + + +https://forum.minetest.net/viewtopic.php?f=11&t=9917 + + +Crafts: + + - Nametag (paper, black dye, string) can be used right-click on a tamed mob to give them a name. + - Nets can be used to right-click tamed mobs to pick them up and place inside inventory as a spawn egg. + - Magic Lasso is similar to nets but with a better chance of picking up larger mobs. + - Shears are used to right-click sheep and return 1-3 wool. + - Protection Rune lets you protect tamed mobs from harm by other players + - Mob Fence and Fence Top (to stop mobs escaping/glitching through fences) + +Lucky Blocks: 9 + + +Changelog: +- 1.47- Mob damage changes, min and max light level for damage added, ignition sources checked for lava damage +- 1.46- Mobs only drop rare items when killed by player (drops.min = 0 makes them rare), code tweak, pathfinding no longer sees through walkable nodes +- 1.45- Added Fence Top to add on top of any fence to stop mobs escaping, new line_of_sight tweaked by Astrobe +- 1.44- Added ToolRanks support for swords when attacking mobs +- 1.43- Better 0.4.16 compatibility, added general attack function and settings +- 1.42- Added "all" option to immune_to table, tidied floating mobs to be less intensive +- 1.41- Mob pathfinding has been updated thanks to Elkien3 +- 1.40- Updated to use newer functions, requires Minetest 0.4.16+ to work. +- 1.39- Added 'on_breed', 'on_grown' and 'do_punch' custom functions per mob +- 1.38- Better entity checking, nametag setting and on_spawn function added to mob registry, tweaked light damage +- 1.37- Added support for Raymoo's CMI (common mob interface) mod: https://forum.minetest.net/viewtopic.php?f=9&t=15448 +- 1.36- Death check added, if mob dies in fire/lava/with lava pick then drops are cooked +- 1.35- Added owner_loyal flag for owned mobs to attack player enemies, also fixed group_attack +- 1.34- Added function to fly mob using directional movement (thanks D00Med for flying code) +- 1.33- Added functions to mount ride mobs (mobs.attach, mobs.detach, mobs.drive) many thanks to Blert2112 +- 1.32- Added new spawn check to count specific mobs AND new minetest.conf setting to chance spawn chance and numbers, added ability to protect tamed mobs +- 1.31- Added 'attack_animals' and 'specific_attack' flags for custom monster attacks, also 'mob_difficulty' .conf setting to make mobs harder. +- 1.30- Added support for invisibility mod (mobs cant attack what they cant see), tweaked and tidied code +- 1.29- Split original Mobs Redo into a modpack to make it easier to disable mob sets (animal, monster, npc) or simply use the Api itself for your own mod +- 1.28- New damage system added with ability for mob to be immune to weapons or healed by them :) +- 1.27- Added new sheep, lava flan and spawn egg textures. New Lava Pick tool smelts what you dig. New atan checking function. +- 1.26- Pathfinding feature added thanks to rnd, when monsters attack they become scary smart in finding you :) also, beehive produces honey now :) +- 1.25- Mobs no longer spawn within 12 blocks of player or despawn within same range, spawners now have player detection, Code tidy and tweak. +- 1.24- Added feature where certain animals run away when punched (runaway = true in mob definition) +- 1.23- Added mob spawner block for admin to setup spawners in-game (place and right click to enter settings) +- 1.22- Added ability to name tamed animals and npc using nametags, also npc will attack anyone who punches them apart from owner +- 1.21- Added some more error checking to reduce serialize.h error and added height checks for falling off cliffs (thanks cmdskp) +- 1.20- Error checking added to remove bad mobs, out of map limit mobs and stop serialize.h error +- 1.19- Chickens now drop egg items instead of placing the egg, also throwing eggs result in 1/8 chance of spawning chick +- 1.18- Added docile_by_day flag so that monsters will not attack automatically during daylight hours unless hit first +- 1.17- Added 'dogshoot' attack type, shoots when out of reach, melee attack when in reach, also api tweaks and self.reach added +- 1.16- Mobs follow multiple items now, Npc's can breed +- 1.15- Added Feeding/Taming/Breeding function, right-click to pick up any sheep with X mark on them and replace with new one to fix compatibility. +- 1.14- All .self variables saved in staticdata, Fixed self.health bug +- 1.13- Added capture function (thanks blert2112) chance of picking up mob with hand; net; magic lasso, replaced some .x models with newer .b3d one's +- 1.12- Added animal ownership so that players cannot steal your tamed animals +- 1.11- Added flying mobs (and swimming), fly=true and fly_in="air" or "deafult:water_source" for fishy +- 1,10- Footstep removed (use replace), explosion routine added for exploding mobs. +- 1.09- reworked breeding routine, added mob rotation value, added footstep feature, added jumping mobs with sounds feature, added magic lasso for picking up animals +- 1.08- Mob throwing attack has been rehauled so that they can damage one another, also drops and on_die function added +- 1.07- Npc's can now be set to follow player or stand by using self.order and self.owner variables +- beta- Npc mob added, kills monsters, attacks player when punched, right click with food to heal or gold lump for drop +- 1.06- Changed recovery times after breeding, and time taken to grow up (can be sped up by feeding baby animal) +- 1.05- Added ExeterDad's bunny's which can be picked up and tamed with 4 carrots from farming redo or farming_plus, also shears added to get wool from sheep and lastly Jordach/BSD's kitten +- 1.04- Added mating for sheep, cows and hogs... feed animals to make horny and hope for a baby which is half size, will grow up quick though :) +- 1.03- Added mob drop/replace feature so that chickens can drop eggs, cow/sheep can eat grass/wheat etc. +- 1.02- Sheared sheep are remembered and spawn shaven, Warthogs will attack when threatened, Api additions +- 1.01- Mobs that suffer fall damage or die in water/lava/sunlight will now drop items +- 1.0 - more work on Api so that certain mobs can float in water while some sink like a brick :) +- 0.9 - Spawn eggs added for all mobs (admin only, cannot be placed in protected areas)... Api tweaked +- 0.8 - Added sounds to monster mobs (thanks Cyberpangolin for the sfx) and also chicken sound +- 0.7 - mobs.protected switch added to api.lua, when set to 1 mobs no longer spawn in protected areas, also bug fixes +- 0.6 - Api now supports multi-textured mobs, e.g oerkki, dungeon master, rats and chickens have random skins when spawning (sheep fix TODO), also new Honey block +- 0.5 - Mobs now float in water, die from falling, and some code improvements +- 0.4 - Dungeon Masters and Mese Monsters have much better aim due to shoot_offset, also they can both shoot through nodes that aren't walkable (flowers, grass etc) plus new sheep sound :) +- 0.3 - Added LOTT's Spider mob, made Cobwebs, added KPavel's Bee with Honey and Beehives (made texture), Warthogs now have sound and can be tamed, taming of shaved sheep or milked cow with 8 wheat so it will not despawn, many bug fixes :) +- 0.2 - Cooking bucket of milk into cheese now returns empty bucket +- 0.1 - Initial Release diff --git a/mods/flora_fauna/mobs_redo/settingtypes.txt b/mods/flora_fauna/mobs_redo/settingtypes.txt new file mode 100644 index 0000000..0821437 --- /dev/null +++ b/mods/flora_fauna/mobs_redo/settingtypes.txt @@ -0,0 +1,29 @@ +# If false then mobs no longer spawn in world without spawner or spawn egg +mobs_spawn (Spawn Mobs) bool true + +# If enabled then monsters no longer spawn in world +only_peaceful_mobs (Only spawn peaceful Mobs) bool false + +# If enabled then punching mobs no longer shows blood effects +mobs_disable_blood (Disable Mob blood) bool false + +# If disabled then Mobs no longer destroy world blocks +mobs_griefing (Griefing Mobs) bool true + +# If false then Mobs no longer spawn inside player protected areas +mobs_spawn_protected (Spawn Mobs in protected areas) bool true + +# If true Mobs will be removed once a map chunk is out of view +remove_far_mobs (Remove far Mobs) bool true + +# Sets Mob difficulty level by multiplying punch damage +mob_difficulty (Mob difficulty) float 1.0 + +# If disabled health status no longer appears above Mob when punched +mob_show_health (Show Mob health) bool true + +# Contains a value used to multiply Mob spawn values +mob_chance_multiplier (Mob chance multiplier) float 1.0 + +# When false Mob no longer drop items when killed +mobs_drop_items (Mob drops) bool true diff --git a/mods/flora_fauna/mobs_redo/sounds/default_punch.ogg b/mods/flora_fauna/mobs_redo/sounds/default_punch.ogg new file mode 100644 index 0000000000000000000000000000000000000000..28a500bf5759c8bb16ea780d100c8bbf1a7a2609 GIT binary patch literal 5946 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 q_rlfhT4(FDGv+6T(tLS3{&=iPU+J3hm^= 0 and num <= 10 + and mlig and mlig >= 0 and mlig <= 15 + and xlig and xlig >= 0 and xlig <= 15 + and pla and pla >=0 and pla <= 20 + and yof and yof > -10 and yof < 10 then + + meta:set_string("command", fields.text) + meta:set_string("infotext", S("Spawner Active (@1)", mob)) + + else + minetest.chat_send_player(name, S("Mob Spawner settings failed!")) + minetest.chat_send_player(name, + S("Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] distance[1-20] y_offset[-10 to 10]”")) + end + end, +}) + + +local max_per_block = tonumber(minetest.settings:get("max_objects_per_block") or 99) + +-- spawner abm +minetest.register_abm({ + label = "Mob spawner node", + nodenames = {"mobs:spawner"}, + interval = 10, + chance = 4, + catch_up = false, + + action = function(pos, node, active_object_count, active_object_count_wider) + + -- return if too many entities already + if active_object_count_wider >= max_per_block then + return + end + + -- get meta and command + local meta = minetest.get_meta(pos) + local comm = meta:get_string("command"):split(" ") + + -- get settings from command + local mob = comm[1] + local mlig = tonumber(comm[2]) + local xlig = tonumber(comm[3]) + local num = tonumber(comm[4]) + local pla = tonumber(comm[5]) or 0 + local yof = tonumber(comm[6]) or 0 + + -- if amount is 0 then do nothing + if num == 0 then + return + end + + -- are we spawning a registered mob? + if not mobs.spawning_mobs[mob] then + --print ("--- mob doesn't exist", mob) + return + end + + -- check objects inside 9x9 area around spawner + local objs = minetest.get_objects_inside_radius(pos, 9) + local count = 0 + local ent = nil + + -- count mob objects of same type in area + for k, obj in ipairs(objs) do + + ent = obj:get_luaentity() + + if ent and ent.name and ent.name == mob then + count = count + 1 + end + end + + -- is there too many of same type? + if count >= num then + return + end + + -- spawn mob if player detected and in range + if pla > 0 then + + local in_range = 0 + local objs = minetest.get_objects_inside_radius(pos, pla) + + for _,oir in pairs(objs) do + + if oir:is_player() then + + in_range = 1 + + break + end + end + + -- player not found + if in_range == 0 then + return + end + end + + -- find air blocks within 5 nodes of spawner + local air = minetest.find_nodes_in_area( + {x = pos.x - 5, y = pos.y + yof, z = pos.z - 5}, + {x = pos.x + 5, y = pos.y + yof, z = pos.z + 5}, + {"air"}) + + -- spawn in random air block + if air and #air > 0 then + + local pos2 = air[math.random(#air)] + local lig = minetest.get_node_light(pos2) or 0 + + pos2.y = pos2.y + 0.5 + + -- only if light levels are within range + if lig >= mlig and lig <= xlig + and minetest.registered_entities[mob] then + minetest.add_entity(pos2, mob) + end + end + + end +}) diff --git a/mods/flora_fauna/mobs_redo/textures/mob_spawner.png b/mods/flora_fauna/mobs_redo/textures/mob_spawner.png new file mode 100644 index 0000000000000000000000000000000000000000..8f0ac39b711f0b8919b945696cc73b4015f8329f GIT binary patch literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;TYyi9E09+5%h?i;vJ=Q+ED7=p zW^j0RBMrzA@pN$v;kcgszopr0BYSC AegFUf literal 0 HcmV?d00001 diff --git a/mods/flora_fauna/mobs_redo/textures/mobs_blood.png b/mods/flora_fauna/mobs_redo/textures/mobs_blood.png new file mode 100644 index 0000000000000000000000000000000000000000..77cfbdaa665922472018ffd016e7a47c974e6bf5 GIT binary patch literal 267 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4&HECyrsn$JLrv%n*= zn1O*?7=#%aX3dcR3bL1Y`ns~;V-*l#XF68-IUFb?S>hT|;+&tGo0?a`;9QiNSdyBe zP@Y+mq2TW68xY>eCk|9p?CIhdVsU!wWN*F(0}fVpzOeIp;)i?nt~kXd=NwvPBT@I^ z`)$SD_5YRF3_|ya?$bSJv37BxYPI+g?T<4qoM6#^erD3SrIE87pG`RweterrYcywC zi% literal 0 HcmV?d00001 diff --git a/mods/flora_fauna/mobs_redo/textures/mobs_chicken_egg.png b/mods/flora_fauna/mobs_redo/textures/mobs_chicken_egg.png new file mode 100644 index 0000000000000000000000000000000000000000..be8a4e1cf58a4b72abec094ddfb36cef4f2e914a GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!aez;Vs|5o?Y8+9EttD(#nNp%w(dW;@5HI&7cQN@a_#c1J2&s%zw_wH!{;xbwJ=ZW1Zrn23GxeO zaCmkj4aiCJba4!kxIDMdQ>ev&gMqV0O^5N{|0qk9#c@xs`HHh1c&=EZ?5kF_VQ2dX z*}pc%Z^crMCjK!u>0bUy?8(HJs}9MAKM+(ia?5|+5~^^jmQ%rW?cd66wIv4P^41Iv iGVWjBeze}!E53Xi^Py?0mhA@G$l&Sf=d#Wzp$PyGxL^_h literal 0 HcmV?d00001 diff --git a/mods/flora_fauna/mobs_redo/textures/mobs_chicken_egg_overlay.png b/mods/flora_fauna/mobs_redo/textures/mobs_chicken_egg_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..e81716a5964b14a0e5c309df5842a36679ecff97 GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;TYyi9E0F&G|NqjP^X~##j3q&S z!3+-1Zlr-YN#5=*3>~bp9zYIffk$L90|U1(2s1Lwnj--eWH0gbb!C6R%q*rWdxfd@ z1yIPy)5S4_<9c#J1LH9^wr?zKbF;n~&J`1RTu_VYZn8D%MjWi%9*3-o?gyVX0f&)Xc#9Px3blo()qRMfG!R$5q6 oNomWAq=2A+(1u&5j~rlNxTec@{eZvcT%bh^p00i_>zopr04TRP?f?J) literal 0 HcmV?d00001 diff --git a/mods/flora_fauna/mobs_redo/textures/mobs_magic_lasso.png b/mods/flora_fauna/mobs_redo/textures/mobs_magic_lasso.png new file mode 100644 index 0000000000000000000000000000000000000000..befdc1120684c7281b1edb8129b302e9beb402b5 GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHV5AX?b6=Yxt^*32FFY4T(w)@vs zl%$(^0;L#Bg8YIR9G=}s19JR5T^vI=u7~zsQL70(Y)*K0-AbW|YuPgfaiF4ao-U3d7N?g^vdubdAacB(E6(QR4TXEx zF3u`ia7TIh3qvMb2mT4lB^n}c3}^mM5hQPNZ2d{j?b$^|R^^`s``T-BW~*s_Ph^k?jTf@q@XleX_U!(d zpRd@|Zl2A&s!G1?iq6}AB6~a*yo!|BkbKYbgOcN0+vUaXZ*7(MqNi+ru+{L@!kfR; xcc<9y}xJr}&S1jg>4r#17hce+c-?XfU(#Xu8o%U0?_>c)I$ztaD0e0svFmpH=_> literal 0 HcmV?d00001 diff --git a/mods/flora_fauna/mobs_redo/textures/mobs_meat_raw.png b/mods/flora_fauna/mobs_redo/textures/mobs_meat_raw.png new file mode 100644 index 0000000000000000000000000000000000000000..0dea4ec5404cccc8820d90a5d3e1513b150d6056 GIT binary patch literal 426 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6U4S$Y z{B+)352QE?JR*x37`TN&n2}-D90{Nxdx@v7EBkF8NoF4Dim2{~Kq1Kz*N775{M_8s zyb=cIqSVBa)D(sC%#sWRcTeAd@J2pypjE7%E{-7kqh6PFiLxlUdNbJa48$*Oi5{r(a(v5$LiYP)9NG@bmxw?^k=dL`2Um z7D`(3L9XHYs-Ty*(|Bvn7jqg0W$_-^y6)wi$>%H?Ph7j=z4qj}=kXQ0mwuQRa9!ly zV+NO$Z<%YS9+UWKBa`yyo`mvtfhC4+QQ4}|!Ou&Sj&L~ayU+aLqIF^D(kn57*3X|* zZ-2bB{l4CGMxU(=1+mM;WL2Inv0!UI8}o0kIGf3TAIE5{BIN89Ry&ac@UkDfQywAE(< Ph8lyXtDnm{r-UW|E48P= literal 0 HcmV?d00001 diff --git a/mods/flora_fauna/mobs_redo/textures/mobs_nametag.png b/mods/flora_fauna/mobs_redo/textures/mobs_nametag.png new file mode 100644 index 0000000000000000000000000000000000000000..74005b3a25a37186a5e2f69cd6cc11f38f206a7f GIT binary patch literal 247 zcmVkf0oG*>Bzpoo zX%)nulCl`QF0%k^u}u-YR(8+d1{$=K$KXk;psEi8h_^^@uz$K?1dwkn`~@fN!5$nH x#9$|ww303PCpZ}5q!ryT`V*Iw9halu`2mf%NGNDlp0@x1002ovPDHLkV1h%cUM>It literal 0 HcmV?d00001 diff --git a/mods/flora_fauna/mobs_redo/textures/mobs_net.png b/mods/flora_fauna/mobs_redo/textures/mobs_net.png new file mode 100644 index 0000000000000000000000000000000000000000..df7c3a61f531d9fb3b5a2a8bfd72c2f7a3e3c69f GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^4e$wZWnj=u6yxxy(FqQ=Q1v5B2yO9Ru#CW{FIq2sZu;qT;#_8q@+w>6|b p{>-jn*&9=KMziu6f5Dzg<{~zJ50m?<|AF=}c)I$ztaD0e0sw}5K|cTh literal 0 HcmV?d00001 diff --git a/mods/flora_fauna/mobs_redo/textures/mobs_noentry_particle.png b/mods/flora_fauna/mobs_redo/textures/mobs_noentry_particle.png new file mode 100644 index 0000000000000000000000000000000000000000..87938ff444bea88add05585ec1a9581c6cb37134 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|t_%$6*}}^6_yrY|70Q8v zj3q&S!3+-1ZlnP@UY;(FAsp9L&n#qYFyLW0xL!e8VOFLU6BF~SuC!S^f-c*ZG+2J; zf6aGvlj8T6EA$&#o9Bh-Web1pJhCKZX)^ob%tf=0%&%=O|H|;KROr@hv-{tGrZRZC L`njxgN@xNAOJ+1n literal 0 HcmV?d00001 diff --git a/mods/flora_fauna/mobs_redo/textures/mobs_protect_particle.png b/mods/flora_fauna/mobs_redo/textures/mobs_protect_particle.png new file mode 100644 index 0000000000000000000000000000000000000000..debe20cb1a8aef3a014bed8f12168abbaa72c48f GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CN$P6S4_x+OrQfvV}A+A9B|Ns9>Z_d99WHFWm z`2{mLJiCzwP>Qi6$S;_|;n|HeAjjF$#W95AdUApTLs~K;NA8j(9BGEymYSM}B)k+9l~u(h z4xi*ak`NYD6x3)qWsXRqQkQ{gSH>;{o|cnMO-)Q5c?=9cFLJ$DmQ+{;G>*a3)z4*} HQ$iB}$7V2G literal 0 HcmV?d00001 diff --git a/mods/flora_fauna/mobs_redo/textures/mobs_saddle.png b/mods/flora_fauna/mobs_redo/textures/mobs_saddle.png new file mode 100644 index 0000000000000000000000000000000000000000..e9d42f82e3fa7d2e840f74430bf6d6fa6d8e022e GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^3h)VW1=41Qdfxi-b^b;>c+39^ToS5nGi|=UbV0dp*0INP zuFe+i_*k%)OOWlB*S15}RWmJAqcd7L4kf(5nzopr0AoZ@-v9sr literal 0 HcmV?d00001 diff --git a/mods/flora_fauna/mobs_redo/textures/tnt_smoke.png b/mods/flora_fauna/mobs_redo/textures/tnt_smoke.png new file mode 100644 index 0000000000000000000000000000000000000000..488b50fe958d33fa4cd50fa383a4685db045def5 GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^Fw4`$F~s6@a>4>ti^@+=>QiQE7$hEQ`G3RY@DXvHh=$u6+S=Ge zd|6pp|9|XU+`ubsmaui^1PiVPOaAGbFCN{bP0l+XkK@H9k* literal 0 HcmV?d00001 diff --git a/mods/flora_fauna/mobs_water/mobs_crocs/init.lua b/mods/flora_fauna/mobs_water/mobs_crocs/init.lua index 7967786..ef3fb07 100644 --- a/mods/flora_fauna/mobs_water/mobs_crocs/init.lua +++ b/mods/flora_fauna/mobs_water/mobs_crocs/init.lua @@ -123,7 +123,7 @@ if mobs.mod and mobs.mod == "redo" then visual_size = {x=2, y=2}, sounds = l_sounds, fly = true, - fly_in = "default:water_source", + fly_in = "default:river_water_source", drops = { {name = "mobs:meat_raw", chance = 1, min = 1, max = 3}, {name = "mobs:leather", chance = 1, min = 1, max = 2}, diff --git a/mods/map/dfcaverns/biomes.lua b/mods/map/dfcaverns/biomes.lua index 0f968de..323a5d8 100644 --- a/mods/map/dfcaverns/biomes.lua +++ b/mods/map/dfcaverns/biomes.lua @@ -79,53 +79,71 @@ subterrane:override_biome({ subterrane:register_cave_decor(-113, dfcaverns.config.ymax) -subterrane:register_cave_layer({ - minimum_depth = dfcaverns.config.ymax, - maximum_depth = dfcaverns.config.level1_min, - cave_threshold = dfcaverns.config.cavern_threshold, - perlin_cave = perlin_cave, - perlin_wave = perlin_wave, - columns = { - maximum_radius = 10, - minimum_radius = 4, - node = c_wet_flowstone, - weight = 0.25, - maximum_count = 20, - minimum_count = 0, - }, -}) - -subterrane:register_cave_layer({ - minimum_depth = dfcaverns.config.level1_min, - maximum_depth = dfcaverns.config.level2_min, - cave_threshold = dfcaverns.config.cavern_threshold, - perlin_cave = perlin_cave, - perlin_wave = perlin_wave, - columns = { - maximum_radius = 15, - minimum_radius = 4, - node = c_wet_flowstone, - weight = 0.25, - maximum_count = 30, - minimum_count = 5, - }, -}) - -subterrane:register_cave_layer({ - minimum_depth = dfcaverns.config.level2_min, - maximum_depth = dfcaverns.config.level3_min, - cave_threshold = dfcaverns.config.cavern_threshold, - perlin_cave = perlin_cave, - perlin_wave = perlin_wave, - columns = { - maximum_radius = 20, - minimum_radius = 5, - node = c_wet_flowstone, - weight = 0.25, - maximum_count = 50, - minimum_count = 10, - }, -}) +if dfcaverns.config.stone_between_layers then + subterrane:register_cave_layer({ + minimum_depth = dfcaverns.config.ymax, + maximum_depth = dfcaverns.config.level1_min, + cave_threshold = dfcaverns.config.cavern_threshold, + perlin_cave = perlin_cave, + perlin_wave = perlin_wave, + columns = { + maximum_radius = 10, + minimum_radius = 4, + node = c_wet_flowstone, + weight = 0.25, + maximum_count = 20, + minimum_count = 0, + }, + }) + + subterrane:register_cave_layer({ + minimum_depth = dfcaverns.config.level1_min, + maximum_depth = dfcaverns.config.level2_min, + cave_threshold = dfcaverns.config.cavern_threshold, + perlin_cave = perlin_cave, + perlin_wave = perlin_wave, + columns = { + maximum_radius = 15, + minimum_radius = 4, + node = c_wet_flowstone, + weight = 0.25, + maximum_count = 30, + minimum_count = 5, + }, + }) + + subterrane:register_cave_layer({ + minimum_depth = dfcaverns.config.level2_min, + maximum_depth = dfcaverns.config.level3_min, + cave_threshold = dfcaverns.config.cavern_threshold, + perlin_cave = perlin_cave, + perlin_wave = perlin_wave, + columns = { + maximum_radius = 20, + minimum_radius = 5, + node = c_wet_flowstone, + weight = 0.25, + maximum_count = 50, + minimum_count = 10, + }, + }) +else + subterrane:register_cave_layer({ + minimum_depth = dfcaverns.config.ymax, + maximum_depth = dfcaverns.config.level3_min, + cave_threshold = dfcaverns.config.cavern_threshold, + perlin_cave = perlin_cave, + perlin_wave = perlin_wave, + columns = { + maximum_radius = 20, + minimum_radius = 4, + node = c_wet_flowstone, + weight = 0.25, + maximum_count = 50, + minimum_count = 0, + }, + }) +end local perlin_cave_lava = { offset = 0, @@ -145,6 +163,7 @@ local perlin_wave_lava = { persist = 0.63 } +--Sunless Sea subterrane:register_cave_layer({ minimum_depth = dfcaverns.config.level3_min, maximum_depth = dfcaverns.config.sunless_sea_min, diff --git a/mods/map/dfcaverns/config.lua b/mods/map/dfcaverns/config.lua index 83f6bee..444afc0 100644 --- a/mods/map/dfcaverns/config.lua +++ b/mods/map/dfcaverns/config.lua @@ -86,6 +86,7 @@ setting("float", "lava_sea_threshold", 0.2, "Cavern threshold for sunless and ma setting("bool", "enable_lava_sea", true, "Enable magma sea level") setting("bool", "flooded_biomes", true, "Add a lot of water to the most humid cavern biomes") +setting("bool", "stone_between_layers", true, "Ensures that there's a solid stone floor/ceiling between cavern layers") if minetest.get_modpath("tnt") then dfcaverns.config.enable_tnt = minetest.settings:get_bool("enable_tnt") diff --git a/mods/map/dfcaverns/locale/update.bat b/mods/map/dfcaverns/locale/update.bat old mode 100755 new mode 100644 diff --git a/mods/map/dfcaverns/settingtypes.txt b/mods/map/dfcaverns/settingtypes.txt index aa6fece..be47555 100644 --- a/mods/map/dfcaverns/settingtypes.txt +++ b/mods/map/dfcaverns/settingtypes.txt @@ -44,6 +44,10 @@ dfcaverns_level3_min (Upper limit of the sunless sea) int -2100 dfcaverns_sunless_sea_min (Lower limit of the sunless sea) int -2500 dfcaverns_lava_sea_max (Upper limit of the lava sea) int -3000 dfcaverns_lava_sea_min (Lower limit of the lava sea) int -3500 +#If this is true then there will never be a direct connection between caverns +#of the first three cavern layers. If false, it's possible for caverns to +#extend vertically through the boundary. +dfcaverns_stone_between_layers (Ensure there's stone between layers) bool true [Lower Seas] #Determines threshold for lower sea cave generation. Higher number means sparser cavern diff --git a/mods/map/dfcaverns/textures/dfcaverns_spore_tree_ladder.png b/mods/map/dfcaverns/textures/dfcaverns_spore_tree_ladder.png new file mode 100644 index 0000000000000000000000000000000000000000..d2e343f80deb428eaec953bc2adb1e1bdf823fdb GIT binary patch literal 701 zcmV;u0z&1)QZ^%{CGjY%7ZF0R@OJ4SVE6)F zzj-G$P3v=AS4xRvTb7j4Qw&{4)a!KZ-@CqDF@Op%I5b+TR;#uUVn7ISRM)k$hH1!P z&?X!T(b*ZR0Pc1G1s~nKaoyV!k10Jp-Bc?z(km+y!y}ij0upEd&W?b&=hISER17_U zZWst5Fbo63&{K6$Pc3{~JT-b@+)@1iwq+4+4bf=0IF5sq62}qDy`10ot5QjrrWy2| z;L-gFv#l*$vrLmrc9m$fo%BjJu4!sRN~so$rS-A#YtGi+ZhqqawOm=m{bP70*!1X+k5?wbamwygV-n)h08+kH$rzMlkky_nCh#X(U( jX^BKawR5AF%K*Ot6~Xo25bP + --wall_bottom = = + --wall_side = = + }, + groups = {choppy = 2, oddly_breakable_by_hand = 3, flammable = 2}, + legacy_wallmounted = true, + sounds = default.node_sound_wood_defaults(), +}) + diff --git a/mods/map/real_minerals/locale/update.bat b/mods/map/real_minerals/locale/update.bat old mode 100755 new mode 100644 diff --git a/mods/map/snowdrift/README.txt b/mods/map/snowdrift/README.txt index a1413d7..0bf714d 100644 --- a/mods/map/snowdrift/README.txt +++ b/mods/map/snowdrift/README.txt @@ -1,10 +1,10 @@ -snowdrift 0.5.2 by paramat -For Minetest 0.4.15 and later -Depends default +snowdrift 0.6.2 by paramat +For Minetest 0.4.16 and later. Compatible with Minetest 5.0.0. +Depends: default -Licenses: -Source code: -MIT by paramat +Licenses +-------- +Source code: MIT by paramat Media: Textures CC BY-SA (3.0) by paramat Sounds CC BY (3.0) by inchadney diff --git a/mods/map/snowdrift/init.lua b/mods/map/snowdrift/init.lua index c0ecd4a..97a4838 100644 --- a/mods/map/snowdrift/init.lua +++ b/mods/map/snowdrift/init.lua @@ -1,27 +1,34 @@ -- Parameters local YLIMIT = 1 -- Set to world's water level - -- Particles are timed to disappear at this y - -- Particles do not spawn when player's head is below this y -local PRECSPR = 6 -- Time scale for precipitation variation in minutes -local PRECOFF = -0.4 -- Precipitation offset, higher = rains more often -local GSCYCLE = 0.5 -- Globalstep cycle (seconds) -local FLAKES = 32 -- Snowflakes per cycle -local DROPS = 128 -- Raindrops per cycle + -- Particles are timed to disappear at this y + -- Particles do not spawn when player's head is below this y +local PRECTIM = 5 -- Precipitation noise spread + -- Time scale for precipitation variation, in minutes +local PRECTHR = 0.2 -- Precipitation noise threshold, -1 to 1: + -- -1 = precipitation all the time + -- 0 = precipitation half the time + -- 1 = no precipitation +local FLAKLPOS = 32 -- Snowflake light-tested positions per cycle + -- Maximum number of snowflakes spawned per 0.5s +local DROPLPOS = 64 -- Raindrop light-tested positions per cycle + -- Maximum number of raindrops spawned per 0.5s +local DROPPPOS = 2 -- Raindrops per light-tested pos local RAINGAIN = 0.2 -- Rain sound volume -local COLLIDE = false -- Whether particles collide with nodes -local NISVAL = 39 -- Clouds RGB value at night -local DASVAL = 175 -- Clouds RGB value in daytime +local NISVAL = 39 -- Overcast sky RGB value at night (brightness) +local DASVAL = 159 -- Overcast sky RGB value in daytime (brightness) +local FLAKRAD = 16 -- Radius in which flakes are created +local DROPRAD = 16 -- Radius in which drops are created local np_prec = { offset = 0, scale = 1, - spread = {x = PRECSPR, y = PRECSPR, z = PRECSPR}, + spread = {x = PRECTIM, y = PRECTIM, z = PRECTIM}, seed = 813, octaves = 1, persist = 0, lacunarity = 2.0, - --flags = "" + flags = "defaults" } -- These 2 must match biome heat and humidity noise parameters for a world @@ -34,7 +41,7 @@ local np_temp = { octaves = 3, persist = 0.5, lacunarity = 2.0, - --flags = "" + flags = "defaults" } local np_humid = { @@ -45,9 +52,11 @@ local np_humid = { octaves = 3, persist = 0.5, lacunarity = 2.0, - --flags = "" + flags = "defaults" } +-- End parameters + -- Stuff @@ -70,7 +79,7 @@ local timer = 0 minetest.register_globalstep(function(dtime) timer = timer + dtime - if timer < GSCYCLE then + if timer < 0.5 then return end @@ -78,8 +87,12 @@ minetest.register_globalstep(function(dtime) for _, player in ipairs(minetest.get_connected_players()) do local player_name = player:get_player_name() - local ppos = player:getpos() - local pposy = math.floor(ppos.y) + 2 -- Precipitation when swimming + -- Predict player position as slightly behind the cycle interval. + -- Assume scheduling gets behind slighly (cycle time * 1.5). + local ppos = vector.add(player:getpos(), + vector.multiply(player:get_player_velocity(), 0.75)) + -- Point just above player head, for precipitation when swimming + local pposy = math.floor(ppos.y) + 2 if pposy >= YLIMIT - 2 then local pposx = math.floor(ppos.x) local pposz = math.floor(ppos.z) @@ -102,12 +115,9 @@ minetest.register_globalstep(function(dtime) -- so area above line is -- h - 14/95 t > 1496/95 local freeze = nval_temp < 35 - local precip = nval_prec < (nval_humid - 50) / 50 + PRECOFF and + local precip = nval_prec > PRECTHR and nval_humid - grad * nval_temp > yint - -- Check if player is outside - local outside = minetest.get_node_light(ppos, 0.5) == 15 - -- Occasionally reset player sky if math.random() < 0.1 then if precip then @@ -129,18 +139,15 @@ minetest.register_globalstep(function(dtime) ((time - 0.1875) / 0.0521) * difsval) end -- Set sky to overcast bluish-grey - player:set_sky( - {r = sval, g = sval, b = sval + 16, a = 255}, - "plain", - {} - ) + player:set_sky({r = sval, g = sval, b = sval + 16, a = 255}, + "plain", {}, false) else -- Reset sky to normal - player:set_sky({}, "regular", {}) + player:set_sky({}, "regular", {}, true) end end - if not precip or not outside or freeze then + if not precip or freeze then if handles[player_name] then -- Stop sound if playing minetest.sound_stop(handles[player_name]) @@ -148,59 +155,71 @@ minetest.register_globalstep(function(dtime) end end - if precip and outside then + if precip then -- Precipitation if freeze then -- Snowfall - local extime = math.min((pposy + 12 - YLIMIT) / 2, 9) - for flake = 1, FLAKES do - minetest.add_particle({ - pos = { - x = pposx - 24 + math.random(0, 48), - y = pposy + 12, - z = pposz - 24 + math.random(0, 48) - }, - velocity = { - x = (-20 + math.random(0, 40)) / 100, - y = -2.0, - z = (-20 + math.random(0, 40)) / 100 - }, - acceleration = {x = 0, y = 0, z = 0}, - expirationtime = extime, - size = 2.8, - collisiondetection = COLLIDE, - collision_removal = true, - vertical = false, - texture = "snowdrift_snowflake" .. - math.random(1, 12) .. ".png", - playername = player:get_player_name() - }) + for lpos = 1, FLAKLPOS do + local lposx = pposx - FLAKRAD + + math.random(0, FLAKRAD * 2) + local lposz = pposz - FLAKRAD + + math.random(0, FLAKRAD * 2) + if minetest.get_node_light( + {x = lposx, y = pposy + 10, z = lposz}, + 0.5) == 15 then + -- Any position above light-tested position is also + -- light level 15. + -- Spawn Y randomised to avoid particles falling + -- in separated layers. + -- Random range = speed * cycle time + local spawny = pposy + 10 + math.random(0, 10) / 10 + local extime = math.min((spawny - YLIMIT) / 2, 10) + + minetest.add_particle({ + pos = {x = lposx, y = spawny, z = lposz}, + velocity = {x = 0, y = -2.0, z = 0}, + acceleration = {x = 0, y = 0, z = 0}, + expirationtime = extime, + size = 2.8, + collisiondetection = true, + collision_removal = true, + vertical = false, + texture = "snowdrift_snowflake" .. + math.random(1, 12) .. ".png", + playername = player:get_player_name() + }) + end end else -- Rainfall - for drop = 1, DROPS do - local spawny = pposy + 10 + math.random(0, 40) / 10 - local extime = math.min((spawny - YLIMIT) / 10, 1.8) - minetest.add_particle({ - pos = { - x = pposx - 12 + math.random(0, 24), - y = spawny, - z = pposz - 12 + math.random(0, 24) - }, - velocity = { - x = 0.0, - y = -10.0, - z = 0.0 - }, - acceleration = {x = 0, y = 0, z = 0}, - expirationtime = extime, - size = 2.8, - collisiondetection = COLLIDE, - collision_removal = true, - vertical = true, - texture = "snowdrift_raindrop.png", - playername = player:get_player_name() - }) + for lpos = 1, DROPLPOS do + local lposx = pposx - DROPRAD + + math.random(0, DROPRAD * 2) + local lposz = pposz - DROPRAD + + math.random(0, DROPRAD * 2) + if minetest.get_node_light( + {x = lposx, y = pposy + 10, z = lposz}, + 0.5) == 15 then + for drop = 1, DROPPPOS do + local spawny = pposy + 10 + math.random(0, 60) / 10 + local extime = math.min((spawny - YLIMIT) / 12, 2) + local spawnx = lposx - 0.4 + math.random(0, 8) / 10 + local spawnz = lposz - 0.4 + math.random(0, 8) / 10 + + minetest.add_particle({ + pos = {x = spawnx, y = spawny, z = spawnz}, + velocity = {x = 0.0, y = -12.0, z = 0.0}, + acceleration = {x = 0, y = 0, z = 0}, + expirationtime = extime, + size = 2.8, + collisiondetection = true, + collision_removal = true, + vertical = true, + texture = "snowdrift_raindrop.png", + playername = player:get_player_name() + }) + end + end end if not handles[player_name] then diff --git a/mods/map/subterrane/functions.lua b/mods/map/subterrane/functions.lua index 7e6cf72..174823d 100644 --- a/mods/map/subterrane/functions.lua +++ b/mods/map/subterrane/functions.lua @@ -92,6 +92,14 @@ end -- track of the biome they belong to via an internal ID that gets changed when the biomes -- are re-registered, resulting in them being left assigned to the wrong biomes. function subterrane:override_biome(biome_def) + + --Minetest 0.5 adds this "unregister biome" method + if minetest.unregister_biome and biome_def.name then + minetest.unregister_biome(biome_def.name) + minetest.register_biome(biome_def) + return + end + local registered_biomes_copy = {} for old_biome_key, old_biome_def in pairs(minetest.registered_biomes) do registered_biomes_copy[old_biome_key] = old_biome_def diff --git a/mods/map/subterrane/locale/update.bat b/mods/map/subterrane/locale/update.bat old mode 100755 new mode 100644 diff --git a/mods/physics/killer_nodes/README.txt b/mods/physics/killer_nodes/README.txt index 74550bf..971d844 100644 --- a/mods/physics/killer_nodes/README.txt +++ b/mods/physics/killer_nodes/README.txt @@ -6,14 +6,14 @@ damage, adds damage to cacti. - Version: 0.7.0 + Version: 0.6.0 Source code's license: GPLv3 Dependencies: default, fire (found in minetest_game) Supported modules: castle_masonry, darkage, fallen_nodes, fallen_trees, mg, stairs (disabled due to damage on walking over), - desert_life, dfcaverns + desert_life Report bugs or request help on the forum topic. https://forum.minetest.net/viewtopic.php?f=9&t=18339 diff --git a/mods/physics/killer_nodes/depends.txt b/mods/physics/killer_nodes/depends.txt index afc7b2c..3f5a852 100644 --- a/mods/physics/killer_nodes/depends.txt +++ b/mods/physics/killer_nodes/depends.txt @@ -3,7 +3,6 @@ fire castle_masonry? darkage? desert_life? -dfcaverns? fallen_nodes? fallen_trees? mg? diff --git a/mods/physics/killer_nodes/init.lua b/mods/physics/killer_nodes/init.lua index e5b8053..02577d3 100644 --- a/mods/physics/killer_nodes/init.lua +++ b/mods/physics/killer_nodes/init.lua @@ -73,7 +73,7 @@ minetest.register_abm({ interval = 1.0, chance = 1, action = function(pos, node, active_object_count, active_object_count_wider) - local players = minetest.get_objects_inside_radius(pos, 0.7) + players = minetest.get_objects_inside_radius(pos, 0.7) for i, player in ipairs(players) do player:set_hp(player:get_hp() - 1) end @@ -101,7 +101,7 @@ minetest.register_abm({ interval = 0.5, chance = 1, action = function(pos, node, active_object_count, active_object_count_wider) - local players = minetest.get_objects_inside_radius(pos, 1) + players = minetest.get_objects_inside_radius(pos, 1) for i, player in ipairs(players) do player:set_hp(player:get_hp() - 1) end @@ -142,35 +142,6 @@ if minetest.get_modpath("desert_life") then end --- --- Support for DFCaverns' blood thorn --- - -if minetest.get_modpath("dfcaverns") then - - minetest.register_abm({ - nodenames = {"dfcaverns:blood_thorn", - "dfcaverns:blood_thorn_spike",}, - interval = 0.5, - chance = 1, - action = function(pos, node, active_object_count, active_object_count_wider) - local objects = minetest.get_objects_inside_radius(pos, 1) - - for _, obj in pairs(objects) do - - if obj:is_player() then - obj:set_hp(obj:get_hp() - 1) - else - if not obj:get_armor_groups().immortal then - obj:set_hp(obj:get_hp() - 1) - end - end - end - end, - }) -end - - -- -- Support for [Mod] Fallen Nodes [fallen_nodes] -- diff --git a/mods/tools_etc/fort_spikes/README.md b/mods/tools_etc/fort_spikes/README.md index 640e739..ca24ed0 100644 --- a/mods/tools_etc/fort_spikes/README.md +++ b/mods/tools_etc/fort_spikes/README.md @@ -1,12 +1,3 @@ -# Fort Spikes -Mod for Minetest game +# Moved to GitLab -Improve your base defense with wood and iron spikes around. - -License of source code: ------------------------ -MIT - -Media ------------------------ -Texture files are created by xeranas and lisensed under CC-0 +https://gitlab.com/zombiebot/fort_spikes diff --git a/mods/tools_etc/fort_spikes/bower.json b/mods/tools_etc/fort_spikes/bower.json deleted file mode 100644 index 99360f2..0000000 --- a/mods/tools_etc/fort_spikes/bower.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "fort_spikes", - "description": "Improve your base defense with wood and iron spikes around.", - "keywords": [ - "fort_spikes", - "spikes", - "traps", - "defense" - ], - "project": "https://github.com/xeranas/fort_spikes", - "forum": "https://forum.minetest.net/viewtopic.php?t=14574", - "screenshots": [ - "https://raw.githubusercontent.com/xeranas/fort_spikes/master/screenshot.png" - ], - "authors": [ - "xeranas" - ] -} \ No newline at end of file diff --git a/mods/tools_etc/handholds/init.lua b/mods/tools_etc/handholds/init.lua index 9c8e4a6..4705732 100644 --- a/mods/tools_etc/handholds/init.lua +++ b/mods/tools_etc/handholds/init.lua @@ -1,3 +1,6 @@ +handholds = {} + +handholds.nodes = {} -- function to safely remove climbable air local function remove_air(pos, oldnode) @@ -24,7 +27,6 @@ local function remove_air(pos, oldnode) end end - -- remove handholds from nodes buried under falling nodes local function remove_handholds(pos) local north_pos = {x = pos.x, y = pos.y, z = pos.z+1} @@ -54,10 +56,94 @@ local function remove_handholds(pos) if node_pos then local handholds_node = string.split(minetest.get_node(node_pos).name, ":") - minetest.set_node(node_pos, {name = "default:"..handholds_node[2]}) + if handholds_node[1] == "handholds" then + minetest.set_node(node_pos, {name = "default:"..handholds_node[2]}) + else + handholds_node = string.split(minetest.get_node(node_pos).name, "_") + minetest.set_node(node_pos, {name = handholds_node[1]}) + end end end +-- handholds registration function +function handholds.register_handholds(name, def) + def.original_mod = def.original_mod or minetest.get_current_modname() + def.original_name = name + + def.mod = minetest.get_current_modname() + if def.mod ~= "handholds" then + name = name .. "_handholds" + end + + handholds.nodes[def.original_mod .. ":" .. def.original_name] = true + + def.tiles = def.tiles or def.mod .. "_" .. def.original_name .. ".png" + + minetest.register_node(":".. def.mod .. ":" .. name, { + description = def.description or "Handholds", + tiles = { + def.tiles, def.tiles, def.tiles, def.tiles, def.tiles, + def.tiles .. "^handholds_holds.png" + }, + paramtype2 = "facedir", + on_rotate = function() + return false + end, + groups = def.groups or + {cracky = 3, stone = 1, not_in_creative_inventory = 1, handholds = 1}, + drop = def.drop or def.mod .. ":" .. def.original_name, + sounds = def.sounds or default.node_sound_stone_defaults(), + after_destruct = function(pos, oldnode) + remove_air(pos, oldnode) + end, + }) +end + + +-- basic handholds nodes +handholds.register_handholds("stone", { + original_mod = "default", + description = "Stone Handholds", + tiles = "default_stone.png", + drop = 'default:cobble', +}) + +handholds.register_handholds("desert_stone", { + original_mod = "default", + description = "Desert Stone Handholds", + tiles = "default_desert_stone.png", + drop = 'default:desert_cobble', +}) + +handholds.register_handholds("sandstone", { + original_mod = "default", + description = "Sandstone Handholds", + tiles = "default_sandstone.png", + drop = 'default:sandstone', +}) + +handholds.register_handholds("silver_sandstone", { + original_mod = "default", + description = "Silver Sandstone Handholds", + tiles = "default_silver_sandstone.png", + drop = 'default:silver_sandstone', +}) + +handholds.register_handholds("desert_sandstone", { + original_mod = "default", + description = "Desert Sandstone Handholds", + tiles = "default_desert_sandstone.png", + drop = 'default:desert_sandstone', +}) + +handholds.register_handholds("ice", { + original_mod = "default", + description = "Ice Handholds", + tiles = "default_ice.png", + drop = 'default:ice', + sounds = default.node_sound_glass_defaults(), +}) + -- climbable air! minetest.register_node("handholds:climbable_air", { @@ -77,87 +163,6 @@ minetest.register_node("handholds:climbable_air", { }) --- handholds nodes -minetest.register_node("handholds:stone", { - description = "Stone Handholds", - tiles = { - "default_stone.png", "default_stone.png", - "default_stone.png", "default_stone.png", - "default_stone.png", "default_stone.png^handholds_holds.png" - }, - paramtype2 = "facedir", - on_rotate = function() - return false - end, - groups = {cracky = 3, stone = 1, not_in_creative_inventory = 1, handholds = 1}, - drop = 'default:cobble', - sounds = default.node_sound_stone_defaults(), - after_destruct = function(pos, oldnode) - remove_air(pos, oldnode) - end, -}) - -minetest.register_node("handholds:desert_stone", { - description = "Desert Stone Handholds", - tiles = { - "default_desert_stone.png", "default_desert_stone.png", - "default_desert_stone.png", "default_desert_stone.png", - "default_desert_stone.png", "default_desert_stone.png^handholds_holds.png" - }, - paramtype2 = "facedir", - on_rotate = function() - return false - end, - groups = {cracky = 3, stone = 1, not_in_creative_inventory = 1, handholds = 1}, - drop = 'default:desert_cobble', - sounds = default.node_sound_stone_defaults(), - after_destruct = function(pos, oldnode) - remove_air(pos, oldnode) - end, -}) - -minetest.register_node("handholds:sandstone", { - description = "Sandstone Handholds", - tiles = { - "default_sandstone.png", "default_sandstone.png", - "default_sandstone.png", "default_sandstone.png", - "default_sandstone.png", "default_sandstone.png^handholds_holds.png" - }, - paramtype2 = "facedir", - on_rotate = function() - return false - end, - groups = {cracky = 3, stone = 1, not_in_creative_inventory = 1, handholds = 1}, - drop = 'default:sandstone', - sounds = default.node_sound_stone_defaults(), - after_destruct = function(pos, oldnode) - remove_air(pos, oldnode) - end, -}) - -minetest.register_node("handholds:ice", { - description = "Ice Handholds", - tiles = { - "default_ice.png", "default_ice.png", - "default_ice.png", "default_ice.png", - "default_ice.png", "default_ice.png^handholds_holds.png" - }, - paramtype2 = "facedir", - on_rotate = function() - return false - end, - groups = { - cracky = 3, puts_out_fire = 1, cools_lava = 1, - not_in_creative_inventory = 1, handholds = 1 - }, - drop = 'default:ice', - sounds = default.node_sound_glass_defaults(), - after_destruct = function(pos, oldnode) - remove_air(pos, oldnode) - end, -}) - - -- handholds tool minetest.register_tool("handholds:climbing_pick", { description = "Climbing Pick", @@ -180,21 +185,34 @@ minetest.register_tool("handholds:climbing_pick", { end local node_name = minetest.get_node(pointed_thing.under).name - local rotation = minetest.dir_to_facedir( - vector.subtract(pointed_thing.under, pointed_thing.above)) - if node_name == "default:stone" then - minetest.set_node(pointed_thing.under, - {name = "handholds:stone", param2 = rotation}) - elseif node_name == "default:desert_stone" then - minetest.set_node(pointed_thing.under, - {name = "handholds:desert_stone", param2 = rotation}) - elseif node_name == "default:sandstone" then - minetest.set_node(pointed_thing.under, - {name = "handholds:sandstone", param2 = rotation}) - elseif node_name == "default:ice" then - minetest.set_node(pointed_thing.under, - {name = "handholds:ice", param2 = rotation}) + if handholds.nodes[node_name] then + local rotation = minetest.dir_to_facedir( + vector.subtract(pointed_thing.under, pointed_thing.above)) + + if node_name == "default:stone" then + minetest.set_node(pointed_thing.under, + {name = "handholds:stone", param2 = rotation}) + elseif node_name == "default:desert_stone" then + minetest.set_node(pointed_thing.under, + {name = "handholds:desert_stone", param2 = rotation}) + elseif node_name == "default:sandstone" then + minetest.set_node(pointed_thing.under, + {name = "handholds:sandstone", param2 = rotation}) + elseif node_name == "default:silver_sandstone" then + minetest.set_node(pointed_thing.under, + {name = "handholds:silver_sandstone", param2 = rotation}) + elseif node_name == "default:desert_sandstone" then + minetest.set_node(pointed_thing.under, + {name = "handholds:desert_sandstone", param2 = rotation}) + elseif node_name == "default:ice" then + minetest.set_node(pointed_thing.under, + {name = "handholds:ice", param2 = rotation}) + else + node_name = node_name .. "_handholds" + minetest.set_node(pointed_thing.under, + {name = node_name, param2 = rotation}) + end else return end diff --git a/mods/tools_etc/hardtorch/fuel.lua b/mods/tools_etc/hardtorch/fuel.lua index 1a308a6..cb5eb28 100644 --- a/mods/tools_etc/hardtorch/fuel.lua +++ b/mods/tools_etc/hardtorch/fuel.lua @@ -23,4 +23,29 @@ hardtorch.register_fuel = function(name, def) registro.time = def.turns * hardtorch.night_time registro.loop_wear = (65535/registro.time)*2 + -- Sobreescreve on_place para evitar reparos no combustivel em ferramentas + if minetest.registered_tools[name] then + hardtorch.registered_fuels[name].old_on_place = minetest.registered_tools[name].on_place + hardtorch.registered_fuels[name].on_place = function(itemstack, placer, pointed_thing) + + -- Verifica nodes evitaveis + if pointed_thing.under and hardtorch.evitar_tool_on_place[1] then + + local nn = minetest.get_node(pointed_thing.under).name + for _,n in ipairs(hardtorch.evitar_tool_on_place) do + if n == nn then + return + end + end + end + + if hardtorch.registered_fuels[name].old_on_place ~= nil then + return hardtorch.registered_fuels[name].old_on_place(itemstack, placer, pointed_thing) + end + end + + minetest.override_item(name, { + on_place = hardtorch.registered_fuels[name].on_place, + }) + end end diff --git a/mods/tools_etc/hardtorch/init.lua b/mods/tools_etc/hardtorch/init.lua index ac888a4..daeeefc 100644 --- a/mods/tools_etc/hardtorch/init.lua +++ b/mods/tools_etc/hardtorch/init.lua @@ -22,7 +22,12 @@ hardtorch.torch_lighter = (minetest.settings:get("hardtorch_torch_lighter") == " -- Nodes que funcionam como fontes de fogo para acender tochas hardtorch.fontes_de_fogo = {} - +-- Nodes para evitar ao colocar tochas +hardtorch.evitar_tool_on_place = {} +-- Mod Anvil +if minetest.get_modpath("anvil") then + table.insert(hardtorch.evitar_tool_on_place, "anvil:anvil") +end -- Tempo fixo de duração de uma noite hardtorch.night_time = tonumber(minetest.settings:get("hardtorch_fixed_night_time") or 0) diff --git a/mods/tools_etc/hardtorch/oil.lua b/mods/tools_etc/hardtorch/oil.lua index 0134dd9..6520dad 100644 --- a/mods/tools_etc/hardtorch/oil.lua +++ b/mods/tools_etc/hardtorch/oil.lua @@ -19,6 +19,7 @@ if oil_nights <= 0 then oil_nights = 1.2 end minetest.register_tool("hardtorch:oil", { description = "Oil", inventory_image = "hardtorch_oil.png", + }) diff --git a/mods/tools_etc/hardtorch/tool.lua b/mods/tools_etc/hardtorch/tool.lua index 64c2b49..6c88b02 100644 --- a/mods/tools_etc/hardtorch/tool.lua +++ b/mods/tools_etc/hardtorch/tool.lua @@ -168,6 +168,16 @@ hardtorch.register_tool = function(torchname, def) -- Ao colocar funciona como tocha normal apenas repassando o desgaste on_place = function(itemstack, placer, pointed_thing) + -- Verifica nodes evitaveis + if pointed_thing.under and hardtorch.evitar_tool_on_place[1] then + local nn = minetest.get_node(pointed_thing.under).name + for _,n in ipairs(hardtorch.evitar_tool_on_place) do + if n == nn then + return + end + end + end + if itemstack:get_name() ~= torchname then return end if pointed_thing.type ~= "node" then @@ -252,6 +262,17 @@ hardtorch.register_tool = function(torchname, def) -- Ao colocar funciona como tocha normal apenas repassando o desgaste on_place = function(itemstack, placer, pointed_thing) + + -- Verifica nodes evitaveis + if pointed_thing.under and hardtorch.evitar_tool_on_place[1] then + local nn = minetest.get_node(pointed_thing.under).name + for _,n in ipairs(hardtorch.evitar_tool_on_place) do + if n == nn then + return + end + end + end + if itemstack:get_name() ~= torchname.."_on" then return end if pointed_thing.type ~= "node" then diff --git a/mods/tools_etc/toolranks/init.lua b/mods/tools_etc/toolranks/init.lua index d829977..49488a1 100644 --- a/mods/tools_etc/toolranks/init.lua +++ b/mods/tools_etc/toolranks/init.lua @@ -220,6 +220,11 @@ if minetest.get_modpath("moreores") then description = toolranks.create_description("Mithril Shovel", 0, 1), after_use = toolranks.new_afteruse}) + minetest.override_item("moreores:sword_mithril", { + original_description = "Mithril Sword", + description = toolranks.create_description("Mithril Sword", 0, 1), + after_use = toolranks.new_afteruse}) + minetest.override_item("moreores:pick_silver", { original_description = "Silver Pickaxe", description = toolranks.create_description("Silver Pickaxe", 0, 1), @@ -234,4 +239,40 @@ if minetest.get_modpath("moreores") then original_description = "Silver Shovel", description = toolranks.create_description("Silver Shovel", 0, 1), after_use = toolranks.new_afteruse}) + + minetest.override_item("moreores:sword_silver", { + original_description = "Silver Sword", + description = toolranks.create_description("Silver Sword", 0, 1), + after_use = toolranks.new_afteruse}) end + +-- add swords for snappy nodes +minetest.override_item("default:sword_wood", { + original_description = "Wooden Sword", + description = toolranks.create_description("Wooden Sword", 0, 1), + after_use = toolranks.new_afteruse}) + +minetest.override_item("default:sword_stone", { + original_description = "Stone Sword", + description = toolranks.create_description("Stone Sword", 0, 1), + after_use = toolranks.new_afteruse}) + +minetest.override_item("default:sword_steel", { + original_description = "Steel Sword", + description = toolranks.create_description("Steel Sword", 0, 1), + after_use = toolranks.new_afteruse}) + +minetest.override_item("default:sword_bronze", { + original_description = "Bronze Sword", + description = toolranks.create_description("Bronze Sword", 0, 1), + after_use = toolranks.new_afteruse}) + +minetest.override_item("default:sword_mese", { + original_description = "Mese Sword", + description = toolranks.create_description("Mese Sword", 0, 1), + after_use = toolranks.new_afteruse}) + +minetest.override_item("default:sword_diamond", { + original_description = "Diamond Sword", + description = toolranks.create_description("Diamond Sword", 0, 1), + after_use = toolranks.new_afteruse}) diff --git a/mods/unifieddyes/API.md b/mods/unifieddyes/API.md index a4e0a62..decf76d 100644 --- a/mods/unifieddyes/API.md +++ b/mods/unifieddyes/API.md @@ -6,23 +6,20 @@ In your node definition, you must include a few things to interface with Unified ```lua minetest.register_node("mymod:colored_node", { - description = "My custom colored node", - tiles = { "mymod_custom_colored_node.png" }, - paramtype = "light", - paramtype2 = "color", - palette = "unifieddyes_palette_extended.png", - place_param2 = 240, - groups = {snappy = 1, cracky = 2, ud_param2_colorable = 1} - on_construct = unifieddyes.on_construct, - after_place_node = unifieddyes.recolor_on_place, - after_dig_node = unifieddyes.after_dig_node, + description = "My custom colored node", + tiles = { "mymod_custom_colored_node.png" }, + paramtype = "light", + paramtype2 = "color", + palette = "unifieddyes_palette_extended.png", + groups = {snappy = 1, cracky = 2, ud_param2_colorable = 1} + on_construct = unifieddyes.on_construct, }) ``` `paramtype2` must be one of: -- "color" this is an 89-color or 256-color node -- "colorwallmounted" this is a 32-color node using "wallmounted" mode -- "colorfacedir" this node uses one of the "split" 89-color palettes. +- "color": this is an 89-color or 256-color node +- "colorwallmounted": this is a 32-color node using "wallmounted" mode +- "colorfacedir": this node uses one of the "split" 89-color palettes. `palette` must be set to match the `paramtype2` setting, and must be one of: - "unifieddyes_palette.png" @@ -30,18 +27,12 @@ minetest.register_node("mymod:colored_node", { - "unifieddyes_palette_colorwallmounted.png" - or one of the "split" hues palettes (see below). -`place_param2` generally is only needed for the 256-color palette, and should usually be set to 240 (which corresponds to white). -`groups` If your node can be colored by punching it with dye, its groups entry must contain the key ud_param2_colorable = 1, among whatever else you'd normally put there. If the node is software-controlled, as might be the case for some mesecons-digilines aware node, then this group key should be omitted. -`on_construct` see below. -`after_place_node` see below. -`after_dig_node` see below. +`groups`: If your node can be colored by punching it with dye, its groups entry must contain the key ud_param2_colorable = 1, among whatever else you'd normally put there. If the node is software-controlled, as might be the case for some mesecons-digilines aware node, then this group key should be omitted. + +`on_construct`: see below. #### Function calls -**`unifieddyes.recolor_on_place(pos, placer, itemstack, pointed_thing)`** - -Call this within your node's `after_place_node` callback to allow Unified Dyes to automatically color the node using the dye you last used on that kind of node The feature will remain active until the dye runs out, or the user places a different kind of colorable node, or the user cancels the feature. - **`unifieddyes.fix_rotation(pos, placer, itemstack, pointed_thing)` `unifieddyes.fix_rotation_nsew(pos, placer, itemstack, pointed_thing)`** @@ -63,15 +54,16 @@ Again, another obvious one, returns whether or not the pointed node is `buildabl Accepts an item name, and returns the corresponding hue, saturation, and value (in that order), as strings. -If the item name is a color (not greyscale), then hue will be the basic hue for that color, saturation will be empty string for high saturation or `_s50` for low, and value will be `dark_`, `medium_`, `light_`, or an empty string if it's full color. +If the item name is a color (not greyscale), then `hue` will be the basic hue for that color, saturation will be empty string for high saturation or "_s50" for low, and value will be "dark_", "medium_", "light_", or an empty string if it's full color. -If the item name is greyscale, then hue will contain `white`, `light_grey`, `grey`, `dark_grey`, or `black`, saturation will (ironically) be an empty string, and value will be `light_`, `dark_`, or empty string if it's medium grey. +If the item name is greyscale, then `hue` will contain "white", "light_grey", "grey", "dark_grey", or "black", saturation will (ironically) be an empty string, and value will be "light_", "dark_", or empty string to correspond with the contents of `hue`. For example: -"mymod:mynode_red" would return ("red", "", "") -"mymod:mynode_light_blue" would return ("blue", "", "light_") -"mymod:mynode_dark_yellow_s50" would return ("yellow", "_s50", "dark_") -"mymod:mynode_dark_grey" would return ("dark_grey", "", "dark_") + +* "mymod:mynode_red" would return ("red", "", "") +* "mymod:mynode_light_blue" would return ("blue", "", "light_") +* "mymod:mynode_dark_yellow_s50" would return ("yellow", "_s50", "dark_") +* "mymod:mynode_dark_grey" would return ("dark_grey", "", "dark_") **`unifieddyes.getpaletteidx(color, palette_type)`** @@ -83,15 +75,7 @@ When given a `color` string (in the form of "dye:foo" or "unifieddyes:foo") and **`unifieddyes.on_construct(pos)`** -This function, called in your node definition's on_construct, just sets the `palette = "ext"` metadata key for the node after it's been placed. This can then be read in an LBM to determine if this node needs to be converted from the old 89-color palette to the extended 256-color palette. Although it is good practice to call this for any node that uses the 256-color palette, it isn't strictly necessary as long as the node has never used the 89-color palette and won't be subjected to an LBM that changes its color. - -**`unifieddyes.after_dig_node(pos, oldnode, oldmetadata, digger)`** - -This function handles returning dyes to the user when a node is dug. All colorized nodes need to call this in `after_dig_node`. - -**`unifieddyes.on_use(itemstack, player, pointed_thing)`** - -This function is used internally by Unfiied Dyes to actually make a dye able to colorize a node when you wield and punch with it. Unified Dyes redefines the minetest_game default dye items to call this function. +This function, called in your node definition's on_construct, just sets the `palette = "ext"` metadata key for the node after it's been placed. This can then be read in an LBM to determine if this node needs to be converted from the old 89-color palette to the extended 256-color palette. Although it is good practice to call this for any node that uses the 256-color palette, it isn't actually necessary as long as the node has never used the 89-color palette, and won't be subjected to an LBM that changes its color. #### Tables @@ -103,6 +87,70 @@ In addition to the above API calls, Unified Dyes provides several useful tables `unifieddyes.base_color_crafts` contains a condensed list of crafting recipes for all 24 basic hues, plus black and white, most of which have multiple alternative recipes. Each line contains the name of the color, up to five dye itemstrings (with `nil` in each unused space), and the yield for that craft. -`unifieddyes.shade_crafts` contains recipes for each of the 10 shades a hue can take on, used with one or two portions of the dye corresponding to that hue. Each line contains the shade name with trailing "_", the saturation name (either `_s50` or empty string), up to three dye itemstrings, and the yield for that craft. +`unifieddyes.shade_crafts` contains recipes for each of the 10 shades a hue can take on, used with one or two portions of the dye corresponding to that hue. Each line contains the shade name with trailing "_", the saturation name (either "_s50" or empty string), up to three dye item strings, and the yield for that craft. `unifieddyes.greymixes` contains the recipes for the 14 shades of grey. Each line contains the grey shade number from 1-14, up to four dye item names, and the yield for that craft. + +#### Converting an old mod + +If your mod used the old paradigm where you craft a neutral-colored item, place it, and punch with dye to color it, and you wish to convert it to colored itemstacks, take the following actions for each node: + +* Remove these keys: + +```lua + after_dig_node = unifieddyes.after_dig_node, + place_param2 = 240, + after_place_node = unifieddyes.recolor_on_place, +``` + +* Add a call to the create-all-recipes helper. Here's an example: + +```lua + unifieddyes.register_color_craft({ + output = "mymod:colored_node 6", + palette = "extended", + neutral_node = "mymod:my_base_node_material", + recipe = { + { "NEUTRAL_NODE", "MAIN_DYE", "NEUTRAL_NODE" }, + { "MAIN_DYE", "NEUTRAL_NODE", "MAIN_DYE" }, + { "NEUTRAL_NODE", "MAIN_DYE", "NEUTRAL_NODE" } + } + }) +``` + +`output` is a standard item string as in the normal `minetest.register_craft()` call. + +`palette` specifies the palette type to iterate through ("extended" and "wallmounted" are obvious, and if not specified, it'll use the 89 color palette). + +`type` can be "shapeless" or unspecified/`nil`, and works the same as in the normal call. + +`neutral_node` should specify the name of whatever item or node serves as the base, neutrally-colored material in your recipe. This really only applies if your node is just made from one item (or more than one of the same item), plus one or more dyes. If your node is just made from a collection of item and no one item is really the neutral material, or anyway if you don't need this substitution, you must set it to an empty string. + +`recipe` is the same as in the normal call, except that Unified Dyes will replace all instances of the string "NEUTRAL_NODE" with the item specified in the preceding `neutral_node` field. Every instance of "MAIN_DYE" will be replaced with a portion of dye, as Unified Dyes' recipe helper works through its color lists (i.e. this field will become whatever dye is needed for each recipe). + +If your mod never has never used Unified Dyes at all, in short, do the following: + +* Remove all of your various colored node definitions, keeping only the one for the white version of your node, or delete them all, and keep whatever node you consider to be "neutral colored". + +* Delete all of the colored texture files too, except keep the brightest, highest-contrast, most detailed one - whichever color that happens to be. Most likely, red or green will be the best one. + +* Convert that last texture to grayscale, enhance its contrast as much as you can without distorting it, and rename it to something more neutral. + +* Add the `on_construct` and `palette` keys to your neutral node definition, for example: + + `palette = "unifieddyes_palette_extended.png",` + `on_construct = unifieddyes.on_construct,` + +* Adjust your node's groups to specify that the node can be colored. Example (note the last item): + + `groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,flammable=3, ud_param2_colorable = 1},` + +* Remove all crafting recipes for all colored versions of that node, keeping only the one that makes the "neutral" one. + +* Add the above recipes helper call (which replaces those delted recipes) + +If your colored node is based on someone else's neutral node, for example if you made a mod that creates multiple colors of minetest_game's default clay, you may find it best to create a single "stand-in" node that's identical to the neutral node, but named for your mod, hidden from the creative inventory, and has a properly-prepared grayscale texture image in addition to the above keys. Use the neutral node and the custom hidden node as in the above craft helper call. Then use minetest.override_item() to add the on_construct and palette keys and the ud_param2_colorable group to that "someone else's" node. + +* You will need to write a run-only-once LBM to convert your old statically-colored nodes to use hardware coloring. See above for functions that will help reduce the work required for this part. + +If your mod has no colorable items, and you wish to expand it accordingly, follow the above "never used" section, skipping the "remove/delete this and that" items, and of course omitting the LBM. diff --git a/mods/unifieddyes/init.lua b/mods/unifieddyes/init.lua index 51cc671..37d3572 100644 --- a/mods/unifieddyes/init.lua +++ b/mods/unifieddyes/init.lua @@ -30,8 +30,6 @@ with this program; if not, write to the Free Software Foundation, Inc., --===================================================================== unifieddyes = {} -unifieddyes.last_used_dye = {} -unifieddyes.last_dyed_node = {} local creative_mode = minetest.settings:get_bool("creative_mode") @@ -89,6 +87,17 @@ unifieddyes.HUES_EXTENDED = { { "crimson", 0xff, 0x00, 0x40 } } +unifieddyes.HUES_WALLMOUNTED = { + "red", + "orange", + "yellow", + "green", + "cyan", + "blue", + "violet", + "magenta" +} + unifieddyes.SATS = { "", "_s50" @@ -118,6 +127,14 @@ unifieddyes.GREYS = { "black" } +unifieddyes.GREYS_EXTENDED = table.copy(unifieddyes.GREYS) + +for i = 1, 14 do + if i ~= 0 and i ~= 3 and i ~= 7 and i ~= 11 and i ~= 15 then + table.insert(unifieddyes.GREYS_EXTENDED, "grey_"..i) + end +end + local default_dyes = { "black", "blue", @@ -136,77 +153,153 @@ local default_dyes = { "yellow" } --- automatically recolor a placed node to match the last-used dye --- should be called in the node's `after_place_node` callback. +-- if a node with a palette is placed in the world, +-- but the itemstack used to place it has no palette_index (color byte), +-- create something appropriate to make it officially white. -function unifieddyes.recolor_on_place(pos, placer, itemstack, pointed_thing) - - local playername = placer:get_player_name() - local stackname = itemstack:get_name() - - if unifieddyes.last_dyed_node[playername] ~= stackname then - if unifieddyes.last_used_dye[playername] then - minetest.chat_send_player(playername, "Switched to \""..stackname.."\" while auto-coloring, color reset to neutral.") +minetest.register_on_placenode( + function(pos, newnode, placer, oldnode, itemstack, pointed_thing) + local def = minetest.registered_items[newnode.name] + if not def or not def.palette then return false end + if string.find(itemstack:to_string(), "palette_index") then + minetest.swap_node(pos, {name = newnode.name, param2 = newnode.param2}) + return end - unifieddyes.last_used_dye[playername] = nil - unifieddyes.last_dyed_node[playername] = nil - end - unifieddyes.last_dyed_node[playername] = stackname + local param2 = 0 + local color = 0 - if unifieddyes.last_used_dye[playername] then - local lastdye = unifieddyes.last_used_dye[playername] - - local inv = placer:get_inventory() - if (lastdye and lastdye ~= "" and inv:contains_item("main", lastdye.." 1")) or creative_mode then - - local nodedef = minetest.registered_nodes[stackname] - local newname = nodedef.ud_replacement_node or stackname - local node = minetest.get_node(pos) - - local palette_type = true -- default to 89-color split, because the others are easier to check for. - local oldfdir = node.param2 % 32 - - if nodedef.palette == "unifieddyes_palette.png" then - palette_type = false - oldfdir = 0 - elseif nodedef.palette == "unifieddyes_palette_colorwallmounted.png" then - palette_type = "wallmounted" - oldfdir = node.param2 % 8 - elseif nodedef.palette == "unifieddyes_palette_extended.png" then - palette_type = "extended" - oldfdir = 0 - end - - local paletteidx, hue = unifieddyes.getpaletteidx(lastdye, palette_type) - if palette_type == true and hue ~= 0 then newname = string.gsub(newname, "_grey", "_"..unifieddyes.HUES[hue]) end - - minetest.set_node(pos, { name = newname, param2 = oldfdir + paletteidx }) - - local meta = minetest.get_meta(pos) - meta:set_string("dye", lastdye) - - if not creative_mode then - inv:remove_item("main", lastdye.." 1") - end - else - minetest.chat_send_player(playername, "Ran out of "..unifieddyes.last_used_dye[playername]..", resetting to neutral.") - unifieddyes.last_used_dye[playername] = nil + if def.palette == "unifieddyes_palette_extended.png" then + param2 = 240 + color = 240 + elseif def.palette == "unifieddyes_palette_colorwallmounted.png" then + param2 = newnode.param2 % 8 + elseif def.palette ~= "unifieddyes_palette.png" then -- it's a split palette + param2 = newnode.param2 % 32 end + + minetest.swap_node(pos, {name = newnode.name, param2 = param2}) + minetest.get_meta(pos):set_int("palette_index", color) end +) + +-- just stubs to keep old mods from crashing when expecting auto-coloring +-- or getting back the dye on dig. + +function unifieddyes.recolor_on_place(foo) end -minetest.register_on_leaveplayer(function(player) - local playername = player:get_player_name() - unifieddyes.last_used_dye[playername] = nil - unifieddyes.last_dyed_node[playername] = nil -end) +function unifieddyes.after_dig_node(foo) +end + +-- This helper function creates a colored itemstack + +function unifieddyes.make_colored_itemstack(item, palette, color) + local paletteidx = unifieddyes.getpaletteidx(color, palette) + local stack = ItemStack(item) + stack:get_meta():set_int("palette_index", paletteidx) + return stack:to_string() +end + +-- if your node was once 89-color and uses an LBM to convert to the 256-color palette, +-- call this in that node def's on_construct: + +function unifieddyes.on_construct(pos) + local meta = minetest.get_meta(pos) + meta:set_string("palette", "ext") +end + +-- these helper functions register all of the recipes needed to create colored +-- nodes with any of the dyes supported by that node's palette. + +local function register_c(craft, hue, sat, val) + local color = "" + if val then + if craft.palette ~= "extended" then + color = val..hue..sat + else + color = val..hue[1]..sat + end + else + color = hue -- if val is nil, then it's grey. + end + + local dye = "dye:"..color + + local recipe = minetest.serialize(craft.recipe) + recipe = string.gsub(recipe, "MAIN_DYE", dye) + recipe = string.gsub(recipe, "NEUTRAL_NODE", craft.neutral_node) + local newrecipe = minetest.deserialize(recipe) + + local output = craft.output + if craft.output_prefix then + if craft.palette ~= true then + output = craft.output_prefix..color..craft.output_suffix + else + if hue == "white" or hue == "black" or string.find(hue, "grey") then + output = craft.output_prefix.."grey"..craft.output_suffix + elseif hue == "pink" then + dye = "dye:light_red" + output = craft.output_prefix.."red"..craft.output_suffix + else + output = craft.output_prefix..hue..craft.output_suffix + end + end + end + + local colored_itemstack = + unifieddyes.make_colored_itemstack(output, craft.palette, dye) + + minetest.register_craft({ + output = colored_itemstack, + type = craft.type, + recipe = newrecipe + }) + +end + +function unifieddyes.register_color_craft(craft) + local hues_table = unifieddyes.HUES + local sats_table = unifieddyes.SATS + local vals_table = unifieddyes.VALS + local greys_table = unifieddyes.GREYS + + if craft.palette == "wallmounted" then + hues_table = unifieddyes.HUES_WALLMOUNTED + sats_table = {""} + vals_table = unifieddyes.VALS + elseif craft.palette == "extended" then + hues_table = unifieddyes.HUES_EXTENDED + vals_table = unifieddyes.VALS_EXTENDED + greys_table = unifieddyes.GREYS_EXTENDED + end + + for _, hue in ipairs(hues_table) do + for _, val in ipairs(vals_table) do + for _, sat in ipairs(sats_table) do + + if sat == "_s50" and val ~= "" and val ~= "medium_" and val ~= "dark_" then break end + register_c(craft, hue, sat, val) + + end + end + end + + for _, grey in ipairs(greys_table) do + register_c(craft, grey) + end + + register_c(craft, "pink") + +end -- code borrowed from homedecor -- call this function to reset the rotation of a "wallmounted" object on place function unifieddyes.fix_rotation(pos, placer, itemstack, pointed_thing) local node = minetest.get_node(pos) + local colorbits = node.param2 - (node.param2 % 8) + local yaw = placer:get_look_horizontal() local dir = minetest.yaw_to_dir(yaw) -- -1.5) local pitch = placer:get_look_vertical() @@ -218,7 +311,7 @@ function unifieddyes.fix_rotation(pos, placer, itemstack, pointed_thing) elseif pitch > math.pi/8 then fdir = 1 end - minetest.swap_node(pos, { name = node.name, param2 = fdir }) + minetest.swap_node(pos, { name = node.name, param2 = fdir+colorbits }) end -- use this when you have a "wallmounted" node that should never be oriented @@ -226,10 +319,12 @@ end function unifieddyes.fix_rotation_nsew(pos, placer, itemstack, pointed_thing) local node = minetest.get_node(pos) + local colorbits = node.param2 - (node.param2 % 8) local yaw = placer:get_look_horizontal() local dir = minetest.yaw_to_dir(yaw+1.5) local fdir = minetest.dir_to_wallmounted(dir) - minetest.swap_node(pos, { name = node.name, param2 = fdir }) + + minetest.swap_node(pos, { name = node.name, param2 = fdir+colorbits }) end -- ... and use this one to force that kind of node off of floor/ceiling @@ -532,221 +627,6 @@ function unifieddyes.getpaletteidx(color, palette_type) end end --- if your node was once 89-color and uses an LBM to convert to the 256-color palette, --- call this in that node def's on_construct: - -function unifieddyes.on_construct(pos) - local meta = minetest.get_meta(pos) - meta:set_string("palette", "ext") -end - --- call this in your node's after_dig_node to get the last-used dye back. - -function unifieddyes.after_dig_node(pos, oldnode, oldmetadata, digger) - local prevdye - - if oldmetadata and oldmetadata.fields then - prevdye = oldmetadata.fields.dye - end - - local inv = digger:get_inventory() - - if prevdye and not (inv:contains_item("main", prevdye) and creative_mode) and minetest.registered_items[prevdye] then - if inv:room_for_item("main", prevdye) then - inv:add_item("main", prevdye) - else - minetest.add_item(pos, prevdye) - end - end -end - -function unifieddyes.on_use(itemstack, player, pointed_thing) - local stackname = itemstack:get_name() - local playername = player:get_player_name() - - if pointed_thing and pointed_thing.type == "node" then - if minetest.is_protected(unifieddyes.select_node(pointed_thing), playername) - and not minetest.check_player_privs(playername, "protection_bypass") then - minetest.chat_send_player(playername, "Sorry, someone else owns that spot.") - return - end - end - - if pointed_thing and pointed_thing.type == "object" then - pointed_thing.ref:punch(player, 0, itemstack:get_tool_capabilities()) - return player:get_wielded_item() -- punch may modified the wielded item, load the new and return it - end - - if not (pointed_thing and pointed_thing.type == "node") then return end -- if "using" the dye on nothing at all (e.g. air) - - local pos = minetest.get_pointed_thing_position(pointed_thing) - local node = minetest.get_node(pos) - - local nodedef = minetest.registered_nodes[node.name] - - if not nodedef then return end -- target was an unknown node, just bail out - - -- if the node has an on_punch defined, bail out and call that instead, unless "sneak" is pressed. - if not player:get_player_control().sneak then - local onpunch = nodedef.on_punch(pos, node, player, pointed_thing) - if onpunch then - return onpunch - end - end - - if player:get_player_control().sneak then - if unifieddyes.last_used_dye[playername] then - minetest.chat_send_player(playername, "Shift-punched a node, switching back to neutral color." ) - end - unifieddyes.last_used_dye[playername] = nil - return - end - - -- if the target is unknown, has no groups defined, or isn't UD-colorable, just bail out - if not (nodedef and nodedef.groups and nodedef.groups.ud_param2_colorable) then - minetest.chat_send_player(playername, "That node can't be colored.") - return - end - - local newnode = nodedef.ud_replacement_node - local palette_type - - if nodedef.palette == "unifieddyes_palette_extended.png" then - palette_type = "extended" - elseif nodedef.palette == "unifieddyes_palette.png" then - palette_type = false - elseif nodedef.paramtype2 == "colorfacedir" then - palette_type = true - elseif nodedef.paramtype2 == "colorwallmounted" then - palette_type = "wallmounted" - end - - if minetest.is_protected(pos, playername) and not minetest.check_player_privs(playername, {protection_bypass=true}) then - minetest.record_protection_violation(pos, playername) - return - end - - local pos2 = unifieddyes.select_node(pointed_thing) - local paletteidx, hue = unifieddyes.getpaletteidx(stackname, palette_type) - - if paletteidx then - - if unifieddyes.last_used_dye[playername] ~= stackname then - minetest.chat_send_player(playername, "Color "..stackname.." selected, auto-coloring activated." ) - unifieddyes.last_used_dye[playername] = stackname - end - - local meta = minetest.get_meta(pos) - local prevdye = meta:get_string("dye") - local inv = player:get_inventory() - - if not (inv:contains_item("main", prevdye) and creative_mode) and minetest.registered_items[prevdye] then - if inv:room_for_item("main", prevdye) then - inv:add_item("main", prevdye) - else - minetest.add_item(pos, prevdye) - end - end - - meta:set_string("dye", stackname) - - if prevdye == stackname then - local a,b = string.find(stackname, ":") - minetest.chat_send_player(playername, "That node is already "..string.sub(stackname, a + 1).."." ) - return - elseif not creative_mode then - itemstack:take_item() - end - - node.param2 = paletteidx - - local oldpaletteidx, oldhuenum = unifieddyes.getpaletteidx(prevdye, palette_type) - local oldnode = minetest.get_node(pos) - - local oldhue = nil - for _, i in ipairs(unifieddyes.HUES) do - if string.find(oldnode.name, "_"..i) and not - ( string.find(oldnode.name, "_redviolet") and i == "red" ) then - oldhue = i - break - end - end - - if newnode then -- this path is used when the calling mod want to supply a replacement node - if palette_type == "wallmounted" then - node.param2 = paletteidx + (minetest.get_node(pos).param2 % 8) - elseif palette_type == true then -- it's colorfacedir - if oldhue ~=0 then -- it's colored, not grey - if oldhue ~= nil then -- it's been painted before - if hue ~= 0 then -- the player's wielding a colored dye - newnode = string.gsub(newnode, "_"..oldhue, "_"..unifieddyes.HUES[hue]) - else -- it's a greyscale dye - newnode = string.gsub(newnode, "_"..oldhue, "_grey") - end - else -- it's never had a color at all - if hue ~= 0 then -- and if the wield is greyscale, don't change the node name - newnode = string.gsub(newnode, "_grey", "_"..unifieddyes.HUES[hue]) - end - end - else - if hue ~= 0 then -- greyscale dye on greyscale node = no hue change - newnode = string.gsub(newnode, "_grey", "_"..unifieddyes.HUES[hue]) - end - end - node.param2 = paletteidx + (minetest.get_node(pos).param2 % 32) - else -- it's the 89-color palette, or the extended palette - node.param2 = paletteidx - end - node.name = newnode - minetest.swap_node(pos, node) - if palette_type == "extended" then - meta:set_string("palette", "ext") - end - if not creative_mode then - return itemstack - end - else -- this path is used when you're just painting an existing node, rather than replacing one. - newnode = oldnode -- note that here, newnode/oldnode are a full node, not just the name. - if palette_type == "wallmounted" then - newnode.param2 = paletteidx + (minetest.get_node(pos).param2 % 8) - elseif palette_type == true then -- it's colorfacedir - if oldhue then - if hue ~= 0 then - newnode.name = string.gsub(newnode.name, "_"..oldhue, "_"..unifieddyes.HUES[hue]) - else - newnode.name = string.gsub(newnode.name, "_"..oldhue, "_grey") - end - elseif string.find(minetest.get_node(pos).name, "_grey") and hue ~= 0 then - newnode.name = string.gsub(newnode.name, "_grey", "_"..unifieddyes.HUES[hue]) - end - newnode.param2 = paletteidx + (minetest.get_node(pos).param2 % 32) - else -- it's the 89-color palette, or the extended palette - newnode.param2 = paletteidx - end - minetest.swap_node(pos, newnode) - if palette_type == "extended" then - meta:set_string("palette", "ext") - end - if not creative_mode then - return itemstack - end - end - else - local a,b = string.find(stackname, ":") - if a then - minetest.chat_send_player(playername, "That node can't be colored "..string.sub(stackname, a + 1).."." ) - end - end -end - --- re-define default dyes slightly, to add on_use - -for _, color in ipairs(default_dyes) do - minetest.override_item("dye:"..color, { - on_use = unifieddyes.on_use - }) -end - -- build a table to convert from classic/89-color palette to extended palette -- the first five entries are for the old greyscale - white, light, grey, dark, black @@ -801,7 +681,6 @@ for _, h in ipairs(unifieddyes.HUES_EXTENDED) do if minetest.registered_items["dye:"..val..hue] then minetest.override_item("dye:"..val..hue, { inventory_image = "unifieddyes_dye.png^[colorize:#"..color..":200", - on_use = unifieddyes.on_use }) else if (val..hue) ~= "medium_orange" @@ -810,7 +689,6 @@ for _, h in ipairs(unifieddyes.HUES_EXTENDED) do description = S(desc), inventory_image = "unifieddyes_dye.png^[colorize:#"..color..":200", groups = { dye=1, not_in_creative_inventory=1 }, - on_use = unifieddyes.on_use }) end end @@ -833,7 +711,6 @@ for _, h in ipairs(unifieddyes.HUES_EXTENDED) do description = S(desc.." (low saturation)"), inventory_image = "unifieddyes_dye.png^[colorize:#"..color..":200", groups = { dye=1, not_in_creative_inventory=1 }, - on_use = unifieddyes.on_use }) minetest.register_alias("unifieddyes:"..val..hue.."_s50", "dye:"..val..hue.."_s50") end @@ -854,7 +731,6 @@ for y = 1, 14 do -- colors 0 and 15 are black and white, default dyes description = S(desc), inventory_image = "unifieddyes_dye.png^[colorize:#"..rgb..":200", groups = { dye=1, not_in_creative_inventory=1 }, - on_use = unifieddyes.on_use }) minetest.register_alias("unifieddyes:"..name, "dye:"..name) end @@ -862,19 +738,16 @@ end minetest.override_item("dye:grey", { inventory_image = "unifieddyes_dye.png^[colorize:#888888:200", - on_use = unifieddyes.on_use }) minetest.override_item("dye:dark_grey", { inventory_image = "unifieddyes_dye.png^[colorize:#444444:200", - on_use = unifieddyes.on_use }) minetest.register_craftitem(":dye:light_grey", { description = S("Light grey Dye"), inventory_image = "unifieddyes_dye.png^[colorize:#cccccc:200", groups = { dye=1, not_in_creative_inventory=1 }, - on_use = unifieddyes.on_use }) unifieddyes.base_color_crafts = { diff --git a/mods/unifieddyes/locale/pt_br.txt b/mods/unifieddyes/locale/pt_br.txt new file mode 100644 index 0000000..def3571 --- /dev/null +++ b/mods/unifieddyes/locale/pt_br.txt @@ -0,0 +1,85 @@ +Lime Dye = Corante Lima +Aqua Dye = Corante Água +Sky-blue Dye = Corante Azul-Céu +Red-violet Dye = Corante Vermelho-Violeta +Light Grey Dye = Corante Cinza Claro + +Dark Red Dye (low saturation) = Corante Vermelho Escuro (baixa saturação) +Dark Orange Dye (low saturation) = Corante Laranja Escuro (baixa saturação) +Dark Yellow Dye (low saturation) = Corante Amarelo Escuro (baixa saturação) +Dark Lime Dye (low saturation) = Corante Lima Escuro (baixa saturação) +Dark Green Dye (low saturation) = Corante Verde Escuro (baixa saturação) +Dark Aqua Dye (low saturation) = Corante Água Escuro (baixa saturação) +Dark Cyan Dye (low saturation) = Corante Ciano Escuro (baixa saturação) +Dark Sky-blue Dye (low saturation) = Corante Azul-Céu Escuro (baixa saturação) +Dark Blue Dye (low saturation) = Corante Azul Escuro (baixa saturação) +Dark Violet Dye (low saturation) = Corante Violeta Escuro (baixa saturação) +Dark Magenta Dye (low saturation) = Corante Magenta Escuro (baixa saturação) +Dark Red-violet Dye (low saturation) = Corante Vermelho-Violeta Escuro (baixa saturação) + +Dark Red Dye = Corante Vermelho Escuro +Dark Orange Dye = Corante Laranja Escuro +Dark Yellow Dye = Corante Amarelo Escuro +Dark Lime Dye = Corante Lima Escuro +Dark Green Dye = Corante Verde Escuro +Dark Aqua Dye = Corante Água Escuro +Dark Cyan Dye = Corante Ciano Escuro +Dark Sky-blue Dye = Corante Azul-Céu Escuro +Dark Blue Dye = Corante Azul Escuro +Dark Violet Dye = Corante Violeta Escuro +Dark Magenta Dye = Corante Magenta Escuro +Dark Red-violet Dye = Corante Vermelho-Violeta Escuro + +Medium Red Dye (low saturation) = Corante Vermelho Médio (baixa saturação) +Medium Orange Dye (low saturation) = Corante Laranja Médio (baixa saturação) +Medium Yellow Dye (low saturation) = Corante Amarelo Médio (baixa saturação) +Medium Lime Dye (low saturation) = Corante Lima Médio (baixa saturação) +Medium Green Dye (low saturation) = Corante Verde Médio (baixa saturação) +Medium Aqua Dye (low saturation) = Corante Água Médio (baixa saturação) +Medium Cyan Dye (low saturation) = Corante Ciano Médio (baixa saturação) +Medium Sky-blue Dye (low saturation) = Corante Azul-Céu Médio (baixa saturação) +Medium Blue Dye (low saturation) = Corante Azul Médio (baixa saturação) +Medium Violet Dye (low saturation) = Corante Violeta Médio (baixa saturação) +Medium Magenta Dye (low saturation) = Corante Magenta Médio (baixa saturação) +Medium Red-violet Dye (low saturation) = Corante Vermelho-Violeta Médio (baixa saturação) + +Medium Red Dye = Corante Vermelho Médio +Medium Orange Dye = Corante Laranja Médio +Medium Yellow Dye = Corante Amarelo Médio +Medium Lime Dye = Corante Lima Médio +Medium Green Dye = Corante Verde Médio +Medium Aqua Dye = Corante Água Médio +Medium Cyan Dye = Corante Ciano Médio +Medium Sky-blue = Corante Azul-Céu Médio +Medium Blue Dye = Corante Azul Médio +Medium Violet Dye = Corante Violeta Médio +Medium Magenta Dye = Corante Magenta Médio +Medium Red-violet Dye = Corante Vermelho-Violeta Médio + +Red Dye (low saturation) = Corante Vermelho (baixa saturação) +Orange Dye (low saturation) = Corante Laranja (baixa saturação) +Yellow Dye (low saturation) = Corante Amarelo (baixa saturação) +Lime Dye (low saturation) = Corante Lima (baixa saturação) +Green Dye (low saturation) = Corante Vermelho (baixa saturação) +Aqua Dye (low saturation) = Corante Água (baixa saturação) +Cyan Dye (low saturation) = Corante Ciano (baixa saturação) +Sky-blue Dye (low saturation) = Corante Azul-Céu (baixa saturação) +Blue Dye (low saturation) = Corante Azul (baixa saturação) +Violet Dye (low saturation) = Corante Violeta (baixa saturação) +Magenta Dye (low saturation) = Corante Magenta (baixa saturação) +Red-violet Dye (low saturation) = Corante Vermelho-Violeta (baixa saturação) + +Red Dye = Corante Vermelho +Orange Dye = Corante Laranja +Yellow Dye = Corante Amarelo +Lime Dye = Corante Lima +Green Dye = Corante Verde +Aqua Dye = Corante Água +Cyan Dye = Corano Ciano +Sky-blue Dye = Corante Azul-Céu +Blue Dye = Corante Azul +Violet Dye = Corante Violeta +Magenta Dye = Corante Magenta +Red-violet Dye = Corante Vermelho-Violeta + +[UnifiedDyes] Loaded! = [UnifiedDyes] Carregado! diff --git a/mods/user_interface/doc/doc/API.md b/mods/user_interface/doc/doc/API.md index 59b8825..784a666 100644 --- a/mods/user_interface/doc/doc/API.md +++ b/mods/user_interface/doc/doc/API.md @@ -41,7 +41,7 @@ this mod is capable of and how these use cases could be implemented. ### Simple use case: Minetest basics Let's say you want to write in free form short help texts about the basic -concepts of Minetest or your subgame. First you could define a category +concepts of Minetest or your game. First you could define a category called “Basics”, the data for each of its entry is just a free form text. The template function simply creates a formspec where this free form text is displayed. @@ -233,7 +233,7 @@ The help starts with this default order: This function can be called at any time, but it recommended to only call this function once for the entire server session and to only call it -from subgame mods, to avoid contradictions. If this function is called a +from game mods, to avoid contradictions. If this function is called a second time by any mod, a warning is written into the log. #### Parameters @@ -362,7 +362,7 @@ rest of the game. #### Parameters * `playername`: Name of the player for whom to reveal the entries -### `doc.add_entry_alias(category_id_orig, entry_id_orig, category_id_alias, entry_id_orig)` +### `doc.add_entry_alias(category_id_orig, entry_id_orig, category_id_alias, entry_id_alias)` Adds a single alias for an entry. If an entry has an alias, supplying the alias to a function which demand `category_id` and `entry_id` will work as expected. When using this function, you must make sure the category already exists. diff --git a/mods/user_interface/doc/doc/README.md b/mods/user_interface/doc/doc/README.md index 5731495..f95b5f8 100644 --- a/mods/user_interface/doc/doc/README.md +++ b/mods/user_interface/doc/doc/README.md @@ -4,7 +4,7 @@ can access help pages about various things and the modder can add those pages. The mod itself does not provide any help texts, just the framework. It is the heart of the Help modpack, on which the other Help mods depend. -Current version: 1.1.0 +Current version: 1.1.1 ## For players ### Accessing the help @@ -37,9 +37,9 @@ stored in the world directory in the file `doc.mt`. You can safely reset the viewed/revealed state of all players by deleting this file. Players then need to start over revealing all entries. -## For modders and subgame authors +## For modders and game authors This mod helps you in creating extensive and flexible help entries for your -mods or subgame. You can write about basically anything in the presentation +mods or game. You can write about basically anything in the presentation you prefer. To get started, read `API.md` in the directory of this mod. diff --git a/mods/user_interface/doc/doc/init.lua b/mods/user_interface/doc/doc/init.lua index b8f8270..7f4705e 100644 --- a/mods/user_interface/doc/doc/init.lua +++ b/mods/user_interface/doc/doc/init.lua @@ -689,7 +689,7 @@ do doc.data.players[name] = {} doc.data.players[name].stored_data = players_stored_data end - minetest.debug("[doc] doc.mt successfully read.") + minetest.log("action", "[doc] doc.mt successfully read.") end end end diff --git a/mods/user_interface/doc/doc_basics/README.md b/mods/user_interface/doc/doc_basics/README.md index 2125bed..f7983fd 100644 --- a/mods/user_interface/doc/doc_basics/README.md +++ b/mods/user_interface/doc/doc_basics/README.md @@ -6,7 +6,7 @@ categories: * Basics: Basic gameplay information (e.g. how to craft) * Advanced usage: Advanced Minetest information (not gameplay-releavant) for power users (e.g. how to use commands) -Version: 1.0.0 +Version: 1.0.1 ## License Everything in this mod is licensed under the MIT License. diff --git a/mods/user_interface/doc/doc_basics/init.lua b/mods/user_interface/doc/doc_basics/init.lua index dea6b7e..266cb3f 100644 --- a/mods/user_interface/doc/doc_basics/init.lua +++ b/mods/user_interface/doc/doc_basics/init.lua @@ -1,6 +1,6 @@ --[[ - TODO: Allow to disable images to save bandwidth -- TODO: Add API for subgame-specific changes so the entries are not too awfully generic +- TODO: Add API for game-specific changes so the entries are not too awfully generic - Support for landing page - Support to modify some parts of existing entries - TODO: Add introduction to online play (if possible) @@ -64,7 +64,7 @@ doc.add_entry("basics", "minetest", { text = S("Minetest is a free software game engine for games based on voxel gameplay, inspired by InfiniMiner, Minecraft, and the like. Minetest was originally created by Perttu Ahola (alias “celeron55”).").."\n\n".. -S("The player is thrown into a huge world made out of cubes or blocks. These cubes usually make the landscape they blocks can be removed and placed almost entirely freely. Using the collected items, new tools and other items can be crafted. Games in Minetest (also called “subgames”) can, however, be much more complex than this.").."\n\n".. +S("The player is thrown into a huge world made out of cubes or blocks. These cubes usually make the landscape they blocks can be removed and placed almost entirely freely. Using the collected items, new tools and other items can be crafted. Games in Minetest can, however, be much more complex than this.").."\n\n".. S("A core feature of Minetest is the built-in modding capability. Mods modify existing gameplay. They can be as simple as adding a few decorational blocks or be very complex by e.g. introducing completely new gameplay concepts, generating a completely different kind of world, and many other things.").."\n\n".. @@ -177,7 +177,7 @@ S("Players can take damage for a variety of reasons, here are some:\ • Being attacked by a computer enemy").."\n\n".. S("At a health of 0, the player dies. The player can just respawn in the world.").."\n".. -S("Other consequences of death depend on the subgame. The player could lose all items, or lose the round in a competitive game.").."\n\n".. +S("Other consequences of death depend on the game. The player could lose all items, or lose the round in a competitive game.").."\n\n".. S("Some blocks reduce breath. While being with the head in a block which causes drowning, the breath points are reduced by 1 for every 2 seconds. When all breath is gone, the player starts to suffer drowning damage. Breath is quickly restored in any other block.").."\n\n".. @@ -407,7 +407,7 @@ S("To craft something, you need one or more items, a crafting grid (C) and a cra S("To complete the craft, take the result item from the output slot, which will consume items from the crafting grid and creates a new item. It is not possible to place items into the output slot.").."\n\n".. -S("A description on how to craft an item is called a “crafting recipe”. You need this knowledge to craft. There are multiple ways to learn crafting recipes. One way is by using a crafting guide, which contains a list of available crafting recipes. Some subgames provide crafting guides. There are also some mods which you can download online for installing a crafting guide. Another way is by reading the online manual of the subgame (if one is available).").."\n\n".. +S("A description on how to craft an item is called a “crafting recipe”. You need this knowledge to craft. There are multiple ways to learn crafting recipes. One way is by using a crafting guide, which contains a list of available crafting recipes. Some games provide crafting guides. There are also some mods which you can download online for installing a crafting guide. Another way is by reading the online manual of the game (if one is available).").."\n\n".. S("Crafting recipes consist of at least one input item and exactly one stack of output items. When performing a single craft, it will consume exactly one item from each stack of the crafting grid, unless the crafting recipe defines replacements.").."\n\n".. @@ -416,7 +416,7 @@ S("There are multiple types of crafting recipes:\ • Shaped (image 2): Items need to be placed in a particular shape\ • Shapeless (images 3 and 4): Items need to be placed somewhere in input (both images show the same recipe)\ • Cooking: Explained in “Basics > Cooking”\ -• Repairing (image 5): Place two damaged tools into the crafting grid anywhere to get a tool which is repaired by a certain percentage. This recipe may not be available in all subgames").."\n\n".. +• Repairing (image 5): Place two damaged tools into the crafting grid anywhere to get a tool which is repaired by a certain percentage. This recipe may not be available in all games").."\n\n".. S("In some crafting recipes, some input items do not need to be a concrete item, instead they need to be a member of a group (see “Basics > Groups”). These recipes offer a bit more freedom in the input items. Images 6-8 show the same group-based recipe. Here, 8 items of the “stone” group are required, which is true for all of the shown items.").."\n\n".. @@ -468,7 +468,7 @@ S("Radar mode (image 2) is more complicated. It displays the “denseness” of S("There are also two different rotation modes. In “square mode”, the rotation of the minimap is fixed. If you press [Shift]+[F9] to switch to “circle mode”, the minimap will instead rotate with your looking direction, so “up” is always your looking direction.").."\n\n".. -S("In some subgames, the minimap may be disabled.").."\n\n".. +S("In some games, the minimap may be disabled.").."\n\n".. S("• Toggle minimap mode: [F9]").."\n".. S("• Toggle minimap rotation mode: [Shift]+[F9]"), @@ -517,7 +517,7 @@ S("Community wiki: ").."\n".. S("A community-based documentation website for Minetest. Anyone with an account can edit it! It also features a documentation of Minetest Game.").."\n\n".. S("Web forums: ").."\n".. -S("A web-based discussion platform where you can discuss everything related to Minetest. This is also a place where player-made mods and subgames are published and discussed. The discussions are mainly in English, but there is also space for discussion in other languages.").."\n\n".. +S("A web-based discussion platform where you can discuss everything related to Minetest. This is also a place where player-made mods and games are published and discussed. The discussions are mainly in English, but there is also space for discussion in other languages.").."\n\n".. S("Chat: ").."\n".. S("A generic Internet Relay Chat channel for everything related to Minetest where people can meet to discuss in real-time. If you do not understand IRC, see the Community Wiki for help.") @@ -597,9 +597,9 @@ S("• Protection: Mechanism to own areas of the world, which only allows the ow S("Technical terms:").."\n".. S("• Minetest: This game engine").."\n".. -S("• Minetest Game: A subgame for Minetest by the Minetest developers").."\n".. -S("• Subgame: A complete playing experience to be used in Minetest; such as a game or sandbox or similar").."\n".. -S("• Mod: A single subsystem which adds or modifies functionality; is the basic building block of subgames and can be used to further enhance or modify them").."\n".. +S("• Minetest Game: A game for Minetest by the Minetest developers").."\n".. +S("• Game: A complete playing experience to be used in Minetest; such as a game or sandbox or similar").."\n".. +S("• Mod: A single subsystem which adds or modifies functionality; is the basic building block of games and can be used to further enhance or modify them").."\n".. S("• Privilege: Allows a player to do something").."\n".. S("• Node: Other word for “block”") }}) @@ -613,7 +613,7 @@ S("There is a large variety of settings to configure Minetest. Pretty much every S("These are a few of the most important gameplay settings:").."\n\n".. S("• Damage enabled (enable_damage): Enables the health and breath attributes for all players. If disabled, players are immortal").."\n".. -S("• Creative Mode (creative_mode): Enables sandbox-style gameplay focusing on creativity rather than a challenging gameplay. The meaning depends on the subgame; usual changes are: Reduced dig times, easy access to almost all items, tools never wear off, etc.").."\n".. +S("• Creative Mode (creative_mode): Enables sandbox-style gameplay focusing on creativity rather than a challenging gameplay. The meaning depends on the game; usual changes are: Reduced dig times, easy access to almost all items, tools never wear off, etc.").."\n".. S("• PvP (enable_pvp): Short for “Player vs Player”. If enabled, players can deal damage to each other").."\n\n".. S("For a full list of all available settings, use the “Advanced settings” dialog in the main menu.") diff --git a/mods/user_interface/doc/doc_identifier/README.md b/mods/user_interface/doc/doc_identifier/README.md index 7620be7..7afe3b9 100644 --- a/mods/user_interface/doc/doc_identifier/README.md +++ b/mods/user_interface/doc/doc_identifier/README.md @@ -1,5 +1,5 @@ # Lookup Tool [`doc_identifier`] -Version: 1.2.1 +Version: 1.2.2 ## Description The lookup tool is an useful little helper which can be used to quickly learn diff --git a/mods/user_interface/doc/doc_identifier/init.lua b/mods/user_interface/doc/doc_identifier/init.lua index 5824d47..d2fb15f 100644 --- a/mods/user_interface/doc/doc_identifier/init.lua +++ b/mods/user_interface/doc/doc_identifier/init.lua @@ -36,7 +36,7 @@ doc_identifier.identify = function(itemstack, user, pointed_thing) mod = string.sub(param,1,colon-1) end end - message = S("Error: This node, item or object is undefined. This is always an error.\nThis can happen for the following reasons:\n• The mod which is required for it is not enabled\n• The author of the subgame or a mod has made a mistake") + message = S("Error: This node, item or object is undefined. This is always an error.\nThis can happen for the following reasons:\n• The mod which is required for it is not enabled\n• The author of the game or a mod has made a mistake") message = message .. "\n\n" if mod ~= nil then @@ -135,10 +135,30 @@ doc_identifier.identify = function(itemstack, user, pointed_thing) end function doc_identifier.solid_mode(itemstack, user, pointed_thing) + -- Use pointed node's on_rightclick function first, if present + if pointed_thing.type == "node" then + 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 + end + return ItemStack("doc_identifier:identifier_solid") end function doc_identifier.liquid_mode(itemstack, user, pointed_thing) + -- Use pointed node's on_rightclick function first, if present + if pointed_thing.type == "node" then + 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 + end + return ItemStack("doc_identifier:identifier_liquid") end diff --git a/mods/user_interface/doc/doc_identifier/locale/de.txt b/mods/user_interface/doc/doc_identifier/locale/de.txt index 996c369..e0bfb34 100644 --- a/mods/user_interface/doc/doc_identifier/locale/de.txt +++ b/mods/user_interface/doc/doc_identifier/locale/de.txt @@ -1,4 +1,4 @@ -Error: This node, item or object is undefined. This is always an error.\nThis can happen for the following reasons:\n• The mod which is required for it is not enabled\n• The author of the subgame or a mod has made a mistake = Fehler: Dieser Node, Gegenstand oder dieses Objekt ist nicht definiert.\nDas ist immer ein Fehler.\nDies kann aus folgenden Gründen passieren:\n• Die Mod, die dafür benötigt wird, ist nicht aktiv\n• Der Subgame-Autor oder ein Mod-Autor machte einen Fehler +Error: This node, item or object is undefined. This is always an error.\nThis can happen for the following reasons:\n• The mod which is required for it is not enabled\n• The author of the game or a mod has made a mistake = Fehler: Dieser Node, Gegenstand oder dieses Objekt ist nicht definiert.\nDas ist immer ein Fehler.\nDies kann aus folgenden Gründen passieren:\n• Die Mod, die dafür benötigt wird, ist nicht aktiv\n• Der Spiel-Autor oder ein Mod-Autor machte einen Fehler It appears to originate from the mod “%s”, which is enabled. = Es scheint von der Mod »%s« zu stammen. Sie ist aktiv. It appears to originate from the mod “%s”, which is not enabled! = Es scheint von der Mod »%s« zu stammen. Sie ist nicht aktiv! Its identifier is “%s”. = Der Identifkator ist »%s«. diff --git a/mods/user_interface/doc/doc_identifier/locale/template.txt b/mods/user_interface/doc/doc_identifier/locale/template.txt index b0ede61..e4dd9c1 100644 --- a/mods/user_interface/doc/doc_identifier/locale/template.txt +++ b/mods/user_interface/doc/doc_identifier/locale/template.txt @@ -1,4 +1,4 @@ -Error: This node, item or object is undefined. This is always an error.\\nThis can happen for the following reasons:\\n• The mod which is required for it is not enabled\\n• The author of the subgame or a mod has made a mistake = +Error: This node, item or object is undefined. This is always an error.\\nThis can happen for the following reasons:\\n• The mod which is required for it is not enabled\\n• The author of the game or a mod has made a mistake = It appears to originate from the mod “%s”, which is enabled. = It appears to originate from the mod “%s”, which is not enabled! = Its identifier is “%s”. = diff --git a/mods/user_interface/doc/doc_items/API.md b/mods/user_interface/doc/doc_items/API.md index a683771..26cb118 100644 --- a/mods/user_interface/doc/doc_items/API.md +++ b/mods/user_interface/doc/doc_items/API.md @@ -179,7 +179,7 @@ explicitly). ### Hand and air The mod adds some default help texts for the hand and the air which are -written in a way that they probably are true for most subgames out of the +written in a way that they probably are true for most games out of the box, but especially the hand help text is kept intentionally vague. If you want to change these help texts or the entry names or other attributes, just add `_doc_items_*` fields to the item definition, either @@ -271,7 +271,7 @@ entry then. #### Background Normally, the core factoids are written in a very general-purpose style, so this function might -not be needed at all. But it might be useful for subgames and mods which radically break with +not be needed at all. But it might be useful for games and mods which radically break with some of the underlying core assumptions in Minetest. For example, if your mod completely changes the digging system, the help texts provided by `doc_items` are probably incorrect, so you can disable `node_mining` and register a custom factoid as a replacement. diff --git a/mods/user_interface/doc/doc_items/README.md b/mods/user_interface/doc/doc_items/README.md index c163fea..c3e6f67 100644 --- a/mods/user_interface/doc/doc_items/README.md +++ b/mods/user_interface/doc/doc_items/README.md @@ -1,4 +1,4 @@ -# Item Help [`doc_items`] (Version 1.1.1) +# Item Help [`doc_items`] (Version 1.1.2) ## Description Automatically generated help texts of blocks, tools, weapons, crafting items and other items. diff --git a/mods/user_interface/doc/doc_items/init.lua b/mods/user_interface/doc/doc_items/init.lua index baa3ef4..ec1bbf9 100644 --- a/mods/user_interface/doc/doc_items/init.lua +++ b/mods/user_interface/doc/doc_items/init.lua @@ -20,12 +20,12 @@ doc.sub.items.temp.rotate_node = S("This block's rotation is affected by the way doc.sub.items.settings = {} doc.sub.items.settings.friendly_group_names = false -local setting = minetest.setting_getbool("doc_items_friendly_group_names") +local setting = minetest.settings:get_bool("doc_items_friendly_group_names") if setting ~= nil then doc.sub.items.settings.friendly_group_names = setting end doc.sub.items.settings.itemstring = false -setting = minetest.setting_getbool("doc_items_show_itemstrings") +setting = minetest.settings:get_bool("doc_items_show_itemstrings") if setting ~= nil then doc.sub.items.settings.itemstring = setting end diff --git a/mods/user_interface/doc_minetest_game/helptexts.lua b/mods/user_interface/doc_minetest_game/helptexts.lua index c943000..3041e10 100644 --- a/mods/user_interface/doc_minetest_game/helptexts.lua +++ b/mods/user_interface/doc_minetest_game/helptexts.lua @@ -14,7 +14,7 @@ end local v6 = minetest.get_mapgen_setting("mg_name") == "v6" -local basicflametext +local basicflametext, permaflametext if minetest.setting_getbool("enable_fire") == false then basicflametext = S("The basic flame is a damaging but short-lived kind of block. This particular world is rather hostile to fire, so basic flames won't spread and destroy other blocks. They will quickly disappear. A basic flame is also destroyed by nearby water or punching. It hurts you when you stand directly inside a basic flame, but punching it is safe.") permaflametext = S("The permanent flame is a damaging block. Other than the basic flame, the permanent flame will not go away by time alone. A permanent flame is extinguished by punching it, by nearby water or similar blocks, or by removing a coal block below it. Punching is is safe, but it hurts if you stand inside. As this world is hostile to fire, it won't spread.") @@ -136,7 +136,8 @@ local export_longdesc = { ["default:dirt_with_snow"] = S("Dirt with snow is a cold block of frozen dirt which doesn't support the growth of any plants. Plants won't die on it, but they don't grow or spread either."), ["default:snow"] = S("A thin layer of snow. When it it on top of dirt, the dirt will slowly turn into dirt with snow. When snow lands on dirt with grass, it immediately turns into dirt with snow."), ["default:snowblock"] = S("A very thick layer of snow, filling an entire block. Snow this thick can usually only be found in arctic regions. When this block is placed on top of dirt with grass, the dirt with grass turns into dirt with snow."), - ["default:ice"] = S("Ice is found in arctic regions. It can appear either in huge glacier formations below snow blocks, or above water."), + ["default:ice"] = S("Ice is found in arctic regions. It can appear either in huge glacier formations below snow blocks, or above water. Ice will not naturally contain tunnels and caves."), + ["default:cave_ice"] = S("Cave ice is a type of ice which might naturally have tunnels and caves inside. It might be found in ice sheet biomes."), ["default:dirt"] = S("Dirt is found often directly under the surface and very common in many regions of the world. When exposed to sunlight, the surface of dirt may change, depending on its neighbors."), ["default:sand"] = S("Sand is found in large quantities at beaches, but it occasionally appears in small chunks around the world."), ["default:desert_sand"] = S("Usually found in huge quantities at the surface of deserts."), @@ -171,6 +172,7 @@ local export_longdesc = { ["default:aspen_wood"] = buildnode, ["default:sapling"] = S("When placed on natural soil (such as dirt) and exposed to sunlight, a sapling will grow into a tree after some time. There's a chance that this tree bears apples."), ["default:junglesapling"] = S("When placed on natural soil (such as dirt) and exposed to sunlight, a jungle sapling will grow into a large jungle tree after some time."), + ["default:emergent_jungle_sapling"] = S("When placed on natural soil (such as dirt) and exposed to sunlight, an emergent jungle sapling will grow into an emergent jungle tree (a taller subspecies of the jungle tree) after some time."), ["default:acacia_sapling"] = S("When placed on natural soil (such as dirt) and exposed to sunlight, an acacia sapling will grow into an acacia tree after some time."), ["default:aspen_sapling"] = S("When placed on natural soil (such as dirt) and exposed to sunlight, an aspen sapling will grow into an aspen tree after some time."), ["default:pine_sapling"] = S("When placed on natural soil (such as dirt) and exposed to sunlight, a pine sapling will grow into a pine tree after some time. If the pine sapling was next to any “snowy” block (e.g. “Snow Block”), the pine tree will be covered with snow."), @@ -236,10 +238,11 @@ local export_longdesc = { ["default:book"] = S("A book is used to store notes and to make bookshelves."), ["default:book_written"] = S("A book with text contains notes which can be rewritten and copied to books. In the inventory, both title and author of the book are shown."), - ["default:grass_1"] = S("Grass can be found in large quantities in open plains. It comes in 5 different sizes but doesn't grow."), + ["default:grass_1"] = S("Grass can be found in large quantities in open plains. It comes in 5 different sizes, but its size never changes."), + ["default:marram_grass_1"] = S("Marram grass can be in beaches on top of sand. It comes in 3 different sizes but its size never changes."), ["default:junglegrass"] = S("This plant is common in jungles."), - ["default:dry_grass_1"] = S("Dry grass is very common in savannahs and comes in 5 different sizes but doesn't grow."), - ["default:fern_1"] = S("Ferns can be found in large quantities in coniferous forests. It comes in 3 different sizes but doesn't grow."), + ["default:dry_grass_1"] = S("Dry grass is very common in savannahs and comes in 5 different sizes but its size never changes."), + ["default:fern_1"] = S("Ferns can be found in large quantities in coniferous forests. It comes in 3 different sizes but its size never changes."), ["default:meselamp"] = S("A bright light source powered by mese crystals. It is brighter than a torch."), ["default:mese_post_light"] = S("A bright light source powered by mese crystals. This is a more compact version of the mese lamp. It is brighter than a torch."), ["default:mese"] = S("Mese is a rare mineral of alien origin; mese blocks are a highly concentrated form of mese. At extreme depths (-1024 or lower), mese blocks rarely occour naturally in stone as clusters of about 3 mese blocks."), @@ -296,7 +299,10 @@ local export_longdesc = { ["vessels:drinking_glass"] = S("A decorational item which can be placed."), ["vessels:steel_bottle"] = S("A decorational item which can be placed."), ["vessels:shelf"] = S("A vessels shelf provides 16 inventory slots for vessels (like glass bottles)."), + ["fireflies:firefly"] = S("Fireflies hover in the air and illuminate the surroundings. They like to appear in the night and disappear in sunlight. They can be catched with a bugnet."), + ["fireflies:firefly_bottle"] = S("A firefly which has been captured in a bottle. It's a simple decoration which illuminates the surroundings."), ["xpanes:pane_1"] = S("Glass panes are thin layers of glass which neatly connect to their neighbors as you build them."), + ["xpanes:obsidian_pane_1"] = S("Obsidian glass panes are thin layers of obsidian glass which neatly connect to their neighbors as you build them."), ["xpanes:bar_1"] = S("Iron bars neatly connect to their neighbors as you build them."), ["beds:bed_bottom"] = beddesc, ["beds:fancy_bed_bottom"] = beddesc, @@ -398,6 +404,7 @@ local export_longdesc = { ["binoculars:binoculars"] = S("Binoculars allow you to zoom."), ["map:mapping_kit"] = S("A mapping kit allows you to use the minimap (but not the radar mode)."), + ["fireflies:bug_net"] = S("A bug net allows you to catch small insects, such as fireflies."), } local bonestime = tonumber(minetest.setting_get("share_bones_time")) @@ -508,6 +515,8 @@ local export_usagehelp = { ["binoculars:binoculars"] = S("Before you can zoom, this item must be activated. To activate it, hold it in your hand, then use the attack key. Now you can zoom with the zoom key (Z by default) until you lose this item. Alternatively, the binoculars get activated ca. 5 seconds after putting them into your inventory."), ["map:mapping_kit"] = S("Before you can use the minimap, this item must be activated. To activate it, hold it in your hand, then use the attack key. Now you can cycle through the minimap modes (surface mode only) with the minimap key (F9 by default) until you lose this item. Alternatively, the mapping kit is activated automatically ca. 5 seconds after putting them into your inventory."), + ["fireflies:bug_net"] = S("Point an insect and use the attack key to try to capture it."), + ["fireflies:firefly_bottle"] = S("Rightclick the bottle to release the firefly."), } local export_uses = { diff --git a/mods/user_interface/doc_minetest_game/init.lua b/mods/user_interface/doc_minetest_game/init.lua index 0bdd7fd..45315d6 100644 --- a/mods/user_interface/doc_minetest_game/init.lua +++ b/mods/user_interface/doc_minetest_game/init.lua @@ -87,6 +87,7 @@ local suppressed_items = { "doors:trapdoor_open", "doors:hidden", "xpanes:pane", + "xpanes:obsidian_pane", "xpanes:bar", "default:chest_open", "default:chest_locked_open", @@ -322,6 +323,7 @@ doc.add_entry_alias("nodes", "doors:trapdoor_steel", "nodes", "doors:trapdoor_st doc.add_entry_alias("nodes", "tnt:tnt", "nodes", "tnt:tnt_burning") doc.add_entry_alias("nodes", "tnt:gunpowder", "nodes", "tnt:gunpowder_burning") doc.add_entry_alias("nodes", "xpanes:pane_flat", "nodes", "xpanes:pane") +doc.add_entry_alias("nodes", "xpanes:obsidian_pane_flat", "nodes", "xpanes:obsidian_pane") doc.add_entry_alias("nodes", "xpanes:bar_flat", "nodes", "xpanes:bar") doc.add_entry_alias("nodes", "default:chest", "nodes", "default:chest_open") doc.add_entry_alias("nodes", "default:chest_locked", "nodes", "default:chest_locked_open") diff --git a/mods/user_interface/doc_minetest_game/locale/it.lua b/mods/user_interface/doc_minetest_game/locale/it.lua new file mode 100644 index 0000000..cb0cab3 --- /dev/null +++ b/mods/user_interface/doc_minetest_game/locale/it.lua @@ -0,0 +1,249 @@ +Books = Libri +Vessels = Contenitori +Dyes = Tinture +Sticks = Bastoni +Wool = Lana +Sand = Sabbia +Wood = Legno +Stones = Pietre +Metal = Metallo +Tree Trunks = Tronchi d'albero +Fences = Steccati +Walls = Muri +Leaves and Needles = Foglie e aghi +Flowers = Fiori +Saplings = Pianticelle +Water = Acqua +Lava = Lava +Coal = Carbone +Water buckets = Secchi d'acqua +Flora = Flora +Snowy = Nevosi +Cracky = Crepabile +Crumbly = Sgretolabile +Choppy = Tagliabile +Snappy = Spezzabile +Hand-breakable = Rompibile a mani nude +Flesh = Carne +Screwdriver = Cacciavite +Cart = Vagone +Basic Flame = Fiamma base +Wheat Plant = Pianta di grano +Cotton Plant = Pianta di cotone +River Water = Acqua di fiume +This block turns adjacent lava sources into obsidian and adjacent flowing lava into stone. = Questo blocco trasforma le fonti di lava adiacenti in ossidiana, e la lava corrente in pietra. +This block is flammable. = Questo blocco è infiammabile. +This block will extinguish nearby fire. = Questo blocco estinguerà i fuochi vicini. +This block will set flammable blocks within a radius of @1 on fire. = Questo blocco incendierà i blocchi infiammabili entro un raggio di @1. +It also destroys flammable items which have been dropped inside. = Distrugge anche gli oggetti infiammabili che sono stati rilasciati all'interno. +This block belongs to the @1 group. It a living organism which likes to grow and spread on dirt with grass and similar “soil”-type blocks when it is in light. Spreading will stop when the surrounding area is too crammed with @2 blocks. On silver sand and desert sand, it will wither and die and turn into a dry shrub. = Questo blocco appartiene al gruppo @1. È un organismo vivente che ama crescere e diffondersi sulla terra con erba e blocchi simili di tipo “terreno”, quando è illuminato. La diffusione si fermerà quando l'area circostante sarà troppo stipata con @2 blocchi. Sulla sabbia argentata e sulla sabbia del deserto, appassirà morendo e si trasformerà in un arbusto secco. +Flowers and other blocks in the @1 group will slowly turn into dry shrubs when placed on this block. = I fiori e gli altri blocchi nel gruppo @1 diventeranno lentamente arbusti secchi quando messi su questo blocco. +This block serves as a soil for saplings and small plants. Blocks in the “@1” group will grow into trees. Blocks in the “@2” group will spread slowly. = Questo blocco funge da terreno per pianticelle e piccole piante. I blocchi nel gruppo “@1” diventeranno alberi. I blocchi nel gruppo “@2” si diffonderanno lentamente. +This block serves as a soil for saplings and other small plants as well as plants grown from seeds. It supports their growth. = Questo blocco funge da terreno per pianticelle e altre piante piccole, così come piante cresciute dai semi. Ne supporta la crescita. +This block may drop as an item when there is no trunk or stem of its species within a distance of @1. Leaf decay does not occour when the block has been manually placed by a player. = Questo blocco potrebbe venire rilasciato come un oggetto quando non c'è un tronco o fusto della sua specie entro una distanza di @1. Il decadimento delle foglie non avviene quando il blocco è stato posizionato manualmente dall* utente. +This block quickly decays when there is no trunk or stem block of its species within a distance of @1. When decaying, it disappears and may drop one of its mining drops (but not itself). The block does not decay when the block has been placed by a player. = Questo blocco decade velocemente quando non c'è un tronco o fusto della sua specie entro una distanza di @1. Quando decade, sparisce e potrebbe rilasciare uno dei suoi oggetti di scavo (ma non sé stesso). Il blocco non decade quando è stato posizionato dall* utente. +This block quickly decays and disappears when there is no trunk or stem block of its species within a distance of @1. The block does not decay when the block has been placed by a player. = Questo blocco decade velocemente e sparisce quando non c'è un tronco o fusto della sua specie entro una distanza di @1. Il blocco non decade quando è stato posizionato da un* utente. +Under sunlight, this block slowly spreads its dirt cover towards nearby dirt blocks. In the shadows, this block eventually loses its dirt cover and turns into plain dirt. = Sotto la luce solare, questo blocco diffonde lentamente la copertura della sua terra verso i blocchi di terra adiacenti. Nelle ombre, questo blocco alla fine perde la copertura della propria terra e si trasforma in terra semplice. +This block can be turned into @1 with a hoe. = Questo blocco può essere trasformato in @1 con una zappa. +This block can be cultivated by a hoe. = Questo blocco è coltivabile con una zappa. +This block is compatible with keys. = Questo blocco è compatibile con le chiavi. +The basic flame is a damaging but short-lived kind of block. This particular world is rather hostile to fire, so basic flames won't spread and destroy other blocks. They will quickly disappear. A basic flame is also destroyed by nearby water or punching. It hurts you when you stand directly inside a basic flame, but punching it is safe. = La fiamma base è un tipo di blocco che ferisce ma non dura molto. Questo mondo particolare è piuttosto ostile al fuoco, perciò le fiamme base non si propagheranno distruggendo altri blocchi. Spariranno velocemente. Una fiamma base viene distrutta dall'acqua vicina o colpendola. Vi ferisce quando ci state dentro, ma colpirla è sicuro. +The permanent flame is a damaging block. Other than the basic flame, the permanent flame will not go away by time alone. A permanent flame is extinguished by punching it, by nearby water or similar blocks, or by removing a coal block below it. Punching is is safe, but it hurts if you stand inside. As this world is hostile to fire, it won't spread. = La fiamma permanente è un blocco che ferisce. Diversamente dalla fiamma base, la fiamma permanente non se ne andrà solo per il tempo. Una fiamma permanente viene estinta colpendola, dall'acqua o da blocchi simili vicini, o togliendo il blocco di carbone sottostante. Colpirla è sicuro, ma vi ferisce se ci state dentro. Dato che questo mondo è ostile al fuoco, non si propagherà. +The basic flame is a damaging and destructive but short-lived kind of block. It will destroy and spread towards near flammable blocks, but fire will disappear if there is nothing to burn left. It will be extinguished by water and other blocks if it is next to it. A single basic flame block can be destroyed safely by punching it, but it is hurtful if you stand directly in it. = La fiamma base è un blocco distruttivo ma dalla breve esistenza. Distruggerà e si allargherà verso i blocchi infiammabili vicini, ma il fuoco sparirà se non resterà nulla da bruciare. Sarà estinta dall'acqua e altri blocchi se le sono vicini. Un blocco di fiamma base può essere distrutto tranquillamente colpendolo, ma vi danneggia se ci state dentro. +The permanent flame is a damaging and destructive block. It will create basic flames next to it if flammable blocks are nearby. Other than the basic flame, the permanent flame will not go away by time alone. A permanent flame is extinguished by punching it, by nearby water or similar blocks, or by removing a coal block below it. Punching is is safe, but it hurts if you stand inside. = La fiamma permanente è un blocco che ferisce e distrugge. Creerà fiamme base nelle sue vicinanze se ci saranno blocchi infiammabili vicini. Diversamente dalla fiamma base, la fiamma permanente non se ne andrà solo per il tempo. Una fiamma permanente viene estinta colpendola, dall'acqua o da blocchi simili vicini, o togliendo il blocco di carbone sottostante. Colpirla è sicuro, ma vi ferisce se ci state dentro. +Flowers of this species have their natural habitat in grasslands and forests and are important for the production of dyes. = I fiori di questa specie hanno il loro habitat naturale nelle praterie e nelle foreste e sono importanti per la produzione di tinture. +A piece of ladder which allows you to move vertically. = Un pezzo di scala a pioli che vi permette di muovervi verticalmente. +A fence post. When multiple of these are placed to next to each other, they will automatically build a nice fence structure. You can easily jump over a low fence. = Un palo di steccato. Quando ne mettete molti in serie, costruiranno automaticamente una bella struttura a staccionata. Potete saltare facilmente uno steccato basso. +Fence gates can be opened or closed and can be easily jumped over. Other fence posts will connect nicely to fence gates. = I cancelletti degli steccati possono essere aperti o chiusi e possono essere saltati facilmente. Gli altri pali di steccato si connetteranno bene ai cancelli degli steccati. +Right-click the gate to open or close it. = Cliccate il cancelletto col tasto destro per aprirlo o chiuderlo. +A piece of wall. When multiple of these are placed to next to each other, they will automatically build a nice wall structure. You can easily jump over a low wall. = Un pezzo di muro. Quando ne mettete molti in serie, costruiranno automaticamente una bella struttura a muro. Potete saltare facilmente un muro basso. +A slab is half as high as their full block counterparts and can occupy either the lower or upper half of a block. Low slabs can be easily stepped on without needing to jump. When a slab is placed on another slab of the same type, a new full block is created. = Una lastra è alta la metà della sua controparte a blocco completo e può occupare sia metà inferiore che quella superiore di un blocco. Si può camminare facilmente sulle lastre basse senza bisogno di saltare. Quando si mette una lastra sopra una lastra dello stesso tipo, viene creato un nuovo blocco completo. +To place a low slab, place it on the floor or the bottom half of the side of a block. To place a high slab, place it on the ceiling or the upper half of the side of a block. = Per posizionare una lastra bassa, mettetela sul pavimento o sulla metà inferiore del lato di un blocco. Per posizionare una lastra alta, mettetela sul soffitto o sulla metà superiore del lato di un blocco. +Stairs are useful to reach higher places by walking over them; jumping is not required. = Le scale sono utili per raggiungere posti più elevati camminando sopra di esse; non è necessario saltare. +A sign is placed at walls. Players can write something on it. = Un cartello è posizionato sui muri. Gli/le utenti possono scriverci sopra qualcosa. +Point to the sign to reveal its message. Right-click the sign to edit the text. = Puntate il cartello per svelarne il messaggio. Cliccatelo col tasto destro per modificarne il testo. +Beds allow you to sleep at night and waste some time. Survival in this world does not demand sleep, but sleeping might have some other uses. = I letti vi permettono di dormire di notte e perdere un po' di tempo. La sopravvivenza in questo mondo non richiede il sonno, ma dormire potrebbe avere altri usi. +Right-click on the bed to try to sleep in it. This only works at night. While being in it, you can right-click the bed again to get up early. = Cliccate col pulsante destro sul letto per provare a dormirci. Questo funziona solo di notte. Mentre ci siete dentro, potete nuovamente cliccare il letto col pulsante destro per alzarvi presto. +In local folklore, legends are told of other worlds where setting the start point for your next would be possible. But this world is not one of them. = Nella tradizione locale, si narrano leggende di altri mondi in cui sarebbe possibile impostare il punto di inizio per la vostra prossima vita. Ma questo mondo non è uno di quelli. +By sleeping in a bed, you set the starting point for your next life. = Dormendo in un letto, impostate il punto di partenza per la vostra prossima vita. +In this strange world, the time will not pass faster for you when you sleep. = In questo strano mondo, il tempo non passerà più velocemente quando dormite. +Going into bed seems to make time pass faster: The night will be skipped when you go sleep and you are the only human being in this world. If you are not alone, the night will be skipped as soon the majority of all humans went to bed. = Andare a letto sembra fare passare il tempo più velocemente: la notte sarà saltata quando andate a dormire e siete l'unica persona in questo mondo. Se non siete sol*, la notte sarà saltata non appena la maggioranza delle persone sarà andata a letto. +Hoes are essential tools for growing crops. They are used to create farming soil in order to plant seeds on it. = Le zappe sono strumenti essenziali per coltivare. Sono usate per creare terreno coltivabile per piantarci i semi. +Punch a cultivatable block with a hoe to turn it into soil. Dirt, dirt with grass, dirt with dry grass and desert sand are cultivatable blocks. = Colpendo un blocco coltivabile con una zappa lo trasformerà in terreno coltivabili. Terra, terra con l'erba, terra con l'erba secca e sabbia del deserto sono blocchi coltivabili. +An axe is your tool of choice to cut down blocks which are affected by brute force, especially trees and wood. It also serves as a weapon in a pinch, although not as efficient as swords, but still acceptable. = Una accetta è il vostro strumento scelto per tagliare blocchi suscettibili alla forza bruta, specialmente alberi e legna. In caso di bisogno serve anche come arma, sebbene non sia efficiente come una spada, ma comunque accettabile. +Swords are great in melee combat, as they are fast, deal high damage and can endure countless battles. Swords are also surprisingly useful in cutting “snappy” plants and blocks, like grass, wheat and leaves, but this will wear them out. = Le spade sono il meglio nel combattimento all'arma bianca, essendo veloci, sferrano molte ferite e possono sostenere innumerevoli battaglie. Le spade sono anche sorprendentemente utili nel tagliare piante e blocchi “spezzabili”, come l'erba, il grano e le foglie, ma questo le usurerà. +Shovels are mining tools to mine “crumbly” blocks, such as sand, dirt, gravel, and so on. Technically, they can also be used as weapons, but they are not much better than hand-to-hand combat. = I badili sono gli strumenti per scavare i blocchi “sgretolabili”, come la sabbia, la terra, la ghiaia, e così via. Tecnicamente, si possono usare anche come armi, ma non sono molto meglio del combattimento a mani nude. +Pickaxes are mining tools to mined hard, “cracky” blocks, such as stone. If you are desperate, you can use a pickaxe as an inefficient weapon. = I picconi sono gli strumenti per scavare i blocchi duri, “crepabili”, come la pietra. Se siete disperat*, potete usare un piccone come arma inefficiente. +Dyes are primarily used for crafting other items, especially for colorizing them. Dyes can also be used to obtain new dyes by using two dyes in crafting. = Le tinture sono utilizzate prevalentemente per assemblare altri oggetti, specialmente per colorarli. Le tinture possono essere usate anche per ottenere nuove tinture usando due tinture in un assemblaggio. +Wool is a soft decorative block which comes in different colors. Walking on wool is completely silent. = La lana è un blocco decorativo morbido presente in colori differenti. Camminare sulla lana non produce nessun suono. +An explosive device. When it explodes, it will hurt living beings, destroy blocks around it, throw blocks affected by gravity all over the place and set flammable blocks on fire. A single TNT has an explosion radius of @1. The explosion radius increases if multiple TNT blocks are close to each other. 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, igniter blocks. Initially, TNT is not affected by gravity, but as soon it has been ignited, it is. = Un congegno esplosivo. Quando esplode, ferirà gli esseri viventi, distruggerà i blocchi attorno a sé, scaglierà tutto attorno i blocchi soggetti alla gravità e incendierà i blocchi infiammabili. Un singolo blocco di dinamited ha un raggio esplosivo di @1. Il raggio dell'esplosione aumenta se si posizionano più blocchi di dinamite vicini uno all'altro. Esiste una piccola possibilità che i blocchi rilascino un oggetto (come se fossero scavati) invece di essere distrutti. La dinamite può essere innescata da strumenti, esplosioni, blocchi innescati. Inizialmente, la dinamite non è soggetta alla gravità, ma lo diventa quando innescata. +This is a mesecon effector. If TNT receives a mesecon signal, it explodes immediately. = Questo è un attuatore mesecon. Se la dinamite riceve un segnale mesecon, esplode all'istante. +A weird creature with a cat face, cat extremities and a strawberry-flavored pop-tart body. It has been trapped in a block and cannot move and can thus be dug easily by simple tools. Nyan cats are usually followed by nyan cat rainbows. Legends say that in ancient times, long before the creation of our world, there were many of the Nyan Cats which were free and flew through space and sang the \"Nya-nya\" song. Nowadays, nyan cats serve as a fancy collector's item and are traded as souvenirs. Apart from that, nyan cats have no intrinsic value. = Una creatura bizzarra col muso da gatto, estremità da gatto e un corpo da dolcetto al gusto fragola. È stata intrappolata in un blocco e non può muoversi, perciò può essere scavata facilmente da strumenti semplici. I gatti Nyan solitamente sono seguiti da arcobaleni da gatto Nyan. Le leggende dicono che in tempi antichi, molto prima della creazione del nostro mondo, esistessero molti gatti Nyan che erano liberi e volavano nello spazio cantando la canzone \"Nya-nya\". Oggigiorno, i gatti Nyan servono come eleganti oggetti per collezionist* e sono scambiati come ricordini. A parte ciò, i gatti Nyan non hanno nessun valore intrinseco. +A rainbow made by a real nyan cat, ancient creatures which once flew through space. It has gone inert and can be dug by simple tools. Like nyan cats, nyan cat rainbows have no intrinsic value. = Un arcobaleno fatto da un vero gatto Nyan, creature antiche che un tempo volavano nello spazio. È diventato inerte e può essere scavato da strumenti semplici. Come i gatti Nyan, gli arcobaleni dei gatti Nyan non hanno nessun valore intrinseco. +Place them on the ground to build your railway, the rails will automatically connect to each other and will turn into curves, T-junctions, crossings and slopes as needed. = Posizionateli sul terreno per costruire la vostra ferrovia, i binari si connetteranno tra di loro automaticamente e formeranno curve, incroci a T, incroci e piani inclinati in base all'esigenza. +Corals are plants naturally found in shallow water of warm climates. Corals are rather delicate. When exposed to air, they will die off to become coral skeletons. = I coralli sono piante che si trovano naturalmente nelle acque basse dei climi caldi. I coralli sono piuttosto delicati. Quando esposti all'aria, muoiono diventando scheletri di corallo. +You use your bare hand whenever you are not wielding any item. With your hand you can mine the weakest blocks and deal minor damage by punching. Using the hand is often a last resort, as proper mining tools and weapons are usually better than the hand. 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 mining capabilities, range and damage of the hand are greatly enhanced. = Usate la vostra mano nuda ogni qual volta non impugnate un oggetto. Con la vostra mano potete scavare i blocchi più morbidi e infliggere ferite minori colpendo. Usare la mano è spesso l'ultima risorsa, poiché gli strumenti di scavo e le armi normalmente sono migliori della mano. Quando impugnate un oggetto che non è uno strumento di scavo o un'arma, si comporterà come se fosse la mano quando iniziate a scavare o a colpire. Nella modalità creativa, le capacità di scavo, raggio di azione e danno della mano sono molto aumentate. +Apples can be eaten to restore 2 hit points. Apples are sometimes grown from saplings. = Le mele possono essere mangiate per risanare due punti salute. A volte crescono dagli alberelli. +Cooks or smelts several items, using a furnace fuel, into something else. = Cuoce o fonde svariati oggetti, usando il combustibile di una fornace, in qualcos'altro. +Provides 32 slots of inventory space. = Fornisce 32 alloggi di spazio inventario. +Provides 32 slots of inventory space, is accessible only to the player who placed it. Locked chests are also immune to explosions. = Fornisce 32 alloggi di spazio inventario, è accessibile solo dall* utente che lo ha piazzato. I bauli chiusi a chiave sono anche immuni alle esplosioni. +A coral skeleton once was a living colorful coral but now has died. Coral skeletons can be found naturally in shallow water of warm climates. = Uno scheletro di corallo un tempo era un corallo vitale e colorato ma ora è morto. Gli scheletri di corallo possono essere trovati naturalmente nelle acque basse dei climi caldi. +A very common block in the world of Minetest Game, almost the entire underground consists of stone. It sometimes contains ores. Stone may be created when water meets lava. = Un blocco molto comune nel mondo del Minetest Game, quasi tutto il sottosuolo è formato di pietra. A volte contiene delle vene minerarie. Le pietre possono essere create quando l'acqua incontra la lava. +Desert stone is less common than stone and is found in large quantities near the surface of deserts. Desert stone doesn't go very deep. = La pietra del deserto è meno comune della pietra ed è reperibile in grandi quantità vicino alla superficie dei deserti. La pietra del deserto non scende molto in profondità. +Some coal contained in stone, it is very common and can be found in stones as large clusters at a height of +64 or lower. = Un po' di carbone contenuto nella pietra, è molto comune e può essere trovato nella pietra in grandi raggruppamenti a partire da un'altitudine di +64 o inferiore. +This stone contains pure iron, which is very common. It is found in small clusters at a height between +2 and -15, in clusters of 5 at a height of -16 or lower and in large clusters of up to 27 iron ores at a height of -64 or lower. = Questa pietra contiene ferro puro, che è molto comune. Si trova in piccoli raggruppamenti ad altitudini tra +2 e -15, in raggruppamenti di cinque a profondità di -16 o inferiori, e in grandi raggruppamenti fino a ventisette vene di ferro a profondità pari a -64 o inferiori. +This stone contains pure copper. Copper is found in stone in clusters of 4-5 at a height of -16 or lower and is more common at a height of -64 or lower. = Questa pietra contiene rame puro. Il rame si trova nella pietra in raggruppamenti di quattro o cinque vene di minerale aprofondità di -16 o inferiori, ed è più comune a profondità pari a -64 o inferiori. +This stone contains pure tin. Tin slightly less common than copper and is found in stone in clusters of 4-5 at a height of -32 or lower and is more common at a height of -128 or lower. = Questa pietra contiene stagno puro. Lo stagno è un po' meno comune del rame e si trova nella pietra in gruppi di quattro o cinque vene minerarie a una altitudine pari a -32 o inferiore, ed è più comune a una altitudine di -128 o inferiore. +This stone contains a small amount of mese, a rare mineral of alien origin. It can be found in clusters of 3-5 at a height of -64 lower. Mese ore is more common at -256 or lower. = Questa pietra contiene un piccolo quantitativo di mese, un minerale raro di origine aliena. Si può trovare in gruppi di tre o cinque vene minerarie a un'altitudine di -64 o inferiore. Le vene minerarie di mese sono più comuni a una profondità di -256 o inferiore. +This stone contains pure gold, a rare metal. It can be found in clusters of about 3 blocks at a height of -64 or lower and in clusters of about 5 blocks at a height of -256 or lower. = Questa pietra contiene oro puro, un metallo raro. Si può trovare in gruppi di circa tre blocchi a una profondità di -64 o inferiore, e in gruppi di circa cinque blocchi a una profondità di -256 o inferiore. +Diamonds are very rare and hard and can be found in clusters deep in the underground. They appear inside stone in clusters of about 4 blocks at a height of -128 or lower and are more common at a height of -256 or lower. = I diamanti sono molto rari e duri e si possono trovare in gruppi profondi nel sottosuolo. Compaiono dentro la pietra in gruppi di circa quattro blocchi a una profondità di -128 o inferiore, e sono più comuni a una profondità di -256 o inferiore. +Very common on the surface, found in grasslands and forests. It is a resourceful block which supports the growth and spreading of many small plants and trees. Dirt with grass turns into dirt with snow when a snow block is placed on top of it. = Molto comune in superficie, si trova nelle praterie e nelle foreste. È un blocco pieno di risorse che consente la crescita e la diffusione di molte piante piccole e alberi. La terra con l'erba diventa terra con la neve quando gli si mette sopra un blocco di neve. +This block is found on the surface of rainforests. It is a resourceful block which supports the growth and spreading of many small plants and trees. = Questo blocco si trova in superficie nelle foreste pluviali. È un blocco pieno di risorse che consente la crescita e la diffusione di molte piante piccole e alberi. +A decorational variant of dirt with grass, it looks like someoned has stepped on the grass. Unlike dirt with grass, it doesn't change on its own and doesn't spread its grass on other dirt blocks. = Una variante decorativa della terra con l'erba, sembra come se qualcun* avesse camminato sull'erba. Diversamente dalla terra con l'erba, non cambia da sé e non diffonde la propria erba agli altri blocchi di terra vicini. +Common on the surface, found in savannahs. = Comune in superficie, si trova nelle savane. +Dirt with snow is a cold block of frozen dirt which doesn't support the growth of any plants. Plants won't die on it, but they don't grow or spread either. = La terra con la neve è un blocco freddo di terra ghiacciata che non consente la crescita di nessuna pianta. Le piante non moriranno su di essa, ma nemmeno cresceranno o si diffonderanno. +A thin layer of snow. When it it on top of dirt, the dirt will slowly turn into dirt with snow. When snow lands on dirt with grass, it immediately turns into dirt with snow. = Un sottile strato di neve. Quando è sopra un blocco di terra, la terra si trasforma lentamente in terra con la neve. Quando la neve precipita sulla terra con l'erba, la trasforma immediatamente in terra con la neve. +A very thick layer of snow, filling an entire block. Snow this thick can usually only be found in arctic regions. When this block is placed on top of dirt with grass, the dirt with grass turns into dirt with snow. = Uno strato molto spesso di neve, che riempie un blocco intero. La neve così spessa di solito si può trovare solo nelle regioni artiche. Quando questo blocco viene messo sulla terra con l'erba, questa si trasforma in terra con la neve. +Ice is found in arctic regions. It can appear either in huge glacier formations below snow blocks, or above water. = Il ghiaccio si trova nelle regioni artiche. Può comparire come enormi formazioni glaciali sotto ai blocchi di neve, o sull'acqua. +Dirt is found often directly under the surface and very common in many regions of the world. When exposed to sunlight, the surface of dirt may change, depending on its neighbors. = La terra si trova spesso sotto la superficie ed è molto comune in molte regioni del mondo. Quando è esposta alla luce solare, la superficie della terra può cambiare, dipendentemente dai blocchi vicini. +Sand is found in large quantities at beaches, but it occasionally appears in small chunks around the world. = La sabbia si trova in grandi quantità nelle spiagge, ma occasionalmente compare in piccoli pezzi sparsi per il mondo. +Usually found in huge quantities at the surface of deserts. = Solitamente trovata in enormi quantità nella superficie dei deserti. +Silver sand can be found in cold biomes in the form of so-called cold deserts. = La sabbia argentata si può trovare nei biomi freddi, in forma dei cosiddetti deserti freddi. +This block consists of a couple of loose stones and can't support itself. It is common only at the beaches of very cold regions, but it can be found in small quantities on the surface and underground. = Questo blocco consiste di un po' di pietre allentate e non può sostenersi da sé. È comune solo nelle spiagge delle regioni molto fredde, ma si può trovare in piccole quantità sulla superficie e sottoterra. +Clay is a rather soft material and it sometimes found in sand beaches. = L'argilla è un materiale piuttosto morbido e a volte si trova nelle spiagge di sabbia. +A pretty soft kind of stone, a compressed form of sand. It is common in sandstone deserts. = Un tipo di pietra abbastanza morbido, una forma compattata di sabbia. È comune nei deserti di arenaria. +A pretty soft kind of stone, a compressed form of silver sand. = Un tipo di pietra abbastanza morbido, una forma compattata della sabbia argentata. +A pretty soft kind of stone, a compressed form of desert sand. = Un tipo di pietra abbastanza morbido, una forma compattata della sabbia del deserto. +A decorational block. It can be destroyed by explosions. = Un blocco decorativo. Può essere distrutto dalle esplosioni. +A trunk of a regular tree. This species of tree sometimes bears apples and is home in deciduous forests in mild climates. = Il tronco di un normale albero. Questa specie di albero a volte porta delle mele e trova casa nelle foreste decidue nei climi temperati. +A trunk of a jungle tree. Jungle trees can be found in jungles, which are in hot and wet climates. = Il tronco di un albero della giungla. Gli alberi della giungla si possono trovare nelle giungle, che sono nei climi caldi e umidi. +A trunk of a pine tree. The natural habitat of pine trees are coniferous forests which can be found in cold climates. = Il tronco di un pino. L'habitat naturale dei pini sono le foreste di conifere che si possono trovare nei climi freddi. +A trunk of an aspen tree. The natural habitat of aspen trees are deciduous forests which can be found in mild climates. = Il tronco di un pioppo. L'habitat naturale dei pioppi sono le foreste decidue che si possono trovare nei climi temperati. +A trunk of an acacia tree. The natural habitat of acacia trees are savannahs, which can be found in hot and dry climates. = Il tronco di una acacia. L'habitat naturale delle acacie sono le savane, che si possono trovare nei climi caldi e secchi. +The stem of a bush. Bushes can be found in grasslands, snowy grasslands and deciduous forests. = Il tronco di un cespuglio. I cespugli si possono trovare nelle praterie, nelle praterie nevose e nelle foreste decidue. +The stem of an acacia bush. Acacia bushes can be found in savannahs. = Il tronco di un cespuglio di acacia. I cespugli di acacia si possono trovare nelle savane. +When placed on natural soil (such as dirt) and exposed to sunlight, a sapling will grow into a tree after some time. There's a chance that this tree bears apples. = Quando messa su di un terreno naturale (come la terra) e esposta alla luce solare, una pianticella dopo un po' di tempo diverrà un albero. C'è una possibilità che questo albero porti delle mele. +When placed on natural soil (such as dirt) and exposed to sunlight, a jungle sapling will grow into a large jungle tree after some time. = Quando messa su di un terreno naturale (come la terra) e esposta alla luce solare, una pianticella di albero della giungla dopo un po' di tempo diverrà un albero della giungla. +When placed on natural soil (such as dirt) and exposed to sunlight, an acacia sapling will grow into an acacia tree after some time. = Quando messa su di un terreno naturale (come la terra) e esposta alla luce solare, una pianticella di acacia dopo un po' di tempo diverrà un'acacia. +When placed on natural soil (such as dirt) and exposed to sunlight, an aspen sapling will grow into an aspen tree after some time. = Quando messa su di un terreno naturale (come la terra) e esposta alla luce solare, una pianticella di pioppo dopo un po' di tempo diverrà un pioppo. +When placed on natural soil (such as dirt) and exposed to sunlight, a pine sapling will grow into a pine tree after some time. If the pine sapling was next to any “snowy” block (e.g. “Snow Block”), the pine tree will be covered with snow. = Quando messa su di un terreno naturale (come la terra) e esposta alla luce solare, una pianticella di pino dopo un po' di tempo diverrà un pino. Se la pianticella di pino era vicino a un qualsiasi blocco “nevoso” (per es. “blocco di neve”), il pino sarà coperto di neve. +When placed on natural soil (such as dirt) and exposed to sunlight, a bush sapling will grow into a bush after some time. = Quando messa su di un terreno naturale (come la terra) e esposta alla luce solare, una pianticella di cespuglio dopo un po' di tempo diverrà un cespuglio. +When placed on natural soil (such as dirt) and exposed to sunlight, an acacia bush sapling will grow into an acacia bush after some time. = Quando messa su di un terreno naturale (come la terra) e esposta alla luce solare, una pianticella di cespuglio di acacia dopo un po' di tempo diverrà un cespuglio di acacia. +Leaves are grown from trees—which sometimes bear apples—found in deciduous forests. = Le foglie crescono sugli alberi - che a volte portano mele - presenti nelle foreste decidue. +Jungle leaves are grown from jungle trees found in jungles. = Le foglie della giungla crescono sugli alberi della giungla presenti nelle giungle. +Acacia leaves are grown from acacia trees found in savannahs. = Le foglie di acacia crescono sugli alberi di acacia presenti nelle savane. +Aspen leaves are grown from aspen trees found in deciduous forests. = Le foglie di pioppo crescono sui pioppi presenti nelle foreste decidue. +Pine needles are grown from pine trees found in coniferous forests. = Gli aghi di pino crescono sui pini presenti nelle foreste di conifere. +Bush leaves are grown from bushes found in grasslands, snowy grasslands and deciduous forests. = Le foglie di cespuglio crescono sui cespugli presenti nelle praterie, nelle praterie nevose e nelle foreste decidue. +Acacia bush leaves are grown from acacia bushes found in savannahs. = Le foglie di cespuglio di acacia crescono sui cespugli di acacia presenti nelle savane. +A piece of cactus usually found in deserts. Cacti grow on sand, desert sand and other blocks belonging to the “@1” group at a light level of 13 or higher. They can reach a height of up to 4 cactus blocks. = Un pezzo di cactus normalmente presente nei deserti. I cactus crescono sulla sabbia, sulla sabbia del deserto e sugli altri blocchi appartenenti al gruppo “@1” a un livello di lupe pari a 13 o maggiore. Possono crescere in altezza fino a quattro blocchi di cactus. +A papyrus piece usually found near shallow water. Papyrus grows vertically up to a height of 4 blocks on dirt and dirt with grass near a water source (or another block belonging to the @1 group) and requires a light level of 13 or higher. When dug, all papyrus blocks directly connected above it will also be dug. = Un pezzo di papiro, solitamente trovato vicino alle acque basse. Il papiro cresce verticalmente fino a una altezza di quattro blocchi, sulla terra e sulla terra con l'erba vicino a una fonte di acqua (o un altro blocco appartenente al gruppo @1), necessita di un livello di luce pari a 13 o superiore. Quando scavato, si scaveranno anche tutti i blocchi superiori direttamente connessi. +A bookshelf provides 16 inventory slots for books. = Uno scaffale fornisce 16 alloggi inventario per i libri. +A decorational and mostly transparent block which is rather easy to break. = Un blocco decorativo e perlopiù trasparente che è piuttosto facile da rompere. +An unremarkable dead plant which is common in deserts and snowy biomes. Small plants which are members of the @1 group placed on silver sand or desert sand will sooner or later turn into dry shrubs. = Una pianta morta priva di interesse, trovata comunemente nei deserti e nei biomi nevosi. Le piante piccole che sono membri del gruppo @1, se poste sulla sabbia argentata o sulla sulla sabbia del deserto, prima o poi diverranno arbusti secchi. +Rails can be used to build transport tracks for carts. Normal rails slightly slow down carts due to friction. = I binari si possono usare per costruire circuiti di trasporto per i vagoni. I binari normali rallentano leggermente i vagoni a causa dell'attrito. +Rails can be used to build transport tracks for carts. Powered rails will accelerate moving carts, up to a maximum speed. = I binari si possono usare per costruire circuiti di trasporto per i vagoni. I binari alimentati accelereranno i vagoni in movimento, fino a una velocità massima. +Rails can be used to build transport tracks for carts. Brake rails will heavily slow down carts, much more than normal rails. = I binari si possono usare per costruire circuiti di trasporto per i vagoni. I binari freno rallenteranno fortemente i vagoni, molto più dei binari normali. +Water is abundant in oceans and may also appear in small quantities in underground water pockets. You can swim easily in water, but you need to catch your breath from time to time. Water will turn nearby lava into obsidian or stone. = L'acqua è abbondante negli oceani e potrebbe apparire anche in piccole quantità in piccole sacche sotterranee. Potete nuotare facilmente nell'acqua, ma di tanto in tanto dovete riprendere fiato. L'acqua vicino alla lava si trasformerà in pietra o ossidiana. +You can swim easily in river water, but you need to catch your breath from time to time. Unlike (normal) water, it appears in rivers only. River water will turn nearby lava into obsidian or stone. = Potete nuotare facilmente nell'acqua di fiume, ma di tanto in tanto dovrete riprendere fiato. Diversamente dall'acqua normale, compare solo nei fiumi. L'acqua di fiume vicino alla lava si trasformerà in pietra o ossidiana. +Lava is found deep underground (@1 and below) and rather dangerous. Don't touch it, it will hurt you a lot and once you're in, it is hard to get out. When a lava source meets water or river water (or another block in the @2 group), it turns into obsidian. Flowing lava turns into stone instead. = La lava si trova a grande profondità (@1 e inferiore) ed è piuttosto pericolosa. Non toccatela, vi ferirà molto e quando ci siete dentro è difficile uscirne. Quando una sorgente di lava incontra acqua o acqua di fiume (o un altro blocco nel gruppo @2), diventa ossidiana. La lava corrente invece diventa pietra. +Provides some light. It can be placed on almost any block facing any direction. It can also be used to ignite gunpowder and TNT by punching. = Fornisce un po' di luce. Si può mettere su quasi ogni blocco rivolto verso qualsiasi direzione. Si può usare anche per innescare la polvere da sparo e la dinamite colpendole. +A building block used to create houses, dungeons and other buildings. It is obtained after mining stone. If it is near water (or any other block in the @1 group), it might turn into mossy cobblestone. = Un blocco di costruzione usato per creare case, sotterranei e altre strutture. Si ottiene dopo avere scavato una pietra. Se è vicino all'acqua (o qualunque altro blocco nel gruppo @1), potrebbe diventare ciottoli muschiosi. +Coal lumps are your standard furnace fuel, but they are also used to make torches and a few other things. = I pezzi di carbone sono il vostro combustibile predefinito per le fornaci, ma si usano anche per creare torce e un po' di altre cose. +A decorational block. It is found in underground dungeons and is the product of cobblestone near water. = Un blocco decorativo. Si trova nei sotterranei del sottosuolo ed è il risultato dei ciottoli vicino all'acqua. +Coal blocks are useful as compact storage of coal lumps and notable for exceptional burning capabilities. As a furnace fuel, it is slightly more efficient than 9 coal lumps. Coal blocks can also be used to start permanent flames with a flint and steel. If you remove the coal block, the permanent flame is destroyed as well. = I blocchi di carbone sono utili come forma di immagazzinamento compatta dei pezzi di carbone, e notevoli per le capacità combustibili eccezionali. Come combustibile per fornaci, è leggermente più efficiente di nove pezzi di carbone. I blocchi di carbone si possono usare anche per avviare delle fiamme permanenti con gli acciarini. Se togliete il blocco di carbone, la fiamma permanente viene distrutta. +A very hard decorational block. = Un blocco decorativo molto duro. +Obsidian glass is transparent, has a very clean surface and is rather hard to break. = Il vetro di ossidiana è trasparente, possiede una superficie molto pulita ed è piuttosto duro da rompere. +A hard mineral which is created from a lava source when it meets water (any block in the @1 group). = Un minerale duro che viene creato da una fonte di lava quando incontra l'acqua (qualunque blocco del gruppo @1). +A key grants you to access to a thing with a lock (e.g. steel door, steel trapdoor, locked chest), even if you don't own it. Each key is unique and only fits into one lock. If the locked thing has been removed, the key won't unlock anything. = Una chiave vi permette l'accesso a qualcosa con una serratura (per es. una porta di acciaio, una botola di acciaio, un baule chiuso a chiave), anche se non è di vostra proprietà. Ciascuna chiave è unica e si adatta solo a una serratura. Se la cosa chiusa a chiave è stata tolta, la chiave non aprirà niente. +A skeleton key can be used to share access to a locked thing you own (e.g. steel door, steel trapdoor, locked chest) with other players. = Una Chiave dello Scheletro si può usare per condividere l'accesso a una cosa chiusa a chiave di vostra proprietà (per es. una porta di acciaio, una botola di acciaio, un baule chiuso a chiave) con gli/le altr* utenti. +A book is used to store notes and to make bookshelves. = Un libro si usa per registrare appunti e creare scaffali. +A book with text contains notes which can be rewritten and copied to books. In the inventory, both title and author of the book are shown. = Un libro scritto contiene appunti che possono essere riscritti e copiati sui libri. Nell'inventario, sono mostrati sia il titolo che il nome dell'autore/autrice. +Grass can be found in large quantities in open plains. It comes in 5 different sizes but doesn't grow. There's a small chance it turns neighbor dirt blocks into dirt with grass, when they're in sunlight. = L'erba si può trovare in grandi quantità nelle pianure aperte. Si presenta in cinque dimensioni differenti, ma non cresce. C'è una piccola possibilità che trasformi i blocchi di terra vicini in terra con erba, quando sono alla luce solare. +This plant is common in jungles. = Questa pianta è comune nelle giungle. +Dry grass is very common in savannahs and comes in 5 different sizes but doesn't grow. There's a small chance it turns neighbor dirt blocks into dirt with dry grass, when they're in sunlight. = L'erba secca è molto comune nelle savane e si presenta in cinque dimensioni differenti, ma non cresce. C'è una piccola possibilità che trasformi i nodi di terra vicini in terra con erba secca, quando sono alla luce solare. +A bright light source powered by mese crystals. It is brighter than a torch. = Una fonte di luce brillante alimentata dai cristalli mese. È più luminosa di una torcia. +A bright light source powered by mese crystals. This is a more compact version of the mese lamp. It is brighter than a torch. = Una fonte di luce brillante alimentata dai cristalli mese. Questa è una versione più compatta della lampada mese. È più luminosa di una torcia. +Mese is a rare mineral of alien origin; mese blocks are a highly concentrated form of mese. At extreme depths (-1024 or lower), mese blocks rarely occour naturally in stone as clusters of about 3 mese blocks. = La mese è un minerale raro di origine aliena; i blocchi di mese sono forme molto concentrate di mese. A profondità estreme (-1024 o inferiori), i blocchi di mese compaiono naturalmente nella pietra in gruppi di circa tre blocchi di mese. +A bucket can be used to collect and release liquids. = Un secchio si può usare per raccogliere e versare liquidi. +A bucket can be used to collect and release liquids. This one is filled with water. = Un secchio si può usare per raccogliere e versare liquidi. Questo è pieno di acqua. +A bucket can be used to collect and release liquids. This one is filled with river water. = Un secchio si può usare per raccogliere e versare liquidi. Questo è pieno di acqua di fiume. +A bucket can be used to collect and release liquids. This one is filled with "hot lava, safely contained inside. Use with caution. = Un secchio si può usare per raccogliere e versare liquidi. Questo è pieno di lava bollente, contenuta in modo sicuro al suo interno. Da usare con cautela. +These are the remains of a deceased player. It may contain the player's former inventory which can be looted. Fresh bones are bones of a player who has deceased recently and can only be looted by the same player. Old bones can be looted by everyone. Once collected, bones can be placed like any other block. = Questi sono i resti di un* utente mort*. Possono contenere il vecchio inventario dell* utente, che si può saccheggiare. Le ossa fresche sono le ossa di un* utente mort* di recente, e possono essere saccheggiate solo dall* stess* utente. Le ossa vecchie possono essere saccheggiate da chiunque. Una volta raccolte, le ossa possono essere posizionate come ogni altro blocco. +A door covers a vertical area of two blocks to block the way. It can be opened and closed by any player. = Una porta copre un'area verticale di due blocchi per bloccare la strada. Può essere aperta e chiusa da qualunque utente. +Steel doors are owned by the player who placed them, only their owner can open, close or mine them. Steel doors are also immune to explosions. = Le porte di acciaio sono di proprietà degli/delle utenti che le hanno posizionate, solo i/le loro proprietari* possono aprirle, chiuderle o scavarle. Le porte di acciaio sono anche immuni alle esplosioni. +A nutritious food. Eat it to restore 5 hit points. = Un cibo nutriente. Mangiatelo per risanare cinque punti salute. +Grows into a wheat plant. = Diventa una pianta di grano. +Grows into a cotton plant. = Diventa una pianta di cotone. +Dry soil for farming, a necessary surface to plant crops. It is created when a hoe is used on dirt or a similar block. Dry soil will become wet soil when a water source is nearby. Soil might turn back into dirt if nothing is planted on it and it is not made wet for a while. = Terreno coltivabile asciutto, una superficie necessaria per coltivare. Si crea quando si usa una zappa sulla terra o su un blocco simile. Il terreno coltivabile asciutto diventa terreno coltivabile irrigato quando c'è una fonte d'acqua vicina. Il terreno coltivabile potrebbe tornare ad essere terra se non ci si pianta niente o se non viene irrigato da un po' di tempo. +Wet soil for farming, this is where you can plant and grow crops on. Wet soil is created when water is near soil. Wet soil will become (dry) soil again when there is no water nearby. = Terreno coltivabile irrigato, qui è dove potete piantare e coltivare. Il terreno coltivabile irrigato si crea quando l'acqua è vicina al terreno coltivabile. Il terreno coltivabile irrigato diventa nuovamente terreno coltivabile asciutto quando non c'è acqua nelle vicinanze. +Dry desert sand soil for farming, a necessary surface to plant crops. It is created when a hoe is used on desert sand. Desert sand soil will become wet desert sand soil if a water source is near. Desert sand soil might turn back into desert sand if nothing is planted on it and it is not made wet for a while. = Terreno coltivabile asciutto della sabbia del deserto, una superficie necessaria per coltivare. È creato quando si usa una zappa sulla sabbia del deserto. Quando è vicina una fonte d'acqua, il terreno coltivabile di sabbia del deserto diventerà terreno coltivabile irrigato di sabbia del deserto. Il terreno coltivabile irrigato di sabbia del deserto potrebbe tornare ad essere sabbia del deserto se non ci si pianta niente o se non è irrigato da un po' di tempo. +Wet desert sand soil for farming, this is where you can plant and grow crops on. Wet desert sand soil is created when water is near (dry) desert sand soil. Wet desert sand soil will become (dry) desert sand soil again when there is no water nearby. = Terreno coltivabile irrigato di sabbia del deserto, qui è dove potete piantare e crescere piante. Il terreno coltivabile irrigato di sabbia del deserto si crea quando l'acqua è vicina al terreno coltivabile asciutto di sabbia del deserto. Il terreno coltivabile irrigato di sabbia del deserto tornerà ad essere terreno coltivabile asciutto di sabbia del deserto quando non c'è acqua vicina. +The wheat plant is a plant grown from wheat seed. It grows on wet soil in direct sunlight. It will grow through 8 stages and stops growing at its final stage. Digging it will yield up to 2 wheat seeds and 2 wheat. The drop probabilities are much lower if the plant is dug at an early stage with the risk to even get nothing at all; only at its final stage you are guaranteed to get at least 1 wheat seed and 1 wheat. = La pianta di grano è una pianta ottenuta dal seme di grano. Cresce sul terreno coltivabile irrigato esposto alla luce solare diretta. Attraverserà otto stadi di crescita e smetterà di crescere allo stadio finale. Scavandola si otterranno fino a due semi di grano e due piante di grano. Le probabilità di rilascio sono molto più basse se la pianta viene scavata a uno stadio di crescita iniziale, col rischio di non raccogliere niente del tutto; è garantita la raccolta di almeno un seme ed una pianta solo allo stadio finale. +The cotton plant is a plant grown from wheat seed. It grows on wet soil or wet desert sand soil in direct sunlight. It will grow through 8 stages and stops growing at its final stage. Digging it will yield up to 2 cotton seeds and 2 cottons. The drop probabilities are much lower if the plant is dug at an early stage with the risk to even get nothing at all; only at its final stage you are guaranteed to get at least 1 cotton seed and 1 cotton. = La pianta di cotone è una pianta ottenuta dal seme di cotone. Cresce sul terreno coltivabile irrigato o sul terreno coltivabile irrigato di sabbia del deserto esposti alla luce solare diretta. Attraverserà otto stadi di crescita e smetterà di crescere allo stadio finale. Scavandola si otterranno fino a due semi di cotone e due fiori di cotone. Le probabilità di rilascio sono molto più basse se la pianta viene scavata a uno stadio di crescita iniziale, col rischio di non raccogliere niente del tutto; è garantita la raccolta di almeno un seme ed un fiore solo allo stadio finale. +An edible mushroom. Eat it to restore 1 hit point. Brown mushrooms like to grow and spread on natural soil (like dirt) and sometimes on fallen tree trunks. They need darkness to spread and survive and die off in direct sunlight. = Un fungo commestibile. Mangiatelo per risanare un punto salute. I funghi marroni amano crescere e diffondersi sul terreno naturale (come la terra) e a volte sui tronchi d'albero caduti. Per sopravvivere e diffondersi gli serve l'oscurità, e muoiono nella luce solare diretta. +A poisonous mushroom, don't eat it. If you eat it, you lose 5 hit points. Red mushrooms like to grow and spread on natural dirt (like dirt) and sometimes on fallen tree trunks. They need darkness to spread and survive and die off in direct sunlight. = Un fungo velenoso, non mangiatelo. Se lo mangiate, perdete cinque punti salute. I funghi rossi amano crescere e diffondersi sul terreno naturale (come la terra) e a volte sui tronchi d'albero caduti. Per sopravvivere e diffondersi gli serve l'oscurità, e muoiono nella luce solare diretta. +Waterlilies are sometimes found on shallow water. They can't survive on anything but water. = Le ninfee a volte si trovano sulle acque poco profonde. Non possono sopravvivere in nient'altro che l'acqua. +Gunpowder is used to craft TNT and to create gunpowder trails which can be ignited. = La polvere da sparo è usata per fabbricare la dinamite, e per creare strisce di polvere da sparo che possono essere innescate. +Flint and steel is a tool to start fires and ignite blocks. = L'acciarino è uno strumento per avviare fuochi e innescare blocchi. +A trapdoor covers a hole in the floor and can be opened manually to access the area below it. = Una botola copre un buco nel terreno e può essere aperta manualmente per accedere all'area sottostante. +A steel trapdoor covers a hole in the floor and can be opened manually only by the placer to access the area below it. Steel trapdoors are immune to explosions. = Una botola di acciaio copre un buco nel terreno e può essere aperta manualmente solo da chi l'ha posizionata per accedere all'area sottostante. Le botole di acciaio sono immuni alle esplosioni. +A screwdriver can be used to rotate blocks. = Un cacciavite si usa per ruotare i blocchi. +A simple boat which allows you to float on the surface of large water bodies. Travelling by boat is a bit faster than swimming. = Una barchetta che vi consente di galleggiare sulla superficie dei grandi corpi d'acqua. Viaggiare per barca è un po' più rapido che nuotare. +A cart which you can use for quick transport of yourself and items on rails. = Un vagone che potete usare per il trasporto rapido di voi stess* e di oggetti sui binari. +Carts only ride on rails and always follow the tracks. At a T-junction with no straight way ahead, the cart normally turns left. There are multiple rail types which affect the cart speed. = I vagoni viaggiano solamente sui binari e seguono sempre il circuito. A una congiunzione a T, senza possibilità di andare dritto, normalmente il vagone svolta a sinistra. Esistono diversi tipi di binario che influiscono sulla velocità del vagone. +A decorational item which can be placed. = Un blocco decorativo che può essere posizionato. +A vessels shelf provides 16 inventory slots for vessels (like glass bottles). = Uno scaffale per contenitori fornisce 16 alloggi inventario per contenitori (come le bottiglie di vetro). +Glass panes are thin layers of glass which neatly connect to their neighbors as you build them. = I vetri per finestre sono strati sottili di vetro che si collegano bene ai loro vicini mentre li posizionate. +Iron bars neatly connect to their neighbors as you build them. = Le sbarre di acciaio si connettono bene alle loro vicine mentre le posizionate. +Cobblestone walls will slowly turn into mossy cobblestone walls when they're near water (or any other block in the @1 group). = I muri di ciottoli si trasformeranno lentamente in muri di ciottoli muschiosi quando sono vicini all'acqua (o qualsiasi altro blocco nel gruppo @1). +A mossy cobblestone wall is created when a cobblestone wall is near water (or any other block in the @1 group) for a while. = Un muro di ciottoli muschiosi si crea quando un muro di ciottoli è vicino all'acqua (o qualsiasi altro blocco nel gruppo @1) da un po' di tempo. +A cobblestone slab will slowly turn into a mossy cobblestone slab when it is near water (or any other block in the @1 group). = Una lastra di ciottoli si trasformerà lentamente in una lastra di ciottoli muschiosi quando è vicino all'acqua (o qualsiasi altro blocco nel gruppo @1). +A mossy cobblestone slab is created when a cobblestone slab is near water (or any other block in the @1 group) for a while. = Una lastra di ciottoli muschiosi si forma quando una lastra di ciottoli muschiosi è vicina all'acqua (o qualsiasi altro blocco nel gruppo @1) da un po' di tempo. +A cobblestone stair will slowly turn into a mossy cobblestone stair when it is near water or any other block in the @1 group. = Una scala di ciottoli si trasformerà lentamente in una scala di ciottoli muschiosi quando è vicina all'acqua o qualsiasi altro blocco nel gruppo @1. +A mossy cobblestone stair is created when a cobblestone stair is near water (or any other block in the @1 group) for a while. = Una scala di ciottoli muschiosi si forma quando una scala di ciottoli è vicina all'acqua (o qualsiasi altro blocco nel gruppo @1) da un po' di tempo. +Molten iron. It is the element of numerous crafting recipes. = Ferro fuso. È l'elemento di numerose ricette di assemblaggio. +A clay lump can be burnt in the furnace to make a clay brick. = Un pezzo di argilla può essere cotto nella fornace per fare un mattone di terracotta. +A gold lump can be smelt in a furnace to make a gold ingot. = Un pezzo di oro può essere fuso un una fornace per fare un lingotto d'oro. +A copper lump can be smelt in a furnace to make a copper ingot. = Un pezzo di rame può esser efuso in una fornace per fare un lingotto di rame. +A tin lump can be smelt in a furnace to make a tin ingot. = Un pezzo di stagno può essere fuso in una fornace per fare un lingotto di stagno. +An iron lump can be smelt in a furnace to make a steel ingot. = Un pezzo di ferro può essere fuso in una fornace per fare un lingotto di acciaio. +Obsidian shards can be smelt in a furnace to create obsidian glass. = Le schegge di ossidiana possono essere fuse in una fornace per fare il vetro di ossidiana. +Wooden sticks are used as a vital element in countless crafting recipes. = I bastoni di legno si usano come elemento essenziale in innumerevoli ricette di assemblaggio. +In this world this can be done without any delay as the bones instantly become old. = In questo mondo si può fare senza nessun ritardo perché le ossa diventano vecchie all'istante. +@1 min = @1 min +@1 min @2 s = @1 min @2 sec +If these are not your bones, you have to wait @1 before you can do this. = Se queste non sono le vostre ossa, dovrete aspettare @1 prima di poterlo fare. +If the player died in a protected area of someone else, the bones can be dug after @1. = Se l'utente è mort* nell'area protetta di qualcun altr*, le ossa possono essere scavate dopo @1. +Right-click the furnace to view it. 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 4 slots at the right side. = Cliccate col pulsante destro la fornace per vederla. Mettete il combustibile nell'alloggio inferiore e il materiale grezzo nell'alloggio superiore. La fornace userà lentamente il proprio combustibile per cuocere o fondere l'oggetto. Il risultato sarà messo nei quattro alloggi sul lato destro. +Right-click the chest to open it and to exchange items. You can only mine it when the chest is empty. = Cliccate col pulsante destro il baule per aprirlo e per scambiare gli oggetti. Potete scavarlo solo quando è vuoto. +Point it to reveal the name of its owner. Right-click the chest to open it and to exchange items. This is only possible if you own the chest. You also can only mine the chest when you own it and it is empty. = Puntatelo per scoprire il nome del* suo proprietari*. Cliccate col pulsante destro il baule per aprirlo e scambiare gli oggetti. Ciò è possibile solo se il baule è vostro. Potete scavarlo solo se è vostro e se è vuoto. +Hold the book in hand and left-click to write some notes. You have to provide both a title and contents. Doing so will turn the book into a new item (see “Book With Text”). = Impugnate il libro e cliccate col pulsante sinistro per scrivere qualche appunto. Dovete fornire sia il titolo che il contenuto. Così facendo trasformerete il libro in un nuovo oggetto (si veda “libro scritto”). +Hold the book with text in hand and left-click to read or rewrite the notes. To copy the text, combine the book with text together with a book (without text) in the crafting grid. = Impugnate il libro scritto e cliccate col pulsante sinistro per leggere o riscrivere gli appunti. Per copiare il testo, combinate nella griglia di assemblaggio il libro scritto con uno senza testo. +Right-click to open the bookshelf. You can only store books and other items belonging to the @1 group into the bookshelf. To collect the bookshelf, you must make sure it does not contain anything. = Cliccate il pulsante destro per aprire lo scaffale per libri. Nello scaffale per libri potete immagazzinare solo libri e altri oggetti appartenenti al gruppo @1. Per raccogliere lo scaffale, dovete assicurarvi che non contenga niente. +Right-click to open the vessels shelf. You can only store items which belong to the @1 group (glass bottle, drinking glass, heavy steel bottle). To collect the vessels shelf, it must be empty. = Cliccate col pulsante destro per aprire lo scaffale per contenitori. Potete immagazzinarci solo oggetti appartenenti al gruppo @1 (bottiglia di vetro, bicchiere, bottiglia di acciaio pesante). Per potere raccogliere lo scaffale per contenitori, questo deve essere vuoto. +Punch a liquid source to collect the liquid. With the filled bucket, you can right-click somewhere to empty the bucket which will create a liquid source at the position you've clicked at. = Colpite una fonte di liquidi per raccogliere il liquido. Col secchio pieno, potete cliccare col pulsante destro da qualche parte per svuotare il secchio, creando così una fonte di liquidi nel punto dove avete cliccato. +Right-click on any block to empty the bucket and put a water source on this spot. = Cliccate col pulsante destro su qualsiasi blocco per svuotare il secchio e posizionare una fonte di acqua in quel punto. +Right-click on any block to empty the bucket and put a river water source on this spot. = Cliccate col pulsante destro su qualsiasi blocco per svuotare il secchio e posizionare una fonte di acqua di fiume in quel punto. +Choose a place where you want to empty the bucket, then get in a safe spot somewhere above it. Be prepared to run away when something goes wrong as the lava will soon start to flow after placing. To empty the bucket (which places a lava source), right-click on your chosen place. = Scegliete un posto dove volete svuotare il secchio, poi mettetevi in un punto sicuro da qualche parte al di sopra di esso. Siate pront* a scappare quando qualcosa va storto perché la lava dopo essere stata posizionata comincerà presto a scorrere. Per svuotare il secchio (posizionando una fonte di lava), cliccate col pulsante destro sul punto scelto. +Point to the bones to see to whom they belong to. If nothing is displayed, they belong to nobody and are empty; they behave any other block in this case. Otherwise, right-click on the bones to access the inventory, punch it to obtain all items and the bones immediately, or at least as many items as you can carry. = Puntate le ossa per vedere a chi appartengono. Se non viene mostrato niente, non appartengono a nessun* e sono vuote; in questo caso si comportano come ogni altro blocco. Altrimenti, cliccate col pulsante destro le ossa per accedere al loro inventario, colpitele per prendere immediatamente tutti gli oggetti e le ossa, o almeno tanti oggetti quanti ne potete portare. +It is only possible to take from this inventory, nothing can be stored into it. = Da questo inventario si può solo prendere, non ci si può immagazzinare niente. +Place gunpowder on the ground to create gunpowder trails. Punch it with a torch or a flint and steel to light the gunpowder. Gunpowder is also ignited by igniter blocks (like fire or lava). Lit gunpowder will ignite all neighbor (including diagonals) gunpowder tiles and TNTs. = Mettete la polvere da sparo sul terreno per creare piste di polvere da sparo. Colpitela con una torcia o un acciarino per innescarla. La polvere da sparo viene innescata anche dai blocchi innescanti (come il fuoco o la lava). La polvere da sparo innescata innescherà tutte le “piastrelle” di polvere da sparo vicine, incluse quelle diagonali e la dinamite. +Place the TNT on the ground and punch it with a torch or a flint and steel to light it and quickly get in a safe distance before it explodes. Nearby burning gunpowder trails and igniter blocks will also ignite the TNT. = Mettete la dinamite per terra e colpitela con una torcia o un acciarino per innescarla, e portatevi rapidamente a distanza di sicurezza prima che esploda. Anche le piste di polvere da sparo innescata vicine, e i blocchi innescanti (fuoco, lava), innescheranno la dinamite. +Right-click the trapdoor to open or close it. = Cliccate col pulsante destro la botola per aprirla o chiuderla. +Point the steel trapdoor to see who owns it. Right-click it to open or close it (if you own it). = Puntate la botola di acciaio per vedere di chi è. Cliccatela col pulsante destro per aprirla o chiuderla (se è vostra). +Right-click the door to open or close it. = Cliccate col pulsante destro la porta per aprirla o chiuderla. +Point the door to see who owns it. Right-click the door to open or close it (if you own it). = Puntate la porta di acciaio per vedere di chi è. Cliccate col pulsante destro la porta per aprirla o chiuderla (se è vostra). +Left-click on a block to rotate it around its current axis. Right-click on a block to rotate its axis. Note that not all blocks can be rotated. = Cliccate col pulsante sinistro su un blocco per ruotarlo attorno al suo asse corrente. Cliccate col pulsante destro su un blocco per ruotare il suo asse. Si noti che non tutti i blocchi possono essere ruotati. +Place the boat on water (any block belonging to the @1 group) to set it up. Right-click the boat to enter it. When you are on the boat, use the forward key to speed up, the backward key to slow down and the left and right keys to turn the boat. Right-click on the boat again to leave it. Left-click the placed boat to collect it. = Mettete la barchetta sull'acqua (qualsiasi blocco appartenente al gruppo @1) per prepararla. Cliccate col pulsante destro la barchetta per salirci. Quando siete sulla barchetta, usate il tasto avanti per accelerare, il tasto indietro per rallentare, e i tasti destra e sinistra per girare la barchetta. Cliccate nuovamente col pulsante destro la barchetta per scendere. Cliccate col pulsante sinistro la barchetta per raccoglierla. +You can place the cart on rails. Right-click it to enter it. Punch the cart to get it moving. = Potete mettere il vagone sui binari. Cliccate col pulsante destro il vagone per salirci. Colpite il vagone per farlo muovere. +When you sit inside, you can control the cart: Hold [Down] to slow down. Hold down [Left] or [Right] to turn the cart at crossings and T-junctions. = Quando siete salit*, potete controllare il vagone: tenete premuto [Giù] per rallentare. Tenete premuto [Destra] o [Sinistra] per fare svoltare il vagone agli incroci e agli incroci a T. +To transport items, just drop them inside and punch the cart. To obtain the cart and the items, punch it while holding down the sneak key. = Per trasportare oggetti, lasciateli cadere all'interno e colpite il vagone. Per prendere il vagone e gli oggetti, colpitelo tenendo premuto il tasto di strisciamento. +Place the wheat seed on soil or wet soil. Use a hoe to create soil. The plant will only grow in sunlight and as long as the soil is wet. Watch the wheat plant grow and mine it at its full size. = Mettete il seme di grano sul terreno coltivabile o sul terreno coltivabile irrigato. Usate una zappa per creare il terreno coltivabile. La pianta crescerà solo alla luce solare e finché il terreno è irrigato. Osservate la pianta di grano crescere e scavatela a dimensione massima raggiunta. +Place the cotton seed on soil, wet soil, desert sand soil or wet desert sand soil. Use a hoe to create soil. The plant will only grow in sunlight and as long as the soil is wet. Watch the cotton plant grow and mine it at its full size. = Mettete il seme di cotone sul terreno coltivabile, sul terreno coltivabile irrigato, sul terreno coltivabile di sabbia del deserto, o sul terreno coltivabile irrigato di sabbia del deserto. Usate una zappa per creare il terreno coltivabile. La pianta crescerà solo alla luce solare e finché il terreno è irrigato. Osservate la pianta di cotone crescere e scavatela a dimensione massima raggiunta. +Punch with it on the surface of a block to attempt to ignite it. This creates a basic flame in front of flammable blocks. When used on a coal block, a permanent flame is created on top of it. TNT and gunpowder get ignited. On other non-flammable blocks, this tool generally has no effect. = Usatelo per colpire la superficie di un blocco per tentare di innescarlo. Questo crea una fiamma base di fronte ai blocchi infiammabili. Quando usato su un blocco di carbone, si crea sopra di esso una fiamma permanente. Polvere da sparo e dinamite vengono innescate. Generalmente questo strumento non ha effetto sugli altri blocchi non infiammabili. +Waterlilies can only be placed on water sources (and other members of the @1 group). = Le ninfee possono essere piazzate solo sulle fonti di acqua (e gli altri membri del gruppo @1). +Wield the key and right-click on a locked thing to attempt to access it. If the key fits, you perform the action (e.g. you open a door). If it doesn't fit, the key does nothing. = Impugnate la chiave e cliccate il pulsante destro su una cosa chiusa a chiave per tentare di aprirla. Se la chiave entra, eseguite l'azione (per es. aprite una porta). Se non entra, la chiave non fa niente. +Go to the locked thing you own to match the key for. Punch it to turn the skeleton key into a key and permanently match it to the locked thing. Any player who possesses this key can now access the locked thing you have selected—but only this! Note that you don't need keys for the things you own. If the locked thing has been removed, the key will stop working. = Andate alla cosa chiusa a chiave di vostra proprietà per accoppiare la chiave. Colpitela per trasformare la Chiave dello Scheletro in una chiave permanentemente accoppiata a quella cosa. Qualsiasi utente che abbia questa chiave ora può accedere alla cosa chiusa a chiave da voi scelta - ma solo quella! Si noti che non vi servono chiavi per le vostra cose. Se la cosa chiusa a chiave è stata tolta, la chiave non funzionerà più. +Creative Mode = Modalità creativa +Enabling Creative Mode in Minetest Game applies the following changes:\n\n• You keep the things you've placed\n• Creative inventory is available to obtain most items easily\n• Hand breaks all default blocks\n• Greatly reduced hand digging time\n• Greatly increased hand damage\n• Increased pointing range of hand\n• Tools don't wear off\n• When you die, you keep your items and no bones appear = Abilitando la modalità creativa in Minetest si applicano i cambiamenti seguenti:\n\n• Le cose posizionate vi rimangono\n• L'inventario creativo è disponibile per ottenere facilmente la maggior parte degli oggetti\n• La mano rompe tutti i blocchi predefiniti\n• Il tempo di scavo a mano è molto ridotto\n• Il danno inflitto dalla mano è molto aumentato\n• Il raggio di puntamento della mano è aumentato\n• Gli strumenti non si usurano\n• Quando morite, tenete i vostri oggetti e non compaiono ossa diff --git a/mods/user_interface/doc_minetest_game/locale/template.txt b/mods/user_interface/doc_minetest_game/locale/template.txt new file mode 100644 index 0000000..c419746 --- /dev/null +++ b/mods/user_interface/doc_minetest_game/locale/template.txt @@ -0,0 +1,249 @@ +Books = +Vessels = +Dyes = +Sticks = +Wool = +Sand = +Wood = +Stones = +Metal = +Tree Trunks = +Fences = +Walls = +Leaves and Needles = +Flowers = +Saplings = +Water = +Lava = +Coal = +Water buckets = +Flora = +Snowy = +Cracky = +Crumbly = +Choppy = +Snappy = +Hand-breakable = +Flesh = +Screwdriver = +Cart = +Basic Flame = +Wheat Plant = +Cotton Plant = +River Water = +This block turns adjacent lava sources into obsidian and adjacent flowing lava into stone. = +This block is flammable. = +This block will extinguish nearby fire. = +This block will set flammable blocks within a radius of @1 on fire. = +It also destroys flammable items which have been dropped inside. = +This block belongs to the @1 group. It a living organism which likes to grow and spread on dirt with grass and similar “soil”-type blocks when it is in light. Spreading will stop when the surrounding area is too crammed with @2 blocks. On silver sand and desert sand, it will wither and die and turn into a dry shrub. = +Flowers and other blocks in the @1 group will slowly turn into dry shrubs when placed on this block. = +This block serves as a soil for saplings and small plants. Blocks in the “@1” group will grow into trees. Blocks in the “@2” group will spread slowly. = +This block serves as a soil for saplings and other small plants as well as plants grown from seeds. It supports their growth. = +This block may drop as an item when there is no trunk or stem of its species within a distance of @1. Leaf decay does not occour when the block has been manually placed by a player. = +This block quickly decays when there is no trunk or stem block of its species within a distance of @1. When decaying, it disappears and may drop one of its mining drops (but not itself). The block does not decay when the block has been placed by a player. = +This block quickly decays and disappears when there is no trunk or stem block of its species within a distance of @1. The block does not decay when the block has been placed by a player. = +Under sunlight, this block slowly spreads its dirt cover towards nearby dirt blocks. In the shadows, this block eventually loses its dirt cover and turns into plain dirt. = +This block can be turned into @1 with a hoe. = +This block can be cultivated by a hoe. = +This block is compatible with keys. = +The basic flame is a damaging but short-lived kind of block. This particular world is rather hostile to fire, so basic flames won't spread and destroy other blocks. They will quickly disappear. A basic flame is also destroyed by nearby water or punching. It hurts you when you stand directly inside a basic flame, but punching it is safe. = +The permanent flame is a damaging block. Other than the basic flame, the permanent flame will not go away by time alone. A permanent flame is extinguished by punching it, by nearby water or similar blocks, or by removing a coal block below it. Punching is is safe, but it hurts if you stand inside. As this world is hostile to fire, it won't spread. = +The basic flame is a damaging and destructive but short-lived kind of block. It will destroy and spread towards near flammable blocks, but fire will disappear if there is nothing to burn left. It will be extinguished by water and other blocks if it is next to it. A single basic flame block can be destroyed safely by punching it, but it is hurtful if you stand directly in it. = +The permanent flame is a damaging and destructive block. It will create basic flames next to it if flammable blocks are nearby. Other than the basic flame, the permanent flame will not go away by time alone. A permanent flame is extinguished by punching it, by nearby water or similar blocks, or by removing a coal block below it. Punching is is safe, but it hurts if you stand inside. = +Flowers of this species have their natural habitat in grasslands and forests and are important for the production of dyes. = +A piece of ladder which allows you to move vertically. = +A fence post. When multiple of these are placed to next to each other, they will automatically build a nice fence structure. You can easily jump over a low fence. = +Fence gates can be opened or closed and can be easily jumped over. Other fence posts will connect nicely to fence gates. = +Right-click the gate to open or close it. = +A piece of wall. When multiple of these are placed to next to each other, they will automatically build a nice wall structure. You can easily jump over a low wall. = +A slab is half as high as their full block counterparts and can occupy either the lower or upper half of a block. Low slabs can be easily stepped on without needing to jump. When a slab is placed on another slab of the same type, a new full block is created. = +To place a low slab, place it on the floor or the bottom half of the side of a block. To place a high slab, place it on the ceiling or the upper half of the side of a block. = +Stairs are useful to reach higher places by walking over them; jumping is not required. = +A sign is placed at walls. Players can write something on it. = +Point to the sign to reveal its message. Right-click the sign to edit the text. = +Beds allow you to sleep at night and waste some time. Survival in this world does not demand sleep, but sleeping might have some other uses. = +Right-click on the bed to try to sleep in it. This only works at night. While being in it, you can right-click the bed again to get up early. = +In local folklore, legends are told of other worlds where setting the start point for your next would be possible. But this world is not one of them. = +By sleeping in a bed, you set the starting point for your next life. = +In this strange world, the time will not pass faster for you when you sleep. = +Going into bed seems to make time pass faster: The night will be skipped when you go sleep and you are the only human being in this world. If you are not alone, the night will be skipped as soon the majority of all humans went to bed. = +Hoes are essential tools for growing crops. They are used to create farming soil in order to plant seeds on it. = +Punch a cultivatable block with a hoe to turn it into soil. Dirt, dirt with grass, dirt with dry grass and desert sand are cultivatable blocks. = +An axe is your tool of choice to cut down blocks which are affected by brute force, especially trees and wood. It also serves as a weapon in a pinch, although not as efficient as swords, but still acceptable. = +Swords are great in melee combat, as they are fast, deal high damage and can endure countless battles. Swords are also surprisingly useful in cutting “snappy” plants and blocks, like grass, wheat and leaves, but this will wear them out. = +Shovels are mining tools to mine “crumbly” blocks, such as sand, dirt, gravel, and so on. Technically, they can also be used as weapons, but they are not much better than hand-to-hand combat. = +Pickaxes are mining tools to mined hard, “cracky” blocks, such as stone. If you are desperate, you can use a pickaxe as an inefficient weapon. = +Dyes are primarily used for crafting other items, especially for colorizing them. Dyes can also be used to obtain new dyes by using two dyes in crafting. = +Wool is a soft decorative block which comes in different colors. Walking on wool is completely silent. = +An explosive device. When it explodes, it will hurt living beings, destroy blocks around it, throw blocks affected by gravity all over the place and set flammable blocks on fire. A single TNT has an explosion radius of @1. The explosion radius increases if multiple TNT blocks are close to each other. 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, igniter blocks. Initially, TNT is not affected by gravity, but as soon it has been ignited, it is. = +This is a mesecon effector. If TNT receives a mesecon signal, it explodes immediately. = +A weird creature with a cat face, cat extremities and a strawberry-flavored pop-tart body. It has been trapped in a block and cannot move and can thus be dug easily by simple tools. Nyan cats are usually followed by nyan cat rainbows. Legends say that in ancient times, long before the creation of our world, there were many of the Nyan Cats which were free and flew through space and sang the \"Nya-nya\" song. Nowadays, nyan cats serve as a fancy collector's item and are traded as souvenirs. Apart from that, nyan cats have no intrinsic value. = +A rainbow made by a real nyan cat, ancient creatures which once flew through space. It has gone inert and can be dug by simple tools. Like nyan cats, nyan cat rainbows have no intrinsic value. = +Place them on the ground to build your railway, the rails will automatically connect to each other and will turn into curves, T-junctions, crossings and slopes as needed. = +Corals are plants naturally found in shallow water of warm climates. Corals are rather delicate. When exposed to air, they will die off to become coral skeletons. = +You use your bare hand whenever you are not wielding any item. With your hand you can mine the weakest blocks and deal minor damage by punching. Using the hand is often a last resort, as proper mining tools and weapons are usually better than the hand. 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 mining capabilities, range and damage of the hand are greatly enhanced. = +Apples can be eaten to restore 2 hit points. Apples are sometimes grown from saplings. = +Cooks or smelts several items, using a furnace fuel, into something else. = +Provides 32 slots of inventory space. = +Provides 32 slots of inventory space, is accessible only to the player who placed it. Locked chests are also immune to explosions. = +A coral skeleton once was a living colorful coral but now has died. Coral skeletons can be found naturally in shallow water of warm climates. = +A very common block in the world of Minetest Game, almost the entire underground consists of stone. It sometimes contains ores. Stone may be created when water meets lava. = +Desert stone is less common than stone and is found in large quantities near the surface of deserts. Desert stone doesn't go very deep. = +Some coal contained in stone, it is very common and can be found in stones as large clusters at a height of +64 or lower. = +This stone contains pure iron, which is very common. It is found in small clusters at a height between +2 and -15, in clusters of 5 at a height of -16 or lower and in large clusters of up to 27 iron ores at a height of -64 or lower. = +This stone contains pure copper. Copper is found in stone in clusters of 4-5 at a height of -16 or lower and is more common at a height of -64 or lower. = +This stone contains pure tin. Tin slightly less common than copper and is found in stone in clusters of 4-5 at a height of -32 or lower and is more common at a height of -128 or lower. = +This stone contains a small amount of mese, a rare mineral of alien origin. It can be found in clusters of 3-5 at a height of -64 lower. Mese ore is more common at -256 or lower. = +This stone contains pure gold, a rare metal. It can be found in clusters of about 3 blocks at a height of -64 or lower and in clusters of about 5 blocks at a height of -256 or lower. = +Diamonds are very rare and hard and can be found in clusters deep in the underground. They appear inside stone in clusters of about 4 blocks at a height of -128 or lower and are more common at a height of -256 or lower. = +Very common on the surface, found in grasslands and forests. It is a resourceful block which supports the growth and spreading of many small plants and trees. Dirt with grass turns into dirt with snow when a snow block is placed on top of it. = +This block is found on the surface of rainforests. It is a resourceful block which supports the growth and spreading of many small plants and trees. = +A decorational variant of dirt with grass, it looks like someoned has stepped on the grass. Unlike dirt with grass, it doesn't change on its own and doesn't spread its grass on other dirt blocks. = +Common on the surface, found in savannahs. = +Dirt with snow is a cold block of frozen dirt which doesn't support the growth of any plants. Plants won't die on it, but they don't grow or spread either. = +A thin layer of snow. When it it on top of dirt, the dirt will slowly turn into dirt with snow. When snow lands on dirt with grass, it immediately turns into dirt with snow. = +A very thick layer of snow, filling an entire block. Snow this thick can usually only be found in arctic regions. When this block is placed on top of dirt with grass, the dirt with grass turns into dirt with snow. = +Ice is found in arctic regions. It can appear either in huge glacier formations below snow blocks, or above water. = +Dirt is found often directly under the surface and very common in many regions of the world. When exposed to sunlight, the surface of dirt may change, depending on its neighbors. = +Sand is found in large quantities at beaches, but it occasionally appears in small chunks around the world. = +Usually found in huge quantities at the surface of deserts. = +Silver sand can be found in cold biomes in the form of so-called cold deserts. = +This block consists of a couple of loose stones and can't support itself. It is common only at the beaches of very cold regions, but it can be found in small quantities on the surface and underground. = +Clay is a rather soft material and it sometimes found in sand beaches. = +A pretty soft kind of stone, a compressed form of sand. It is common in sandstone deserts. = +A pretty soft kind of stone, a compressed form of silver sand. = +A pretty soft kind of stone, a compressed form of desert sand. = +A decorational block. It can be destroyed by explosions. = +A trunk of a regular tree. This species of tree sometimes bears apples and is home in deciduous forests in mild climates. = +A trunk of a jungle tree. Jungle trees can be found in jungles, which are in hot and wet climates. = +A trunk of a pine tree. The natural habitat of pine trees are coniferous forests which can be found in cold climates. = +A trunk of an aspen tree. The natural habitat of aspen trees are deciduous forests which can be found in mild climates. = +A trunk of an acacia tree. The natural habitat of acacia trees are savannahs, which can be found in hot and dry climates. = +The stem of a bush. Bushes can be found in grasslands, snowy grasslands and deciduous forests. = +The stem of an acacia bush. Acacia bushes can be found in savannahs. = +When placed on natural soil (such as dirt) and exposed to sunlight, a sapling will grow into a tree after some time. There's a chance that this tree bears apples. = +When placed on natural soil (such as dirt) and exposed to sunlight, a jungle sapling will grow into a large jungle tree after some time. = +When placed on natural soil (such as dirt) and exposed to sunlight, an acacia sapling will grow into an acacia tree after some time. = +When placed on natural soil (such as dirt) and exposed to sunlight, an aspen sapling will grow into an aspen tree after some time. = +When placed on natural soil (such as dirt) and exposed to sunlight, a pine sapling will grow into a pine tree after some time. If the pine sapling was next to any “snowy” block (e.g. “Snow Block”), the pine tree will be covered with snow. = +When placed on natural soil (such as dirt) and exposed to sunlight, a bush sapling will grow into a bush after some time. = +When placed on natural soil (such as dirt) and exposed to sunlight, an acacia bush sapling will grow into an acacia bush after some time. = +Leaves are grown from trees—which sometimes bear apples—found in deciduous forests. = +Jungle leaves are grown from jungle trees found in jungles. = +Acacia leaves are grown from acacia trees found in savannahs. = +Aspen leaves are grown from aspen trees found in deciduous forests. = +Pine needles are grown from pine trees found in coniferous forests. = +Bush leaves are grown from bushes found in grasslands, snowy grasslands and deciduous forests. = +Acacia bush leaves are grown from acacia bushes found in savannahs. = +A piece of cactus usually found in deserts. Cacti grow on sand, desert sand and other blocks belonging to the “@1” group at a light level of 13 or higher. They can reach a height of up to 4 cactus blocks. = +A papyrus piece usually found near shallow water. Papyrus grows vertically up to a height of 4 blocks on dirt and dirt with grass near a water source (or another block belonging to the @1 group) and requires a light level of 13 or higher. When dug, all papyrus blocks directly connected above it will also be dug. = +A bookshelf provides 16 inventory slots for books. = +A decorational and mostly transparent block which is rather easy to break. = +An unremarkable dead plant which is common in deserts and snowy biomes. Small plants which are members of the @1 group placed on silver sand or desert sand will sooner or later turn into dry shrubs. = +Rails can be used to build transport tracks for carts. Normal rails slightly slow down carts due to friction. = +Rails can be used to build transport tracks for carts. Powered rails will accelerate moving carts, up to a maximum speed. = +Rails can be used to build transport tracks for carts. Brake rails will heavily slow down carts, much more than normal rails. = +Water is abundant in oceans and may also appear in small quantities in underground water pockets. You can swim easily in water, but you need to catch your breath from time to time. Water will turn nearby lava into obsidian or stone. = +You can swim easily in river water, but you need to catch your breath from time to time. Unlike (normal) water, it appears in rivers only. River water will turn nearby lava into obsidian or stone. = +Lava is found deep underground (@1 and below) and rather dangerous. Don't touch it, it will hurt you a lot and once you're in, it is hard to get out. When a lava source meets water or river water (or another block in the @2 group), it turns into obsidian. Flowing lava turns into stone instead. = +Provides some light. It can be placed on almost any block facing any direction. It can also be used to ignite gunpowder and TNT by punching. = +A building block used to create houses, dungeons and other buildings. It is obtained after mining stone. If it is near water (or any other block in the @1 group), it might turn into mossy cobblestone. = +Coal lumps are your standard furnace fuel, but they are also used to make torches and a few other things. = +A decorational block. It is found in underground dungeons and is the product of cobblestone near water. = +Coal blocks are useful as compact storage of coal lumps and notable for exceptional burning capabilities. As a furnace fuel, it is slightly more efficient than 9 coal lumps. Coal blocks can also be used to start permanent flames with a flint and steel. If you remove the coal block, the permanent flame is destroyed as well. = +A very hard decorational block. = +Obsidian glass is transparent, has a very clean surface and is rather hard to break. = +A hard mineral which is created from a lava source when it meets water (any block in the @1 group). = +A key grants you to access to a thing with a lock (e.g. steel door, steel trapdoor, locked chest), even if you don't own it. Each key is unique and only fits into one lock. If the locked thing has been removed, the key won't unlock anything. = +A skeleton key can be used to share access to a locked thing you own (e.g. steel door, steel trapdoor, locked chest) with other players. = +A book is used to store notes and to make bookshelves. = +A book with text contains notes which can be rewritten and copied to books. In the inventory, both title and author of the book are shown. = +Grass can be found in large quantities in open plains. It comes in 5 different sizes but doesn't grow. There's a small chance it turns neighbor dirt blocks into dirt with grass, when they're in sunlight. = +This plant is common in jungles. = +Dry grass is very common in savannahs and comes in 5 different sizes but doesn't grow. There's a small chance it turns neighbor dirt blocks into dirt with dry grass, when they're in sunlight. = +A bright light source powered by mese crystals. It is brighter than a torch. = +A bright light source powered by mese crystals. This is a more compact version of the mese lamp. It is brighter than a torch. = +Mese is a rare mineral of alien origin; mese blocks are a highly concentrated form of mese. At extreme depths (-1024 or lower), mese blocks rarely occour naturally in stone as clusters of about 3 mese blocks. = +A bucket can be used to collect and release liquids. = +A bucket can be used to collect and release liquids. This one is filled with water. = +A bucket can be used to collect and release liquids. This one is filled with river water. = +A bucket can be used to collect and release liquids. This one is filled with "hot lava, safely contained inside. Use with caution. = +These are the remains of a deceased player. It may contain the player's former inventory which can be looted. Fresh bones are bones of a player who has deceased recently and can only be looted by the same player. Old bones can be looted by everyone. Once collected, bones can be placed like any other block. = +A door covers a vertical area of two blocks to block the way. It can be opened and closed by any player. = +Steel doors are owned by the player who placed them, only their owner can open, close or mine them. Steel doors are also immune to explosions. = +A nutritious food. Eat it to restore 5 hit points. = +Grows into a wheat plant. = +Grows into a cotton plant. = +Dry soil for farming, a necessary surface to plant crops. It is created when a hoe is used on dirt or a similar block. Dry soil will become wet soil when a water source is nearby. Soil might turn back into dirt if nothing is planted on it and it is not made wet for a while. = +Wet soil for farming, this is where you can plant and grow crops on. Wet soil is created when water is near soil. Wet soil will become (dry) soil again when there is no water nearby. = +Dry desert sand soil for farming, a necessary surface to plant crops. It is created when a hoe is used on desert sand. Desert sand soil will become wet desert sand soil if a water source is near. Desert sand soil might turn back into desert sand if nothing is planted on it and it is not made wet for a while. = +Wet desert sand soil for farming, this is where you can plant and grow crops on. Wet desert sand soil is created when water is near (dry) desert sand soil. Wet desert sand soil will become (dry) desert sand soil again when there is no water nearby. = +The wheat plant is a plant grown from wheat seed. It grows on wet soil in direct sunlight. It will grow through 8 stages and stops growing at its final stage. Digging it will yield up to 2 wheat seeds and 2 wheat. The drop probabilities are much lower if the plant is dug at an early stage with the risk to even get nothing at all; only at its final stage you are guaranteed to get at least 1 wheat seed and 1 wheat. = +The cotton plant is a plant grown from wheat seed. It grows on wet soil or wet desert sand soil in direct sunlight. It will grow through 8 stages and stops growing at its final stage. Digging it will yield up to 2 cotton seeds and 2 cottons. The drop probabilities are much lower if the plant is dug at an early stage with the risk to even get nothing at all; only at its final stage you are guaranteed to get at least 1 cotton seed and 1 cotton. = +An edible mushroom. Eat it to restore 1 hit point. Brown mushrooms like to grow and spread on natural soil (like dirt) and sometimes on fallen tree trunks. They need darkness to spread and survive and die off in direct sunlight. = +A poisonous mushroom, don't eat it. If you eat it, you lose 5 hit points. Red mushrooms like to grow and spread on natural dirt (like dirt) and sometimes on fallen tree trunks. They need darkness to spread and survive and die off in direct sunlight. = +Waterlilies are sometimes found on shallow water. They can't survive on anything but water. = +Gunpowder is used to craft TNT and to create gunpowder trails which can be ignited. = +Flint and steel is a tool to start fires and ignite blocks. = +A trapdoor covers a hole in the floor and can be opened manually to access the area below it. = +A steel trapdoor covers a hole in the floor and can be opened manually only by the placer to access the area below it. Steel trapdoors are immune to explosions. = +A screwdriver can be used to rotate blocks. = +A simple boat which allows you to float on the surface of large water bodies. Travelling by boat is a bit faster than swimming. = +A cart which you can use for quick transport of yourself and items on rails. = +Carts only ride on rails and always follow the tracks. At a T-junction with no straight way ahead, the cart normally turns left. There are multiple rail types which affect the cart speed. = +A decorational item which can be placed. = +A vessels shelf provides 16 inventory slots for vessels (like glass bottles). = +Glass panes are thin layers of glass which neatly connect to their neighbors as you build them. = +Iron bars neatly connect to their neighbors as you build them. = +Cobblestone walls will slowly turn into mossy cobblestone walls when they're near water (or any other block in the @1 group). = +A mossy cobblestone wall is created when a cobblestone wall is near water (or any other block in the @1 group) for a while. = +A cobblestone slab will slowly turn into a mossy cobblestone slab when it is near water (or any other block in the @1 group). = +A mossy cobblestone slab is created when a cobblestone slab is near water (or any other block in the @1 group) for a while. = +A cobblestone stair will slowly turn into a mossy cobblestone stair when it is near water or any other block in the @1 group. = +A mossy cobblestone stair is created when a cobblestone stair is near water (or any other block in the @1 group) for a while. = +Molten iron. It is the element of numerous crafting recipes. = +A clay lump can be burnt in the furnace to make a clay brick. = +A gold lump can be smelt in a furnace to make a gold ingot. = +A copper lump can be smelt in a furnace to make a copper ingot. = +A tin lump can be smelt in a furnace to make a tin ingot. = +An iron lump can be smelt in a furnace to make a steel ingot. = +Obsidian shards can be smelt in a furnace to create obsidian glass. = +Wooden sticks are used as a vital element in countless crafting recipes. = +In this world this can be done without any delay as the bones instantly become old. = +@1 min = +@1 min @2 s = +If these are not your bones, you have to wait @1 before you can do this. = +If the player died in a protected area of someone else, the bones can be dug after @1. = +Right-click the furnace to view it. 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 4 slots at the right side. = +Right-click the chest to open it and to exchange items. You can only mine it when the chest is empty. = +Point it to reveal the name of its owner. Right-click the chest to open it and to exchange items. This is only possible if you own the chest. You also can only mine the chest when you own it and it is empty. = +Hold the book in hand and left-click to write some notes. You have to provide both a title and contents. Doing so will turn the book into a new item (see “Book With Text”). = +Hold the book with text in hand and left-click to read or rewrite the notes. To copy the text, combine the book with text together with a book (without text) in the crafting grid. = +Right-click to open the bookshelf. You can only store books and other items belonging to the @1 group into the bookshelf. To collect the bookshelf, you must make sure it does not contain anything. = +Right-click to open the vessels shelf. You can only store items which belong to the @1 group (glass bottle, drinking glass, heavy steel bottle). To collect the vessels shelf, it must be empty. = +Punch a liquid source to collect the liquid. With the filled bucket, you can right-click somewhere to empty the bucket which will create a liquid source at the position you've clicked at. = +Right-click on any block to empty the bucket and put a water source on this spot. = +Right-click on any block to empty the bucket and put a river water source on this spot. = +Choose a place where you want to empty the bucket, then get in a safe spot somewhere above it. Be prepared to run away when something goes wrong as the lava will soon start to flow after placing. To empty the bucket (which places a lava source), right-click on your chosen place. = +Point to the bones to see to whom they belong to. If nothing is displayed, they belong to nobody and are empty; they behave any other block in this case. Otherwise, right-click on the bones to access the inventory, punch it to obtain all items and the bones immediately, or at least as many items as you can carry. = +It is only possible to take from this inventory, nothing can be stored into it. = +Place gunpowder on the ground to create gunpowder trails. Punch it with a torch or a flint and steel to light the gunpowder. Gunpowder is also ignited by igniter blocks (like fire or lava). Lit gunpowder will ignite all neighbor (including diagonals) gunpowder tiles and TNTs. = +Place the TNT on the ground and punch it with a torch or a flint and steel to light it and quickly get in a safe distance before it explodes. Nearby burning gunpowder trails and igniter blocks will also ignite the TNT. = +Right-click the trapdoor to open or close it. = +Point the steel trapdoor to see who owns it. Right-click it to open or close it (if you own it). = +Right-click the door to open or close it. = +Point the door to see who owns it. Right-click the door to open or close it (if you own it). = +Left-click on a block to rotate it around its current axis. Right-click on a block to rotate its axis. Note that not all blocks can be rotated. = +Place the boat on water (any block belonging to the @1 group) to set it up. Right-click the boat to enter it. When you are on the boat, use the forward key to speed up, the backward key to slow down and the left and right keys to turn the boat. Right-click on the boat again to leave it. Left-click the placed boat to collect it. = +You can place the cart on rails. Right-click it to enter it. Punch the cart to get it moving. = +When you sit inside, you can control the cart: Hold [Down] to slow down. Hold down [Left] or [Right] to turn the cart at crossings and T-junctions. = +To transport items, just drop them inside and punch the cart. To obtain the cart and the items, punch it while holding down the sneak key. = +Place the wheat seed on soil or wet soil. Use a hoe to create soil. The plant will only grow in sunlight and as long as the soil is wet. Watch the wheat plant grow and mine it at its full size. = +Place the cotton seed on soil, wet soil, desert sand soil or wet desert sand soil. Use a hoe to create soil. The plant will only grow in sunlight and as long as the soil is wet. Watch the cotton plant grow and mine it at its full size. = +Punch with it on the surface of a block to attempt to ignite it. This creates a basic flame in front of flammable blocks. When used on a coal block, a permanent flame is created on top of it. TNT and gunpowder get ignited. On other non-flammable blocks, this tool generally has no effect. = +Waterlilies can only be placed on water sources (and other members of the @1 group). = +Wield the key and right-click on a locked thing to attempt to access it. If the key fits, you perform the action (e.g. you open a door). If it doesn't fit, the key does nothing. = +Go to the locked thing you own to match the key for. Punch it to turn the skeleton key into a key and permanently match it to the locked thing. Any player who possesses this key can now access the locked thing you have selected—but only this! Note that you don't need keys for the things you own. If the locked thing has been removed, the key will stop working. = +Creative Mode = +Enabling Creative Mode in Minetest Game applies the following changes:\n\n• You keep the things you've placed\n• Creative inventory is available to obtain most items easily\n• Hand breaks all default blocks\n• Greatly reduced hand digging time\n• Greatly increased hand damage\n• Increased pointing range of hand\n• Tools don't wear off\n• When you die, you keep your items and no bones appear = diff --git a/mods/user_interface/intllib/tools/xgettext.bat b/mods/user_interface/intllib/tools/xgettext.bat old mode 100755 new mode 100644 diff --git a/settingtypes.txt b/settingtypes.txt index 9113d80..b43d1f5 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -4,13 +4,18 @@ # Should the character be spawned into a cavern on join or death? cave_spawn (Cavern spawn) bool false -# Please choose your favorite resolution. -# Allowed resolutions: 16, 32, 64, 128 (pixels). -# The default value is 16 pixels. +# Here you can change the mobs' difficulty. +# 1: normal (default) +# 2: harder +mob_difficulty ([Mobs Redo] Mobs Difficulty) int 1 + +# Please choose your favorite resolution. +# Allowed resolutions: 16, 32, 64, 128 (pixels). +# The default value is 16 pixels. hidden_doors_res ([Hidden Doors] Textures' resolution) int 16 -# Here you can set your preferred value for the stone made hidden -# doors' opening and closing sounds, the default value is 5.0 +# Here you can set your preferred value for the stone made hidden +# doors' opening and closing sounds, the default value is 5.0 hidden_doors_vol ([Hidden Doors] Stone doors' sounds volume) float 5.0 # In creative mode players are able to dig all kind of blocks nearly @@ -42,4 +47,5 @@ enable_stairs_replace_abm (Replace old stairs) bool false # Controls length of day/night cycle. # Examples: 72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays unchanged. # type: int +# Default: 24 time_speed (Length of day/night) int 24