From b0e3380ed8c659e6299612f3bd61a97b29038008 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 25 Oct 2020 20:54:52 +0100 Subject: [PATCH] update --- ...apply-world.mt-regenerate-from-config-file | 6 + mods-download | 6 +- mods/biome_lib/API.txt | 590 ++++++++++++++ mods/biome_lib/LICENSE | 600 ++++++++++++++ mods/biome_lib/README.md | 28 + mods/biome_lib/depends.txt | 3 + mods/biome_lib/description.txt | 1 + mods/biome_lib/growth.lua | 90 +++ mods/biome_lib/init.lua | 736 +++++++++++++++++ mods/biome_lib/locale/de.txt | 5 + mods/biome_lib/locale/fr.txt | 5 + mods/biome_lib/locale/ru.txt | 5 + mods/biome_lib/locale/template.txt | 5 + mods/biome_lib/locale/tr.txt | 5 + mods/biome_lib/mod.conf | 2 + mods/biome_lib/search_functions.lua | 60 ++ mods/moretrees/.luacheckrc | 30 + mods/moretrees/LICENSE | 620 ++++++++++++++ mods/moretrees/README.md | 11 + mods/moretrees/biome_defs.lua | 301 +++++++ mods/moretrees/cocos_palm.lua | 335 ++++++++ mods/moretrees/crafts.lua | 271 +++++++ mods/moretrees/date_palm.lua | 762 ++++++++++++++++++ mods/moretrees/default_settings.txt | 135 ++++ mods/moretrees/init.lua | 329 ++++++++ mods/moretrees/locale/moretrees.de.tr | 211 +++++ mods/moretrees/locale/moretrees.es.tr | 211 +++++ mods/moretrees/locale/moretrees.fr.tr | 211 +++++ mods/moretrees/locale/template.txt | 210 +++++ mods/moretrees/mod.conf | 4 + mods/moretrees/node_defs.lua | 743 +++++++++++++++++ mods/moretrees/saplings.lua | 84 ++ mods/moretrees/screenshot.lua | 168 ++++ mods/moretrees/screenshot.png | Bin 0 -> 103526 bytes mods/moretrees/textures/moretrees_acorn.png | Bin 0 -> 417 bytes .../textures/moretrees_acorn_muffin.png | Bin 0 -> 782 bytes .../moretrees_acorn_muffin_batter.png | Bin 0 -> 619 bytes .../textures/moretrees_apple_tree_leaves.png | Bin 0 -> 351 bytes .../textures/moretrees_apple_tree_sapling.png | Bin 0 -> 183 bytes .../textures/moretrees_apple_tree_trunk.png | Bin 0 -> 1066 bytes .../moretrees_apple_tree_trunk_top.png | Bin 0 -> 503 bytes .../textures/moretrees_apple_tree_wood.png | Bin 0 -> 464 bytes .../textures/moretrees_beech_leaves.png | Bin 0 -> 201 bytes .../textures/moretrees_beech_sapling.png | Bin 0 -> 177 bytes .../textures/moretrees_beech_trunk.png | Bin 0 -> 980 bytes .../textures/moretrees_beech_trunk_top.png | Bin 0 -> 926 bytes .../textures/moretrees_beech_wood.png | Bin 0 -> 175 bytes .../textures/moretrees_birch_leaves.png | Bin 0 -> 459 bytes .../textures/moretrees_birch_sapling.png | Bin 0 -> 208 bytes .../textures/moretrees_birch_trunk.png | Bin 0 -> 975 bytes .../textures/moretrees_birch_trunk_top.png | Bin 0 -> 811 bytes .../textures/moretrees_birch_wood.png | Bin 0 -> 1075 bytes .../textures/moretrees_cedar_cone.png | Bin 0 -> 315 bytes .../textures/moretrees_cedar_leaves.png | Bin 0 -> 205 bytes .../textures/moretrees_cedar_nuts.png | Bin 0 -> 369 bytes .../textures/moretrees_cedar_sapling.png | Bin 0 -> 202 bytes .../textures/moretrees_cedar_trunk.png | Bin 0 -> 1074 bytes .../textures/moretrees_cedar_trunk_top.png | Bin 0 -> 451 bytes .../textures/moretrees_cedar_wood.png | Bin 0 -> 648 bytes mods/moretrees/textures/moretrees_coconut.png | Bin 0 -> 963 bytes .../textures/moretrees_coconut_0.png | Bin 0 -> 877 bytes .../textures/moretrees_coconut_1.png | Bin 0 -> 429 bytes .../textures/moretrees_coconut_2.png | Bin 0 -> 1009 bytes .../textures/moretrees_coconut_milk.png | Bin 0 -> 227 bytes .../textures/moretrees_coconut_milk_inv.png | Bin 0 -> 199 bytes mods/moretrees/textures/moretrees_date.png | Bin 0 -> 2118 bytes .../textures/moretrees_date_nut_bar.png | Bin 0 -> 685 bytes .../textures/moretrees_date_nut_batter.png | Bin 0 -> 608 bytes .../textures/moretrees_date_nut_cake.png | Bin 0 -> 695 bytes .../textures/moretrees_date_nut_snack.png | Bin 0 -> 450 bytes .../textures/moretrees_date_palm_leaves.png | Bin 0 -> 757 bytes .../textures/moretrees_date_palm_sapling.png | Bin 0 -> 261 bytes .../textures/moretrees_date_palm_trunk.png | Bin 0 -> 1196 bytes .../moretrees_date_palm_trunk_top.png | Bin 0 -> 673 bytes .../textures/moretrees_date_palm_wood.png | Bin 0 -> 735 bytes mods/moretrees/textures/moretrees_dates.png | Bin 0 -> 9421 bytes .../moretrees/textures/moretrees_dates_f0.png | Bin 0 -> 3848 bytes .../moretrees/textures/moretrees_dates_f1.png | Bin 0 -> 4137 bytes .../moretrees/textures/moretrees_dates_f2.png | Bin 0 -> 9070 bytes .../moretrees/textures/moretrees_dates_f3.png | Bin 0 -> 8295 bytes .../moretrees/textures/moretrees_dates_f4.png | Bin 0 -> 9237 bytes .../moretrees/textures/moretrees_dates_fn.png | Bin 0 -> 2589 bytes .../moretrees/textures/moretrees_dates_m0.png | Bin 0 -> 4138 bytes mods/moretrees/textures/moretrees_dates_n.png | Bin 0 -> 2107 bytes .../moretrees/textures/moretrees_fir_cone.png | Bin 0 -> 244 bytes .../textures/moretrees_fir_leaves.png | Bin 0 -> 205 bytes .../textures/moretrees_fir_leaves_bright.png | Bin 0 -> 205 bytes .../moretrees/textures/moretrees_fir_nuts.png | Bin 0 -> 361 bytes .../textures/moretrees_fir_sapling.png | Bin 0 -> 166 bytes .../textures/moretrees_fir_trunk.png | Bin 0 -> 753 bytes .../textures/moretrees_fir_trunk_top.png | Bin 0 -> 924 bytes .../moretrees/textures/moretrees_fir_wood.png | Bin 0 -> 1055 bytes .../moretrees_jungletree_leaves_green.png | Bin 0 -> 201 bytes .../moretrees_jungletree_leaves_red.png | Bin 0 -> 201 bytes .../moretrees_jungletree_leaves_yellow.png | Bin 0 -> 201 bytes .../textures/moretrees_oak_leaves.png | Bin 0 -> 730 bytes .../textures/moretrees_oak_sapling.png | Bin 0 -> 172 bytes .../textures/moretrees_oak_trunk.png | Bin 0 -> 998 bytes .../textures/moretrees_oak_trunk_top.png | Bin 0 -> 519 bytes .../moretrees/textures/moretrees_oak_wood.png | Bin 0 -> 618 bytes .../textures/moretrees_palm_leaves.png | Bin 0 -> 918 bytes .../textures/moretrees_palm_sapling.png | Bin 0 -> 122 bytes .../textures/moretrees_palm_trunk.png | Bin 0 -> 295 bytes .../textures/moretrees_palm_trunk_top.png | Bin 0 -> 400 bytes .../textures/moretrees_palm_wood.png | Bin 0 -> 598 bytes .../textures/moretrees_poplar_leaves.png | Bin 0 -> 563 bytes .../textures/moretrees_poplar_sapling.png | Bin 0 -> 447 bytes .../moretrees_poplar_small_sapling.png | Bin 0 -> 347 bytes .../textures/moretrees_poplar_trunk-1.png | Bin 0 -> 1217 bytes .../textures/moretrees_poplar_trunk.png | Bin 0 -> 980 bytes .../textures/moretrees_poplar_trunk_top.png | Bin 0 -> 751 bytes .../textures/moretrees_poplar_wood.png | Bin 0 -> 726 bytes .../textures/moretrees_raw_coconut.png | Bin 0 -> 466 bytes .../textures/moretrees_rubber_tree_leaves.png | Bin 0 -> 201 bytes .../moretrees_rubber_tree_sapling.png | Bin 0 -> 151 bytes .../textures/moretrees_rubber_tree_trunk.png | Bin 0 -> 693 bytes .../moretrees_rubber_tree_trunk_empty.png | Bin 0 -> 1107 bytes .../moretrees_rubber_tree_trunk_top.png | Bin 0 -> 534 bytes .../textures/moretrees_rubber_tree_wood.png | Bin 0 -> 435 bytes .../textures/moretrees_sequoia_leaves.png | Bin 0 -> 205 bytes .../textures/moretrees_sequoia_sapling.png | Bin 0 -> 209 bytes .../textures/moretrees_sequoia_trunk.png | Bin 0 -> 621 bytes .../textures/moretrees_sequoia_trunk_top.png | Bin 0 -> 594 bytes .../textures/moretrees_sequoia_wood.png | Bin 0 -> 1037 bytes .../textures/moretrees_spruce_cone.png | Bin 0 -> 496 bytes .../textures/moretrees_spruce_leaves.png | Bin 0 -> 205 bytes .../textures/moretrees_spruce_nuts.png | Bin 0 -> 365 bytes .../textures/moretrees_spruce_sapling.png | Bin 0 -> 153 bytes .../textures/moretrees_spruce_trunk.png | Bin 0 -> 753 bytes .../textures/moretrees_spruce_trunk_top.png | Bin 0 -> 414 bytes .../textures/moretrees_spruce_wood.png | Bin 0 -> 536 bytes .../textures/moretrees_willow_leaves.png | Bin 0 -> 409 bytes .../textures/moretrees_willow_sapling.png | Bin 0 -> 168 bytes .../textures/moretrees_willow_trunk.png | Bin 0 -> 630 bytes .../textures/moretrees_willow_trunk_top.png | Bin 0 -> 513 bytes .../textures/moretrees_willow_wood.png | Bin 0 -> 565 bytes mods/moretrees/tree_biomes.txt | 34 + mods/moretrees/tree_models.lua | 275 +++++++ mods/trees_lib/LICENSE.txt | 502 ++++++++++++ mods/trees_lib/README.md | 122 +++ mods/trees_lib/init.lua | 656 +++++++++++++++ mods/vines/.luacheckrc | 13 + mods/vines/LICENSE.md | 4 + mods/vines/README.md | 56 ++ mods/vines/aliases.lua | 11 + mods/vines/bower.json | 18 + mods/vines/crafts.lua | 14 + mods/vines/depends.txt | 3 + mods/vines/description.txt | 1 + mods/vines/functions.lua | 129 +++ mods/vines/init.lua | 14 + mods/vines/mod.conf | 2 + mods/vines/nodes.lua | 83 ++ mods/vines/recipes.lua | 12 + mods/vines/screenshot.png | Bin 0 -> 189723 bytes mods/vines/shear.lua | 15 + mods/vines/textures/vines_item.png | Bin 0 -> 167 bytes mods/vines/textures/vines_jungle_end.png | Bin 0 -> 497 bytes mods/vines/textures/vines_jungle_middle.png | Bin 0 -> 481 bytes mods/vines/textures/vines_root_end.png | Bin 0 -> 215 bytes mods/vines/textures/vines_root_middle.png | Bin 0 -> 201 bytes mods/vines/textures/vines_rope.png | Bin 0 -> 106 bytes mods/vines/textures/vines_rope_end.png | Bin 0 -> 118 bytes mods/vines/textures/vines_shears.png | Bin 0 -> 194 bytes mods/vines/textures/vines_side_end.png | Bin 0 -> 247 bytes mods/vines/textures/vines_side_middle.png | Bin 0 -> 225 bytes mods/vines/textures/vines_vine_end.png | Bin 0 -> 364 bytes mods/vines/textures/vines_vine_middle.png | Bin 0 -> 187 bytes mods/vines/textures/vines_willow_end.png | Bin 0 -> 226 bytes mods/vines/textures/vines_willow_middle.png | Bin 0 -> 196 bytes mods/vines/vines.lua | 105 +++ reset-map => reset-map-and-players | 4 +- setup-mt | 1 + 173 files changed, 8855 insertions(+), 2 deletions(-) create mode 100644 mods/biome_lib/API.txt create mode 100644 mods/biome_lib/LICENSE create mode 100644 mods/biome_lib/README.md create mode 100644 mods/biome_lib/depends.txt create mode 100644 mods/biome_lib/description.txt create mode 100644 mods/biome_lib/growth.lua create mode 100644 mods/biome_lib/init.lua create mode 100644 mods/biome_lib/locale/de.txt create mode 100644 mods/biome_lib/locale/fr.txt create mode 100644 mods/biome_lib/locale/ru.txt create mode 100644 mods/biome_lib/locale/template.txt create mode 100644 mods/biome_lib/locale/tr.txt create mode 100644 mods/biome_lib/mod.conf create mode 100644 mods/biome_lib/search_functions.lua create mode 100644 mods/moretrees/.luacheckrc create mode 100644 mods/moretrees/LICENSE create mode 100644 mods/moretrees/README.md create mode 100644 mods/moretrees/biome_defs.lua create mode 100644 mods/moretrees/cocos_palm.lua create mode 100644 mods/moretrees/crafts.lua create mode 100644 mods/moretrees/date_palm.lua create mode 100644 mods/moretrees/default_settings.txt create mode 100644 mods/moretrees/init.lua create mode 100644 mods/moretrees/locale/moretrees.de.tr create mode 100644 mods/moretrees/locale/moretrees.es.tr create mode 100644 mods/moretrees/locale/moretrees.fr.tr create mode 100644 mods/moretrees/locale/template.txt create mode 100644 mods/moretrees/mod.conf create mode 100644 mods/moretrees/node_defs.lua create mode 100644 mods/moretrees/saplings.lua create mode 100644 mods/moretrees/screenshot.lua create mode 100644 mods/moretrees/screenshot.png create mode 100644 mods/moretrees/textures/moretrees_acorn.png create mode 100644 mods/moretrees/textures/moretrees_acorn_muffin.png create mode 100644 mods/moretrees/textures/moretrees_acorn_muffin_batter.png create mode 100644 mods/moretrees/textures/moretrees_apple_tree_leaves.png create mode 100644 mods/moretrees/textures/moretrees_apple_tree_sapling.png create mode 100644 mods/moretrees/textures/moretrees_apple_tree_trunk.png create mode 100644 mods/moretrees/textures/moretrees_apple_tree_trunk_top.png create mode 100644 mods/moretrees/textures/moretrees_apple_tree_wood.png create mode 100644 mods/moretrees/textures/moretrees_beech_leaves.png create mode 100644 mods/moretrees/textures/moretrees_beech_sapling.png create mode 100644 mods/moretrees/textures/moretrees_beech_trunk.png create mode 100644 mods/moretrees/textures/moretrees_beech_trunk_top.png create mode 100644 mods/moretrees/textures/moretrees_beech_wood.png create mode 100644 mods/moretrees/textures/moretrees_birch_leaves.png create mode 100644 mods/moretrees/textures/moretrees_birch_sapling.png create mode 100644 mods/moretrees/textures/moretrees_birch_trunk.png create mode 100644 mods/moretrees/textures/moretrees_birch_trunk_top.png create mode 100644 mods/moretrees/textures/moretrees_birch_wood.png create mode 100644 mods/moretrees/textures/moretrees_cedar_cone.png create mode 100644 mods/moretrees/textures/moretrees_cedar_leaves.png create mode 100644 mods/moretrees/textures/moretrees_cedar_nuts.png create mode 100644 mods/moretrees/textures/moretrees_cedar_sapling.png create mode 100644 mods/moretrees/textures/moretrees_cedar_trunk.png create mode 100644 mods/moretrees/textures/moretrees_cedar_trunk_top.png create mode 100644 mods/moretrees/textures/moretrees_cedar_wood.png create mode 100644 mods/moretrees/textures/moretrees_coconut.png create mode 100644 mods/moretrees/textures/moretrees_coconut_0.png create mode 100644 mods/moretrees/textures/moretrees_coconut_1.png create mode 100644 mods/moretrees/textures/moretrees_coconut_2.png create mode 100644 mods/moretrees/textures/moretrees_coconut_milk.png create mode 100644 mods/moretrees/textures/moretrees_coconut_milk_inv.png create mode 100644 mods/moretrees/textures/moretrees_date.png create mode 100644 mods/moretrees/textures/moretrees_date_nut_bar.png create mode 100644 mods/moretrees/textures/moretrees_date_nut_batter.png create mode 100644 mods/moretrees/textures/moretrees_date_nut_cake.png create mode 100644 mods/moretrees/textures/moretrees_date_nut_snack.png create mode 100644 mods/moretrees/textures/moretrees_date_palm_leaves.png create mode 100644 mods/moretrees/textures/moretrees_date_palm_sapling.png create mode 100644 mods/moretrees/textures/moretrees_date_palm_trunk.png create mode 100644 mods/moretrees/textures/moretrees_date_palm_trunk_top.png create mode 100644 mods/moretrees/textures/moretrees_date_palm_wood.png create mode 100644 mods/moretrees/textures/moretrees_dates.png create mode 100644 mods/moretrees/textures/moretrees_dates_f0.png create mode 100644 mods/moretrees/textures/moretrees_dates_f1.png create mode 100644 mods/moretrees/textures/moretrees_dates_f2.png create mode 100644 mods/moretrees/textures/moretrees_dates_f3.png create mode 100644 mods/moretrees/textures/moretrees_dates_f4.png create mode 100644 mods/moretrees/textures/moretrees_dates_fn.png create mode 100644 mods/moretrees/textures/moretrees_dates_m0.png create mode 100644 mods/moretrees/textures/moretrees_dates_n.png create mode 100644 mods/moretrees/textures/moretrees_fir_cone.png create mode 100644 mods/moretrees/textures/moretrees_fir_leaves.png create mode 100644 mods/moretrees/textures/moretrees_fir_leaves_bright.png create mode 100644 mods/moretrees/textures/moretrees_fir_nuts.png create mode 100644 mods/moretrees/textures/moretrees_fir_sapling.png create mode 100644 mods/moretrees/textures/moretrees_fir_trunk.png create mode 100644 mods/moretrees/textures/moretrees_fir_trunk_top.png create mode 100644 mods/moretrees/textures/moretrees_fir_wood.png create mode 100644 mods/moretrees/textures/moretrees_jungletree_leaves_green.png create mode 100644 mods/moretrees/textures/moretrees_jungletree_leaves_red.png create mode 100644 mods/moretrees/textures/moretrees_jungletree_leaves_yellow.png create mode 100644 mods/moretrees/textures/moretrees_oak_leaves.png create mode 100644 mods/moretrees/textures/moretrees_oak_sapling.png create mode 100644 mods/moretrees/textures/moretrees_oak_trunk.png create mode 100644 mods/moretrees/textures/moretrees_oak_trunk_top.png create mode 100644 mods/moretrees/textures/moretrees_oak_wood.png create mode 100644 mods/moretrees/textures/moretrees_palm_leaves.png create mode 100644 mods/moretrees/textures/moretrees_palm_sapling.png create mode 100644 mods/moretrees/textures/moretrees_palm_trunk.png create mode 100644 mods/moretrees/textures/moretrees_palm_trunk_top.png create mode 100644 mods/moretrees/textures/moretrees_palm_wood.png create mode 100644 mods/moretrees/textures/moretrees_poplar_leaves.png create mode 100644 mods/moretrees/textures/moretrees_poplar_sapling.png create mode 100644 mods/moretrees/textures/moretrees_poplar_small_sapling.png create mode 100644 mods/moretrees/textures/moretrees_poplar_trunk-1.png create mode 100644 mods/moretrees/textures/moretrees_poplar_trunk.png create mode 100644 mods/moretrees/textures/moretrees_poplar_trunk_top.png create mode 100644 mods/moretrees/textures/moretrees_poplar_wood.png create mode 100644 mods/moretrees/textures/moretrees_raw_coconut.png create mode 100644 mods/moretrees/textures/moretrees_rubber_tree_leaves.png create mode 100644 mods/moretrees/textures/moretrees_rubber_tree_sapling.png create mode 100644 mods/moretrees/textures/moretrees_rubber_tree_trunk.png create mode 100644 mods/moretrees/textures/moretrees_rubber_tree_trunk_empty.png create mode 100644 mods/moretrees/textures/moretrees_rubber_tree_trunk_top.png create mode 100644 mods/moretrees/textures/moretrees_rubber_tree_wood.png create mode 100644 mods/moretrees/textures/moretrees_sequoia_leaves.png create mode 100644 mods/moretrees/textures/moretrees_sequoia_sapling.png create mode 100644 mods/moretrees/textures/moretrees_sequoia_trunk.png create mode 100644 mods/moretrees/textures/moretrees_sequoia_trunk_top.png create mode 100644 mods/moretrees/textures/moretrees_sequoia_wood.png create mode 100644 mods/moretrees/textures/moretrees_spruce_cone.png create mode 100644 mods/moretrees/textures/moretrees_spruce_leaves.png create mode 100644 mods/moretrees/textures/moretrees_spruce_nuts.png create mode 100644 mods/moretrees/textures/moretrees_spruce_sapling.png create mode 100644 mods/moretrees/textures/moretrees_spruce_trunk.png create mode 100644 mods/moretrees/textures/moretrees_spruce_trunk_top.png create mode 100644 mods/moretrees/textures/moretrees_spruce_wood.png create mode 100644 mods/moretrees/textures/moretrees_willow_leaves.png create mode 100644 mods/moretrees/textures/moretrees_willow_sapling.png create mode 100644 mods/moretrees/textures/moretrees_willow_trunk.png create mode 100644 mods/moretrees/textures/moretrees_willow_trunk_top.png create mode 100644 mods/moretrees/textures/moretrees_willow_wood.png create mode 100644 mods/moretrees/tree_biomes.txt create mode 100644 mods/moretrees/tree_models.lua create mode 100644 mods/trees_lib/LICENSE.txt create mode 100644 mods/trees_lib/README.md create mode 100644 mods/trees_lib/init.lua create mode 100644 mods/vines/.luacheckrc create mode 100644 mods/vines/LICENSE.md create mode 100644 mods/vines/README.md create mode 100644 mods/vines/aliases.lua create mode 100644 mods/vines/bower.json create mode 100644 mods/vines/crafts.lua create mode 100644 mods/vines/depends.txt create mode 100644 mods/vines/description.txt create mode 100644 mods/vines/functions.lua create mode 100644 mods/vines/init.lua create mode 100644 mods/vines/mod.conf create mode 100644 mods/vines/nodes.lua create mode 100644 mods/vines/recipes.lua create mode 100644 mods/vines/screenshot.png create mode 100644 mods/vines/shear.lua create mode 100644 mods/vines/textures/vines_item.png create mode 100644 mods/vines/textures/vines_jungle_end.png create mode 100644 mods/vines/textures/vines_jungle_middle.png create mode 100644 mods/vines/textures/vines_root_end.png create mode 100644 mods/vines/textures/vines_root_middle.png create mode 100644 mods/vines/textures/vines_rope.png create mode 100644 mods/vines/textures/vines_rope_end.png create mode 100644 mods/vines/textures/vines_shears.png create mode 100644 mods/vines/textures/vines_side_end.png create mode 100644 mods/vines/textures/vines_side_middle.png create mode 100644 mods/vines/textures/vines_vine_end.png create mode 100644 mods/vines/textures/vines_vine_middle.png create mode 100644 mods/vines/textures/vines_willow_end.png create mode 100644 mods/vines/textures/vines_willow_middle.png create mode 100644 mods/vines/vines.lua rename reset-map => reset-map-and-players (64%) diff --git a/mods-apply-world.mt-regenerate-from-config-file b/mods-apply-world.mt-regenerate-from-config-file index 5834d035..b39dc5f9 100755 --- a/mods-apply-world.mt-regenerate-from-config-file +++ b/mods-apply-world.mt-regenerate-from-config-file @@ -74,8 +74,14 @@ load_mod_unifieddyes = true load_mod_font_api = true load_mod_display_api = true load_mod_basic_materials = true +load_mod_trees_lib = true +load_mod_biome_lib = true +load_mod_moretrees = true +load_mod_vines = true load_mod_intllib = true " >> /home/minetest/.minetest/worlds/world/world.mt chown minetest:minetest /home/minetest/ -cR + +echo "Start minetestsrv service" systemctl start minetestsrv diff --git a/mods-download b/mods-download index cac33f65..6e037ce7 100755 --- a/mods-download +++ b/mods-download @@ -49,9 +49,13 @@ git clone --depth 1 --branch master https://github.com/minetest-mods/mymasonhamm git clone --depth 1 --branch master https://github.com/minetest-mods/mywoodslopes.git git clone --depth 1 --branch master https://github.com/minetest-mods/display_api.git git clone --depth 1 --branch master https://github.com/minetest-mods/font_api.git -git clone --depth 1 --branch master https://github.com/minetest-mods/intllib.git git clone --depth 1 --branch master https://gitlab.com/VanessaE/unifieddyes.git git clone --depth 1 --branch master https://gitlab.com/VanessaE/basic_materials.git +git clone --depth 1 --branch master https://github.com/minetest-mods/trees_lib.git +git clone --depth 1 --branch master https://gitlab.com/VanessaE/biome_lib.git +git clone --depth 1 --branch master https://gitlab.com/VanessaE/moretrees.git +git clone --depth 1 --branch master https://github.com/minetest-mods/intllib.git +git clone --depth 1 --branch master https://github.com/bas080/vines.git rm */.git -rf rm */.gitignore -f rm */.gitattributes -f diff --git a/mods/biome_lib/API.txt b/mods/biome_lib/API.txt new file mode 100644 index 00000000..0dd15c35 --- /dev/null +++ b/mods/biome_lib/API.txt @@ -0,0 +1,590 @@ +This document describes the Plantlife mod API. + +Last revision: 2015-02-16 + + +========= +Functions +========= + +There are three main functions defined by the main "biome_lib" mod: + +spawn_on_surfaces() +register_generate_plant() +grow_plants() + +There are also several internal, helper functions that can be called if so +desired, but they are not really intended for use by other mods and may change +at any time. They are briefly described below these main functions, but see +init.lua for details. + +Most functions in plants lib are declared locally to avoid namespace +collisions with other mods. They are accessible via the "biome_lib" method, +e.g. biome_lib:spawn_on_surfaces() and so forth. + +===== +spawn_on_surfaces(biome) +spawn_on_surfaces(sdelay, splant, sradius, schance, ssurface, savoid) + +This first function is an ABM-based spawner function originally created as +part of Ironzorg's flowers mod. It has since been largely extended and +expanded. There are two ways to call this function: You can either pass it +several individual string and number parameters to use the legacy interface, +or you can pass a single biome definition as a table, with all of your options +spelled out nicely. This is the preferred method. + +When used with the legacy interface, you must specify the parameters exactly +in order, with the first five being mandatory (even if some are set to nil), +and the last one being optional: + +sdelay: The value passed to the ABM's interval parameter, in seconds. +splant: The node name of the item to spawn (e.g. + "flowers:flower_rose"). A plant will of course only be + spawned if the node about to be replaced is air. +sradius: Don't spawn within this many nodes of the avoid items + mentioned below. If set to nil, this check is skipped. +schance: The value passed to the ABM's chance parameter, normally in + the 10-100 range (1-in-X chance of operating on a given node) +ssurface: String with the name of the node on which to spawn the plant + in question, such as "default:sand" or + "default:dirt_with_grass". It is not recommended to put air, + stone, or plain dirt here if you can use some other node, as + doing so will cause the engine to process potentially large + numbers of such nodes when deciding when to execute the ABM + and where it should operate. +savoid: Table with a list of groups and/or node names to avoid when + spawning the plant, such as {"group:flowers", "default:tree"}. + +When passed a table as the argument, and thus using the modern calling method, +you must pass a number of arguments in the form of an ordinary keyed-value +table. Below is a list of everything supported by this function: + +biome = { + spawn_plants = something, -- [*] String or table; see below. + spawn_delay = number, -- same as sdelay, above. + spawn_chance = number, -- same as schance, above. + spawn_surfaces = {table}, -- List of node names on which the plants + -- should be spawned. As with the single-node "ssurface" + -- option in the legacy API, you should not put stone, air, + -- etc. here. + + ---- From here down are a number of optional parameters. You will + ---- most likely want to use at least some of these to limit how and + ---- where your objects are spawned. + + label = string, -- set this to identify the ABM for Minetest's profiler + avoid_nodes = {table}, -- same meaning as savoid, above + avoid_radius = num, -- same as sradius + seed_diff = num, -- The Perlin seed difference value passed to the + -- minetest.get_perlin() function. Used along with + -- the global Perlin controls below to create the + -- "biome" in which the plants will spawn. Defaults + -- to 0 if not provided. + light_min = num, -- Minimum amount of light necessary to make a plant + -- spawn. Defaults to 0. + light_max = num, -- Maximum amount of light needed to spawn. Defaults + -- to the engine's MAX_LIGHT value of 14. + neighbors = {table}, -- List of neighboring nodes that need to be + -- immediately next to the node the plant is about to + -- spawn on. Can also be a string with a single node + -- name. It is both passed to the ABM as the + -- "neighbors" parameter, and is used to manually + -- check the adjacent nodes. It only takes one of + -- these for the spawn routine to mark the target as + -- spawnable. Defaults to nil (ignored). + ncount = num, -- There must be at least this many of the above + -- neighbors in the eight spaces immediately + -- surrounding the node the plant is about to spawn on + -- for it to happen. If not provided, this check is + -- disabled. + facedir = num, -- The value passed to the param2 variable when adding + -- the node to the map. Defaults to 0. Be sure that + -- the value you use here (and the range thereof) is + -- appropriate for the type of node you're spawning. + random_facedir = {table}, -- If set, the table should contain two values. + -- If they're both provided, the spawned plant will be + -- given a random facedir value in the range specified + -- by these two numbers. Overrides the facedir + -- parameter above, if it exists. Use {0,3} if you + -- want the full range for wallmounted nodes, or {2,5} + -- for most everything else, or any other pair of + -- numbers appropriate for the node you want to spawn. + depth_max = num, -- If the object spawns on top of a water source, the + -- water must be at most this deep. Defaults to 1. + min_elevation = num, -- Surface must be at this altitude or higher to + -- spawn at all. Defaults to -31000... + max_elevation = num, -- ...but must be no higher than this altitude. + -- Defaults to +31000. + near_nodes = {table}, -- List of nodes that must be somewhere in the + -- vicinity in order for the plant to spawn. Can also + -- be a string with a single node name. If not + -- provided, this check is disabled. + near_nodes_size = num, -- How large of an area to check for the above + -- node. Specifically, this checks a flat, horizontal + -- area centered on the node to be spawned on. + -- Defaults to 0, but is ignored if the above + -- near_nodes value is not set. + near_nodes_vertical = num, -- Used with the size value above, this extends + -- the vertical range of the near nodes search. + -- Basically, this turns the flat region described + -- above into a cuboid region. The area to be checked + -- will extend this high and this low above/below the + -- target node, centered thereon. Defaults to 1 (only + -- check the layer above, the layer at, and the layer + -- below the target node), but is ignored if + -- near_nodes is not set. + near_nodes_count = num, -- How many of the above nodes must be within that + -- radius. Defaults to 1 but is ignored if near_nodes + -- isn't set. Bear in mind that the total area to be + -- checked is equal to: + -- (near_nodes_size^2)*near_nodes_vertical*2 + -- For example, if size is 10 and vertical is 4, then + -- the area is (10^2)*8 = 800 nodes in size, so you'll + -- want to make sure you specify a value appropriate + -- for the size of the area being tested. + air_size = num, -- How large of an area to check for air above and + -- around the target. If omitted, only the space + -- above the target is checked. This does not check + -- for air at the sides or below the target. + air_count = num, -- How many of the surrounding nodes need to be air + -- for the above check to return true. If omitted, + -- only the space above the target is checked. + plantlife_limit = num, -- The value compared against the generic "plants + -- can grow here" Perlin noise layer. Smaller numbers + -- result in more abundant plants. Range of -1 to +1, + -- with values in the range of about 0 to 0.5 being + -- most useful. Defaults to 0.1. + temp_min = num, -- Minimum temperature needed for the desired object + -- to spawn. This is a 2d Perlin value, which has an + -- inverted range of +1 to -1. Larger values + -- represent *colder* temperatures, so this value is + -- actually the upper end of the desired Perlin range. + -- See the temperature map section at the bottom of + -- this document for details on how these values work. + -- Defaults to +1 (unlimited coldness). + temp_max = num, -- Maximum temperature/lower end of the Perlin range. + -- Defaults to -1 (unlimited heat). + humidity_min = num, -- Minimum humidity for the plant to spawn in. Like + -- the temperature map, this is a Perlin value where + -- lower numbers mean more humidity in the area. + -- Defaults to +1 (0% humidity). + humidity_max = num, -- Maximum humidity for the plant to spawn at. + -- Defaults to -1 (100% humidity). + verticals_list = {table}, -- List of nodes that should be considered to be + -- natural walls. + alt_wallnode = "string", -- If specified, this node will be substituted in + -- place of the plant(s) defined by spawn_plants + -- above, if the spawn target has one or more adjacent + -- walls. In such a case, the two above facedir + -- parameters will be ignored. + spawn_on_side = bool, -- Set this to true to immediately spawn the node on + -- one side of the target node rather than the top. + -- The code will search for an airspace to the side of + -- the target, then spawn the plant at the first one + -- found. The above facedir and random_facedir + -- parameters are ignored in this case. If the above + -- parameters for selecting generic wall nodes are + -- provided, this option is ignored. Important note: + -- the facedir values assigned by this option only + -- make sense with wallmounted nodes (nodes which + -- don't use facedir won't be affected). + choose_random_wall = bool, -- if set to true, and searching for walls is + -- being done, just pick any random wall if there is + -- one, rather than returning the first one. + spawn_on_bottom = bool, -- If set to true, spawn the object below the + -- target node instead of above it. The above + -- spawn_on_side variable takes precedence over this + -- one if both happen to be true. When using this + -- option with the random facedir function above, the + -- values given to the facedir parameter are for + -- regular nodes, not wallmounted. + spawn_replace_node = bool, -- If set to true, the target node itself is + -- replaced by the spawned object. Overrides the + -- spawn_on_bottom and spawn_on_side settings. +} + +[*] spawn_plants must be either a table or a string. If it's a table, the +values therein are treated as a list of nodenames to pick from randomly on +each application of the ABM code. The more nodes you can pack into this +parameter to avoid making too many calls to this function, the lower the CPU +load will likely be. + +You can also specify a string containing the name of a function to execute. +In this case, the function will be passed a single position parameter +indicating where the function should place the desired object, and the checks +for spawning on top vs. sides vs. bottom vs. replacing the target node will be +skipped. + +By default, if a biome node, size, and count are not defined, the biome +checking is disabled. Same holds true for the nneighbors bit above that. + + +===== +biome_lib:register_generate_plant(biome, nodes_or_function_or_treedef) + +To register an object to be spawned at mapgen time rather than via an ABM, +call this function with two parameters: a table with your object's biome +information, and a string, function, or table describing what to do if the +engine finds a suitable surface node (see below). + +The biome table contains quite a number of options, though there are fewer +here than are available in the ABM-based spawner, as some stuff doesn't make +sense at map-generation time. + +biome = { + surface = something, -- What node(s). May be a string such as + -- "default:dirt_with_grass" or a table with + -- multiple such entries. + + ---- Everything else is optional, but you'll definitely want to use + ---- some of these other fields to limit where and under what + ---- conditions the objects are spawned. + + below_nodes = {table}, -- List of nodes that must be below the target + -- node. Useful in snow biomes to keep objects from + -- spawning in snow that's on the wrong surface for + -- that object. + avoid_nodes = {table}, -- List of nodes to avoid when spawning. Groups are + -- not supported here. + avoid_radius = num, -- How much distance to leave between the object to be + -- added and the objects to be avoided. If this or + -- the avoid_nodes value is nil/omitted, this check is + -- skipped. Avoid using excessively large radii. + rarity = num, -- How rare should this object be in its biome? Larger + -- values make objects more rare, via: + -- math.random(1,100) > this + max_count = num, -- The absolute maximum number of your object that + -- should be allowed to spawn in a 5x5x5 mapblock area + -- (80x80x80 nodes). Defaults to 5, but be sure you + -- set this to some reasonable value depending on your + -- object and its size if 5 is insufficient. + seed_diff = num, -- Perlin seed-diff value. Defaults to 0, which + -- causes the function to inherit the global value of + -- 329. + neighbors = {table}, -- What ground nodes must be right next to and at the + -- same elevation as the node to be spawned on. + ncount = num, -- At least this many of the above nodes must be next + -- to the node to spawn on. Any value greater than 8 + -- will probably cause the code to never spawn + -- anything. Defaults to 0. + depth = num, -- How deep/thick of a layer the spawned-on node must + -- be. Typically used for water. + min_elevation = num, -- Minimum elevation in meters/nodes. Defaults to + -- -31000 (unlimited). + max_elevation = num, -- Max elevation. Defaults to +31000 (unlimited). + near_nodes = {table}, -- what nodes must be in the general vicinity of the + -- object being spawned. + near_nodes_size = num, -- how wide of a search area to look for the nodes + -- in that list. + near_nodes_vertical = num, -- How high/low of an area to search from the + -- target node. + near_nodes_count = num, -- at least this many of those nodes must be in + -- the area. + plantlife_limit = num, -- The value compared against the generic "plants + -- can grow here" Perlin noise layer. Smaller numbers + -- result in more abundant plants. Range of -1 to +1, + -- with values in the range of about 0 to 0.5 being + -- most useful. Defaults to 0.1. + temp_min = num, -- Coldest allowable temperature for a plant to spawn + -- (that is, the largest Perlin value). + temp_max = num, -- warmest allowable temperature to spawn a plant + -- (lowest Perlin value). + verticals_list = {table}, -- Same as with the spawn_on_surfaces function. + check_air = bool, -- Flag to tell the mapgen code to check for air above + -- the spawn target. Defaults to true if not + -- explicitly set to false. Set this to false VERY + -- SPARINGLY, as it will slow the map generator down. + delete_above = bool, -- Flag to tell the mapgen code to delete the two + -- nodes directly above the spawn target just before + -- adding the plant or tree. Useful when generating + -- in snow biomes. Defaults to false. + delete_above_surround = bool, -- Flag to tell the mapgen code to also + -- delete the five nodes surrounding the above space, + -- and the five nodes above those, resulting in a two- + -- node-deep cross-shaped empty region above/around + -- the spawn target. Useful when adding trees to snow + -- biomes. Defaults to false. + spawn_replace_node = bool, -- same as with the ABM spawner. + random_facedir = {table}, -- same as with the ABM spawner. +} + +Regarding nodes_or_function_or_treedef, this must either be a string naming +a node to spawn, a table with a list of nodes to choose from, a table with an +L-Systems tree definition, or a function. + +If you specified a string, the code will attempt to determine whether that +string specifies a valid node name. If it does, that node will be placed on +top of the target position directly (unless one of the other mapgen options +directs the code to do otherwise). + +If you specified a table and there is no "axiom" field, the code assumes that +it is a list of nodes. Simply name one node per entry in the list, e.g. +{"default:junglegrass", "default:dry_shrub"} and so on, for as many nodes as +you want to list. A random node from the list will be chosen each time the +code goes to place a node. + +If you specified a table, and there *is* an "axiom" field, the code assumes +that this table contains an L-Systems tree definition, which will be passed +directly to the engine's spawn_tree() function along with the position on +which to spawn the tree. + +You can also supply a function to be directly executed, which is given the +current node position (the usual "pos" table format) as its sole argument. It +will be called in the form: + + somefunction(pos) + + +===== +biome_lib:grow_plants(options) + +The third function, grow_plants() is used to turn the spawned nodes above +into something else over time. This function has no return value, and accepts +a biome definition table as the only parameter. These are defined like so: + +options = { + label = string, -- set this to identify the ABM for Minetest's + -- profiler. If not set, biome_lib will set it to + -- "biome_lib grow_plants(): " appended with the node + -- in grow_plant (or the first item if it's a table) + grow_plant = "string" or {table}, -- Name(s) of the node(s) to be grown + -- into something else. This value is passed to the + -- ABM as the "nodenames" parameter, so the plants + -- themselves are the ABM trigger, rather than + -- the ground they spawned on. A plant will only grow + -- if the node above it is air. If you use a table, + -- note that all nodes referenced therein will be + -- grown into the same final object. + grow_delay = num, -- Passed as the ABM "interval" parameter, as with + -- spawning. + grow_chance = num, -- Passed as the ABM "chance" parameter. + grow_result = "string", -- Name of the node into which the grow_plant + -- node(s) should transform when the ABM executes. + + ---- Everything from here down is optional. + + dry_early_node = "string", -- This value is ignored except for jungle + -- grass (a corner case needed by that mod), where it + -- indicates which node the grass must be on in order + -- for it to turn from the short size to + -- "default:dry_shrub" instead of the medium size. + grow_nodes = {table}, -- One of these nodes must be under the plant in + -- order for it to grow at all. Normally this should + -- be the same as the list of surfaces passed to the + -- spawning ABM as the "nodenames" parameter. This is + -- so that the plant can be manually placed on + -- something like a flower pot or something without it + -- necessarily growing and perhaps dieing. Defaults + -- to "default:dirt_with_grass". + facedir = num, -- Same as with spawning a plant. + need_wall = bool, -- Set this to true if you the plant needs to grow + -- against a wall. Defaults to false. + verticals_list = {table}, -- same as with spawning a plant. + choose_random_wall = bool, -- same as with spawning a plant. + grow_vertically = bool, -- Set this to true if the plant needs to grow + -- vertically, as in climbing poison ivy. Defaults to + -- false. + height_limit = num, -- Set this to limit how tall the desired node can + -- grow. The mod will search straight down from the + -- position being spawned at to find a ground node, + -- set via the field below. Defaults to 5 nodes. + ground_nodes = {table}, -- What nodes should be treated as "the ground" + -- below a vertically-growing plant. Usually this + -- should be the same as the grow_nodes table, but + -- might also include, for example, water or some + -- other surrounding material. Defaults to + -- "default:dirt_with_grass". + grow_function = something, -- [*] see below. + seed_diff = num, -- [*] see below. +} + +[*] grow_function can take one of three possible settings: it can be nil (or + not provided), a string, or a table. + +If it is not provided or it's set to nil, all of the regular growing code is +executed normally, the value of seed_diff, if any, is ignored, and the node to +be placed is assumed to be specified in the grow_result variable. + +If this value is set to a simple string, this is treated as the name of the +function to use to grow the plant. In this case, all of the usual growing +code is executeed, but then instead of a plant being simply added to the +world, grow_result is ignored and the named function is executed and passed a +few parmeters in the following general form: + + somefunction(pos, perlin1, perlin2) + +These values represent the current position (the usual table), the Perlin +noise value for that spot in the generic "plants can grow here" map for the +seed_diff value above, the Perlin value for that same spot from the +temperature map, and the detected neighboring wall face, if there was one (or +nil if not). If seed_diff is not provided, it defaults to 0. + +If this variable is instead set to a table, it is treated an an L-Systems tree +definition. All of the growing code is executed in the usual manner, then the +tree described by that definition is spawned at the current position instead, +and grow_result is ignored. + + +===== +find_adjacent_wall(pos, verticals, randomflag) + +Of the few helper functions, this one expects a position parameter and a table +with the list of nodes that should be considered as walls. The code will +search around the given position for a neighboring wall, returning the first +one it finds as a facedir value, or nil if there are no adjacent walls. + +If randomflag is set to true, the function will just return the facedir of any +random wall it finds adjacent to the target position. Defaults to false if +not specified. + +===== +is_node_loaded(pos) + +This acts as a wrapper for the minetest.get_node_or_nil(node_pos) +function and accepts a single position parameter. Returns true if the node in +question is already loaded, or false if not. + + +===== +dbg(string) + +This is a simple debug output function which takes one string parameter. It +just checks if DEBUG is true and outputs the phrase "[Plantlife] " followed by +the supplied string, via the print() function, if so. + +===== +biome_lib:generate_tree(pos, treemodel) +biome_lib:grow_tree(pos, treemodel) + +In the case of the growing code and the mapgen-based tree generator code, +generating a tree is done via the above two calls, which in turn immediately +call the usual spawn_tree() functions. This rerouting exists as a way for +other mods to hook into biome_lib's tree-growing functions in general, +perhaps to execute something extra whenever a tree is spawned. + +biome_lib:generate_tree(pos, treemodel) is called any time a tree is spawned +at map generation time. 'pos' is the position of the block on which the tree +is to be placed. 'treemodel' is the standard L-Systems tree definition table +expected by the spawn_tree() function. Refer to the 'trunk' field in that +table to derive the name of the tree being spawned. + +biome_lib:grow_tree(pos, treemodel) does the same sort of thing whenever a +tree is spawned within the abm-based growing code, for example when growing a +sapling into a tree. + + +===== +There are other, internal helper functions that are not meant for use by other +mods. Don't rely on them, as they are subject to change without notice. + + +=============== +Global Settings +=============== + +Set this to true if you want the mod to spam your console with debug info :-) + + plantlife_debug = false + +To slow down the playback of the queue (e.g. for really slow machines where +the 0.2 second max limiter isn't enough), set: + + biome_lib_queue_run_ratio = + +Default is 100 (basically percent of maximum runtime) + +====================== +Fertile Ground Mapping +====================== + +The mod uses Perlin noise to create "biomes" of the various plants, via the +minetest.get_perlin() function. At present, there are three layers of +Perlin noise used. + +The first one is for a "fertile ground" layer, which I tend to refer to as the +generic "stuff can potentially grow here" layer. Its values are hard-coded: + + biome_lib.plantlife_seed_diff = 329 + perlin_octaves = 3 + perlin_persistence = 0.6 + perlin_scale = 100 + +For more information on how Perlin noise is generated, you will need to search +the web, as these default values were from that which is used by minetest_game +to spawn jungle grass at mapgen time, and I'm still learning how Perlin noise +works. ;-) + + +=================== +Temperature Mapping +=================== + +The second Perlin layer is a temperature map, with values taken from +SPlizard's Snow Biomes mod so that the two will be compatible, since that mod +appears to be the standard now. Those values are: + + temperature_seeddiff = 112 + temperature_octaves = 3 + temperature_persistence = 0.5 + temperature_scale = 150 + +The way Perlin values are used by this mod, in keeping with the snow mod's +apparent methods, larger values returned by the Perlin function represent +*colder* temperatures. In this mod, the following table gives a rough +approximation of how temperature maps to these values, normalized to +0.53 = 0 °C and +1.0 = -25 °C. + +Perlin Approx. Temperature +-1.0 81 °C ( 178 °F) +-0.75 68 °C ( 155 °F) +-0.56 58 °C ( 136 °F) +-0.5 55 °C ( 131 °F) +-0.25 41 °C ( 107 °F) +-0.18 38 °C ( 100 °F) + 0 28 °C ( 83 °F) + 0.13 21 °C ( 70 °F) + 0.25 15 °C ( 59 °F) + 0.5 2 °C ( 35 °F) + 0.53 0 °C ( 32 °F) + 0.75 -12 °C ( 11 °F) + 0.86 -18 °C ( 0 °F) + 1.0 -25 °C (- 13 °F) + +Included in this table are even 0.25 steps in Perlin values along with some +common temperatures on both the Centigrade and Fahrenheit scales. Note that +unless you're trying to model the Moon or perhaps Mercury in your mods/maps, +you probably won't need to bother with Perlin values of less than -0.56 or so. + + +================ +Humidity Mapping +================ + +Last but not least is a moisture/humidity map. Like the temperature map +above, Perlin values can be tested to determine the approximate humidity of +the *air* in the area. This humidity map is basically the perlin layer used +for deserts. + +A value of +1.0 is very moist (basically a thick fog, if it could be seen), a +value of roughly +0.25 represents the edge of a desert as usually seen in the +game, and a value of -1.0 is as dry as a bone. + +This does not check for nearby water, just general air humidity, and that +being the case, nearby ground does not affect the reported humidity of a +region (because this isn't yet possible to calculate yet). Use the near_nodes +and avoid_nodes parameters and their related options to check for water and +such. + +The Perlin values use for this layer are: + + humidity_seeddiff = 9130 + humidity_octaves = 3 + humidity_persistence = 0.5 + humidity_scale = 250 + +And this particular one is mapped slightly differently from the others: + + noise3 = perlin3:get2d({x=p_top.x+150, y=p_top.z+50}) + +(Note the +150 and +50 offsets) + diff --git a/mods/biome_lib/LICENSE b/mods/biome_lib/LICENSE new file mode 100644 index 00000000..c5885ae9 --- /dev/null +++ b/mods/biome_lib/LICENSE @@ -0,0 +1,600 @@ +License for code: LGPL 3.0 +License for media and all other assets: CC-by-SA 4.0 + +############################################################################### + + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. + +############################################################################### + +Attribution-ShareAlike 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution-ShareAlike 4.0 International Public +License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution-ShareAlike 4.0 International Public License ("Public +License"). To the extent this Public License may be interpreted as a +contract, You are granted the Licensed Rights in consideration of Your +acceptance of these terms and conditions, and the Licensor grants You +such rights in consideration of benefits the Licensor receives from +making the Licensed Material available under these terms and +conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. BY-SA Compatible License means a license listed at + creativecommons.org/compatiblelicenses, approved by Creative + Commons as essentially the equivalent of this Public License. + + d. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + e. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + f. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + g. License Elements means the license attributes listed in the name + of a Creative Commons Public License. The License Elements of this + Public License are Attribution and ShareAlike. + + h. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + i. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + j. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + k. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + l. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + m. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. Additional offer from the Licensor -- Adapted Material. + Every recipient of Adapted Material from You + automatically receives an offer from the Licensor to + exercise the Licensed Rights in the Adapted Material + under the conditions of the Adapter's License You apply. + + c. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + b. ShareAlike. + + In addition to the conditions in Section 3(a), if You Share + Adapted Material You produce, the following conditions also apply. + + 1. The Adapter's License You apply must be a Creative Commons + license with the same License Elements, this version or + later, or a BY-SA Compatible License. + + 2. You must include the text of, or the URI or hyperlink to, the + Adapter's License You apply. You may satisfy this condition + in any reasonable manner based on the medium, means, and + context in which You Share Adapted Material. + + 3. You may not offer or impose any additional or different terms + or conditions on, or apply any Effective Technological + Measures to, Adapted Material that restrict exercise of the + rights granted under the Adapter's License You apply. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material, + + including for purposes of Section 3(b); and + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the “Licensor.” The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. diff --git a/mods/biome_lib/README.md b/mods/biome_lib/README.md new file mode 100644 index 00000000..ac39750f --- /dev/null +++ b/mods/biome_lib/README.md @@ -0,0 +1,28 @@ +# Biome Lib + +This library's purpose is to allow other mods to add growing things to the map in a straightforward, simple manner. It contains all the core functions needed by mods and modpacks such as More Trees, Tiny Trees, Plantlife, and others. + +Spawning of plants is optionally sensitive to the amount of available light, elevation, nearness to other nodes, plant-to-plant density, water depth, and a whole host of controls. + +All objects spawned or generated using this mod use Perlin noise to stay within simple biomes, rather than just letting everything just spread around the map randomly. + +This library also features a basic temperature map, which should blend in nicely with SPlizard's Snow Biomes mod (the same Perlin settings are used, with the assumption that the edge of a snow biome is 0° Centigrade). + +Both mapgen-based spawning and ABM-based spawning is supported. Growing code is strictly ABM-based. L-system trees can be spawned at mapgen time via the engine's spawn_tree() function and are quite fast. + +It is primarily intended for mapgen v6, but it should work fine when used with mapgen v7. + +**Dependencies**: default from minetest_game + +**Recommends**: [Plantlife Modpack](https://github.com/minetest-mods/plantlife_modpack), +[More Trees](https://github.com/minetest-mods/moretrees) + +**API**: This mod supplies a small number of very powerful functions. They are, briefly: + +* biome_lib:register_generate_plant() +* biome_lib:spawn_on_surfaces() +* biome_lib:grow_plants() +* biome_lib:find_valid_wall() +* biome_lib:is_node_loaded() + +For a complete description of these functions as well as several of the internal variables within the mod, [read the API.txt document](https://raw.githubusercontent.com/minetest-mods/biome_lib/master/API.txt) included in this package. diff --git a/mods/biome_lib/depends.txt b/mods/biome_lib/depends.txt new file mode 100644 index 00000000..c48fe0d0 --- /dev/null +++ b/mods/biome_lib/depends.txt @@ -0,0 +1,3 @@ +default +intllib? + diff --git a/mods/biome_lib/description.txt b/mods/biome_lib/description.txt new file mode 100644 index 00000000..0412661b --- /dev/null +++ b/mods/biome_lib/description.txt @@ -0,0 +1 @@ +The biome spawning and management library for Plantlife, Moretrees, Tiny Trees, and other mods that originally depended on plants_lib from the plantlife modpack. diff --git a/mods/biome_lib/growth.lua b/mods/biome_lib/growth.lua new file mode 100644 index 00000000..807b69c5 --- /dev/null +++ b/mods/biome_lib/growth.lua @@ -0,0 +1,90 @@ +local time_scale = ... + +-- The growing ABM + +function biome_lib.check_surface(name, nodes) + if not nodes then return true end + if type(nodes) == "string" then return nodes == name end + if nodes.set and nodes[name] then + return true + else + for _, n in ipairs(nodes) do + if name == n then return true end + end + end + return false +end + +function biome_lib:grow_plants(opts) + + local options = opts + + options.height_limit = options.height_limit or 5 + options.ground_nodes = options.ground_nodes or { "default:dirt_with_grass" } + options.grow_nodes = options.grow_nodes or { "default:dirt_with_grass" } + options.seed_diff = options.seed_diff or 0 + + local n + + if type(options.grow_plant) == "table" then + n = "multi: "..options.grow_plant[1]..", ..." + else + n = options.grow_plant + end + + options.label = options.label or "biome_lib grow_plants(): "..n + + if options.grow_delay*time_scale >= 1 then + options.interval = options.grow_delay*time_scale + else + options.interval = 1 + end + + minetest.register_abm({ + nodenames = { options.grow_plant }, + interval = options.interval, + chance = options.grow_chance, + label = options.label, + action = function(pos, node, active_object_count, active_object_count_wider) + local p_top = {x=pos.x, y=pos.y+1, z=pos.z} + local p_bot = {x=pos.x, y=pos.y-1, z=pos.z} + local n_top = minetest.get_node(p_top) + local n_bot = minetest.get_node(p_bot) + local root_node = minetest.get_node({x=pos.x, y=pos.y-options.height_limit, z=pos.z}) + local walldir = nil + if options.need_wall and options.verticals_list then + walldir = biome_lib:find_adjacent_wall(p_top, options.verticals_list, options.choose_random_wall) + end + if (n_top.name == "air" or n_top.name == "default:snow") + and (not options.need_wall or (options.need_wall and walldir)) then + if options.grow_vertically and walldir then + if biome_lib:search_downward(pos, options.height_limit, options.ground_nodes) then + minetest.swap_node(p_top, { name = options.grow_plant, param2 = walldir}) + end + + elseif biome_lib.check_surface(n_bot.name, options.grow_nodes) then + if not options.grow_result and not options.grow_function then + minetest.swap_node(pos, biome_lib.air) + + else + biome_lib:replace_object(pos, options.grow_result, options.grow_function, options.facedir, options.seed_diff) + end + end + end + end + }) +end + + +-- spawn_tree() on generate is routed through here so that other mods can hook +-- into it. + +function biome_lib:generate_tree(pos, nodes_or_function_or_model) + minetest.spawn_tree(pos, nodes_or_function_or_model) +end + +-- and this one's for the call used in the growing code + +function biome_lib:grow_tree(pos, nodes_or_function_or_model) + minetest.spawn_tree(pos, nodes_or_function_or_model) +end diff --git a/mods/biome_lib/init.lua b/mods/biome_lib/init.lua new file mode 100644 index 00000000..b8635b9d --- /dev/null +++ b/mods/biome_lib/init.lua @@ -0,0 +1,736 @@ +-- Biome library mod by Vanessa Ezekowitz +-- +-- I got the temperature map idea from "hmmmm", values used for it came from +-- Splizard's snow mod. +-- + +-- Various settings - most of these probably won't need to be changed + +biome_lib = {} +biome_lib.air = {name = "air"} + +plantslib = setmetatable({}, { __index=function(t,k) print("Use of deprecated function:", k) return biome_lib[k] end }) + +biome_lib.blocklist_aircheck = {} +biome_lib.blocklist_no_aircheck = {} + +biome_lib.surface_nodes_aircheck = {} +biome_lib.surface_nodes_no_aircheck = {} + +biome_lib.surfaceslist_aircheck = {} +biome_lib.surfaceslist_no_aircheck = {} + +biome_lib.actioncount_aircheck = {} +biome_lib.actioncount_no_aircheck = {} + +biome_lib.actionslist_aircheck = {} +biome_lib.actionslist_no_aircheck = {} + +biome_lib.modpath = minetest.get_modpath("biome_lib") + +biome_lib.total_no_aircheck_calls = 0 + +biome_lib.queue_run_ratio = tonumber(minetest.settings:get("biome_lib_queue_run_ratio")) or 100 + +-- Boilerplate to support localized strings if intllib mod is installed. +local S +if minetest.global_exists("intllib") then + if intllib.make_gettext_pair then + S = intllib.make_gettext_pair() + else + S = intllib.Getter() + end +else + S = function(s) return s end +end +biome_lib.intllib = S + +local DEBUG = false --... except if you want to spam the console with debugging info :-) + +function biome_lib:dbg(msg) + if DEBUG then + print("[Plantlife] "..msg) + minetest.log("verbose", "[Plantlife] "..msg) + end +end + +biome_lib.plantlife_seed_diff = 329 -- needs to be global so other mods can see it + +local perlin_octaves = 3 +local perlin_persistence = 0.6 +local perlin_scale = 100 + +local temperature_seeddiff = 112 +local temperature_octaves = 3 +local temperature_persistence = 0.5 +local temperature_scale = 150 + +local humidity_seeddiff = 9130 +local humidity_octaves = 3 +local humidity_persistence = 0.5 +local humidity_scale = 250 + +local time_scale = 1 +local time_speed = tonumber(minetest.settings:get("time_speed")) + +if time_speed and time_speed > 0 then + time_scale = 72 / time_speed +end + +--PerlinNoise(seed, octaves, persistence, scale) + +biome_lib.perlin_temperature = PerlinNoise(temperature_seeddiff, temperature_octaves, temperature_persistence, temperature_scale) +biome_lib.perlin_humidity = PerlinNoise(humidity_seeddiff, humidity_octaves, humidity_persistence, humidity_scale) + +-- Local functions + +local function get_biome_data(pos, perlin_fertile) + local fertility = perlin_fertile:get_2d({x=pos.x, y=pos.z}) + + if type(minetest.get_biome_data) == "function" then + local data = minetest.get_biome_data(pos) + if data then + return fertility, data.heat / 100, data.humidity / 100 + end + end + + local temperature = biome_lib.perlin_temperature:get2d({x=pos.x, y=pos.z}) + local humidity = biome_lib.perlin_humidity:get2d({x=pos.x+150, y=pos.z+50}) + + return fertility, temperature, humidity +end + +function biome_lib:is_node_loaded(node_pos) + local n = minetest.get_node_or_nil(node_pos) + if (not n) or (n.name == "ignore") then + return false + end + return true +end + +function biome_lib:set_defaults(biome) + biome.seed_diff = biome.seed_diff or 0 + biome.min_elevation = biome.min_elevation or -31000 + biome.max_elevation = biome.max_elevation or 31000 + biome.temp_min = biome.temp_min or 1 + biome.temp_max = biome.temp_max or -1 + biome.humidity_min = biome.humidity_min or 1 + biome.humidity_max = biome.humidity_max or -1 + biome.plantlife_limit = biome.plantlife_limit or 0.1 + biome.near_nodes_vertical = biome.near_nodes_vertical or 1 + +-- specific to on-generate + + biome.neighbors = biome.neighbors or biome.surface + biome.near_nodes_size = biome.near_nodes_size or 0 + biome.near_nodes_count = biome.near_nodes_count or 1 + biome.rarity = biome.rarity or 50 + biome.max_count = biome.max_count or 5 + if biome.check_air ~= false then biome.check_air = true end + +-- specific to abm spawner + biome.seed_diff = biome.seed_diff or 0 + biome.light_min = biome.light_min or 0 + biome.light_max = biome.light_max or 15 + biome.depth_max = biome.depth_max or 1 + biome.facedir = biome.facedir or 0 +end + +local function search_table(t, s) + for i = 1, #t do + if t[i] == s then return true end + end + return false +end + +-- register the list of surfaces to spawn stuff on, filtering out all duplicates. +-- separate the items by air-checking or non-air-checking map eval methods + +function biome_lib:register_generate_plant(biomedef, nodes_or_function_or_model) + + -- if calling code passes an undefined node for a surface or + -- as a node to be spawned, don't register an action for it. + + if type(nodes_or_function_or_model) == "string" + and string.find(nodes_or_function_or_model, ":") + and not minetest.registered_nodes[nodes_or_function_or_model] then + biome_lib:dbg("Warning: Ignored registration for undefined spawn node: "..dump(nodes_or_function_or_model)) + return + end + + if type(nodes_or_function_or_model) == "string" + and not string.find(nodes_or_function_or_model, ":") then + biome_lib:dbg("Warning: Registered function call using deprecated string method: "..dump(nodes_or_function_or_model)) + end + + if biomedef.check_air == false then + biome_lib:dbg("Register no-air-check mapgen hook: "..dump(nodes_or_function_or_model)) + biome_lib.actionslist_no_aircheck[#biome_lib.actionslist_no_aircheck + 1] = { biomedef, nodes_or_function_or_model } + local s = biomedef.surface + if type(s) == "string" then + if s and (string.find(s, "^group:") or minetest.registered_nodes[s]) then + if not search_table(biome_lib.surfaceslist_no_aircheck, s) then + biome_lib.surfaceslist_no_aircheck[#biome_lib.surfaceslist_no_aircheck + 1] = s + end + else + biome_lib:dbg("Warning: Ignored no-air-check registration for undefined surface node: "..dump(s)) + end + else + for i = 1, #biomedef.surface do + local s = biomedef.surface[i] + if s and (string.find(s, "^group:") or minetest.registered_nodes[s]) then + if not search_table(biome_lib.surfaceslist_no_aircheck, s) then + biome_lib.surfaceslist_no_aircheck[#biome_lib.surfaceslist_no_aircheck + 1] = s + end + else + biome_lib:dbg("Warning: Ignored no-air-check registration for undefined surface node: "..dump(s)) + end + end + end + else + biome_lib:dbg("Register with-air-checking mapgen hook: "..dump(nodes_or_function_or_model)) + biome_lib.actionslist_aircheck[#biome_lib.actionslist_aircheck + 1] = { biomedef, nodes_or_function_or_model } + local s = biomedef.surface + if type(s) == "string" then + if s and (string.find(s, "^group:") or minetest.registered_nodes[s]) then + if not search_table(biome_lib.surfaceslist_aircheck, s) then + biome_lib.surfaceslist_aircheck[#biome_lib.surfaceslist_aircheck + 1] = s + end + else + biome_lib:dbg("Warning: Ignored with-air-checking registration for undefined surface node: "..dump(s)) + end + else + for i = 1, #biomedef.surface do + local s = biomedef.surface[i] + if s and (string.find(s, "^group:") or minetest.registered_nodes[s]) then + if not search_table(biome_lib.surfaceslist_aircheck, s) then + biome_lib.surfaceslist_aircheck[#biome_lib.surfaceslist_aircheck + 1] = s + end + else + biome_lib:dbg("Warning: Ignored with-air-checking registration for undefined surface node: "..dump(s)) + end + end + end + end +end + +-- Function to check whether a position matches the given biome definition +-- Returns true when the surface can be populated + +local function populate_single_surface(biome, pos, perlin_fertile_area, checkair) + local p_top = { x = pos.x, y = pos.y + 1, z = pos.z } + + if math.random(1, 100) <= biome.rarity then + return + end + + local fertility, temperature, humidity = get_biome_data(pos, perlin_fertile_area) + + local pos_biome_ok = pos.y >= biome.min_elevation and pos.y <= biome.max_elevation + and fertility > biome.plantlife_limit + and temperature <= biome.temp_min and temperature >= biome.temp_max + and humidity <= biome.humidity_min and humidity >= biome.humidity_max + + if not pos_biome_ok then + return -- Y position mismatch, outside of biome + end + + local biome_surfaces_string = dump(biome.surface) + local surface_ok = false + + if not biome.depth then + local dest_node = minetest.get_node(pos) + if string.find(biome_surfaces_string, dest_node.name) then + surface_ok = true + else + if string.find(biome_surfaces_string, "group:") then + for j = 1, #biome.surface do + if string.find(biome.surface[j], "^group:") + and minetest.get_item_group(dest_node.name, biome.surface[j]) then + surface_ok = true + break + end + end + end + end + elseif not string.find(biome_surfaces_string, + minetest.get_node({ x = pos.x, y = pos.y-biome.depth-1, z = pos.z }).name) then + surface_ok = true + end + + if not surface_ok then + return -- Surface does not match the given node group/name + end + + if checkair and minetest.get_node(p_top).name ~= "air" then + return + end + + if biome.below_nodes and + not string.find(dump(biome.below_nodes), + minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name + ) then + return -- Node below does not match + end + + if biome.ncount and + #minetest.find_nodes_in_area( + {x=pos.x-1, y=pos.y, z=pos.z-1}, + {x=pos.x+1, y=pos.y, z=pos.z+1}, + biome.neighbors + ) <= biome.ncount then + return -- Not enough similar biome nodes around + end + + if biome.near_nodes and + #minetest.find_nodes_in_area( + {x=pos.x-biome.near_nodes_size, y=pos.y-biome.near_nodes_vertical, z=pos.z-biome.near_nodes_size}, + {x=pos.x+biome.near_nodes_size, y=pos.y+biome.near_nodes_vertical, z=pos.z+biome.near_nodes_size}, + biome.near_nodes + ) < biome.near_nodes_count then + return -- Long distance neighbours do not match + end + + -- Position fits into given biome + return true +end + +function biome_lib:populate_surfaces(biome, nodes_or_function_or_model, snodes, checkair) + + biome_lib:set_defaults(biome) + + -- filter stage 1 - find nodes from the supplied surfaces that are within the current biome. + + local in_biome_nodes = {} + local perlin_fertile_area = minetest.get_perlin(biome.seed_diff, perlin_octaves, perlin_persistence, perlin_scale) + + for i = 1, #snodes do + local pos = vector.new(snodes[i]) + if populate_single_surface(biome, pos, perlin_fertile_area, checkair) then + in_biome_nodes[#in_biome_nodes + 1] = pos + end + end + + -- filter stage 2 - find places within that biome area to place the plants. + + local num_in_biome_nodes = #in_biome_nodes + + if num_in_biome_nodes == 0 then + return + end + + for i = 1, math.min(biome.max_count, num_in_biome_nodes) do + local tries = 0 + local spawned = false + while tries < 2 and not spawned do + local pos = in_biome_nodes[math.random(1, num_in_biome_nodes)] + if biome.spawn_replace_node then + pos.y = pos.y-1 + end + local p_top = { x = pos.x, y = pos.y + 1, z = pos.z } + + if not (biome.avoid_nodes and biome.avoid_radius + and minetest.find_node_near(p_top, biome.avoid_radius + + math.random(-1.5,2), biome.avoid_nodes)) then + if biome.delete_above then + minetest.swap_node(p_top, biome_lib.air) + minetest.swap_node({x=p_top.x, y=p_top.y+1, z=p_top.z}, biome_lib.air) + end + + if biome.delete_above_surround then + minetest.swap_node({x=p_top.x-1, y=p_top.y, z=p_top.z}, biome_lib.air) + minetest.swap_node({x=p_top.x+1, y=p_top.y, z=p_top.z}, biome_lib.air) + minetest.swap_node({x=p_top.x, y=p_top.y, z=p_top.z-1}, biome_lib.air) + minetest.swap_node({x=p_top.x, y=p_top.y, z=p_top.z+1}, biome_lib.air) + + minetest.swap_node({x=p_top.x-1, y=p_top.y+1, z=p_top.z}, biome_lib.air) + minetest.swap_node({x=p_top.x+1, y=p_top.y+1, z=p_top.z}, biome_lib.air) + minetest.swap_node({x=p_top.x, y=p_top.y+1, z=p_top.z-1}, biome_lib.air) + minetest.swap_node({x=p_top.x, y=p_top.y+1, z=p_top.z+1}, biome_lib.air) + end + + if biome.spawn_replace_node then + minetest.swap_node(pos, biome_lib.air) + end + + local objtype = type(nodes_or_function_or_model) + + if objtype == "table" then + if nodes_or_function_or_model.axiom then + biome_lib:generate_tree(p_top, nodes_or_function_or_model) + spawned = true + else + local fdir = nil + if biome.random_facedir then + fdir = math.random(biome.random_facedir[1], biome.random_facedir[2]) + end + minetest.swap_node(p_top, { name = nodes_or_function_or_model[math.random(#nodes_or_function_or_model)], param2 = fdir }) + spawned = true + end + elseif objtype == "string" and + minetest.registered_nodes[nodes_or_function_or_model] then + local fdir = nil + if biome.random_facedir then + fdir = math.random(biome.random_facedir[1], biome.random_facedir[2]) + end + minetest.swap_node(p_top, { name = nodes_or_function_or_model, param2 = fdir }) + spawned = true + elseif objtype == "function" then + nodes_or_function_or_model(pos) + spawned = true + elseif objtype == "string" and pcall(loadstring(("return %s(...)"): + format(nodes_or_function_or_model)),pos) then + spawned = true + else + biome_lib:dbg("Warning: Ignored invalid definition for object "..dump(nodes_or_function_or_model).." that was pointed at {"..dump(pos).."}") + end + else + tries = tries + 1 + end + end + end +end + +-- Primary mapgen spawner, for mods that can work with air checking enabled on +-- a surface during the initial map read stage. + +function biome_lib:generate_block_with_air_checking() + if #biome_lib.blocklist_aircheck == 0 then + return + end + + local minp = biome_lib.blocklist_aircheck[1][1] + local maxp = biome_lib.blocklist_aircheck[1][2] + + -- use the block hash as a unique key into the surface nodes + -- tables, so that we can write the tables thread-safely. + + local blockhash = minetest.hash_node_position(minp) + + if not biome_lib.surface_nodes_aircheck.blockhash then + + if type(minetest.find_nodes_in_area_under_air) == "function" then -- use newer API call + biome_lib.surface_nodes_aircheck.blockhash = + minetest.find_nodes_in_area_under_air(minp, maxp, biome_lib.surfaceslist_aircheck) + else + local search_area = minetest.find_nodes_in_area(minp, maxp, biome_lib.surfaceslist_aircheck) + + -- search the generated block for air-bounded surfaces the slow way. + + biome_lib.surface_nodes_aircheck.blockhash = {} + + for i = 1, #search_area do + local pos = search_area[i] + local p_top = { x=pos.x, y=pos.y+1, z=pos.z } + if minetest.get_node(p_top).name == "air" then + biome_lib.surface_nodes_aircheck.blockhash[#biome_lib.surface_nodes_aircheck.blockhash + 1] = pos + end + end + end + biome_lib.actioncount_aircheck.blockhash = 1 + + else + if biome_lib.actioncount_aircheck.blockhash <= #biome_lib.actionslist_aircheck then + -- [1] is biome, [2] is node/function/model + biome_lib:populate_surfaces( + biome_lib.actionslist_aircheck[biome_lib.actioncount_aircheck.blockhash][1], + biome_lib.actionslist_aircheck[biome_lib.actioncount_aircheck.blockhash][2], + biome_lib.surface_nodes_aircheck.blockhash, true) + biome_lib.actioncount_aircheck.blockhash = biome_lib.actioncount_aircheck.blockhash + 1 + else + if biome_lib.surface_nodes_aircheck.blockhash then + table.remove(biome_lib.blocklist_aircheck, 1) + biome_lib.surface_nodes_aircheck.blockhash = nil + end + end + end +end + +-- Secondary mapgen spawner, for mods that require disabling of +-- checking for air during the initial map read stage. + +function biome_lib:generate_block_no_aircheck() + if #biome_lib.blocklist_no_aircheck == 0 then + return + end + + local minp = biome_lib.blocklist_no_aircheck[1][1] + local maxp = biome_lib.blocklist_no_aircheck[1][2] + + local blockhash = minetest.hash_node_position(minp) + + if not biome_lib.surface_nodes_no_aircheck.blockhash then + + -- directly read the block to be searched into the chunk cache + + biome_lib.surface_nodes_no_aircheck.blockhash = + minetest.find_nodes_in_area(minp, maxp, biome_lib.surfaceslist_no_aircheck) + biome_lib.actioncount_no_aircheck.blockhash = 1 + + else + if biome_lib.actioncount_no_aircheck.blockhash <= #biome_lib.actionslist_no_aircheck then + biome_lib:populate_surfaces( + biome_lib.actionslist_no_aircheck[biome_lib.actioncount_no_aircheck.blockhash][1], + biome_lib.actionslist_no_aircheck[biome_lib.actioncount_no_aircheck.blockhash][2], + biome_lib.surface_nodes_no_aircheck.blockhash, false) + biome_lib.actioncount_no_aircheck.blockhash = biome_lib.actioncount_no_aircheck.blockhash + 1 + else + if biome_lib.surface_nodes_no_aircheck.blockhash then + table.remove(biome_lib.blocklist_no_aircheck, 1) + biome_lib.surface_nodes_no_aircheck.blockhash = nil + end + end + end +end + +-- "Play" them back, populating them with new stuff in the process + +local step_duration = tonumber(minetest.settings:get("dedicated_server_step")) +minetest.register_globalstep(function(dtime) + if dtime >= step_duration + 0.1 -- don't attempt to populate if lag is already too high + or math.random(100) > biome_lib.queue_run_ratio + or (#biome_lib.blocklist_aircheck == 0 and #biome_lib.blocklist_no_aircheck == 0) then + return + end + + biome_lib.globalstep_start_time = minetest.get_us_time() + biome_lib.globalstep_runtime = 0 + while (#biome_lib.blocklist_aircheck > 0 or #biome_lib.blocklist_no_aircheck > 0) + and biome_lib.globalstep_runtime < 200000 do -- 0.2 seconds, in uS. + if #biome_lib.blocklist_aircheck > 0 then + biome_lib:generate_block_with_air_checking() + end + if #biome_lib.blocklist_no_aircheck > 0 then + biome_lib:generate_block_no_aircheck() + end + biome_lib.globalstep_runtime = minetest.get_us_time() - biome_lib.globalstep_start_time + end +end) + +-- Play out the entire log all at once on shutdown +-- to prevent unpopulated map areas + +minetest.register_on_shutdown(function() + if #biome_lib.blocklist_aircheck == 0 then + return + end + + print("[biome_lib] Stand by, playing out the rest of the aircheck mapblock log") + print("(there are "..#biome_lib.blocklist_aircheck.." entries)...") + while #biome_lib.blocklist_aircheck > 0 do + biome_lib:generate_block_with_air_checking(0.1) + end +end) + +minetest.register_on_shutdown(function() + if #biome_lib.blocklist_aircheck == 0 then + return + end + + print("[biome_lib] Stand by, playing out the rest of the no-aircheck mapblock log") + print("(there are "..#biome_lib.blocklist_no_aircheck.." entries)...") + while #biome_lib.blocklist_no_aircheck > 0 do + biome_lib:generate_block_no_aircheck(0.1) + end +end) + +-- The spawning ABM + +function biome_lib:spawn_on_surfaces(sd,sp,sr,sc,ss,sa) + + local biome = {} + + if type(sd) ~= "table" then + biome.spawn_delay = sd -- old api expects ABM interval param here. + biome.spawn_plants = {sp} + biome.avoid_radius = sr + biome.spawn_chance = sc + biome.spawn_surfaces = {ss} + biome.avoid_nodes = sa + else + biome = sd + end + + if biome.spawn_delay*time_scale >= 1 then + biome.interval = biome.spawn_delay*time_scale + else + biome.interval = 1 + end + + biome_lib:set_defaults(biome) + biome.spawn_plants_count = #(biome.spawn_plants) + + local n + if type(biome.spawn_plants) == "table" then + n = "random: "..biome.spawn_plants[1]..", ..." + else + n = biome.spawn_plants + end + biome.label = biome.label or "biome_lib spawn_on_surfaces(): "..n + + minetest.register_abm({ + nodenames = biome.spawn_surfaces, + interval = biome.interval, + chance = biome.spawn_chance, + neighbors = biome.neighbors, + label = biome.label, + action = function(pos, node, active_object_count, active_object_count_wider) + local p_top = { x = pos.x, y = pos.y + 1, z = pos.z } + local n_top = minetest.get_node(p_top) + local perlin_fertile_area = minetest.get_perlin(biome.seed_diff, perlin_octaves, perlin_persistence, perlin_scale) + + local fertility, temperature, humidity = get_biome_data(pos, perlin_fertile_area) + + local pos_biome_ok = pos.y >= biome.min_elevation and pos.y <= biome.max_elevation + and fertility > biome.plantlife_limit + and temperature <= biome.temp_min and temperature >= biome.temp_max + and humidity <= biome.humidity_min and humidity >= biome.humidity_max + and biome_lib:is_node_loaded(p_top) + + if not pos_biome_ok then + return -- Outside of biome + end + + local n_light = minetest.get_node_light(p_top, nil) + if n_light < biome.light_min or n_light > biome.light_max then + return -- Too dark or too bright + end + + if biome.avoid_nodes and biome.avoid_radius and minetest.find_node_near( + p_top, biome.avoid_radius + math.random(-1.5,2), biome.avoid_nodes) then + return -- Nodes to avoid are nearby + end + + if biome.neighbors and biome.ncount and + #minetest.find_nodes_in_area( + {x=pos.x-1, y=pos.y, z=pos.z-1}, + {x=pos.x+1, y=pos.y, z=pos.z+1}, + biome.neighbors + ) <= biome.ncount then + return -- Near neighbour nodes are not present + end + + local NEAR_DST = biome.near_nodes_size + if biome.near_nodes and biome.near_nodes_count and biome.near_nodes_size and + #minetest.find_nodes_in_area( + {x=pos.x-NEAR_DST, y=pos.y-biome.near_nodes_vertical, z=pos.z-NEAR_DST}, + {x=pos.x+NEAR_DST, y=pos.y+biome.near_nodes_vertical, z=pos.z+NEAR_DST}, + biome.near_nodes + ) < biome.near_nodes_count then + return -- Far neighbour nodes are not present + end + + if (biome.air_count and biome.air_size) and + #minetest.find_nodes_in_area( + {x=p_top.x-biome.air_size, y=p_top.y, z=p_top.z-biome.air_size}, + {x=p_top.x+biome.air_size, y=p_top.y, z=p_top.z+biome.air_size}, + "air" + ) < biome.air_count then + return -- Not enough air + end + + local walldir = biome_lib:find_adjacent_wall(p_top, biome.verticals_list, biome.choose_random_wall) + if biome.alt_wallnode and walldir then + if n_top.name == "air" then + minetest.swap_node(p_top, { name = biome.alt_wallnode, param2 = walldir }) + end + return + end + + local currentsurface = minetest.get_node(pos).name + + if currentsurface == "default:water_source" and + #minetest.find_nodes_in_area( + {x=pos.x, y=pos.y-biome.depth_max-1, z=pos.z}, + vector.new(pos), + {"default:dirt", "default:dirt_with_grass", "default:sand"} + ) == 0 then + return -- On water but no ground nearby + end + + local rnd = math.random(1, biome.spawn_plants_count) + local plant_to_spawn = biome.spawn_plants[rnd] + local fdir = biome.facedir + if biome.random_facedir then + fdir = math.random(biome.random_facedir[1],biome.random_facedir[2]) + end + if type(biome.spawn_plants) == "string" then + assert(loadstring(biome.spawn_plants.."(...)"))(pos) + elseif not biome.spawn_on_side and not biome.spawn_on_bottom and not biome.spawn_replace_node then + if n_top.name == "air" then + minetest.swap_node(p_top, { name = plant_to_spawn, param2 = fdir }) + end + elseif biome.spawn_replace_node then + minetest.swap_node(pos, { name = plant_to_spawn, param2 = fdir }) + + elseif biome.spawn_on_side then + local onside = biome_lib:find_open_side(pos) + if onside then + minetest.swap_node(onside.newpos, { name = plant_to_spawn, param2 = onside.facedir }) + end + elseif biome.spawn_on_bottom then + if minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name == "air" then + minetest.swap_node({x=pos.x, y=pos.y-1, z=pos.z}, { name = plant_to_spawn, param2 = fdir} ) + end + end + end + }) +end + +-- Function to decide how to replace a plant - either grow it, replace it with +-- a tree, run a function, or die with an error. + +function biome_lib:replace_object(pos, replacement, grow_function, walldir, seeddiff) + local growtype = type(grow_function) + if growtype == "table" then + minetest.swap_node(pos, biome_lib.air) + biome_lib:grow_tree(pos, grow_function) + return + elseif growtype == "function" then + local perlin_fertile_area = minetest.get_perlin(seeddiff, perlin_octaves, perlin_persistence, perlin_scale) + local fertility, temperature, _ = get_biome_data(pos, perlin_fertile_area) + grow_function(pos, fertility, temperature, walldir) + return + elseif growtype == "string" then + local perlin_fertile_area = minetest.get_perlin(seeddiff, perlin_octaves, perlin_persistence, perlin_scale) + local fertility, temperature, _ = get_biome_data(pos, perlin_fertile_area) + assert(loadstring(grow_function.."(...)"))(pos, fertility, temperature, walldir) + return + elseif growtype == "nil" then + minetest.swap_node(pos, { name = replacement, param2 = walldir}) + return + elseif growtype ~= "nil" and growtype ~= "string" and growtype ~= "table" then + error("Invalid grow function "..dump(grow_function).." used on object at ("..dump(pos)..")") + end +end + + +dofile(biome_lib.modpath .. "/search_functions.lua") +assert(loadfile(biome_lib.modpath .. "/growth.lua"))(time_scale) + + + +-- Check for infinite stacks + +if minetest.get_modpath("unified_inventory") or not minetest.settings:get_bool("creative_mode") then + biome_lib.expect_infinite_stacks = false +else + biome_lib.expect_infinite_stacks = true +end + +-- read a field from a node's definition + +function biome_lib:get_nodedef_field(nodename, fieldname) + if not minetest.registered_nodes[nodename] then + return nil + end + return minetest.registered_nodes[nodename][fieldname] +end + +print("[Biome Lib] Loaded") + +minetest.after(0, function() + print("[Biome Lib] Registered a total of "..(#biome_lib.surfaceslist_aircheck)+(#biome_lib.surfaceslist_no_aircheck).." surface types to be evaluated, spread") + print("[Biome Lib] across "..#biome_lib.actionslist_aircheck.." actions with air-checking and "..#biome_lib.actionslist_no_aircheck.." actions without.") +end) + diff --git a/mods/biome_lib/locale/de.txt b/mods/biome_lib/locale/de.txt new file mode 100644 index 00000000..28867868 --- /dev/null +++ b/mods/biome_lib/locale/de.txt @@ -0,0 +1,5 @@ +# Translation by Xanthin + +someone = jemand +Sorry, %s owns that spot. = Entschuldige, %s gehoert diese Stelle. +[Plantlife Library] Loaded = [Plantlife Library] Geladen diff --git a/mods/biome_lib/locale/fr.txt b/mods/biome_lib/locale/fr.txt new file mode 100644 index 00000000..90709002 --- /dev/null +++ b/mods/biome_lib/locale/fr.txt @@ -0,0 +1,5 @@ +# Template + +someone = quelqu'un +Sorry, %s owns that spot. = Désolé, %s possède cet endroit. +[Plantlife Library] Loaded = [Librairie Plantlife] Chargée. diff --git a/mods/biome_lib/locale/ru.txt b/mods/biome_lib/locale/ru.txt new file mode 100644 index 00000000..7b3072d0 --- /dev/null +++ b/mods/biome_lib/locale/ru.txt @@ -0,0 +1,5 @@ +# Translation by inpos + +someone = кто-то +Sorry, %s owns that spot. = Извините, но %s уже является владельцем этой точки. +[Plantlife Library] Loaded = [Plantlife Library] Загружена diff --git a/mods/biome_lib/locale/template.txt b/mods/biome_lib/locale/template.txt new file mode 100644 index 00000000..0f5fbbd4 --- /dev/null +++ b/mods/biome_lib/locale/template.txt @@ -0,0 +1,5 @@ +# Template + +someone = +Sorry, %s owns that spot. = +[Plantlife Library] Loaded = diff --git a/mods/biome_lib/locale/tr.txt b/mods/biome_lib/locale/tr.txt new file mode 100644 index 00000000..4b596f40 --- /dev/null +++ b/mods/biome_lib/locale/tr.txt @@ -0,0 +1,5 @@ +# Turkish translation by mahmutelmas06 + +someone = birisi +Sorry, %s owns that spot. = Üzgünüm, buranın sahibi %s. +[Plantlife Library] Loaded = [Plantlife Library] yüklendi diff --git a/mods/biome_lib/mod.conf b/mods/biome_lib/mod.conf new file mode 100644 index 00000000..033b72e9 --- /dev/null +++ b/mods/biome_lib/mod.conf @@ -0,0 +1,2 @@ +name = biome_lib +min_minetest_version = 5.2.0 diff --git a/mods/biome_lib/search_functions.lua b/mods/biome_lib/search_functions.lua new file mode 100644 index 00000000..d665b5fe --- /dev/null +++ b/mods/biome_lib/search_functions.lua @@ -0,0 +1,60 @@ + +-- function to decide if a node has a wall that's in verticals_list{} +-- returns wall direction of valid node, or nil if invalid. + +function biome_lib:find_adjacent_wall(pos, verticals, randomflag) + local verts = dump(verticals) + if randomflag then + local walltab = {} + + if string.find(verts, minetest.get_node({ x=pos.x-1, y=pos.y, z=pos.z }).name) then walltab[#walltab + 1] = 3 end + if string.find(verts, minetest.get_node({ x=pos.x+1, y=pos.y, z=pos.z }).name) then walltab[#walltab + 1] = 2 end + if string.find(verts, minetest.get_node({ x=pos.x , y=pos.y, z=pos.z-1 }).name) then walltab[#walltab + 1] = 5 end + if string.find(verts, minetest.get_node({ x=pos.x , y=pos.y, z=pos.z+1 }).name) then walltab[#walltab + 1] = 4 end + + if #walltab > 0 then return walltab[math.random(1, #walltab)] end + + else + if string.find(verts, minetest.get_node({ x=pos.x-1, y=pos.y, z=pos.z }).name) then return 3 end + if string.find(verts, minetest.get_node({ x=pos.x+1, y=pos.y, z=pos.z }).name) then return 2 end + if string.find(verts, minetest.get_node({ x=pos.x , y=pos.y, z=pos.z-1 }).name) then return 5 end + if string.find(verts, minetest.get_node({ x=pos.x , y=pos.y, z=pos.z+1 }).name) then return 4 end + end + return nil +end + +-- Function to search downward from the given position, looking for the first +-- node that matches the ground table. Returns the new position, or nil if +-- height limit is exceeded before finding it. + +function biome_lib:search_downward(pos, heightlimit, ground) + for i = 0, heightlimit do + if string.find(dump(ground), minetest.get_node({x=pos.x, y=pos.y-i, z = pos.z}).name) then + return {x=pos.x, y=pos.y-i, z = pos.z} + end + end + return false +end + +function biome_lib:find_open_side(pos) + if minetest.get_node({ x=pos.x-1, y=pos.y, z=pos.z }).name == "air" then + return {newpos = { x=pos.x-1, y=pos.y, z=pos.z }, facedir = 2} + end + if minetest.get_node({ x=pos.x+1, y=pos.y, z=pos.z }).name == "air" then + return {newpos = { x=pos.x+1, y=pos.y, z=pos.z }, facedir = 3} + end + if minetest.get_node({ x=pos.x, y=pos.y, z=pos.z-1 }).name == "air" then + return {newpos = { x=pos.x, y=pos.y, z=pos.z-1 }, facedir = 4} + end + if minetest.get_node({ x=pos.x, y=pos.y, z=pos.z+1 }).name == "air" then + return {newpos = { x=pos.x, y=pos.y, z=pos.z+1 }, facedir = 5} + end + return nil +end + +-- "Record" the chunks being generated by the core mapgen + +minetest.register_on_generated(function(minp, maxp, blockseed) + biome_lib.blocklist_aircheck[#biome_lib.blocklist_aircheck + 1] = { minp, maxp } + biome_lib.blocklist_no_aircheck[#biome_lib.blocklist_no_aircheck + 1] = { minp, maxp } +end) diff --git a/mods/moretrees/.luacheckrc b/mods/moretrees/.luacheckrc new file mode 100644 index 00000000..459b2e2e --- /dev/null +++ b/mods/moretrees/.luacheckrc @@ -0,0 +1,30 @@ +std = "lua51+minetest" +unused_args = false +allow_defined_top = true +max_line_length = 999 +max_comment_line_length = 999 + +stds.minetest = { + read_globals = { + "minetest", + "vector", + "VoxelManip", + "VoxelArea", + "PseudoRandom", + "ItemStack", + "default", + table = { + fields = { + "copy", + }, + }, + "dump", + } +} + +read_globals = { + "biome_lib", + "stairsplus", + "stairs", + "doors", +} diff --git a/mods/moretrees/LICENSE b/mods/moretrees/LICENSE new file mode 100644 index 00000000..08cda455 --- /dev/null +++ b/mods/moretrees/LICENSE @@ -0,0 +1,620 @@ +Minetest mod moretrees +====================== + +All source code: + © 2013, Vanessa Ezekowitz +Date & cocos palm code (date_palm.lua, cocos_palm.lua) + © 2016, Rogier +All date & date palm textures, date-based food, cocos flower & green coconuts, +and all poplar textures: + © 2016, Rogier + - Three of the date palm textures are modifications of existing moretrees textures + - The green coconuts are a modification of the brown coconut + - The date cake batter is a modification of the acorn muffin batter +All other sapling textures (textures/*_sapling.png): + © 2013, Tim Huppertz +All other textures: + © 2013, Vanessa Ezekowitz + +############################################################################### + +License for all code: LGPL 3.0 +License for all media and all other assets: CC-by-SA 4.0 + +############################################################################### + + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. + +############################################################################### + +Attribution-ShareAlike 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution-ShareAlike 4.0 International Public +License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution-ShareAlike 4.0 International Public License ("Public +License"). To the extent this Public License may be interpreted as a +contract, You are granted the Licensed Rights in consideration of Your +acceptance of these terms and conditions, and the Licensor grants You +such rights in consideration of benefits the Licensor receives from +making the Licensed Material available under these terms and +conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. BY-SA Compatible License means a license listed at + creativecommons.org/compatiblelicenses, approved by Creative + Commons as essentially the equivalent of this Public License. + + d. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + e. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + f. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + g. License Elements means the license attributes listed in the name + of a Creative Commons Public License. The License Elements of this + Public License are Attribution and ShareAlike. + + h. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + i. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + j. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + k. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + l. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + m. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. Additional offer from the Licensor -- Adapted Material. + Every recipient of Adapted Material from You + automatically receives an offer from the Licensor to + exercise the Licensed Rights in the Adapted Material + under the conditions of the Adapter's License You apply. + + c. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + b. ShareAlike. + + In addition to the conditions in Section 3(a), if You Share + Adapted Material You produce, the following conditions also apply. + + 1. The Adapter's License You apply must be a Creative Commons + license with the same License Elements, this version or + later, or a BY-SA Compatible License. + + 2. You must include the text of, or the URI or hyperlink to, the + Adapter's License You apply. You may satisfy this condition + in any reasonable manner based on the medium, means, and + context in which You Share Adapted Material. + + 3. You may not offer or impose any additional or different terms + or conditions on, or apply any Effective Technological + Measures to, Adapted Material that restrict exercise of the + rights granted under the Adapter's License You apply. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material, + + including for purposes of Section 3(b); and + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the “Licensor.” The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. diff --git a/mods/moretrees/README.md b/mods/moretrees/README.md new file mode 100644 index 00000000..905cefa4 --- /dev/null +++ b/mods/moretrees/README.md @@ -0,0 +1,11 @@ +More trees! + +This mod adds a whole bunch of new types of trees to the game + +Much of the code here came from cisoun's conifers mod and bas080's +jungle trees mod, and big contributions by RealBadAngel. + +Brought together into one mod and made L-systems compatible by Vanessa +Ezekowitz. + +Dependencies: biome_lib and default diff --git a/mods/moretrees/biome_defs.lua b/mods/moretrees/biome_defs.lua new file mode 100644 index 00000000..c080ed01 --- /dev/null +++ b/mods/moretrees/biome_defs.lua @@ -0,0 +1,301 @@ + +moretrees.beech_biome = { + surface = "default:dirt_with_grass", + avoid_nodes = moretrees.avoidnodes, + avoid_radius = 8, + seed_diff = 2, + rarity = 50, + max_count = 20, +} + +moretrees.palm_biome = { + surface = "default:sand", + avoid_nodes = moretrees.avoidnodes, + avoid_radius = 5, + seed_diff = 330, + min_elevation = -1, + max_elevation = 1, + near_nodes = {"default:water_source"}, + near_nodes_size = 15, + near_nodes_count = 10, + temp_min = 0.25, + temp_max = -0.15, + rarity = 50, + max_count = 10, +} + +moretrees.date_palm_biome = { + surface = "default:desert_sand", + avoid_nodes = moretrees.avoidnodes, + avoid_radius = 10, + seed_diff = 339, + min_elevation = -1, + max_elevation = 10, + near_nodes = {"default:water_source"}, + near_nodes_size = 20, + near_nodes_count = 100, + near_nodes_vertical = 20, + temp_min = -0.20, + humidity_max = 0.20, + rarity = 10, + max_count = 30, +} + +moretrees.date_palm_biome_2 = { + surface = "default:desert_sand", + avoid_nodes = moretrees.avoidnodes, + avoid_radius = 10, + seed_diff = 340, + min_elevation = 11, + max_elevation = 30, + near_nodes = {"default:water_source"}, + near_nodes_size = 1, + near_nodes_count = 1, + near_nodes_vertical = 30, + temp_min = -0.20, + humidity_max = 0.20, + rarity = 10, + max_count = 30, +} + +moretrees.apple_tree_biome = { + surface = "default:dirt_with_grass", + avoid_nodes = moretrees.avoidnodes, + avoid_radius = 10, + seed_diff = 331, + min_elevation = 1, + max_elevation = 10, + temp_min = 0.1, + temp_max = -0.15, + rarity = 75, + max_count = 5, +} + +moretrees.oak_biome = { + surface = "default:dirt_with_grass", + avoid_nodes = moretrees.avoidnodes, + avoid_radius = 15, + seed_diff = 332, + min_elevation = 0, + max_elevation = 10, + temp_min = 0.4, + temp_max = 0.2, + rarity = 50, + max_count = 5, +} + +moretrees.sequoia_biome = { + surface = "default:dirt_with_grass", + avoid_nodes = moretrees.avoidnodes, + avoid_radius = 10, + seed_diff = 333, + min_elevation = 0, + max_elevation = 10, + temp_min = 1, + temp_max = -0.4, + rarity = 90, + max_count = 5, +} + +moretrees.birch_biome = { + surface = "default:dirt_with_grass", + avoid_nodes = moretrees.avoidnodes, + avoid_radius = 5, + seed_diff = 334, + min_elevation = 10, + max_elevation = 15, + temp_min = 0.9, + temp_max = 0.3, + rarity = 50, + max_count = 10, +} + +moretrees.willow_biome = { + surface = "default:dirt_with_grass", + avoid_nodes = moretrees.avoidnodes, + avoid_radius = 10, + seed_diff = 337, + min_elevation = -5, + max_elevation = 5, + near_nodes = {"default:water_source"}, + near_nodes_size = 15, + near_nodes_count = 5, + rarity = 75, + max_count = 5, +} + +moretrees.rubber_tree_biome = { + surface = "default:dirt_with_grass", + avoid_nodes = moretrees.avoidnodes, + avoid_radius = 10, + seed_diff = 338, + min_elevation = -5, + max_elevation = 5, + near_nodes = {"default:water_source"}, + near_nodes_size = 15, + near_nodes_count = 10, + temp_min = -0.15, + rarity = 75, + max_count = 10, +} + +moretrees.jungletree_biome = { + surface = { + "default:dirt", + "default:dirt_with_grass", + "woodsoils:dirt_with_leaves_1", + "woodsoils:grass_with_leaves_1", + "woodsoils:grass_with_leaves_2" + }, + avoid_nodes = {"moretrees:jungletree_trunk"}, + max_count = 12, + avoid_radius = 3, + rarity = 85, + seed_diff = 329, + min_elevation = 1, + near_nodes = {"default:jungletree"}, + near_nodes_size = 6, + near_nodes_vertical = 2, + near_nodes_count = 1, + plantlife_limit = -0.9, +} + +moretrees.spruce_biome = { + surface = "default:dirt_with_grass", + avoid_nodes = moretrees.avoidnodes, + avoid_radius = 10, + seed_diff = 335, + min_elevation = 20, + temp_min = 0.9, + temp_max = 0.7, + rarity = 50, + max_count = 5, +} + +moretrees.cedar_biome = { + surface = "default:dirt_with_grass", + avoid_nodes = moretrees.avoidnodes, + avoid_radius = 10, + seed_diff = 336, + near_nodes = {"default:water_source"}, + near_nodes_size = 15, + near_nodes_count = 5, + rarity = 50, + max_count = 10, +} + + +-- Poplar requires a lot of water. +moretrees.poplar_biome = { + surface = "default:dirt_with_grass", + avoid_nodes = moretrees.avoidnodes, + avoid_radius = 6, + seed_diff = 341, + min_elevation = 0, + max_elevation = 50, + near_nodes = {"default:water_source"}, + near_nodes_size = 15, + near_nodes_vertical = 5, + near_nodes_count = 1, + humidity_min = -0.7, + humidity_max = -1, + rarity = 50, + max_count = 15, +} + +-- The humidity requirement it quite restrictive (apparently). +-- Spawn an occasional poplar elsewhere. +moretrees.poplar_biome_2 = { + surface = "default:dirt_with_grass", + avoid_nodes = moretrees.avoidnodes, + avoid_radius = 6, + seed_diff = 341, + min_elevation = 0, + max_elevation = 50, + near_nodes = {"default:water_source"}, + near_nodes_size = 15, + near_nodes_vertical = 4, + near_nodes_count = 10, + humidity_min = 0.1, + humidity_max = -0.6, + rarity = 50, + max_count = 1, +} + +-- Subterranean lakes provide enough water for poplars to grow +moretrees.poplar_biome_3 = { + surface = "default:dirt_with_grass", + avoid_nodes = moretrees.avoidnodes, + avoid_radius = 6, + seed_diff = 342, + min_elevation = 0, + max_elevation = 50, + near_nodes = {"default:water_source"}, + near_nodes_size = 1, + near_nodes_vertical = 25, + near_nodes_count = 1, + humidity_min = -0.5, + humidity_max = -1, + rarity = 0, + max_count = 30, +} + +moretrees.poplar_small_biome = { + surface = "default:dirt_with_grass", + avoid_nodes = moretrees.avoidnodes, + avoid_radius = 4, + seed_diff = 343, + min_elevation = 0, + max_elevation = 50, + near_nodes = {"default:water_source"}, + near_nodes_size = 10, + near_nodes_vertical = 5, + near_nodes_count = 1, + humidity_min = -0.7, + humidity_max = -1, + rarity = 50, + max_count = 10, +} + +moretrees.poplar_small_biome_2 = { + surface = "default:dirt_with_grass", + avoid_nodes = moretrees.avoidnodes, + avoid_radius = 4, + seed_diff = 343, + min_elevation = 0, + max_elevation = 50, + near_nodes = {"default:water_source"}, + near_nodes_size = 10, + near_nodes_vertical = 4, + near_nodes_count = 5, + humidity_min = 0.1, + humidity_max = -0.6, + rarity = 50, + max_count = 3, +} + + +moretrees.fir_biome = { + surface = "default:dirt_with_grass", + avoid_nodes = moretrees.avoidnodes, + avoid_radius = 10, + seed_diff = 359, + min_elevation = 25, + temp_min = 0.9, + temp_max = 0.3, + rarity = 50, + max_count = 10, +} + +moretrees.fir_biome_snow = { + surface = {"snow:dirt_with_snow", "snow:snow"}, + below_nodes = {"default:dirt", "default:dirt_with_grass", "snow:dirt_with_snow"}, + avoid_nodes = moretrees.avoidnodes, + avoid_radius = 10, + seed_diff = 359, + rarity = 50, + max_count = 10, + check_air = false, + delete_above = true, + spawn_replace_node = true +} diff --git a/mods/moretrees/cocos_palm.lua b/mods/moretrees/cocos_palm.lua new file mode 100644 index 00000000..127f3285 --- /dev/null +++ b/mods/moretrees/cocos_palm.lua @@ -0,0 +1,335 @@ +-- © 2016, Rogier +-- Translation support +local S = minetest.get_translator("moretrees") + +-- Some constants + +local coconut_drop_ichance = 8 + +-- Make the cocos palm fruit trunk a real trunk (it is generated as a fruit) +local trunk = minetest.registered_nodes["moretrees:palm_trunk"] +local ftrunk = {} +local gftrunk = {} +for k,v in pairs(trunk) do + ftrunk[k] = v + gftrunk[k] = v +end +ftrunk.tiles = {} +gftrunk.tiles = {} +for k,v in pairs(trunk.tiles) do + ftrunk.tiles[k] = v + gftrunk.tiles[k] = v +end +ftrunk.drop = "moretrees:palm_trunk" +gftrunk.drop = "moretrees:palm_trunk" +ftrunk.after_destruct = function(pos, oldnode) + local coconuts = minetest.find_nodes_in_area( + {x=pos.x-1, y=pos.y, z=pos.z-1}, + {x=pos.x+1, y=pos.y, z=pos.z+1}, + {"group:moretrees_coconut"} + ) + for _,coconutpos in pairs(coconuts) do + -- minetest.dig_node(coconutpos) does not cause nearby coconuts to be dropped :-( ... + --minetest.dig_node(coconutpos) + local items = minetest.get_node_drops(minetest.get_node(coconutpos).name) + minetest.swap_node(coconutpos, biome_lib.air) + for _, itemname in pairs(items) do + minetest.add_item(coconutpos, itemname) + end + end +end +-- Make the different trunk types distinguishable (but barely) +ftrunk.tiles[1] = "moretrees_palm_trunk_top.png^[transformR90" +gftrunk.tiles[1] = "moretrees_palm_trunk_top.png^[transformR180" +gftrunk.description = gftrunk.description.." (gen)" +minetest.register_node("moretrees:palm_fruit_trunk", ftrunk) +minetest.register_node("moretrees:palm_fruit_trunk_gen", gftrunk) + +local coconut_regrow_abm_spec = { + nodenames = { "moretrees:palm_fruit_trunk" }, + interval = moretrees.coconut_flower_interval, + chance = moretrees.coconut_flower_chance, + action = function(pos, node, active_object_count, active_object_count_wider) + local coconuts = minetest.find_nodes_in_area( + {x=pos.x-1, y=pos.y, z=pos.z-1}, + {x=pos.x+1, y=pos.y, z=pos.z+1}, + "group:moretrees_coconut" + ) + -- Expected growth interval increases exponentially with number of coconuts already hanging. + -- Also: if more coconuts are hanging, the chance of picking an empty spot decreases as well... + if math.random(2^#coconuts) <= 2 then + -- Grow in area of 3x3 round trunk + local dx=math.floor(math.random(3)-2) + local dz=math.floor(math.random(3)-2) + local coconutpos = {x=pos.x+dx, y=pos.y, z=pos.z+dz} + local coconutnode = minetest.get_node(coconutpos) + if coconutnode.name == "air" then + minetest.swap_node(coconutpos, {name="moretrees:coconut_0"}) + end + end + end +} +if moretrees.coconuts_regrow then + minetest.register_abm(coconut_regrow_abm_spec) +end + +-- Spawn initial coconuts + +-- Spawn initial coconuts +-- (Instead of coconuts, a generated-palm fruit trunk is generated with the tree. This +-- ABM converts the trunk to a regular fruit trunk, and spawns some coconuts) +minetest.register_abm({ + nodenames = { "moretrees:palm_fruit_trunk_gen" }, + interval = 1, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + minetest.swap_node(pos, {name="moretrees:palm_fruit_trunk"}) + local poslist = minetest.find_nodes_in_area( + {x=pos.x-1, y=pos.y, z=pos.z-1}, + {x=pos.x+1, y=pos.y, z=pos.z+1}, + "air" + ) + local genlist = {} + for k,v in pairs(poslist) do + genlist[k] = {x = math.random(100), pos = v} + end + table.sort(genlist, function(a, b) return a.x < b.x; end) + local count = 0 + for _, gen in pairs(genlist) do + minetest.swap_node(gen.pos, {name = "moretrees:coconut_3"}) + count = count + 1 + if count == 4 then + break + end + end + end, +}) + +-- Register coconuts, and make them regrow + +local coconut_growfn = function(pos, elapsed) + local node = minetest.get_node(pos) + local delay = moretrees.coconut_grow_interval + if not node then + return + elseif not moretrees.coconuts_regrow then + -- Regrowing has been turned off. Make coconust grow instantly + minetest.swap_node(pos, {name="moretrees:coconut_3"}) + return + elseif node.name == "moretrees:coconut_3" then + -- Drop coconuts (i.e. remove them), so that new coconuts can grow. + -- Coconuts will drop as items with a small chance + if math.random(coconut_drop_ichance) == 1 then + if moretrees.coconut_item_drop_ichance > 0 + and math.random(moretrees.coconut_item_drop_ichance) == 1 then + local items = minetest.get_node_drops(minetest.get_node(pos).name) + for _, itemname in pairs(items) do + minetest.add_item(pos, itemname) + end + end + minetest.swap_node(pos, biome_lib.air) + end + else + -- Grow coconuts to the next stage + local offset = string.len("moretrees:coconut_x") + local n = string.sub(node.name, offset) + minetest.swap_node(pos, {name=string.sub(node.name, 1, offset-1)..n+1}) + end + -- Don't catch up when elapsed time is large. Regular visits are needed for growth... + local timer = minetest.get_node_timer(pos) + timer:start(delay + math.random(moretrees.coconut_grow_interval)) +end + +local coconut_starttimer = function(pos, elapsed) + local timer = minetest.get_node_timer(pos) + local base_interval = moretrees.coconut_grow_interval * 2 / 3 + timer:set(base_interval + math.random(base_interval), elapsed or 0) +end + +for _,suffix in ipairs({"_0", "_1", "_2", "_3", ""}) do + local name + if suffix == "_0" then + name = S("Coconut Flower") + else + name = S("Coconut") + end + local drop = "" + local coco_group = 1 + local tile = "moretrees_coconut"..suffix..".png" + local timerfn = coconut_growfn + local constructfn = coconut_starttimer + if suffix == "_3" then + drop = "moretrees:coconut" + tile = "moretrees_coconut.png" + elseif suffix == "" then + drop = nil + coco_group = nil + timerfn = nil + constructfn = nil + end + local coconutdef = { + description = name, + tiles = {tile}, + drawtype = "plantlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + groups = { fleshy=3, dig_immediate=3, flammable=2, moretrees_coconut=coco_group }, + inventory_image = tile.."^[transformR180", + wield_image = tile.."^[transformR180", + sounds = default.node_sound_defaults(), + drop = drop, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.3, -0.3, 0.3, 0.3, 0.3} + }, + on_timer = timerfn, + on_construct = constructfn, + + } + minetest.register_node("moretrees:coconut"..suffix, coconutdef) +end + +-- convert exisiting cocos palms. This is a bit tricky... +-- Try to make sure that this is indeed a generated tree, and not manually-placed trunks and/or coconuts +if moretrees.coconuts_convert_existing_palms then + local spec = { + name = "moretrees:convert_existing_cocos_palms_to_regrow_coconuts", + nodenames = "moretrees:coconut", + action = function(pos, node, active_object_count, active_object_count_wider) + local trunks + local cvtrunks + local leaves + local coconuts + -- One regular trunk must be adjacent to the coconut + trunks = minetest.find_nodes_in_area( + {x=pos.x-1, y=pos.y, z=pos.z-1}, + {x=pos.x+1, y=pos.y, z=pos.z+1}, + "moretrees:palm_trunk" + ) + if #trunks ~= 1 then + return + end + local tpos = trunks[1] + -- 1 or 2 other trunks must be one level below to the trunk being converted. + trunks = minetest.find_nodes_in_area( + {x=tpos.x-1, y=tpos.y-1, z=tpos.z-1}, + {x=tpos.x+1, y=tpos.y-1, z=tpos.z+1}, + "moretrees:palm_trunk" + ) + if #trunks < 1 or #trunks > 2 then + return + end + -- 1 or 2 other trunks must be two levels below to the trunk being converted. + trunks = minetest.find_nodes_in_area( + {x=tpos.x-1, y=tpos.y-2, z=tpos.z-1}, + {x=tpos.x+1, y=tpos.y-2, z=tpos.z+1}, + "moretrees:palm_trunk" + ) + if #trunks < 1 or #trunks > 2 then + return + end + -- 1 or 2 trunks must at the level of the trunk being converted. + cvtrunks = minetest.find_nodes_in_area( + {x=tpos.x-1, y=tpos.y, z=tpos.z-1}, + {x=tpos.x+1, y=tpos.y, z=tpos.z+1}, + "moretrees:palm_trunk" + ) + if #cvtrunks < 1 or #cvtrunks > 2 then + return + end + -- No trunks may be one level above the trunk being converted. + trunks = minetest.find_nodes_in_area( + {x=tpos.x-1, y=tpos.y+1, z=tpos.z-1}, + {x=tpos.x+1, y=tpos.y+1, z=tpos.z+1}, + "moretrees:palm_trunk" + ) + if #trunks ~= 0 then + return + end + -- Leaves must be one level above the trunk being converted. + leaves = minetest.find_nodes_in_area( + {x=tpos.x-1, y=tpos.y+1, z=tpos.z-1}, + {x=tpos.x+1, y=tpos.y+1, z=tpos.z+1}, + "moretrees:palm_leaves" + ) + if #leaves == 0 then + return + end + -- Leaves must be two levels above the trunk being converted. + leaves = minetest.find_nodes_in_area( + {x=tpos.x-1, y=tpos.y+2, z=tpos.z-1}, + {x=tpos.x+1, y=tpos.y+2, z=tpos.z+1}, + "moretrees:palm_leaves" + ) + if #leaves == 0 then + return + end + -- No cocos fruit trunk may already be adjacent to the coconut + trunks = minetest.find_nodes_in_area( + {x=pos.x-1, y=pos.y, z=pos.z-1}, + {x=pos.x+1, y=pos.y, z=pos.z+1}, + "moretrees:palm_fruit_trunk" + ) + if #trunks ~= 0 then + return + end + -- No cocos fruit trunk may be adjacent to or below the trunk being converted. + trunks = minetest.find_nodes_in_area( + {x=tpos.x-1, y=tpos.y-2, z=tpos.z-1}, + {x=tpos.x+1, y=tpos.y, z=tpos.z+1}, + "moretrees:palm_fruit_trunk" + ) + if #trunks ~= 0 then + return + end + -- Convert trunk and all coconuts nearby. Maybe convert 2 trunks, just in case... + for _, tpos_1 in pairs(cvtrunks) do + minetest.swap_node(tpos_1, {name = "moretrees:palm_fruit_trunk"}) + coconuts = minetest.find_nodes_in_area( + {x=tpos_1.x-1, y=tpos_1.y, z=tpos_1.z-1}, + {x=tpos_1.x+1, y=tpos_1.y, z=tpos_1.z+1}, + "moretrees:coconut" + ) + for _, coconutpos in pairs(coconuts) do + minetest.swap_node(coconutpos, {name = "moretrees:coconut_3"}) + end + end + end, + } + if minetest.register_lbm then + minetest.register_lbm(spec) + else + spec.interval = 3691 + spec.chance = 10 + minetest.register_abm(spec) + end +end + +-- If regrowing was previously disabled, but is enabled now, make sure timers are started for existing coconuts +if moretrees.coconuts_regrow then + local spec = { + name = "moretrees:restart_coconut_regrow_timer", + nodenames = "group:moretrees_coconut", + action = function(pos, node, active_object_count, active_object_count_wider) + local timer = minetest.get_node_timer(pos) + if not timer:is_started() then + coconut_starttimer(pos) + else + local timeout = timer:get_timeout() + local elapsed = timer:get_elapsed() + if timeout - elapsed > moretrees.coconut_grow_interval * 4/3 then + coconut_starttimer(pos, math.random(moretrees.coconut_grow_interval * 4/3)) + end + end + end, + } + if minetest.register_lbm then + minetest.register_lbm(spec) + else + spec.interval = 3659 + spec.chance = 10 + minetest.register_abm(spec) + end +end + diff --git a/mods/moretrees/crafts.lua b/mods/moretrees/crafts.lua new file mode 100644 index 00000000..360f9848 --- /dev/null +++ b/mods/moretrees/crafts.lua @@ -0,0 +1,271 @@ +local S = minetest.get_translator("moretrees") + +for i in ipairs(moretrees.treelist) do + local treename = moretrees.treelist[i][1] + + minetest.register_craft({ + type = "shapeless", + output = "moretrees:"..treename.."_planks 4", + recipe = { + "moretrees:"..treename.."_trunk" + } + }) + + minetest.register_craft({ + type = "fuel", + recipe = "moretrees:"..treename.."_sapling", + burntime = 10, + }) +end + +minetest.register_craft({ + type = "shapeless", + output = "moretrees:rubber_tree_planks 4", + recipe = { + "moretrees:rubber_tree_trunk_empty" + } +}) + +minetest.register_craft({ + type = "fuel", + recipe = "group:moretrees_leaves", + burntime = 1, +}) + +-- Food recipes! + +minetest.register_craftitem("moretrees:coconut_milk", { + description = S("Coconut Milk"), + inventory_image = "moretrees_coconut_milk_inv.png", + wield_image = "moretrees_coconut_milk.png", + on_use = minetest.item_eat(2, "vessels:drinking_glass"), + groups = {vessel = 1}, +}) + +minetest.register_craftitem("moretrees:raw_coconut", { + description = S("Raw Coconut"), + inventory_image = "moretrees_raw_coconut.png", + on_use = minetest.item_eat(4), +}) + +minetest.register_craftitem("moretrees:date", { + description = S("Date"), + inventory_image = "moretrees_date.png", + on_use = minetest.item_eat(1), +}) + +minetest.register_craftitem("moretrees:date_nut_snack", { + description = S("Date & nut snack"), + inventory_image = "moretrees_date_nut_snack.png", + on_use = minetest.item_eat(4), +}) + +minetest.register_craftitem("moretrees:date_nut_batter", { + description = S("Date-nut cake batter"), + inventory_image = "moretrees_date_nut_batter.png", +}) + +minetest.register_craftitem("moretrees:date_nut_cake", { + description = S("Date-nut cake"), + inventory_image = "moretrees_date_nut_cake.png", + on_use = minetest.item_eat(32), +}) + +minetest.register_craftitem("moretrees:date_nut_bar", { + description = S("Date-nut energy bar"), + inventory_image = "moretrees_date_nut_bar.png", + on_use = minetest.item_eat(4), +}) + +minetest.register_craftitem("moretrees:acorn_muffin_batter", { + description = S("Acorn Muffin batter"), + inventory_image = "moretrees_acorn_muffin_batter.png", +}) + +minetest.register_craftitem("moretrees:acorn_muffin", { + description = S("Acorn Muffin"), + inventory_image = "moretrees_acorn_muffin.png", + on_use = minetest.item_eat(4), +}) + +minetest.register_craftitem("moretrees:spruce_nuts", { + description = S("Roasted Spruce Cone Nuts"), + inventory_image = "moretrees_spruce_nuts.png", + on_use = minetest.item_eat(1), +}) + +minetest.register_craftitem("moretrees:cedar_nuts", { + description = S("Roasted Cedar Cone Nuts"), + inventory_image = "moretrees_cedar_nuts.png", + on_use = minetest.item_eat(1), +}) + +minetest.register_craftitem("moretrees:fir_nuts", { + description = S("Roasted Fir Cone Nuts"), + inventory_image = "moretrees_fir_nuts.png", + on_use = minetest.item_eat(1), +}) + +for i in ipairs(moretrees.cutting_tools) do + local tool = moretrees.cutting_tools[i] + minetest.register_craft({ + type = "shapeless", + output = "moretrees:coconut_milk", + recipe = { + "moretrees:coconut", + "vessels:drinking_glass", + tool + }, + replacements = { + { "moretrees:coconut", "moretrees:raw_coconut" }, + } + }) +end + +-- give tool back with wear preserved +minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv) + if (itemstack:get_name() == "moretrees:coconut_milk") then + for i, j in pairs(old_craft_grid) do + -- find tool used to do the craft + local ocg_name = j:get_name() + if ((ocg_name ~= "") and (ocg_name ~= "moretrees:coconut") and (ocg_name ~= "vessels:drinking_glass")) then + -- abort if using cutting board + if minetest.get_item_group(ocg_name, "food_cutting_board") == 1 then + return + end + -- create a new tool and set wear + local t = ItemStack(ocg_name) + local w = j:get_wear() + -- works if tool used is an axe + local uses = j:get_tool_capabilities().groupcaps.choppy.uses or 0 + if (w == 0 and uses ~= 0) then + -- tool has never been used + -- use tool once + t:set_wear(65535/(9*(uses - 1))) + else + -- set wear back + t:set_wear(w) + -- use tool once + if (uses ~= 0) then + t:add_wear(65535/(9*(uses - 1))) + end + end + -- add to craft inventory + craft_inv:add_item("craft", t) + end + end + end +end) + +-- coconut milk using food_cutting_board from farming redo +if minetest.registered_items["farming:cutting_board"] then + minetest.register_craft({ + type = "shapeless", + output = "moretrees:coconut_milk", + recipe = { + "moretrees:coconut", + "vessels:drinking_glass", + "group:food_cutting_board", + }, + replacements = { + { "moretrees:coconut", "moretrees:raw_coconut" }, + { "group:food_cutting_board", "farming:cutting_board" }, + } + }) +end + + +minetest.register_craft({ + type = "shapeless", + output = "moretrees:date_nut_snack", + recipe = { + "moretrees:date", + "moretrees:date", + "moretrees:date", + "moretrees:spruce_nuts", + "moretrees:cedar_nuts", + "moretrees:fir_nuts", + } +}) + +-- The date-nut cake is an exceptional food item due to its highly +-- concentrated nature (32 food units). Because of that, it requires +-- many different ingredients, and, starting from the base ingredients +-- found or harvested in nature, it requires many steps to prepare. +local flour +if minetest.registered_nodes["farming:flour"] then + flour = "farming:flour" +else + flour = "moretrees:acorn_muffin_batter" +end +minetest.register_craft({ + type = "shapeless", + output = "moretrees:date_nut_batter", + recipe = { + "moretrees:date_nut_snack", + "moretrees:date_nut_snack", + "moretrees:date_nut_snack", + "moretrees:coconut_milk", + "moretrees:date_nut_snack", + "moretrees:raw_coconut", + "moretrees:coconut_milk", + flour, + "moretrees:raw_coconut", + }, + replacements = { + { "moretrees:coconut_milk", "vessels:drinking_glass 2" } + } +}) + +minetest.register_craft({ + type = "cooking", + output = "moretrees:date_nut_cake", + recipe = "moretrees:date_nut_batter", +}) + +minetest.register_craft({ + type = "shapeless", + output = "moretrees:date_nut_bar 8", + recipe = {"moretrees:date_nut_cake"}, +}) + +minetest.register_craft({ + type = "shapeless", + output = "moretrees:acorn_muffin_batter", + recipe = { + "moretrees:acorn", + "moretrees:acorn", + "moretrees:acorn", + "moretrees:acorn", + "moretrees:coconut_milk", + }, + replacements = { + { "moretrees:coconut_milk", "vessels:drinking_glass" } + } +}) + +minetest.register_craft({ + type = "cooking", + output = "moretrees:acorn_muffin 4", + recipe = "moretrees:acorn_muffin_batter", +}) + +minetest.register_craft({ + type = "cooking", + output = "moretrees:spruce_nuts 4", + recipe = "moretrees:spruce_cone", +}) + +minetest.register_craft({ + type = "cooking", + output = "moretrees:cedar_nuts 4", + recipe = "moretrees:cedar_cone", +}) + +minetest.register_craft({ + type = "cooking", + output = "moretrees:fir_nuts 4", + recipe = "moretrees:fir_cone", +}) + + diff --git a/mods/moretrees/date_palm.lua b/mods/moretrees/date_palm.lua new file mode 100644 index 00000000..33cd646a --- /dev/null +++ b/mods/moretrees/date_palm.lua @@ -0,0 +1,762 @@ +-- Date palms. +-- +-- Date palms grow in hot and dry desert, but they require water. This makes them +-- a bit harder to find. If found in the middle of the desert, their presence +-- indicates a water source below the surface. +-- +-- As an additional feature (which can be disabled), dates automatically regrow after +-- harvesting (provided a male tree is sufficiently nearby). +-- If regrowing is enabled, then ripe dates will not hang forever. Most will disappear +-- (e.g. eaten by birds, ...), and a small fraction will drop as items. + +-- © 2016, Rogier + +local S = minetest.get_translator("moretrees") + +-- Some constants + +local dates_drop_ichance = 4 +local stems_drop_ichance = 4 +local flowers_wither_ichance = 3 + +-- implementation + +local dates_regrow_prob +if moretrees.dates_regrow_unpollinated_percent <= 0 then + dates_regrow_prob = 0 +elseif moretrees.dates_regrow_unpollinated_percent >= 100 then + dates_regrow_prob = 1 +else + dates_regrow_prob = 1 - math.pow(moretrees.dates_regrow_unpollinated_percent/100, 1/flowers_wither_ichance) +end + +-- Make the date palm fruit trunk a real trunk (it is generated as a fruit) +local trunk = minetest.registered_nodes["moretrees:date_palm_trunk"] +local ftrunk = {} +local fftrunk = {} +local mftrunk = {} +for k,v in pairs(trunk) do + ftrunk[k] = v +end +ftrunk.tiles = {} +for k,v in pairs(trunk.tiles) do + ftrunk.tiles[k] = v +end +ftrunk.drop = "moretrees:date_palm_trunk" +ftrunk.after_destruct = function(pos, oldnode) + local dates = minetest.find_nodes_in_area( + {x=pos.x-2, y=pos.y, z=pos.z-2}, + {x=pos.x+2, y=pos.y, z=pos.z+2}, + {"group:moretrees_dates"} + ) + for _,datespos in pairs(dates) do + -- minetest.dig_node(datespos) does not cause nearby dates to be dropped :-( ... + local items = minetest.get_node_drops(minetest.get_node(datespos).name) + minetest.swap_node(datespos, biome_lib.air) + for _, itemname in pairs(items) do + minetest.add_item(datespos, itemname) + end + end +end +for k,v in pairs(ftrunk) do + mftrunk[k] = v + fftrunk[k] = v +end +fftrunk.tiles = {} +mftrunk.tiles = {} +for k,v in pairs(trunk.tiles) do + fftrunk.tiles[k] = v + mftrunk.tiles[k] = v +end +-- Make the different types of trunk distinguishable (but not too easily) +ftrunk.tiles[1] = "moretrees_date_palm_trunk_top.png^[transformR180" +ftrunk.description = ftrunk.description.." (gen)" +fftrunk.tiles[1] = "moretrees_date_palm_trunk_top.png^[transformR90" +mftrunk.tiles[1] = "moretrees_date_palm_trunk_top.png^[transformR-90" +minetest.register_node("moretrees:date_palm_fruit_trunk", ftrunk) +minetest.register_node("moretrees:date_palm_ffruit_trunk", fftrunk) +minetest.register_node("moretrees:date_palm_mfruit_trunk", mftrunk) + +-- ABM to grow new date blossoms +local date_regrow_abm_spec = { + nodenames = { "moretrees:date_palm_ffruit_trunk", "moretrees:date_palm_mfruit_trunk" }, + interval = moretrees.dates_flower_interval, + chance = moretrees.dates_flower_chance, + action = function(pos, node, active_object_count, active_object_count_wider) + local dates = minetest.find_nodes_in_area({x=pos.x-2, y=pos.y, z=pos.z-2}, {x=pos.x+2, y=pos.y, z=pos.z+2}, "group:moretrees_dates") + + -- New blossom interval increases exponentially with number of dates already hanging + -- In addition: if more dates are hanging, the chance of picking an empty spot decreases as well... + if math.random(2^#dates) <= 2 then + -- Grow in area of 5x5 round trunk; higher probability in 3x3 area close to trunk + local dx=math.floor((math.random(50)-18)/16) + local dz=math.floor((math.random(50)-18)/16) + local datepos = {x=pos.x+dx, y=pos.y, z=pos.z+dz} + local datenode = minetest.get_node(datepos) + if datenode.name == "air" then + if node.name == "moretrees:date_palm_ffruit_trunk" then + minetest.swap_node(datepos, {name="moretrees:dates_f0"}) + else + minetest.swap_node(datepos, {name="moretrees:dates_m0"}) + end + end + end + end +} +if moretrees.dates_regrow_pollinated or moretrees.dates_regrow_unpollinated_percent > 0 then + minetest.register_abm(date_regrow_abm_spec) +end + +-- Choose male or female palm, and spawn initial dates +-- (Instead of dates, a dates fruit trunk is generated with the tree. This +-- ABM converts the trunk to a female or male fruit trunk, and spawns some +-- hanging dates) +minetest.register_abm({ + nodenames = { "moretrees:date_palm_fruit_trunk" }, + interval = 1, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + local type + if math.random(100) <= moretrees.dates_female_percent then + type = "f" + minetest.swap_node(pos, {name="moretrees:date_palm_ffruit_trunk"}) + else + type = "m" + minetest.swap_node(pos, {name="moretrees:date_palm_mfruit_trunk"}) + end + local dates1 = minetest.find_nodes_in_area( + {x=pos.x-1, y=pos.y, z=pos.z-1}, + {x=pos.x+1, y=pos.y, z=pos.z+1}, + "air" + ) + for _,genpos in pairs(dates1) do + if math.random(100) <= 20 then + if type == "m" then + minetest.swap_node(genpos, {name = "moretrees:dates_n"}) + else + minetest.swap_node(genpos, {name = "moretrees:dates_f4"}) + end + end + end + local dates2 = minetest.find_nodes_in_area( + {x=pos.x-2, y=pos.y, z=pos.z-2}, + {x=pos.x+2, y=pos.y, z=pos.z+2}, + "air" + ) + for _,genpos in pairs(dates2) do + if math.random(100) <= 5 then + if type == "m" then + minetest.swap_node(genpos, {name = "moretrees:dates_n"}) + else + minetest.swap_node(genpos, {name = "moretrees:dates_f4"}) + end + end + end + end, +}) + +-- Dates growing functions. + +-- This is a bit complex, as the purpose is to find male flowers at horizontal distances of over +-- 100 nodes. As searching such a large area is time consuming, this is optimized in four ways: +-- - The search result (the locations of male trees) is cached, so that it can be used again +-- - Only 1/9th of the desired area is searched at a time. A new search is only performed if no male +-- flowers are found in the previously searched parts. +-- - Search results are shared with other female palms nearby. +-- - If previous searches for male palms have consumed too much CPU time, the search is skipped +-- (This means no male palms will be found, and the pollination of the flowers affected will be +-- delayed. If this happens repeatedly, eventually, the female flowers will wither...) +-- A caching method was selected that is suited for the case where most date trees are long-lived, +-- and where the number of trees nearby is limited: +-- - Locations of male palms are stored as metadata for every female palm. This means that a player +-- visiting a remote area with some date palms will not cause extensive searches for male palms as +-- long overdue blossoming ABMs are triggered for every date palm. +-- - Even when male palms *are* cut down, a cache refill will only be performed if the cached results do not +-- contain a male palm with blossoms. +-- The method will probably perform suboptimally: +-- - If female palms are frequently chopped down and replanted. +-- Freshly grown palms will need to search for male palms again +-- (this is mitigated by the long blossoming interval, which increases the chance that search +-- results have already been shared) +-- - If an area contains a large number of male and female palms. +-- In this area, every female palm will have an almost identical list of male palm locations +-- as metadata. +-- - If all male palms within range of a number of female palms have been chopped down (with possibly +-- new ones planted). Although an attempt was made to share search results in this case as well, +-- a number of similar searches will unavoidably be performed by the different female palms. +-- - If no male palms are in range of a female palm. In that case, there will be frequent searches +-- for newly-grown male palms. + +-- Search statistics - used to limit the search load. +local sect_search_stats = {} -- Search statistics - server-wide +local function reset_sect_search_stats() + sect_search_stats.count = 0 -- # of searches + sect_search_stats.skip = 0 -- # of times skipped + sect_search_stats.sum = 0 -- total time spent + sect_search_stats.min = 999999999 -- min time spent + sect_search_stats.max = 0 -- max time spent +end +reset_sect_search_stats() +sect_search_stats.last_us = 0 -- last time a search was done (microseconds, max: 2^32) +sect_search_stats.last_s = 0 -- last time a search was done (system time in seconds) + +-- Find male trunks in one section (=1/9 th) of the searchable area. +-- sect is -4 to 4, where 0 is the center section +local function find_fruit_trunks_near(ftpos, sect) + local r = moretrees.dates_pollination_distance + 2 * math.sqrt(2) + local sect_hr = math.floor(r / 3 + 0.9999) + local sect_vr = math.floor(r / 2 + 0.9999) + local t0us = minetest.get_us_time() + local t0s = os.time() + + -- Compute elapsed time since last search. + -- Unfortunately, the time value wraps after about 71 minutes (2^32 microseconds), + -- so it must be corrected to obtain the actual elapsed time. + if t0us < sect_search_stats.last_us then + -- Correct a simple wraparound. + -- This is not sufficient, as the time value may have wrapped more than once... + sect_search_stats.last_us = sect_search_stats.last_us - 2^32 + end + if t0s - sect_search_stats.last_s > 2^32/1000000 then + -- One additional correction is enough for our purposes. + -- For exact results, more corrections may be needed though... + -- (and even not applying this correction at all would still only yield + -- a minimal risk of a non-serious miscalculation...) + sect_search_stats.last_us = sect_search_stats.last_us - 2^32 + end + + -- Skip the search if it is consuming too much CPU time + if sect_search_stats.count > 0 and moretrees.dates_blossom_search_iload > 0 + and sect_search_stats.sum / sect_search_stats.count > moretrees.dates_blossom_search_time_treshold + and t0us - sect_search_stats.last_us < moretrees.dates_blossom_search_iload * (sect_search_stats.sum / sect_search_stats.count) then + sect_search_stats.skip = sect_search_stats.skip + 1 + return nil + end + + local basevec = { x = ftpos.x + 2 * sect.x * sect_hr, + y = ftpos.y, + z = ftpos.z + 2 * sect.z * sect_hr} + -- find_nodes_in_area is limited to 82^3, make sure to not overrun it + local sizevec = { x = sect_hr, y = sect_vr, z = sect_hr } + if sect_hr * sect_hr * sect_vr > 41^3 then + sizevec = vector.apply(sizevec, function(a) return math.min(a, 41) end) + end + + local all_palms = minetest.find_nodes_in_area( + vector.subtract(basevec, sizevec), + vector.add(basevec, sizevec), + {"moretrees:date_palm_mfruit_trunk", "moretrees:date_palm_ffruit_trunk"}) + + -- Collect different palms in separate lists. + local female_palms = {} + local male_palms = {} + local all_male_palms = {} + for _, pos in pairs(all_palms) do + if pos.x ~= ftpos.x or pos.y ~= ftpos.y or pos.z ~= ftpos.z then + local node = minetest.get_node(pos) + if node and node.name == "moretrees:date_palm_ffruit_trunk" then + table.insert(female_palms,pos) + elseif node then + table.insert(all_male_palms,pos) + -- In sector 0, all palms are of interest. + -- In other sectors, forget about palms that are too far away. + if sect == 0 then + table.insert(male_palms,pos) + else + local ssq = 0 + for _, c in pairs({"x", "z"}) do + local dc = pos[c] - ftpos[c] + ssq = ssq + dc * dc + end + if math.sqrt(ssq) <= r then + table.insert(male_palms,pos) + end + end + end + end + end + + -- Update search statistics + local t1us = minetest.get_us_time() + if t1us < t0us then + -- Wraparound. Assume the search lasted less than 2^32 microseconds (~71 min) + -- (so no need to apply another correction) + t0us = t0us - 2^32 + end + sect_search_stats.last_us = t0us + sect_search_stats.last_s = t0s + sect_search_stats.count = sect_search_stats.count + 1 + sect_search_stats.sum = sect_search_stats.sum + t1us-t0us + if t1us - t0us < sect_search_stats.min then + sect_search_stats.min = t1us - t0us + end + if t1us - t0us > sect_search_stats.max then + sect_search_stats.max = t1us - t0us + end + + return male_palms, female_palms, all_male_palms +end + +local function dates_print_search_stats(log) + local stats + if sect_search_stats.count > 0 then + stats = string.format("Male date tree searching stats: searches: %d/%d: average: %d µs (%d..%d)", + sect_search_stats.count, sect_search_stats.count + sect_search_stats.skip, + sect_search_stats.sum/sect_search_stats.count, sect_search_stats.min, sect_search_stats.max) + else + stats = string.format("Male date tree searching stats: searches: 0/0: average: (no searches yet)") + end + if log then + minetest.log("action", "[moretrees] " .. stats) + end + return true, stats +end + +minetest.register_chatcommand("dates_stats", { + description = "Print male date palm search statistics", + params = "|chat|log|reset", + privs = { server = true }, + func = function(name, param) + param = string.lower(param:gsub("%s+", "")) + if param == "" or param == "chat" then + return dates_print_search_stats(false) + elseif param == "log" then + return dates_print_search_stats(true) + elseif param == "reset" then + reset_sect_search_stats() + return true + else + return false, "Invalid subcommand; expected: '' or 'chat' or 'log' or 'reset'" + end + end, +}) + +-- Find the female trunk near the female flowers to be pollinated +local function find_female_trunk(fbpos) + local trunks = minetest.find_nodes_in_area({x=fbpos.x-2, y=fbpos.y, z=fbpos.z-2}, + {x=fbpos.x+2, y=fbpos.y, z=fbpos.z+2}, + "moretrees:date_palm_ffruit_trunk") + local ftpos + local d = 99 + for x, pos in pairs(trunks) do + local ssq = 0 + for _, c in pairs({"x", "z"}) do + local dc = pos[c] - fbpos[c] + ssq = ssq + dc * dc + end + if math.sqrt(ssq) < d then + ftpos = pos + d = math.sqrt(ssq) + end + end + return ftpos +end + +-- Find male blossom near a male trunk, +-- the male blossom must be in range of a specific female blossom as well +local function find_male_blossom_near_trunk(fbpos, mtpos) + local r = moretrees.dates_pollination_distance + local blossoms = minetest.find_nodes_in_area({x=mtpos.x-2, y=mtpos.y, z=mtpos.z-2}, + {x=mtpos.x+2, y=mtpos.y, z=mtpos.z+2}, + "moretrees:dates_m0") + for x, mbpos in pairs(blossoms) do + local ssq = 0 + for _, c in pairs({"x", "z"}) do + local dc = mbpos[c] - fbpos[c] + ssq = ssq + dc * dc + end + if math.sqrt(ssq) <= r then + return mbpos + end + end + +end + +-- Find a male blossom in range of a specific female blossom, +-- using a nested list of male blossom positions +local function find_male_blossom_in_mpalms(ftpos, fbpos, mpalms) + -- Process the elements of mpalms.sect (index -4 .. 4) in random order + -- First, compute the order in which the sectors will be searched + local sect_index = {} + local sect_rnd = {} + for i = -4,4 do + local n = math.random(1023) + sect_index[n] = i + table.insert(sect_rnd, n) + end + table.sort(sect_rnd) + + -- Search the sectors + local sect_old = 0 + local sect_time = minetest.get_gametime() + for _, n in pairs(sect_rnd) do + -- Record the oldest sector, so that it can be searched if no male + -- blossoms were found + if not mpalms.sect_time[sect_index[n]] then + sect_old = sect_index[n] + sect_time = 0 + elseif mpalms.sect_time[sect_index[n]] < sect_time then + sect_old = sect_index[n] + sect_time = mpalms.sect_time[sect_index[n]] + end + if mpalms.sect[sect_index[n]] and #mpalms.sect[sect_index[n]] then + for px, mtpos in pairs(mpalms.sect[sect_index[n]]) do + local node = minetest.get_node(mtpos) + if node and node.name == "moretrees:date_palm_mfruit_trunk" then + local mbpos = find_male_blossom_near_trunk(fbpos, mtpos) + if mbpos then + return mbpos + end + elseif node and node.name ~= "ignore" then + -- no more male trunk here. + mpalms.sect[sect_index[n]][px] = nil + end + end + end + end + return nil, sect_old +end + +-- Find a male blossom in range of a specific female blossom, +-- using the cache associated with the given female trunk +-- If necessary, recompute part of the cache +local last_search_result = {} +local function find_male_blossom_with_ftrunk(fbpos,ftpos) + local meta = minetest.get_meta(ftpos) + local mpalms + local cache_changed = true + + -- Load cache. If distance has changed, start with empty cache instead. + local mpalms_dist = meta:get_int("male_palms_dist") + if mpalms_dist and mpalms_dist == moretrees.dates_pollination_distance then + mpalms = meta:get_string("male_palms") + if mpalms and mpalms ~= "" then + mpalms = minetest.deserialize(mpalms) + cache_changed = false + end + end + if not mpalms or not mpalms.sect then + mpalms = {} + mpalms.sect = {} + mpalms.sect_time = {} + meta:set_int("male_palms_dist", moretrees.dates_pollination_distance) + cache_changed = true + end + local fpalms_list + local all_mpalms_list + local sector0_searched = false + + -- Always make sure that sector 0 is cached + if not mpalms.sect[0] then + mpalms.sect[0], fpalms_list, all_mpalms_list = find_fruit_trunks_near(ftpos, {x = 0, z = 0}) + mpalms.sect_time[0] = minetest.get_gametime() + sector0_searched = true + cache_changed = true + last_search_result.female = fpalms_list + last_search_result.male = all_mpalms_list + end + + -- Find male palms + local mbpos, sect_old = find_male_blossom_in_mpalms(ftpos, fbpos, mpalms) + + -- If not found, (re)generate the cache for an additional sector. But don't search it yet (for performance reasons) + -- (Use the globally cached results if possible) + if not mbpos and not sector0_searched then + if not mpalms.sect_time[0] or mpalms.sect_time[0] == 0 or math.random(3) == 1 then + -- Higher probability of re-searching the center sector + sect_old = 0 + end + -- Use globally cached result if possible + mpalms.sect[sect_old] = nil + if sect_old == 0 and mpalms.sect_time[0] and mpalms.sect_time[0] > 0 + and last_search_result.male and #last_search_result.male then + for _, pos in pairs(last_search_result.female) do + if pos.x == ftpos.x and pos.y == ftpos.y and pos.z == ftpos.z then + mpalms.sect[sect_old] = last_search_result.male + -- Next time, don't use the cached result + mpalms.sect_time[sect_old] = nil + cache_changed = true + end + end + end + -- Else do a new search + if not mpalms.sect[sect_old] then + mpalms.sect[sect_old], fpalms_list, all_mpalms_list = find_fruit_trunks_near(ftpos, {x = (sect_old + 4) % 3 - 1, z = (sect_old + 4) / 3 - 1}) + cache_changed = true + if sect_old == 0 then + -- Save the results if it is sector 0 + -- (chance of reusing results from another sector are smaller) + last_search_result.female = fpalms_list + last_search_result.male = all_mpalms_list + end + if mpalms.sect[sect_old] then + mpalms.sect_time[sect_old] = minetest.get_gametime() + else + mpalms.sect_time[sect_old] = nil + end + end + end + + -- Share search results with other female trunks in the same area + -- Note that the list of female trunks doesn't (shouldn't :-) contain the current female trunk. + if fpalms_list and #fpalms_list and #all_mpalms_list then + local all_mpalms = {} + all_mpalms.sect = {} + all_mpalms.sect_time = {} + all_mpalms.sect[0] = all_mpalms_list + -- Don't set sect_time[0], so that the cached sector will be re-searched soon (if necessary) + local all_mpalms_serialized = minetest.serialize(all_mpalms) + for _, pos in pairs(fpalms_list) do + local fmeta = minetest.get_meta(pos) + local fdist = fmeta:get_int("male_palms_dist") + if not fdist or fdist ~= moretrees.dates_pollination_distance then + fmeta:set_string("male_palms", all_mpalms_serialized) + fmeta:set_int("male_palms_dist", moretrees.dates_pollination_distance) + end + end + end + + -- Save cache. + if cache_changed then + meta:set_string("male_palms", minetest.serialize(mpalms)) + end + + return mbpos +end + +-- Find a male blossom in range of a specific female blossom +local function find_male_blossom(fbpos) + local ftpos = find_female_trunk(fbpos) + if ftpos then + return find_male_blossom_with_ftrunk(fbpos, ftpos) + end + return nil +end + +-- Growing function for dates +local dates_growfn = function(pos, elapsed) + local node = minetest.get_node(pos) + local delay = moretrees.dates_grow_interval + local action + if not node then + return + elseif not moretrees.dates_regrow_pollinated and dates_regrow_prob == 0 then + -- Regrowing of dates is disabled. + if string.find(node.name, "moretrees:dates_f") then + minetest.swap_node(pos, {name="moretrees:dates_f4"}) + elseif string.find(node.name, "moretrees:dates_m") then + minetest.swap_node(pos, {name="moretrees:dates_n"}) + else + minetest.swap_node(pos, biome_lib.air) + end + return + elseif node.name == "moretrees:dates_f0" and math.random(100) <= 100 * dates_regrow_prob then + -- Dates grow unpollinated + minetest.swap_node(pos, {name="moretrees:dates_f1"}) + action = "nopollinate" + elseif node.name == "moretrees:dates_f0" and moretrees.dates_regrow_pollinated and find_male_blossom(pos) then + -- Pollinate flowers + minetest.swap_node(pos, {name="moretrees:dates_f1"}) + action = "pollinate" + elseif string.match(node.name, "0$") then + -- Make female unpollinated and male flowers last a bit longer + if math.random(flowers_wither_ichance) == 1 then + if node.name == "moretrees:dates_f0" then + minetest.swap_node(pos, {name="moretrees:dates_fn"}) + else + minetest.swap_node(pos, {name="moretrees:dates_n"}) + end + action = "wither" + else + action = "nowither" + end + elseif node.name == "moretrees:dates_f4" then + -- Remove dates, and optionally drop them as items + if math.random(dates_drop_ichance) == 1 then + if moretrees.dates_item_drop_ichance > 0 and math.random(moretrees.dates_item_drop_ichance) == 1 then + local items = minetest.get_node_drops(minetest.get_node(pos).name) + for _, itemname in pairs(items) do + minetest.add_item(pos, itemname) + end + end + minetest.swap_node(pos, {name="moretrees:dates_n"}) + action = "drop" + else + action = "nodrop" + end + elseif string.match(node.name, "n$") then + -- Remove stems. + if math.random(stems_drop_ichance) == 1 then + minetest.swap_node(pos, biome_lib.air) + return "stemdrop" + end + action = "nostemdrop" + else + -- Grow dates + local offset = 18 + local n = string.sub(node.name, offset) + minetest.swap_node(pos, {name=string.sub(node.name, 1, offset-1)..n+1}) + action = "grow" + end + -- Don't catch up when elapsed time is large. Regular visits are needed for growth... + local timer = minetest.get_node_timer(pos) + timer:start(delay + math.random(moretrees.dates_grow_interval)) + return action +end + +--[[ +-- Alternate growth function for dates. +-- It calls the primary growth function, but also measures CPU time consumed. +-- Use this function to analyze date growing performance. +local stat = {} +stat.count = 0 +local dates_growfn_profiling = function(pos, elapsed) + local t0 = minetest.get_us_time() + local action = dates_growfn(pos, elapsed) + local t1 = minetest.get_us_time() + if t1 < t0 then + t1 = t1 + 2^32 + end + stat.count = stat.count + 1 + if not stat[action] then + stat[action] = {} + stat[action].count = 0 + stat[action].sum = 0 + stat[action].min = 9999999999 + stat[action].max = 0 + end + stat[action].count = stat[action].count + 1 + stat[action].sum = stat[action].sum + t1-t0 + if t1-t0 < stat[action].min then + stat[action].min = t1-t0 + end + if t1-t0 > stat[action].max then + stat[action].max = t1-t0 + end + + if stat.count % 10 == 0 then + io.write(".") + io.flush() + end + if stat.count % 100 == 0 then + print(string.format("Date grow statistics %5d:", stat.count)) + local sum = 0 + local count = 0 + if sect_search_stats.count > 0 and stat.pollinate and stat.pollinate.count > 0 then + print(string.format("\t%-12s: %6d (%4.1f%%): %6dus (%d..%d)", + "search", sect_search_stats.count, + 100*sect_search_stats.count/stat.pollinate.count, + sect_search_stats.sum/sect_search_stats.count, + sect_search_stats.min, sect_search_stats.max)) + else + print(string.format("\t%-12s: %6d (%4.1f%%): %6dus (%d..%d)", + "search", sect_search_stats.count, + 0, 0, 0, 0)) + end + for action,data in pairs(stat) do + if action ~= "count" then + count = count + data.count + sum = sum + data.sum + print(string.format("\t%-12s: %6d (%4.1f%%): %6dus (%d..%d)", + action, data.count, + 100*data.count/stat.count, data.sum/data.count, + data.min, data.max)) + end + end + print(string.format("\t%-12s: %6d ( 100%%): %6dus", + "TOTAL", count, sum/count)) + end +end +--]] + +-- Register dates + +local dates_starttimer = function(pos, elapsed) + local timer = minetest.get_node_timer(pos) + local base_interval = moretrees.dates_grow_interval * 2 / 3 + timer:set(base_interval + math.random(base_interval), elapsed or 0) +end + +local dates_drop = { + items = { + {items = { "moretrees:date" }}, + {items = { "moretrees:date" }}, + {items = { "moretrees:date" }}, + {items = { "moretrees:date" }}, + {items = { "moretrees:date" }, rarity = 2 }, + {items = { "moretrees:date" }, rarity = 2 }, + {items = { "moretrees:date" }, rarity = 2 }, + {items = { "moretrees:date" }, rarity = 2 }, + {items = { "moretrees:date" }, rarity = 5 }, + {items = { "moretrees:date" }, rarity = 5 }, + {items = { "moretrees:date" }, rarity = 5 }, + {items = { "moretrees:date" }, rarity = 5 }, + {items = { "moretrees:date" }, rarity = 20 }, + {items = { "moretrees:date" }, rarity = 20 }, + {items = { "moretrees:date" }, rarity = 20 }, + {items = { "moretrees:date" }, rarity = 20 }, + } +} + +for _,suffix in ipairs({"f0", "f1", "f2", "f3", "f4", "m0", "fn", "n"}) do + local name + if suffix == "f0" or suffix == "m0" then + name = S("Date Flowers") + elseif suffix == "n" or suffix == "fn" then + name = S("Date Stem") + else + name = S("Dates") + end + local dropfn = suffix == "f4" and dates_drop or "" + local datedef = { + description = name, + tiles = {"moretrees_dates_"..suffix..".png"}, + visual_scale = 2, + drawtype = "plantlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + groups = { fleshy=3, dig_immediate=3, flammable=2, moretrees_dates=1 }, + inventory_image = "moretrees_dates_"..suffix..".png^[transformR0", + wield_image = "moretrees_dates_"..suffix..".png^[transformR90", + sounds = default.node_sound_defaults(), + drop = dropfn, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.3, -0.3, 0.3, 3.5, 0.3} + }, + on_timer = dates_growfn, + on_construct = (moretrees.dates_regrow_pollinated or moretrees.dates_regrow_unpollinated_percent > 0) + and dates_starttimer, + + } + minetest.register_node("moretrees:dates_"..suffix, datedef) +end + +-- If regrowing was previously disabled, but is enabled now, make sure timers are started for existing dates +if moretrees.dates_regrow_pollinated or moretrees.dates_regrow_unpollinated_percent > 0 then + local spec = { + name = "moretrees:restart_dates_regrow_timer", + nodenames = "group:moretrees_dates", + action = function(pos, node, active_object_count, active_object_count_wider) + local timer = minetest.get_node_timer(pos) + if not timer:is_started() then + dates_starttimer(pos) + else + local timeout = timer:get_timeout() + local elapsed = timer:get_elapsed() + if timeout - elapsed > moretrees.dates_grow_interval * 4/3 then + dates_starttimer(pos, math.random(moretrees.dates_grow_interval * 4/3)) + end + end + end, + } + if minetest.register_lbm then + minetest.register_lbm(spec) + else + spec.interval = 3557 + spec.chance = 10 + minetest.register_abm(spec) + end +end + diff --git a/mods/moretrees/default_settings.txt b/mods/moretrees/default_settings.txt new file mode 100644 index 00000000..a0fae226 --- /dev/null +++ b/mods/moretrees/default_settings.txt @@ -0,0 +1,135 @@ +-- Global configuration variables + +-- Enable the various kinds of trees. + +moretrees.enable_apple_tree = true +moretrees.enable_oak = true +moretrees.enable_sequoia = true +moretrees.enable_palm = true +moretrees.enable_date_palm = true +moretrees.enable_cedar = true +moretrees.enable_rubber_tree = true +moretrees.enable_willow = true +moretrees.enable_birch = true +moretrees.enable_spruce = true +moretrees.enable_jungle_tree = true +moretrees.enable_fir = true +moretrees.enable_poplar = true +moretrees.enable_beech = false + +-- set this to true to make moretrees spawn saplings at mapgen time instead +-- of fully-grown trees, which will grow into full trees after a very short +-- delay. This reduces mapgen lag in some situations, and fixes situations +-- where the mapgen conflicts with the tree generator. + +moretrees.spawn_saplings = true + +-- Set this to true to allow defining stairs/slabs/etc. If Moreblocks is +-- installed, this will use that mod's Stairs Plus component. Otherwise, it +-- will use the default stairs mod in minetest_game, if present + +moretrees.enable_stairs = true + +-- If this variable is set to true, register fences for moretrees wood + +moretrees.enable_fences = false + +-- Set this to true if you want the plantlike drawtype for leaves, which +-- improves some peoples' framerates without resorting to making leaf nodes opaque. +-- Affects default leaves and default jungle leaves also. + +moretrees.plantlike_leaves = false + +-- Enable this if you want moretrees to redefine default apples so that they +-- fall when leaves decay/are dug. + +moretrees.enable_redefine_apple = true + +-- Set this to true to enable leaf decay of all trees except the default ones. + +moretrees.enable_leafdecay = true + +-- various related settings to configure leaf decay. + +moretrees.leafdecay_delay = 2 +moretrees.leafdecay_chance = 5 +moretrees.leafdecay_radius = 5 +moretrees.palm_leafdecay_radius = 10 + +-- Change these settings if you want default trees to be gradually cut down +-- above the elevation where firs normally generate. + +moretrees.firs_remove_default_trees = false +moretrees.firs_remove_interval = 2 +moretrees.firs_remove_chance = 150 + +-- Cocos palm settings + +moretrees.coconuts_regrow = true +moretrees.coconuts_convert_existing_palms = true -- Converting existing palm trees will make coconuts regrow on them as well + -- Else, they will only regrow on newly-spawned palms + -- However, conversion is not an exact science, and although an attempt is + -- made to detect whether a trunk belongs to an actual palm, some coconut trunks + -- and some coconuts may be incorrectly converted. +moretrees.coconut_flower_interval = 59 +moretrees.coconut_flower_chance = 67 +moretrees.coconut_grow_interval = 2 * moretrees.coconut_flower_interval * moretrees.coconut_flower_chance + -- Actual interval will randomly vary between 67% and 133% of this value + -- 2 * 59 * 67 ~ 2 hours. So flowers become coconuts in about 6 hours +moretrees.coconut_item_drop_ichance = 10 -- inverse probability of ripe coconuts dropping as items (instead of disappearing) + +-- Date palm settings + +-- Suggested configuration alternatives: +-- - Dates grow only when pollinated: +-- - Set dates_regrow_pollinated to true +-- - Set dates_regrow_unpollinated_percent to 0 +-- - Dates grow without pollination. Pollination disabled: +-- - Set dates_regrow_pollinated to false +-- - Set dates_regrow_unpollinated_percent to some larger positive value, e.g. 95 +-- - Dates grow, but more and faster if male flowers are nearby +-- - Set dates_regrow_pollinated to true +-- - Set dates_regrow_unpollinated_percent to some small positive value, e.g. 33 +-- - Optional but recommended: Reduce the pollination distance, e.g. to 30 + +-- Note that it should not be necessary to disable pollination for performance +-- reasons. A lot of effort has gone into ensuring that date growing will not cause lag. +-- +-- If lag is suspected, use the chat command '/dates_stats' to obtain the male dates +-- search time, as well as the counts of total number of searches requested and the +-- number of searches actually performed. + +moretrees.dates_regrow_pollinated = true -- Enable pollination. If enabled, male trees are required for dates to grow. + -- If disabled, dates_regrow_unpollinated_percent must be non-zero for dates to regrow. +moretrees.dates_regrow_unpollinated_percent = 0 -- Percentage of female dates becoming dates without being pollinated. + -- If 0, dates_regrow_pollinated must be enabled for dates to grow. +moretrees.dates_female_percent = 57 -- Ratio of female to male trees - tune this to improve # of generated trees that actually bear fruit + -- ~57% gives near optimal results for groups of 3 random trees, while it is only slightly suboptimal + -- for groups of 2 and 4 random trees (~2% less fruit than optimal). + -- Optimal values per group size: 2: 50%, 3: 57.78%, 4: 63%, 5: 66.9%, 6: 69.9%, [...], 12: 79.8% + -- So 57% is optimal for small groups of trees. As larger groups have more female palms anyway, a + -- less than optimal proportion of female to male trees is not a problem. +moretrees.dates_pollination_distance = 120 +moretrees.dates_blossom_search_time_treshold = 1000 -- If average male blossom search time (in microseconds) exceeds this, start limiting the search load. +moretrees.dates_blossom_search_iload = 10 -- Inverse fraction of CPU time that male blossom searching search may consume. + -- As searching a large area (radius: dates_pollination_distance/3 per attempt) can cause lag, + -- this limits the search frequency server-wide so that the impact on server lag is minimised + -- For personal servers, this can be set lower, or even to 1 or 0 (0 disables load limiting). + -- Obtain the current average search time using /dates_stats +moretrees.dates_flower_interval = 59 +moretrees.dates_flower_chance = 181 +moretrees.dates_grow_interval = 2 * moretrees.dates_flower_interval * moretrees.dates_flower_chance + -- As date palms have a high yield, don't grow dates too fast + -- The actual interval will vary randomly between 67% and 133% of this value. + -- 2 * 59 * 181 ~ 6 hours. So by default flowers become dates in about one (human) day. +moretrees.dates_item_drop_ichance = 10 -- inverse probability of ripe dates dropping as items (instead of disappearing) + +-- Sapling settings + +moretrees.sapling_interval = 100 +moretrees.sapling_chance = 5 + +-- If this variable is set to true, drop leaves out as entities during leaf +-- decay, rather than just disappearing them. + +moretrees.decay_leaves_as_items = false diff --git a/mods/moretrees/init.lua b/mods/moretrees/init.lua new file mode 100644 index 00000000..9196852f --- /dev/null +++ b/mods/moretrees/init.lua @@ -0,0 +1,329 @@ +-- More trees! 2013-04-07 +-- +-- This mod adds more types of trees to the game +-- +-- Some of the node definitions and textures came from cisoun's conifers mod +-- and bas080's jungle trees mod. +-- +-- Brought together into one mod and made L-systems compatible by Vanessa +-- Ezekowitz. +-- +-- Firs and Jungle tree axioms/rules by Vanessa Dannenberg, with the +-- latter having been tweaked by RealBadAngel, most other axioms/rules written +-- by RealBadAngel. +-- + +moretrees = {} + +minetest.override_item("default:sapling", { + description = "Sapling" +}) + +minetest.override_item("default:tree", { + description = "Tree" +}) + +minetest.override_item("default:wood", { + description = "Wooden Planks" +}) + +minetest.override_item("default:leaves", { + description = "Leaves" +}) + +minetest.override_item("default:fence_wood", { + description = "Wooden Fence" +}) + +minetest.override_item("default:fence_rail_wood", { + description = "Wooden Fence Rail" +}) + +if minetest.get_modpath("doors") then + minetest.override_item("doors:gate_wood_closed", { + description = "Wooden Fence Gate" + }) + + minetest.override_item("doors:gate_wood_open", { + description = "Wooden Fence Gate" + }) +end + + +-- Read the default config file (and if necessary, copy it to the world folder). + +local worldpath=minetest.get_worldpath() +local modpath=minetest.get_modpath("moretrees") + +dofile(modpath.."/default_settings.txt") + +if io.open(worldpath.."/moretrees_settings.txt","r") then + io.close() + dofile(worldpath.."/moretrees_settings.txt") +end + + +-- infinite stacks checking + +if minetest.get_modpath("unified_inventory") or not + minetest.settings:get_bool("creative_mode") then + moretrees.expect_infinite_stacks = false +else + moretrees.expect_infinite_stacks = true +end + +-- tables, load other files + +moretrees.cutting_tools = { + "default:axe_bronze", + "default:axe_diamond", + "default:axe_mese", + "default:axe_steel", + "glooptest:axe_alatro", + "glooptest:axe_arol", + "moreores:axe_mithril", + "moreores:axe_silver", + "titanium:axe", +} + +dofile(modpath.."/tree_models.lua") +dofile(modpath.."/node_defs.lua") +dofile(modpath.."/date_palm.lua") +dofile(modpath.."/cocos_palm.lua") +dofile(modpath.."/biome_defs.lua") +dofile(modpath.."/saplings.lua") +dofile(modpath.."/crafts.lua") + +-- tree spawning setup + +if moretrees.spawn_saplings then + moretrees.spawn_beech_object = "moretrees:beech_sapling_ongen" + moretrees.spawn_apple_tree_object = "moretrees:apple_tree_sapling_ongen" + moretrees.spawn_oak_object = "moretrees:oak_sapling_ongen" + moretrees.spawn_sequoia_object = "moretrees:sequoia_sapling_ongen" + moretrees.spawn_palm_object = "moretrees:palm_sapling_ongen" + moretrees.spawn_date_palm_object = "moretrees:date_palm_sapling_ongen" + moretrees.spawn_cedar_object = "moretrees:cedar_sapling_ongen" + moretrees.spawn_rubber_tree_object = "moretrees:rubber_tree_sapling_ongen" + moretrees.spawn_willow_object = "moretrees:willow_sapling_ongen" + moretrees.spawn_birch_object = "moretrees:birch_sapling_ongen" + moretrees.spawn_spruce_object = "moretrees:spruce_sapling_ongen" + moretrees.spawn_jungletree_object = "moretrees:jungletree_sapling_ongen" + moretrees.spawn_fir_object = "moretrees:fir_sapling_ongen" + moretrees.spawn_fir_snow_object = "snow:sapling_pine" + moretrees.spawn_poplar_object = "moretrees:poplar_sapling_ongen" + moretrees.spawn_poplar_small_object = "moretrees:poplar_small_sapling_ongen" +else + moretrees.spawn_beech_object = moretrees.beech_model + moretrees.spawn_apple_tree_object = moretrees.apple_tree_model + moretrees.spawn_oak_object = moretrees.oak_model + moretrees.spawn_sequoia_object = moretrees.sequoia_model + moretrees.spawn_palm_object = moretrees.palm_model + moretrees.spawn_date_palm_object = moretrees.date_palm_model + moretrees.spawn_cedar_object = moretrees.cedar_model + moretrees.spawn_rubber_tree_object = moretrees.rubber_tree_model + moretrees.spawn_willow_object = moretrees.willow_model + moretrees.spawn_birch_object = "moretrees.grow_birch" + moretrees.spawn_spruce_object = "moretrees.grow_spruce" + moretrees.spawn_jungletree_object = "moretrees.grow_jungletree" + moretrees.spawn_fir_object = "moretrees.grow_fir" + moretrees.spawn_fir_snow_object = "moretrees.grow_fir_snow" + moretrees.spawn_poplar_object = moretrees.poplar_model + moretrees.spawn_poplar_small_object = moretrees.poplar_small_model +end + +if moretrees.enable_beech then + biome_lib:register_generate_plant(moretrees.beech_biome, moretrees.spawn_beech_object) +end + +if moretrees.enable_apple_tree then + biome_lib:register_generate_plant(moretrees.apple_tree_biome, moretrees.spawn_apple_tree_object) +end + +if moretrees.enable_oak then + biome_lib:register_generate_plant(moretrees.oak_biome, moretrees.spawn_oak_object) +end + +if moretrees.enable_sequoia then + biome_lib:register_generate_plant(moretrees.sequoia_biome, moretrees.spawn_sequoia_object) +end + +if moretrees.enable_palm then + biome_lib:register_generate_plant(moretrees.palm_biome, moretrees.spawn_palm_object) +end + +if moretrees.enable_date_palm then + biome_lib:register_generate_plant(moretrees.date_palm_biome, moretrees.spawn_date_palm_object) + biome_lib:register_generate_plant(moretrees.date_palm_biome_2, moretrees.spawn_date_palm_object) +end + +if moretrees.enable_cedar then + biome_lib:register_generate_plant(moretrees.cedar_biome, moretrees.spawn_cedar_object) +end + +if moretrees.enable_rubber_tree then + biome_lib:register_generate_plant(moretrees.rubber_tree_biome, moretrees.spawn_rubber_tree_object) +end + +if moretrees.enable_willow then + biome_lib:register_generate_plant(moretrees.willow_biome, moretrees.spawn_willow_object) +end + +if moretrees.enable_birch then + biome_lib:register_generate_plant(moretrees.birch_biome, moretrees.spawn_birch_object) +end + +if moretrees.enable_spruce then + biome_lib:register_generate_plant(moretrees.spruce_biome, moretrees.spawn_spruce_object) +end + +if moretrees.enable_jungle_tree then + biome_lib:register_generate_plant(moretrees.jungletree_biome, moretrees.spawn_jungletree_object) +end + +if moretrees.enable_fir then + biome_lib:register_generate_plant(moretrees.fir_biome, moretrees.spawn_fir_object) + if minetest.get_modpath("snow") then + biome_lib:register_generate_plant(moretrees.fir_biome_snow, moretrees.spawn_fir_snow_object) + end +end + +if moretrees.enable_poplar then + biome_lib:register_generate_plant(moretrees.poplar_biome, moretrees.spawn_poplar_object) + biome_lib:register_generate_plant(moretrees.poplar_biome_2, moretrees.spawn_poplar_object) + biome_lib:register_generate_plant(moretrees.poplar_biome_3, moretrees.spawn_poplar_object) + biome_lib:register_generate_plant(moretrees.poplar_small_biome, moretrees.spawn_poplar_small_object) + biome_lib:register_generate_plant(moretrees.poplar_small_biome_2, moretrees.spawn_poplar_small_object) +end + +-- Code to spawn a birch tree + +function moretrees.grow_birch(pos) + minetest.swap_node(pos, biome_lib.air) + if math.random(1,2) == 1 then + minetest.spawn_tree(pos, moretrees.birch_model1) + else + minetest.spawn_tree(pos, moretrees.birch_model2) + end +end + +-- Code to spawn a spruce tree + +function moretrees.grow_spruce(pos) + minetest.swap_node(pos, biome_lib.air) + if math.random(1,2) == 1 then + minetest.spawn_tree(pos, moretrees.spruce_model1) + else + minetest.spawn_tree(pos, moretrees.spruce_model2) + end +end + +-- Code to spawn jungle trees + +moretrees.jt_axiom1 = "FFFA" +moretrees.jt_rules_a1 = "FFF[&&-FBf[&&&Ff]^^^Ff][&&+FBFf[&&&FFf]^^^Ff][&&---FBFf[&&&Ff]^^^Ff][&&+++FBFf[&&&Ff]^^^Ff]F/A" +moretrees.jt_rules_b1 = "[-Ff&f][+Ff&f]B" + +moretrees.jt_axiom2 = "FFFFFA" +moretrees.jt_rules_a2 = "FFFFF[&&-FFFBF[&&&FFff]^^^FFf][&&+FFFBFF[&&&FFff]^^^FFf][&&---FFFBFF[&&&FFff]^^^FFf][&&+++FFFBFF[&&&FFff]^^^FFf]FF/A" +moretrees.jt_rules_b2 = "[-FFf&ff][+FFf&ff]B" + +moretrees.ct_rules_a1 = "FF[FF][&&-FBF][&&+FBF][&&---FBF][&&+++FBF]F/A" +moretrees.ct_rules_b1 = "[-FBf][+FBf]" + +moretrees.ct_rules_a2 = "FF[FF][&&-FBF][&&+FBF][&&---FBF][&&+++FBF]F/A" +moretrees.ct_rules_b2 = "[-fB][+fB]" + +function moretrees.grow_jungletree(pos) + local r1 = math.random(2) + local r2 = math.random(3) + if r1 == 1 then + moretrees.jungletree_model.leaves2 = "moretrees:jungletree_leaves_red" + else + moretrees.jungletree_model.leaves2 = "moretrees:jungletree_leaves_yellow" + end + moretrees.jungletree_model.leaves2_chance = math.random(25, 75) + + if r2 == 1 then + moretrees.jungletree_model.trunk_type = "single" + moretrees.jungletree_model.iterations = 2 + moretrees.jungletree_model.axiom = moretrees.jt_axiom1 + moretrees.jungletree_model.rules_a = moretrees.jt_rules_a1 + moretrees.jungletree_model.rules_b = moretrees.jt_rules_b1 + elseif r2 == 2 then + moretrees.jungletree_model.trunk_type = "double" + moretrees.jungletree_model.iterations = 4 + moretrees.jungletree_model.axiom = moretrees.jt_axiom2 + moretrees.jungletree_model.rules_a = moretrees.jt_rules_a2 + moretrees.jungletree_model.rules_b = moretrees.jt_rules_b2 + elseif r2 == 3 then + moretrees.jungletree_model.trunk_type = "crossed" + moretrees.jungletree_model.iterations = 4 + moretrees.jungletree_model.axiom = moretrees.jt_axiom2 + moretrees.jungletree_model.rules_a = moretrees.jt_rules_a2 + moretrees.jungletree_model.rules_b = moretrees.jt_rules_b2 + end + + minetest.swap_node(pos, biome_lib.air) + local leaves = minetest.find_nodes_in_area({x = pos.x-1, y = pos.y, z = pos.z-1}, {x = pos.x+1, y = pos.y+10, z = pos.z+1}, "default:leaves") + for leaf in ipairs(leaves) do + minetest.swap_node(leaves[leaf], biome_lib.air) + end + minetest.spawn_tree(pos, moretrees.jungletree_model) +end + +-- code to spawn fir trees + +function moretrees.grow_fir(pos) + if math.random(2) == 1 then + moretrees.fir_model.leaves="moretrees:fir_leaves" + else + moretrees.fir_model.leaves="moretrees:fir_leaves_bright" + end + if math.random(2) == 1 then + moretrees.fir_model.rules_a = moretrees.ct_rules_a1 + moretrees.fir_model.rules_b = moretrees.ct_rules_b1 + else + moretrees.fir_model.rules_a = moretrees.ct_rules_a2 + moretrees.fir_model.rules_b = moretrees.ct_rules_b2 + end + + moretrees.fir_model.iterations = 7 + moretrees.fir_model.random_level = 5 + + minetest.swap_node(pos, biome_lib.air) + local leaves = minetest.find_nodes_in_area({x = pos.x, y = pos.y, z = pos.z}, {x = pos.x, y = pos.y+5, z = pos.z}, "default:leaves") + for leaf in ipairs(leaves) do + minetest.swap_node(leaves[leaf], biome_lib.air) + end + minetest.spawn_tree(pos,moretrees.fir_model) +end + +-- same thing, but a smaller version that grows only in snow biomes + +function moretrees.grow_fir_snow(pos) + if math.random(2) == 1 then + moretrees.fir_model.leaves="moretrees:fir_leaves" + else + moretrees.fir_model.leaves="moretrees:fir_leaves_bright" + end + if math.random(2) == 1 then + moretrees.fir_model.rules_a = moretrees.ct_rules_a1 + moretrees.fir_model.rules_b = moretrees.ct_rules_b1 + else + moretrees.fir_model.rules_a = moretrees.ct_rules_a2 + moretrees.fir_model.rules_b = moretrees.ct_rules_b2 + end + + moretrees.fir_model.iterations = 2 + moretrees.fir_model.random_level = 2 + + minetest.swap_node(pos, biome_lib.air) + local leaves = minetest.find_nodes_in_area({x = pos.x, y = pos.y, z = pos.z}, {x = pos.x, y = pos.y+5, z = pos.z}, "default:leaves") + for leaf in ipairs(leaves) do + minetest.swap_node(leaves[leaf], biome_lib.air) + end + minetest.spawn_tree(pos,moretrees.fir_model) +end + +print("[Moretrees] Loaded (2013-02-11)") diff --git a/mods/moretrees/locale/moretrees.de.tr b/mods/moretrees/locale/moretrees.de.tr new file mode 100644 index 00000000..10980d62 --- /dev/null +++ b/mods/moretrees/locale/moretrees.de.tr @@ -0,0 +1,211 @@ +# textdomain: moretrees +# Translation by Xanthin + + +### cocos_palm.lua ### + +Coconut=Kokosnuss +Coconut Flower= + +### crafts.lua ### + +Acorn Muffin=Eichelmuffin +Acorn Muffin batter=Eichelmuffinteig +Coconut Milk=Kokosnussmilch +Date= +Date & nut snack= +Date-nut cake= +Date-nut cake batter= +Date-nut energy bar= +Raw Coconut=Kokosnussfleisch +Roasted Cedar Cone Nuts= +Roasted Fir Cone Nuts=Geroestete Tannenzapfen +Roasted Spruce Cone Nuts=Geroestete Fichtenzapfen + +### date_palm.lua ### + +Date Flowers= +Date Stem= +Dates= + +### node_defs.lua ### + +@1 (fast growth)= +Acorn=Eichel +Apple Tree= +Apple Tree Fence= +Apple Tree Fence Gate= +Apple Tree Fence Rail= +Apple Tree Leaves=Apfelbaumlaub +Apple Tree Planks=Apfelbaumbretter +Apple Tree Planks Slab= +Apple Tree Planks Stair= +Apple Tree Sapling=Apfelbaumsetzling +Apple Tree Trunk=Apfelbaumstamm +Apple Tree Trunk Slab= +Apple Tree Trunk Stair= +Beech Tree= +Beech Tree Fence= +Beech Tree Fence Gate= +Beech Tree Fence Rail= +Beech Tree Leaves=Buchenlaub +Beech Tree Planks=Buchebretter +Beech Tree Planks Slab= +Beech Tree Planks Stair= +Beech Tree Sapling=Buchesetzling +Beech Tree Trunk=Buchenstamm +Beech Tree Trunk Slab= +Beech Tree Trunk Stair= +Birch Tree= +Birch Tree Fence= +Birch Tree Fence Gate= +Birch Tree Fence Rail= +Birch Tree Leaves=Birkenlaub +Birch Tree Planks=Birkebretter +Birch Tree Planks Slab= +Birch Tree Planks Stair= +Birch Tree Sapling=Birkensetzling +Birch Tree Trunk=Birkenstamm +Birch Tree Trunk Slab= +Birch Tree Trunk Stair= +Cedar Cone= +Cedar Tree= +Cedar Tree Fence= +Cedar Tree Fence Gate= +Cedar Tree Fence Rail= +Cedar Tree Leaves= +Cedar Tree Planks= +Cedar Tree Planks Slab= +Cedar Tree Planks Stair= +Cedar Tree Sapling= +Cedar Tree Trunk= +Cedar Tree Trunk Slab= +Cedar Tree Trunk Stair= +Date Palm Tree= +Date Palm Tree Fence= +Date Palm Tree Fence Gate= +Date Palm Tree Fence Rail= +Date Palm Tree Leaves= +Date Palm Tree Planks= +Date Palm Tree Planks Slab= +Date Palm Tree Planks Stair= +Date Palm Tree Sapling= +Date Palm Tree Trunk= +Date Palm Tree Trunk Slab= +Date Palm Tree Trunk Stair= +Douglas Fir= +Douglas Fir Fence= +Douglas Fir Fence Gate= +Douglas Fir Fence Rail= +Douglas Fir Leaves=Douglasiennadeln +Douglas Fir Leaves (Bright)=Douglasiennadeln (breit) +Douglas Fir Planks=Douglasienbretter +Douglas Fir Planks Slab= +Douglas Fir Planks Stair= +Douglas Fir Sapling=Douglasiensetzling +Douglas Fir Trunk=Douglasienstamm +Douglas Fir Trunk Slab= +Douglas Fir Trunk Stair= +Fir Cone=Tannenzapfen +Giant Sequoia= +Giant Sequoia Fence= +Giant Sequoia Fence Gate= +Giant Sequoia Fence Rail= +Giant Sequoia Leaves=Riesenmammutbaumlaub +Giant Sequoia Planks=Riesenmammutbaumbretter +Giant Sequoia Planks Slab= +Giant Sequoia Planks Stair= +Giant Sequoia Sapling=Riesenmammutbaumsetzling +Giant Sequoia Trunk=Riesenmammutbaumstamm +Giant Sequoia Trunk Slab= +Giant Sequoia Trunk Stair= +Jungle Tree= +Jungle Tree Fence= +Jungle Tree Fence Gate= +Jungle Tree Fence Rail= +Jungle Tree Leaves=Tropenbaumlaub +Jungle Tree Leaves (@1)=Tropenbaumlaub (@1) +Jungle Tree Planks=Tropenholzbretter +Jungle Tree Planks Slab= +Jungle Tree Planks Stair= +Jungle Tree Sapling=Tropenbaumsetzling +Jungle Tree Trunk=Tropenbaumstamm +Jungle Tree Trunk Slab= +Jungle Tree Trunk Stair= +Oak Tree= +Oak Tree Fence= +Oak Tree Fence Gate= +Oak Tree Fence Rail= +Oak Tree Leaves=Eichenlaub +Oak Tree Planks=Eichenbretter +Oak Tree Planks Slab= +Oak Tree Planks Stair= +Oak Tree Sapling=Eichensetzling +Oak Tree Trunk=Eichenstamm +Oak Tree Trunk Slab= +Oak Tree Trunk Stair= +Palm Tree= +Palm Tree Fence= +Palm Tree Fence Gate= +Palm Tree Fence Rail= +Palm Tree Leaves=Palmenlaub +Palm Tree Planks=Palmenbretter +Palm Tree Planks Slab= +Palm Tree Planks Stair= +Palm Tree Sapling=Palmensetzling +Palm Tree Trunk=Palmenstamm +Palm Tree Trunk Slab= +Palm Tree Trunk Stair= +Poplar Tree= +Poplar Tree Fence= +Poplar Tree Fence Gate= +Poplar Tree Fence Rail= +Poplar Tree Leaves= +Poplar Tree Planks= +Poplar Tree Planks Slab= +Poplar Tree Planks Stair= +Poplar Tree Sapling= +Poplar Tree Trunk= +Poplar Tree Trunk Slab= +Poplar Tree Trunk Stair= +Red=rot +Rubber Tree= +Rubber Tree Fence= +Rubber Tree Fence Gate= +Rubber Tree Fence Rail= +Rubber Tree Leaves=Gummibaumlaub +Rubber Tree Planks=Gummibaumbretter +Rubber Tree Planks Slab= +Rubber Tree Planks Stair= +Rubber Tree Sapling=Gummibaumsetzling +Rubber Tree Trunk=Gummibaumstamm +Rubber Tree Trunk (Empty)=Gummibaumstamm (leer) +Rubber Tree Trunk Slab= +Rubber Tree Trunk Stair= +Small poplar Tree Sapling= +Spruce Cone=Fichtenzapfen +Spruce Tree= +Spruce Tree Fence= +Spruce Tree Fence Gate= +Spruce Tree Fence Rail= +Spruce Tree Leaves=Fichtennadeln +Spruce Tree Planks=Fichtenbretter +Spruce Tree Planks Slab= +Spruce Tree Planks Stair= +Spruce Tree Sapling=Fichtensetzling +Spruce Tree Trunk=Fichtenstamm +Spruce Tree Trunk Slab= +Spruce Tree Trunk Stair= +Willow Tree= +Willow Tree Fence= +Willow Tree Fence Gate= +Willow Tree Fence Rail= +Willow Tree Leaves=Weidenlaub +Willow Tree Planks=Weidenbretter +Willow Tree Planks Slab= +Willow Tree Planks Stair= +Willow Tree Sapling=Weidensetzling +Willow Tree Trunk=Weidenstamm +Willow Tree Trunk Slab= +Willow Tree Trunk Stair= +Yellow=gelb diff --git a/mods/moretrees/locale/moretrees.es.tr b/mods/moretrees/locale/moretrees.es.tr new file mode 100644 index 00000000..ccdb42a2 --- /dev/null +++ b/mods/moretrees/locale/moretrees.es.tr @@ -0,0 +1,211 @@ +# textdomain: moretrees +# Translation by Carlos Barraza + + +### cocos_palm.lua ### + +Coconut=Coco +Coconut Flower= + +### crafts.lua ### + +Acorn Muffin=Mollete de Bellota +Acorn Muffin batter= Masa de Mollete de Bellota +Coconut Milk=Leche de Coco +Date=Datilera +Date & nut snack=Datilera y Nueces +Date-nut cake=Pastel de Datilera +Date-nut cake batter=Pasta de torta de Datilera +Date-nut energy bar=Barra energetica de Datilera +Raw Coconut=Coco crudo +Roasted Cedar Cone Nuts=Coco de Alamo Tostado +Roasted Fir Cone Nuts=Cono de Abeto Tostado +Roasted Spruce Cone Nuts=Cono de Picea Tostado + +### date_palm.lua ### + +Date Flowers=Flores de Datilera +Date Stem=Tallo de Datilera +Dates=Datilera + +### node_defs.lua ### + +@1 (fast growth)= +Acorn=Bellota +Apple Tree= +Apple Tree Fence= +Apple Tree Fence Gate= +Apple Tree Fence Rail= +Apple Tree Leaves=Hojas de Arbol de Manzana +Apple Tree Planks=Madera de Arbol de Manzana +Apple Tree Planks Slab= +Apple Tree Planks Stair= +Apple Tree Sapling=Retoño de Arbol de Manzana +Apple Tree Trunk=Tronco de Arbol de Manzana +Apple Tree Trunk Slab= +Apple Tree Trunk Stair= +Beech Tree= +Beech Tree Fence= +Beech Tree Fence Gate= +Beech Tree Fence Rail= +Beech Tree Leaves=Hojas de Arbol de Haya +Beech Tree Planks=Madera de Arbol de Haya +Beech Tree Planks Slab= +Beech Tree Planks Stair= +Beech Tree Sapling=Retoño de Arbol de Haya +Beech Tree Trunk=Tronco de Arbol de Haya +Beech Tree Trunk Slab= +Beech Tree Trunk Stair= +Birch Tree= +Birch Tree Fence= +Birch Tree Fence Gate= +Birch Tree Fence Rail= +Birch Tree Leaves=Hojas de Arbol de Abedul +Birch Tree Planks=Madera de Arbol de Abedul +Birch Tree Planks Slab= +Birch Tree Planks Stair= +Birch Tree Sapling=Retoño de Arbol de Abedul +Birch Tree Trunk=Tronco de Arbol de Abedul +Birch Tree Trunk Slab= +Birch Tree Trunk Stair= +Cedar Cone=Coco de Alamo +Cedar Tree= +Cedar Tree Fence= +Cedar Tree Fence Gate= +Cedar Tree Fence Rail= +Cedar Tree Leaves=Hojas de Arbol de Cedro +Cedar Tree Planks=Madera de Arbol de Cedro +Cedar Tree Planks Slab= +Cedar Tree Planks Stair= +Cedar Tree Sapling=Retoño de Arbol de Cedro +Cedar Tree Trunk=Tronco de Arbol de Cedro +Cedar Tree Trunk Slab= +Cedar Tree Trunk Stair= +Date Palm Tree= +Date Palm Tree Fence= +Date Palm Tree Fence Gate= +Date Palm Tree Fence Rail= +Date Palm Tree Leaves= +Date Palm Tree Planks=Madera de Palmera Datilera +Date Palm Tree Planks Slab= +Date Palm Tree Planks Stair= +Date Palm Tree Sapling= +Date Palm Tree Trunk=Tronco de Palmera Datilera +Date Palm Tree Trunk Slab= +Date Palm Tree Trunk Stair= +Douglas Fir= +Douglas Fir Fence= +Douglas Fir Fence Gate= +Douglas Fir Fence Rail= +Douglas Fir Leaves=Hojas de Arbol de Abeto de Douglas +Douglas Fir Leaves (Bright)=Hojas de Arbol de Abeto de Douglas (Brillante) +Douglas Fir Planks=Madera de Arbol de Abeto de Douglas +Douglas Fir Planks Slab= +Douglas Fir Planks Stair= +Douglas Fir Sapling=Retoño de Arbol de Abeto de Douglas +Douglas Fir Trunk=Tronco de Arbol de Abeto de Douglas +Douglas Fir Trunk Slab= +Douglas Fir Trunk Stair= +Fir Cone=Coco de Abeto +Giant Sequoia= +Giant Sequoia Fence= +Giant Sequoia Fence Gate= +Giant Sequoia Fence Rail= +Giant Sequoia Leaves=Hojas de Sequoia Gigante +Giant Sequoia Planks=Madera de Sequoia Gigante +Giant Sequoia Planks Slab= +Giant Sequoia Planks Stair= +Giant Sequoia Sapling=Retoño de Arbol de Sequoia Gigante +Giant Sequoia Trunk=Tronco de Sequoia Gigante +Giant Sequoia Trunk Slab= +Giant Sequoia Trunk Stair= +Jungle Tree=Tronco de Arbol de Arbol de la Selva +Jungle Tree Fence= +Jungle Tree Fence Gate= +Jungle Tree Fence Rail= +Jungle Tree Leaves=Hojas de Arbol de la Selva +Jungle Tree Leaves (@1)=Hojas de Arbol de la Selva (@1) +Jungle Tree Planks= +Jungle Tree Planks Slab= +Jungle Tree Planks Stair= +Jungle Tree Sapling= +Jungle Tree Trunk= +Jungle Tree Trunk Slab= +Jungle Tree Trunk Stair= +Oak Tree= +Oak Tree Fence= +Oak Tree Fence Gate= +Oak Tree Fence Rail= +Oak Tree Leaves=Hojas de Arbol de Roble +Oak Tree Planks=Madera de Arbol de Roble +Oak Tree Planks Slab= +Oak Tree Planks Stair= +Oak Tree Sapling=Retoño de Arbol de Roble +Oak Tree Trunk=Tronco de Arbol de Roble +Oak Tree Trunk Slab= +Oak Tree Trunk Stair= +Palm Tree= +Palm Tree Fence= +Palm Tree Fence Gate= +Palm Tree Fence Rail= +Palm Tree Leaves=Hojas de Palmera +Palm Tree Planks=Madera de Palmera +Palm Tree Planks Slab= +Palm Tree Planks Stair= +Palm Tree Sapling=Retoño de Palmera +Palm Tree Trunk=Tronco de Palmera +Palm Tree Trunk Slab= +Palm Tree Trunk Stair= +Poplar Tree= +Poplar Tree Fence= +Poplar Tree Fence Gate= +Poplar Tree Fence Rail= +Poplar Tree Leaves=Hojas de Arbol de Alamo +Poplar Tree Planks=Madera de Arbol de Alamo +Poplar Tree Planks Slab= +Poplar Tree Planks Stair= +Poplar Tree Sapling=Retoño de Arbol de Alamo +Poplar Tree Trunk=Tronco de Arbol de Alamo +Poplar Tree Trunk Slab= +Poplar Tree Trunk Stair= +Red=Roja +Rubber Tree= +Rubber Tree Fence= +Rubber Tree Fence Gate= +Rubber Tree Fence Rail= +Rubber Tree Leaves=Hojas de Arbol de Arbol de Goma +Rubber Tree Planks=Madera de Arbol de Arbol de Goma +Rubber Tree Planks Slab= +Rubber Tree Planks Stair= +Rubber Tree Sapling=Retoño de Arbol de Arbol de Goma +Rubber Tree Trunk=Tronco de Arbol de Arbol de Goma +Rubber Tree Trunk (Empty)=Tronco de Arbol de Goma (Vacio) +Rubber Tree Trunk Slab= +Rubber Tree Trunk Stair= +Small poplar Tree Sapling= +Spruce Cone=Coco de Picea +Spruce Tree= +Spruce Tree Fence= +Spruce Tree Fence Gate= +Spruce Tree Fence Rail= +Spruce Tree Leaves=Hojas de Arbol de Abeto +Spruce Tree Planks=Madera de Arbol de Abeto +Spruce Tree Planks Slab= +Spruce Tree Planks Stair= +Spruce Tree Sapling=Retoño de Arbol de Abeto +Spruce Tree Trunk=Tronco de Arbol de Abeto +Spruce Tree Trunk Slab= +Spruce Tree Trunk Stair= +Willow Tree= +Willow Tree Fence= +Willow Tree Fence Gate= +Willow Tree Fence Rail= +Willow Tree Leaves=Hojas de Arbol de Sauce +Willow Tree Planks=Madera de Arbol de Sauce +Willow Tree Planks Slab= +Willow Tree Planks Stair= +Willow Tree Sapling=Retoño de Arbol de Sauce +Willow Tree Trunk=Tronco de Arbol de Sauce +Willow Tree Trunk Slab= +Willow Tree Trunk Stair= +Yellow=Amarilla diff --git a/mods/moretrees/locale/moretrees.fr.tr b/mods/moretrees/locale/moretrees.fr.tr new file mode 100644 index 00000000..09058f34 --- /dev/null +++ b/mods/moretrees/locale/moretrees.fr.tr @@ -0,0 +1,211 @@ +# textdomain: moretrees +# Translation by Yoan31 and Louis Royer + + +### cocos_palm.lua ### + +Coconut=Noix de coco +Coconut Flower=Fleur de coco + +### crafts.lua ### + +Acorn Muffin=Muffins au gland +Acorn Muffin batter=Pate à muffins au Gland +Coconut Milk=Lait de coco +Date=Datte +Date & nut snack=Collation aux dattes et aux noix +Date-nut cake=Gâteau datte-noix +Date-nut cake batter=Pâte à gâteau datte-noix +Date-nut energy bar=Barre énergétique datte-noix +Raw Coconut=Noix de coco crue +Roasted Cedar Cone Nuts=Noix de pomme de pin roties +Roasted Fir Cone Nuts=Noix de cône de sapin roties +Roasted Spruce Cone Nuts=Noix de cône de sapin roties + +### date_palm.lua ### + +Date Flowers=Fleurs de datte +Date Stem=Tige de datte +Dates=Dattes + +### node_defs.lua ### + +@1 (fast growth)=@1 (croissance rapide) +Acorn=Gland +Apple Tree=Pommier +Apple Tree Fence=Barrière en bois de pommier +Apple Tree Fence Gate=Porte de clôture en bois de pommier +Apple Tree Fence Rail=Clôture en bois de pommier +Apple Tree Leaves=Feuilles de pommier +Apple Tree Planks=Planches de pommier +Apple Tree Planks Slab=Dalle en bois de pommier +Apple Tree Planks Stair=Escaliers en bois de pommier +Apple Tree Sapling=Pousse d'arbre de pommier +Apple Tree Trunk=Tronc d'arbre de pommier +Apple Tree Trunk Slab=Dalle en tronc de pommier +Apple Tree Trunk Stair=Escalier en tronc de pommier +Beech Tree=Hêtre +Beech Tree Fence=Barrière en bois de hêtre +Beech Tree Fence Gate=Porte de clôture en bois de hêtre +Beech Tree Fence Rail=Clôture en bois de hêtre +Beech Tree Leaves=Feuilles de hêtre +Beech Tree Planks=Planches de hêtre +Beech Tree Planks Slab=Dalle en bois de hêtre +Beech Tree Planks Stair=Escalier en bois de hêtre +Beech Tree Sapling=Pousse d'arbre de hêtre +Beech Tree Trunk=Tronc d'arbre de hêtre +Beech Tree Trunk Slab=Dalle en tronc de hêtre +Beech Tree Trunk Stair=Escalier en tronc de hêtre +Birch Tree=Bouleau +Birch Tree Fence=Barrière en bois de bouleau +Birch Tree Fence Gate=Porte de clôture en bois de bouleau +Birch Tree Fence Rail=Clôture en bois de bouleau +Birch Tree Leaves=Feuilles de bouleau +Birch Tree Planks=Planches d'arbre de bouleau +Birch Tree Planks Slab=Dalle en bois de bouleau +Birch Tree Planks Stair=Escalier en bois de bouleau +Birch Tree Sapling=Pousse d'arbre de bouleau +Birch Tree Trunk=Tronc d'arbre de bouleau +Birch Tree Trunk Slab=Dalle en tronc de bouleau +Birch Tree Trunk Stair=Escalier en tronc de bouleau +Cedar Cone=Pomme de pin +Cedar Tree=Pin +Cedar Tree Fence=Barrière en bois de pin +Cedar Tree Fence Gate=Porte de clôture en bois de pin +Cedar Tree Fence Rail=Clôture en bois de pin +Cedar Tree Leaves=Feuilles de pin +Cedar Tree Planks=Planches d'arbre de pin +Cedar Tree Planks Slab=Dalle en bois de pin +Cedar Tree Planks Stair=Escalier en bois de pin +Cedar Tree Sapling=Pousse d'arbre de pin +Cedar Tree Trunk=Tronc d'arbre de pin +Cedar Tree Trunk Slab=Dalle en tronc de pin +Cedar Tree Trunk Stair=Escalier en tronc de pin +Date Palm Tree=Dattier +Date Palm Tree Fence=Barrière en bois de dattier +Date Palm Tree Fence Gate=Porte de clôture en bois de dattier +Date Palm Tree Fence Rail=Clôture en bois de dattier +Date Palm Tree Leaves=Feuille de dattier +Date Palm Tree Planks=Planches de dattier +Date Palm Tree Planks Slab=Dalle en bois de dattier +Date Palm Tree Planks Stair=Escalier en bois de dattier +Date Palm Tree Sapling=Pousse de dattier +Date Palm Tree Trunk=Tronc de dattier +Date Palm Tree Trunk Slab=Dalle en tronc de dattier +Date Palm Tree Trunk Stair=Escalier en tronc de dattier +Douglas Fir=Sapin de Douglas +Douglas Fir Fence=Barrière en bois de sapin de Douglas +Douglas Fir Fence Gate=Porte de clôture en bois de sapin de Douglas +Douglas Fir Fence Rail=Clôture en bois de sapin de Douglas +Douglas Fir Leaves=Feuilles de sapin de Douglas +Douglas Fir Leaves (Bright)=Feuille de sapin de Douglas (brillant) +Douglas Fir Planks=Planches de sapin de Douglas +Douglas Fir Planks Slab=Dalle en bois de sapin de Douglas +Douglas Fir Planks Stair=Escalier en bois de sapin de Douglas +Douglas Fir Sapling=Pousse de sapin de Douglas +Douglas Fir Trunk=Tronc de sapin de Douglas +Douglas Fir Trunk Slab=Dalle en tronc de sapin de Douglas +Douglas Fir Trunk Stair=Escalier en tronc de sapin de Douglas +Fir Cone=Pomme de sapin +Giant Sequoia=Séquoia géant +Giant Sequoia Fence=Barrière en bois de séquoia géant +Giant Sequoia Fence Gate=Porte de clôture en bois de séquoia géant +Giant Sequoia Fence Rail=Clôture en bois de séquoia géant +Giant Sequoia Leaves=Feuilles de séquoia géant +Giant Sequoia Planks=Planches de séquoia géant +Giant Sequoia Planks Slab=Dalle en bois de séquoia géant +Giant Sequoia Planks Stair=Escalier en bois de séquoia géant +Giant Sequoia Sapling=Pousse de séquoia géant +Giant Sequoia Trunk=Tronc de séquoia géant +Giant Sequoia Trunk Slab=Dalle en tronc de séquoia géant +Giant Sequoia Trunk Stair=Escalier en tronc de séquoia géant +Jungle Tree=Arbre de la jungle +Jungle Tree Fence=Barrière en bois d'arbre de la jungle +Jungle Tree Fence Gate=Porte de clôture en bois d'arbre de la jungle +Jungle Tree Fence Rail=Clôture en bois d'arbre de la jungle +Jungle Tree Leaves=Feuilles d'arbre de la jungle +Jungle Tree Leaves (@1)=Feuilles d'arbre de la jungle (@1) +Jungle Tree Planks=Planches d'arbre de la jungle +Jungle Tree Planks Slab=Dalle en bois d'arbre de la jungle +Jungle Tree Planks Stair=Escalier en bois d'arbre de la jungle +Jungle Tree Sapling=Pousse d'arbre de la jungle +Jungle Tree Trunk=Tronc d'arbre de la jungle +Jungle Tree Trunk Slab=Dalle en tronc d'arbre de la jungle +Jungle Tree Trunk Stair=Escalier en tronc d'arbre de la jungle +Oak Tree=Chêne +Oak Tree Fence=Barrière en bois de chêne +Oak Tree Fence Gate=Porte de clôture en bois de chêne +Oak Tree Fence Rail=Clôture en bois de chêne +Oak Tree Leaves=Feuilles de chêne +Oak Tree Planks=Planches de chêne +Oak Tree Planks Slab=Dalle en bois de chêne +Oak Tree Planks Stair=Escalier en bois de chêne +Oak Tree Sapling=Pousse d'arbre de chêne +Oak Tree Trunk=Tronc d'arbre de chêne +Oak Tree Trunk Slab=Dalle en tronc de chêne +Oak Tree Trunk Stair=Escalier en tronc de chêne +Palm Tree=Palmier +Palm Tree Fence=Barrière en bois de palmier +Palm Tree Fence Gate=Porte de clôture en bois de palmier +Palm Tree Fence Rail=Clôture en bois de palmier +Palm Tree Leaves=Feuilles de palmier +Palm Tree Planks=Planches de palmier +Palm Tree Planks Slab=Dalle en bois de palmier +Palm Tree Planks Stair=Escalier en bois de palmier +Palm Tree Sapling=Pousse d'arbre de palmier +Palm Tree Trunk=Tronc d'arbre de palmier +Palm Tree Trunk Slab=Dalle en tronc de palmier +Palm Tree Trunk Stair=Escalier en tronc de palmier +Poplar Tree=Peuplier +Poplar Tree Fence=Barrière en bois de peuplier +Poplar Tree Fence Gate=Porte de clôture en bois de peuplier +Poplar Tree Fence Rail=Clôture en bois de peuplier +Poplar Tree Leaves=Feuilles de peuplier +Poplar Tree Planks=Plances de peuplier +Poplar Tree Planks Slab=Dalle en bois de peuplier +Poplar Tree Planks Stair=Escalier en bois de peuplier +Poplar Tree Sapling=Pousse de peuplier +Poplar Tree Trunk=Tronc de peuplier +Poplar Tree Trunk Slab=Dalle en tronc de peuplier +Poplar Tree Trunk Stair=Escalier en tronc de peuplier +Red=rouge +Rubber Tree=Arbre à caoutchouc +Rubber Tree Fence=Barrière en bois d'arbre à caoutchouc +Rubber Tree Fence Gate=Porte de clôture en bois d'arbre à caoutchouc +Rubber Tree Fence Rail=Clôture en bois d'arbre à caoutchouc +Rubber Tree Leaves=Feuilles d'arbre à caoutchouc +Rubber Tree Planks=Planches d'arbre à caoutchouc +Rubber Tree Planks Slab=Dalle en bois d'arbre à caoutchouc +Rubber Tree Planks Stair=Escalier en bois d'arbre à caoutchouc +Rubber Tree Sapling=Pousse d'arbre à caoutchouc +Rubber Tree Trunk=Tronc d'arbre a caoutchouc +Rubber Tree Trunk (Empty)=Tronc d'arbre à caoutchouc (vide) +Rubber Tree Trunk Slab=Dalle en tronc d'arbre à caoutchouc +Rubber Tree Trunk Stair=Escalier en tronc d'arbre à caoutchouc +Small poplar Tree Sapling=Pousse de petit peuplier +Spruce Cone=Cône de sapin +Spruce Tree=Épicéa +Spruce Tree Fence=Barrière en bois d'épicéa +Spruce Tree Fence Gate=Porte de clôture en bois d'épicéa +Spruce Tree Fence Rail=Clôture en bois d'épicéa +Spruce Tree Leaves=Feuilles d'épicéa +Spruce Tree Planks=Planches d'arbre d'épicéa +Spruce Tree Planks Slab=Dalle en bois d'épicéa +Spruce Tree Planks Stair=Escalier en bois d'épicéa +Spruce Tree Sapling=Pousse d'arbre d'épicéa +Spruce Tree Trunk=Tronc d'arbre d'épicéa +Spruce Tree Trunk Slab=Dalle en tronc d'épicéa +Spruce Tree Trunk Stair=Escalier en tronc d'épicéa +Willow Tree=Saule +Willow Tree Fence=Barrière en bois de saule +Willow Tree Fence Gate=Porte de clôture en bois de saule +Willow Tree Fence Rail=Clôture en bois de saule +Willow Tree Leaves=Feuilles de saule +Willow Tree Planks=Planches de saule +Willow Tree Planks Slab=Dalle en bois de saule +Willow Tree Planks Stair=Escalier en bois de saule +Willow Tree Sapling=Pousse de saule +Willow Tree Trunk=Tronc d'arbre de saule +Willow Tree Trunk Slab=Dalle en tronc de saule +Willow Tree Trunk Stair=Escalier en tronc de saule +Yellow=jaune diff --git a/mods/moretrees/locale/template.txt b/mods/moretrees/locale/template.txt new file mode 100644 index 00000000..bac4da7d --- /dev/null +++ b/mods/moretrees/locale/template.txt @@ -0,0 +1,210 @@ +# textdomain: moretrees + + +### cocos_palm.lua ### + +Coconut= +Coconut Flower= + +### crafts.lua ### + +Acorn Muffin= +Acorn Muffin batter= +Coconut Milk= +Date= +Date & nut snack= +Date-nut cake= +Date-nut cake batter= +Date-nut energy bar= +Raw Coconut= +Roasted Cedar Cone Nuts= +Roasted Fir Cone Nuts= +Roasted Spruce Cone Nuts= + +### date_palm.lua ### + +Date Flowers= +Date Stem= +Dates= + +### node_defs.lua ### + +@1 (fast growth)= +Acorn= +Apple Tree= +Apple Tree Fence= +Apple Tree Fence Gate= +Apple Tree Fence Rail= +Apple Tree Leaves= +Apple Tree Planks= +Apple Tree Planks Slab= +Apple Tree Planks Stair= +Apple Tree Sapling= +Apple Tree Trunk= +Apple Tree Trunk Slab= +Apple Tree Trunk Stair= +Beech Tree= +Beech Tree Fence= +Beech Tree Fence Gate= +Beech Tree Fence Rail= +Beech Tree Leaves= +Beech Tree Planks= +Beech Tree Planks Slab= +Beech Tree Planks Stair= +Beech Tree Sapling= +Beech Tree Trunk= +Beech Tree Trunk Slab= +Beech Tree Trunk Stair= +Birch Tree= +Birch Tree Fence= +Birch Tree Fence Gate= +Birch Tree Fence Rail= +Birch Tree Leaves= +Birch Tree Planks= +Birch Tree Planks Slab= +Birch Tree Planks Stair= +Birch Tree Sapling= +Birch Tree Trunk= +Birch Tree Trunk Slab= +Birch Tree Trunk Stair= +Cedar Cone= +Cedar Tree= +Cedar Tree Fence= +Cedar Tree Fence Gate= +Cedar Tree Fence Rail= +Cedar Tree Leaves= +Cedar Tree Planks= +Cedar Tree Planks Slab= +Cedar Tree Planks Stair= +Cedar Tree Sapling= +Cedar Tree Trunk= +Cedar Tree Trunk Slab= +Cedar Tree Trunk Stair= +Date Palm Tree= +Date Palm Tree Fence= +Date Palm Tree Fence Gate= +Date Palm Tree Fence Rail= +Date Palm Tree Leaves= +Date Palm Tree Planks= +Date Palm Tree Planks Slab= +Date Palm Tree Planks Stair= +Date Palm Tree Sapling= +Date Palm Tree Trunk= +Date Palm Tree Trunk Slab= +Date Palm Tree Trunk Stair= +Douglas Fir= +Douglas Fir Fence= +Douglas Fir Fence Gate= +Douglas Fir Fence Rail= +Douglas Fir Leaves= +Douglas Fir Leaves (Bright)= +Douglas Fir Planks= +Douglas Fir Planks Slab= +Douglas Fir Planks Stair= +Douglas Fir Sapling= +Douglas Fir Trunk= +Douglas Fir Trunk Slab= +Douglas Fir Trunk Stair= +Fir Cone= +Giant Sequoia= +Giant Sequoia Fence= +Giant Sequoia Fence Gate= +Giant Sequoia Fence Rail= +Giant Sequoia Leaves= +Giant Sequoia Planks= +Giant Sequoia Planks Slab= +Giant Sequoia Planks Stair= +Giant Sequoia Sapling= +Giant Sequoia Trunk= +Giant Sequoia Trunk Slab= +Giant Sequoia Trunk Stair= +Jungle Tree= +Jungle Tree Fence= +Jungle Tree Fence Gate= +Jungle Tree Fence Rail= +Jungle Tree Leaves= +Jungle Tree Leaves (@1)= +Jungle Tree Planks= +Jungle Tree Planks Slab= +Jungle Tree Planks Stair= +Jungle Tree Sapling= +Jungle Tree Trunk= +Jungle Tree Trunk Slab= +Jungle Tree Trunk Stair= +Oak Tree= +Oak Tree Fence= +Oak Tree Fence Gate= +Oak Tree Fence Rail= +Oak Tree Leaves= +Oak Tree Planks= +Oak Tree Planks Slab= +Oak Tree Planks Stair= +Oak Tree Sapling= +Oak Tree Trunk= +Oak Tree Trunk Slab= +Oak Tree Trunk Stair= +Palm Tree= +Palm Tree Fence= +Palm Tree Fence Gate= +Palm Tree Fence Rail= +Palm Tree Leaves= +Palm Tree Planks= +Palm Tree Planks Slab= +Palm Tree Planks Stair= +Palm Tree Sapling= +Palm Tree Trunk= +Palm Tree Trunk Slab= +Palm Tree Trunk Stair= +Poplar Tree= +Poplar Tree Fence= +Poplar Tree Fence Gate= +Poplar Tree Fence Rail= +Poplar Tree Leaves= +Poplar Tree Planks= +Poplar Tree Planks Slab= +Poplar Tree Planks Stair= +Poplar Tree Sapling= +Poplar Tree Trunk= +Poplar Tree Trunk Slab= +Poplar Tree Trunk Stair= +Red= +Rubber Tree= +Rubber Tree Fence= +Rubber Tree Fence Gate= +Rubber Tree Fence Rail= +Rubber Tree Leaves= +Rubber Tree Planks= +Rubber Tree Planks Slab= +Rubber Tree Planks Stair= +Rubber Tree Sapling= +Rubber Tree Trunk= +Rubber Tree Trunk (Empty)= +Rubber Tree Trunk Slab= +Rubber Tree Trunk Stair= +Small poplar Tree Sapling= +Spruce Cone= +Spruce Tree= +Spruce Tree Fence= +Spruce Tree Fence Gate= +Spruce Tree Fence Rail= +Spruce Tree Leaves= +Spruce Tree Planks= +Spruce Tree Planks Slab= +Spruce Tree Planks Stair= +Spruce Tree Sapling= +Spruce Tree Trunk= +Spruce Tree Trunk Slab= +Spruce Tree Trunk Stair= +Willow Tree= +Willow Tree Fence= +Willow Tree Fence Gate= +Willow Tree Fence Rail= +Willow Tree Leaves= +Willow Tree Planks= +Willow Tree Planks Slab= +Willow Tree Planks Stair= +Willow Tree Sapling= +Willow Tree Trunk= +Willow Tree Trunk Slab= +Willow Tree Trunk Stair= +Yellow= diff --git a/mods/moretrees/mod.conf b/mods/moretrees/mod.conf new file mode 100644 index 00000000..da7e4932 --- /dev/null +++ b/mods/moretrees/mod.conf @@ -0,0 +1,4 @@ +name = moretrees +depends = default, biome_lib, vessels +optional_depends = doors, stairs, moreblocks, farming +min_minetest_version = 5.2.0 diff --git a/mods/moretrees/node_defs.lua b/mods/moretrees/node_defs.lua new file mode 100644 index 00000000..bdc4a2b4 --- /dev/null +++ b/mods/moretrees/node_defs.lua @@ -0,0 +1,743 @@ +local S = minetest.get_translator("moretrees") + +moretrees.avoidnodes = {} + +moretrees.treelist = { + {"beech", S("Beech Tree")}, + {"apple_tree", S("Apple Tree")}, + {"oak", S("Oak Tree"), "acorn", S("Acorn"), {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 }, + {"sequoia", S("Giant Sequoia")}, + {"birch", S("Birch Tree")}, + {"palm", S("Palm Tree"), "palm_fruit_trunk_gen", S("Palm Tree"), {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 1.0 }, + {"date_palm", S("Date Palm Tree"), "date_palm_fruit_trunk", S("Date Palm Tree"), {0, 0, 0, 0, 0, 0}, 0.0 }, + {"spruce", S("Spruce Tree"), "spruce_cone", S("Spruce Cone"), {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 }, + {"cedar", S("Cedar Tree"), "cedar_cone", S("Cedar Cone"), {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 }, + {"poplar", S("Poplar Tree")}, + {"poplar_small", S("Poplar Tree")}, + {"willow", S("Willow Tree")}, + {"rubber_tree", S("Rubber Tree")}, + {"fir", S("Douglas Fir"), "fir_cone", S("Fir Cone"), {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 }, + {"jungletree", S("Jungle Tree"), nil, nil, nil, nil, "default_junglesapling.png" }, +} + +moretrees.treedesc = { + beech = { + trunk = S("Beech Tree Trunk"), + planks = S("Beech Tree Planks"), + sapling = S("Beech Tree Sapling"), + leaves = S("Beech Tree Leaves"), + trunk_stair = S("Beech Tree Trunk Stair"), + trunk_slab = S("Beech Tree Trunk Slab"), + planks_stair = S("Beech Tree Planks Stair"), + planks_slab = S("Beech Tree Planks Slab"), + fence = S("Beech Tree Fence"), + fence_rail = S("Beech Tree Fence Rail"), + fence_gate = S("Beech Tree Fence Gate"), + }, + apple_tree = { + trunk = S("Apple Tree Trunk"), + planks = S("Apple Tree Planks"), + sapling = S("Apple Tree Sapling"), + leaves = S("Apple Tree Leaves"), + trunk_stair = S("Apple Tree Trunk Stair"), + trunk_slab = S("Apple Tree Trunk Slab"), + planks_stair = S("Apple Tree Planks Stair"), + planks_slab = S("Apple Tree Planks Slab"), + fence = S("Apple Tree Fence"), + fence_rail = S("Apple Tree Fence Rail"), + fence_gate = S("Apple Tree Fence Gate"), + }, + oak = { + trunk = S("Oak Tree Trunk"), + planks = S("Oak Tree Planks"), + sapling = S("Oak Tree Sapling"), + leaves = S("Oak Tree Leaves"), + trunk_stair = S("Oak Tree Trunk Stair"), + trunk_slab = S("Oak Tree Trunk Slab"), + planks_stair = S("Oak Tree Planks Stair"), + planks_slab = S("Oak Tree Planks Slab"), + fence = S("Oak Tree Fence"), + fence_rail = S("Oak Tree Fence Rail"), + fence_gate = S("Oak Tree Fence Gate"), + }, + sequoia = { + trunk = S("Giant Sequoia Trunk"), + planks = S("Giant Sequoia Planks"), + sapling = S("Giant Sequoia Sapling"), + leaves = S("Giant Sequoia Leaves"), + trunk_stair = S("Giant Sequoia Trunk Stair"), + trunk_slab = S("Giant Sequoia Trunk Slab"), + planks_stair = S("Giant Sequoia Planks Stair"), + planks_slab = S("Giant Sequoia Planks Slab"), + fence = S("Giant Sequoia Fence"), + fence_rail = S("Giant Sequoia Fence Rail"), + fence_gate = S("Giant Sequoia Fence Gate"), + }, + birch = { + trunk = S("Birch Tree Trunk"), + planks = S("Birch Tree Planks"), + sapling = S("Birch Tree Sapling"), + leaves = S("Birch Tree Leaves"), + trunk_stair = S("Birch Tree Trunk Stair"), + trunk_slab = S("Birch Tree Trunk Slab"), + planks_stair = S("Birch Tree Planks Stair"), + planks_slab = S("Birch Tree Planks Slab"), + fence = S("Birch Tree Fence"), + fence_rail = S("Birch Tree Fence Rail"), + fence_gate = S("Birch Tree Fence Gate"), + }, + palm = { + trunk = S("Palm Tree Trunk"), + planks = S("Palm Tree Planks"), + sapling = S("Palm Tree Sapling"), + leaves = S("Palm Tree Leaves"), + trunk_stair = S("Palm Tree Trunk Stair"), + trunk_slab = S("Palm Tree Trunk Slab"), + planks_stair = S("Palm Tree Planks Stair"), + planks_slab = S("Palm Tree Planks Slab"), + fence = S("Palm Tree Fence"), + fence_rail = S("Palm Tree Fence Rail"), + fence_gate = S("Palm Tree Fence Gate"), + }, + date_palm = { + trunk = S("Date Palm Tree Trunk"), + planks = S("Date Palm Tree Planks"), + sapling = S("Date Palm Tree Sapling"), + leaves = S("Date Palm Tree Leaves"), + trunk_stair = S("Date Palm Tree Trunk Stair"), + trunk_slab = S("Date Palm Tree Trunk Slab"), + planks_stair = S("Date Palm Tree Planks Stair"), + planks_slab = S("Date Palm Tree Planks Slab"), + fence = S("Date Palm Tree Fence"), + fence_rail = S("Date Palm Tree Fence Rail"), + fence_gate = S("Date Palm Tree Fence Gate"), + }, + spruce = { + trunk = S("Spruce Tree Trunk"), + planks = S("Spruce Tree Planks"), + sapling = S("Spruce Tree Sapling"), + leaves = S("Spruce Tree Leaves"), + trunk_stair = S("Spruce Tree Trunk Stair"), + trunk_slab = S("Spruce Tree Trunk Slab"), + planks_stair = S("Spruce Tree Planks Stair"), + planks_slab = S("Spruce Tree Planks Slab"), + fence = S("Spruce Tree Fence"), + fence_rail = S("Spruce Tree Fence Rail"), + fence_gate = S("Spruce Tree Fence Gate"), + }, + cedar = { + trunk = S("Cedar Tree Trunk"), + planks = S("Cedar Tree Planks"), + sapling = S("Cedar Tree Sapling"), + leaves = S("Cedar Tree Leaves"), + trunk_stair = S("Cedar Tree Trunk Stair"), + trunk_slab = S("Cedar Tree Trunk Slab"), + planks_stair = S("Cedar Tree Planks Stair"), + planks_slab = S("Cedar Tree Planks Slab"), + fence = S("Cedar Tree Fence"), + fence_rail = S("Cedar Tree Fence Rail"), + fence_gate = S("Cedar Tree Fence Gate"), + }, + poplar = { + trunk = S("Poplar Tree Trunk"), + planks = S("Poplar Tree Planks"), + sapling = S("Poplar Tree Sapling"), + leaves = S("Poplar Tree Leaves"), + trunk_stair = S("Poplar Tree Trunk Stair"), + trunk_slab = S("Poplar Tree Trunk Slab"), + planks_stair = S("Poplar Tree Planks Stair"), + planks_slab = S("Poplar Tree Planks Slab"), + fence = S("Poplar Tree Fence"), + fence_rail = S("Poplar Tree Fence Rail"), + fence_gate = S("Poplar Tree Fence Gate"), + }, + poplar_small = { + sapling = S("Small poplar Tree Sapling"), + }, + willow = { + trunk = S("Willow Tree Trunk"), + planks = S("Willow Tree Planks"), + sapling = S("Willow Tree Sapling"), + leaves = S("Willow Tree Leaves"), + trunk_stair = S("Willow Tree Trunk Stair"), + trunk_slab = S("Willow Tree Trunk Slab"), + planks_stair = S("Willow Tree Planks Stair"), + planks_slab = S("Willow Tree Planks Slab"), + fence = S("Willow Tree Fence"), + fence_rail = S("Willow Tree Fence Rail"), + fence_gate = S("Willow Tree Fence Gate"), + }, + rubber_tree = { + trunk = S("Rubber Tree Trunk"), + planks = S("Rubber Tree Planks"), + sapling = S("Rubber Tree Sapling"), + leaves = S("Rubber Tree Leaves"), + trunk_stair = S("Rubber Tree Trunk Stair"), + trunk_slab = S("Rubber Tree Trunk Slab"), + planks_stair = S("Rubber Tree Planks Stair"), + planks_slab = S("Rubber Tree Planks Slab"), + fence = S("Rubber Tree Fence"), + fence_rail = S("Rubber Tree Fence Rail"), + fence_gate = S("Rubber Tree Fence Gate"), + }, + fir = { + trunk = S("Douglas Fir Trunk"), + planks = S("Douglas Fir Planks"), + sapling = S("Douglas Fir Sapling"), + leaves = S("Douglas Fir Leaves"), + trunk_stair = S("Douglas Fir Trunk Stair"), + trunk_slab = S("Douglas Fir Trunk Slab"), + planks_stair = S("Douglas Fir Planks Stair"), + planks_slab = S("Douglas Fir Planks Slab"), + fence = S("Douglas Fir Fence"), + fence_rail = S("Douglas Fir Fence Rail"), + fence_gate = S("Douglas Fir Fence Gate"), + }, + jungletree = { + trunk = S("Jungle Tree Trunk"), + planks = S("Jungle Tree Planks"), + sapling = S("Jungle Tree Sapling"), + leaves = S("Jungle Tree Leaves"), + trunk_stair = S("Jungle Tree Trunk Stair"), + trunk_slab = S("Jungle Tree Trunk Slab"), + planks_stair = S("Jungle Tree Planks Stair"), + planks_slab = S("Jungle Tree Planks Slab"), + fence = S("Jungle Tree Fence"), + fence_rail = S("Jungle Tree Fence Rail"), + fence_gate = S("Jungle Tree Fence Gate"), + }, +} + + +-- local dirs1 = { 21, 20, 23, 22, 21 } +local dirs2 = { 12, 9, 18, 7, 12 } +-- local dirs3 = { 14, 11, 16, 5, 14 } + +local moretrees_new_leaves_drawtype = "allfaces_optional" +local moretrees_plantlike_leaves_visual_scale = 1 + +if moretrees.plantlike_leaves then + moretrees_new_leaves_drawtype = "plantlike" + moretrees_plantlike_leaves_visual_scale = math.sqrt(2) +end + +-- redefine default leaves to handle plantlike and/or leaf decay options + +if moretrees.plantlike_leaves then + minetest.override_item("default:leaves", { + inventory_image = minetest.inventorycube("default_leaves.png"), + drawtype = "plantlike", + visual_scale = math.sqrt(2) + }) +end + +-- redefine default jungle leaves for same + +if moretrees.plantlike_leaves then + minetest.override_item("default:jungleleaves", { + inventory_image = minetest.inventorycube("default_jungleleaves.png"), + drawtype = "plantlike", + visual_scale = math.sqrt(2) + }) +end + +for i in ipairs(moretrees.treelist) do + local treename = moretrees.treelist[i][1] + local fruit = moretrees.treelist[i][3] + local fruitdesc = moretrees.treelist[i][4] + local selbox = moretrees.treelist[i][5] + local vscale = moretrees.treelist[i][6] + + local saptex = moretrees.treelist[i][7] + + -- player will get a sapling with 1/100 chance + -- player will get leaves only if he/she gets no saplings, + -- this is because max_items is 1 + + local droprarity = 100 + local decay = moretrees.leafdecay_radius + + if treename == "palm" then + droprarity = 20 + decay = moretrees.palm_leafdecay_radius + elseif treename == "date_palm" then + decay = moretrees.palm_leafdecay_radius + end + + if treename ~= "jungletree" -- the default game provides jungle tree and pine trunk/planks nodes. + and treename ~= "poplar_small" + and treename ~= "pine" then + + saptex = "moretrees_"..treename.."_sapling.png" + + minetest.register_node("moretrees:"..treename.."_trunk", { + description = moretrees.treedesc[treename].trunk, + tiles = { + "moretrees_"..treename.."_trunk_top.png", + "moretrees_"..treename.."_trunk_top.png", + "moretrees_"..treename.."_trunk.png" + }, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree=1,snappy=1,choppy=2,oddly_breakable_by_hand=1,flammable=2}, + sounds = default.node_sound_wood_defaults(), + on_place = minetest.rotate_node, + }) + + minetest.register_node("moretrees:"..treename.."_planks", { + description = moretrees.treedesc[treename].planks, + tiles = {"moretrees_"..treename.."_wood.png"}, + is_ground_content = false, + groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, + sounds = default.node_sound_wood_defaults(), + }) + + minetest.register_node("moretrees:"..treename.."_sapling", { + description = moretrees.treedesc[treename].sapling, + drawtype = "plantlike", + tiles = {saptex}, + inventory_image = saptex, + paramtype = "light", + paramtype2 = "waving", + walkable = false, + is_ground_content = true, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} + }, + groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1}, + sounds = default.node_sound_defaults(), + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "moretrees:" ..treename.. "_sapling", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -3, y = 1, z = -3}, + {x = 3, y = 6, z = 3}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, + }) + + local moretrees_leaves_inventory_image = nil + local moretrees_new_leaves_waving = nil + + if moretrees.plantlike_leaves then + moretrees_leaves_inventory_image = minetest.inventorycube("moretrees_"..treename.."_leaves.png") + else + moretrees_new_leaves_waving = 1 + end + + minetest.register_node("moretrees:"..treename.."_leaves", { + description = moretrees.treedesc[treename].leaves, + drawtype = moretrees_new_leaves_drawtype, + waving = moretrees_new_leaves_waving, + visual_scale = moretrees_plantlike_leaves_visual_scale, + tiles = { "moretrees_"..treename.."_leaves.png" }, + inventory_image = moretrees_leaves_inventory_image, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, flammable = 2, leaves = 1, moretrees_leaves = 1, leafdecay = 1}, + sounds = default.node_sound_leaves_defaults(), + + drop = { + max_items = 1, + items = { + {items = {"moretrees:"..treename.."_sapling"}, rarity = droprarity }, + {items = {"moretrees:"..treename.."_leaves"} } + } + }, + }) + + if moretrees.enable_stairs then + if minetest.get_modpath("moreblocks") then + + -- stairsplus:register_all(modname, subname, recipeitem, {fields}) + + stairsplus:register_all( + "moretrees", + treename.."_trunk", + "moretrees:"..treename.."_trunk", + { + groups = { snappy=1, choppy=2, oddly_breakable_by_hand=1, flammable=2, not_in_creative_inventory=1 }, + tiles = { + "moretrees_"..treename.."_trunk_top.png", + "moretrees_"..treename.."_trunk_top.png", + "moretrees_"..treename.."_trunk.png" + }, + description = moretrees.treedesc[treename].trunk, + drop = treename.."_trunk", + } + ) + + stairsplus:register_all( + "moretrees", + treename.."_planks", + "moretrees:"..treename.."_planks", + { + groups = { snappy=1, choppy=2, oddly_breakable_by_hand=2, flammable=3, not_in_creative_inventory=1 }, + tiles = { "moretrees_"..treename.."_wood.png" }, + description = moretrees.treedesc[treename].planks, + drop = treename.."_planks", + } + ) + elseif minetest.get_modpath("stairs") then + stairs.register_stair_and_slab( + "moretrees_"..treename.."_trunk", + "moretrees:"..treename.."_trunk", + { snappy=1, choppy=2, oddly_breakable_by_hand=1, flammable=2 }, + { "moretrees_"..treename.."_trunk_top.png", + "moretrees_"..treename.."_trunk_top.png", + "moretrees_"..treename.."_trunk.png" + }, + moretrees.treedesc[treename].trunk_stair, + moretrees.treedesc[treename].trunk_slab, + default.node_sound_wood_defaults() + ) + + stairs.register_stair_and_slab( + "moretrees_"..treename.."_planks", + "moretrees:"..treename.."_planks", + { snappy=1, choppy=2, oddly_breakable_by_hand=2, flammable=3 }, + { "moretrees_"..treename.."_wood.png" }, + moretrees.treedesc[treename].planks_stair, + moretrees.treedesc[treename].planks_slab, + default.node_sound_wood_defaults() + ) + + end + end + + if moretrees.enable_fences then + local planks_name = "moretrees:" .. treename .. "_planks" + local planks_tile = "moretrees_" .. treename .. "_wood.png" + default.register_fence("moretrees:" .. treename .. "_fence", { + description = moretrees.treedesc[treename].fence, + texture = planks_tile, + inventory_image = "default_fence_overlay.png^" .. planks_tile .. + "^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^" .. planks_tile .. + "^default_fence_overlay.png^[makealpha:255,126,126", + material = planks_name, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + }) + default.register_fence_rail("moretrees:" .. treename .. "_fence_rail", { + description = moretrees.treedesc[treename].fence_rail, + texture = planks_tile, + inventory_image = "default_fence_rail_overlay.png^" .. planks_tile .. + "^default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^" .. planks_tile .. + "^default_fence_rail_overlay.png^[makealpha:255,126,126", + material = planks_name, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + }) + if minetest.global_exists("doors") then + doors.register_fencegate("moretrees:" .. treename .. "_gate", { + description = moretrees.treedesc[treename].fence_gate, + texture = planks_tile, + material = planks_name, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2} + }) + end + end + end + + minetest.register_node("moretrees:"..treename.."_sapling_ongen", { + description = S("@1 (fast growth)", moretrees.treedesc[treename].sapling), + drawtype = "plantlike", + tiles = {saptex}, + inventory_image = saptex, + paramtype = "light", + paramtype2 = "waving", + walkable = false, + is_ground_content = true, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} + }, + groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1}, + sounds = default.node_sound_defaults(), + drop = "moretrees:"..treename.."_sapling", + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "moretrees:" ..treename.. "_sapling_ongen", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -3, y = 1, z = -3}, + {x = 3, y = 6, z = 3}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, + }) + + local fruitname = nil + if fruit then + fruitname = "moretrees:"..fruit + minetest.register_node(fruitname, { + description = fruitdesc, + drawtype = "plantlike", + tiles = { "moretrees_"..fruit..".png" }, + inventory_image = "moretrees_"..fruit..".png^[transformR180", + wield_image = "moretrees_"..fruit..".png^[transformR180", + visual_scale = vscale, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = selbox + }, + groups = {fleshy=3,dig_immediate=3,flammable=2, attached_node=1, leafdecay = 1, leafdecay_drop = 1}, + sounds = default.node_sound_defaults(), + }) + end + + if treename ~= "jungletree" + and treename ~= "poplar_small" + and treename ~= "pine" then + default.register_leafdecay({ + trunks = { "moretrees:"..treename.."_trunk" }, + leaves = { "moretrees:"..treename.."_leaves", fruitname }, + radius = decay, + }) + end + + minetest.register_abm({ + nodenames = { "moretrees:"..treename.."_trunk_sideways" }, + interval = 1, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + local fdir = node.param2 or 0 + local nfdir = dirs2[fdir+1] + minetest.add_node(pos, {name = "moretrees:"..treename.."_trunk", param2 = nfdir}) + end, + }) + + table.insert(moretrees.avoidnodes, "moretrees:"..treename.."_trunk") + + if moretrees.spawn_saplings then + table.insert(moretrees.avoidnodes, "moretrees:"..treename.."_sapling") + table.insert(moretrees.avoidnodes, "moretrees:"..treename.."_sapling_ongen") + end +end + +-- Add small poplar saplings + +local poplar_sapling = minetest.registered_nodes["moretrees:poplar_sapling"] +local poplar_sapling_ongen = minetest.registered_nodes["moretrees:poplar_sapling_ongen"] +local poplar_small_sapling = {} +local poplar_small_sapling_ongen = {} +for k,v in pairs(poplar_sapling) do + poplar_small_sapling[k] = v +end +for k,v in pairs(poplar_sapling_ongen) do + poplar_small_sapling_ongen[k] = v +end +poplar_small_sapling.tiles = {"moretrees_poplar_small_sapling.png"} +poplar_small_sapling.inventory_image = "moretrees_poplar_small_sapling.png" +poplar_small_sapling.is_ground_content = true +poplar_small_sapling_ongen.tiles_ongen = {"moretrees_poplar_small_sapling.png"} +poplar_small_sapling_ongen.inventory_image_ongen = "moretrees_poplar_small_sapling.png" +poplar_small_sapling_ongen.drop = "moretrees:poplar_small_sapling" +poplar_small_sapling_ongen.is_ground_content = true + +minetest.register_node("moretrees:poplar_small_sapling", poplar_small_sapling) +minetest.register_node("moretrees:poplar_small_sapling_ongen", poplar_small_sapling_ongen) +if moretrees.spawn_saplings then + table.insert(moretrees.avoidnodes, "moretrees:poplar_sapling") + table.insert(moretrees.avoidnodes, "moretrees:poplar_small_sapling_ongen") +end + +local poplar_leaves_drop = minetest.registered_nodes["moretrees:poplar_leaves"].drop +minetest.override_item("moretrees:poplar_leaves", { + drop = { + max_items = poplar_leaves_drop.maxitems, + items = { + {items = {"moretrees:poplar_sapling"}, rarity = 1.33 * poplar_leaves_drop.items[1].rarity }, + {items = {"moretrees:poplar_small_sapling"}, rarity = 1.33 * poplar_leaves_drop.items[1].rarity }, + {items = {"moretrees:poplar_leaves"} } + } + } +}) + +-- Extra nodes for jungle trees: + +local jungleleaves = {"yellow","red"} +local jungleleavesnames = {S("Yellow"), S("Red")} +for color = 1, #jungleleaves do + local leave_name = "moretrees:jungletree_leaves_"..jungleleaves[color] + + local moretrees_leaves_inventory_image = nil + + if moretrees.plantlike_leaves then + moretrees_leaves_inventory_image = minetest.inventorycube("moretrees_jungletree_leaves_"..jungleleaves[color]..".png") + else + moretrees_new_leaves_waving = 1 + end + + minetest.register_node(leave_name, { + description = S("Jungle Tree Leaves (@1)", jungleleavesnames[color]), + drawtype = moretrees_new_leaves_drawtype, + waving = moretrees_new_leaves_waving, + visual_scale = moretrees_plantlike_leaves_visual_scale, + tiles = {"moretrees_jungletree_leaves_"..jungleleaves[color]..".png"}, + inventory_image = moretrees_leaves_inventory_image, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, flammable = 2, leaves = 1, moretrees_leaves = 1, leafdecay = 3 }, + drop = { + max_items = 1, + items = { + {items = {"default:junglesapling"}, rarity = 100 }, + {items = {"moretrees:jungletree_leaves_"..jungleleaves[color]} } + } + }, + sounds = default.node_sound_leaves_defaults(), + }) +end + +-- To get Moretrees to generate its own jungle trees among the default mapgen +-- we need our own copy of that node, which moretrees will match against. + +local jungle_tree = table.copy(minetest.registered_nodes["default:jungletree"]) +jungle_tree.drop = "default:jungletree" +minetest.register_node("moretrees:jungletree_trunk", jungle_tree) + +default.register_leafdecay({ + trunks = { "default:jungletree", "moretrees:jungletree_trunk" }, + leaves = { "default:jungleleaves", "moretrees:jungletree_leaves_yellow", "moretrees:jungletree_leaves_red" }, + radius = moretrees.leafdecay_radius, +}) + +-- Extra needles for firs + +local moretrees_leaves_inventory_image = nil + +if moretrees.plantlike_leaves then + moretrees_leaves_inventory_image = minetest.inventorycube("moretrees_fir_leaves_bright.png") +end + +minetest.register_node("moretrees:fir_leaves_bright", { + drawtype = moretrees_new_leaves_drawtype, + waving = moretrees_new_leaves_waving, + visual_scale = moretrees_plantlike_leaves_visual_scale, + description = S("Douglas Fir Leaves (Bright)"), + tiles = { "moretrees_fir_leaves_bright.png" }, + inventory_image = moretrees_leaves_inventory_image, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, flammable = 2, leaves = 1, moretrees_leaves = 1, leafdecay = 3 }, + drop = { + max_items = 1, + items = { + {items = {'moretrees:fir_sapling'}, rarity = 100 }, + {items = {'moretrees:fir_leaves_bright'} } + } + }, + sounds = default.node_sound_leaves_defaults() +}) + +default.register_leafdecay({ + trunks = { "moretrees:fir_trunk" }, + leaves = { "moretrees:fir_leaves", "moretrees:fir_leaves_bright" }, + radius = moretrees.leafdecay_radius, +}) + + +if moretrees.enable_redefine_apple then + local appledef = table.copy(minetest.registered_nodes["default:apple"]) + appledef.groups.attached_node = 1 + minetest.register_node(":default:apple", appledef) +end + +table.insert(moretrees.avoidnodes, "default:jungletree") +table.insert(moretrees.avoidnodes, "default:pine_tree") +table.insert(moretrees.avoidnodes, "default:acacia_tree") +table.insert(moretrees.avoidnodes, "moretrees:fir_trunk") +table.insert(moretrees.avoidnodes, "default:tree") + +if moretrees.spawn_saplings then + table.insert(moretrees.avoidnodes, "snow:sapling_pine") + table.insert(moretrees.avoidnodes, "default:junglesapling") + table.insert(moretrees.avoidnodes, "default:pine_sapling") +end + +-- "empty" (tapped) rubber tree nodes + +minetest.register_node("moretrees:rubber_tree_trunk_empty", { + description = S("Rubber Tree Trunk (Empty)"), + tiles = { + "moretrees_rubber_tree_trunk_top.png", + "moretrees_rubber_tree_trunk_top.png", + "moretrees_rubber_tree_trunk_empty.png" + }, + groups = {tree=1,snappy=1,choppy=2,oddly_breakable_by_hand=1,flammable=2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + is_ground_content = false, + on_place = minetest.rotate_node, +}) + +minetest.register_abm({ + nodenames = { "moretrees:rubber_tree_trunk_empty_sideways" }, + interval = 1, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + local fdir = node.param2 or 0 + local nfdir = dirs2[fdir+1] + minetest.add_node(pos, {name = "moretrees:rubber_tree_trunk_empty", param2 = nfdir}) + end, +}) + +-- For compatibility with old nodes, recently-changed nodes, and default nodes + +minetest.register_alias("technic:rubber_tree_full", "moretrees:rubber_tree_trunk") +minetest.register_alias("farming_plus:rubber_tree_full", "moretrees:rubber_tree_trunk") +minetest.register_alias("farming:rubber_tree_full", "moretrees:rubber_tree_trunk") + +minetest.register_alias("technic:rubber_leaves", "moretrees:rubber_tree_leaves") +minetest.register_alias("farming_plus:rubber_leaves", "moretrees:rubber_tree_leaves") +minetest.register_alias("farming:rubber_leaves", "moretrees:rubber_tree_leaves") + +minetest.register_alias("technic:rubber_tree_sapling", "moretrees:rubber_tree_sapling") +minetest.register_alias("farming_plus:rubber_sapling", "moretrees:rubber_tree_sapling") +minetest.register_alias("farming:rubber_sapling", "moretrees:rubber_tree_sapling") + +minetest.register_alias("moretrees:conifer_trunk", "moretrees:fir_trunk") +minetest.register_alias("moretrees:conifer_trunk_sideways", "moretrees:fir_trunk_sideways") +minetest.register_alias("moretrees:conifer_leaves", "moretrees:fir_leaves") +minetest.register_alias("moretrees:conifer_leaves_bright", "moretrees:fir_leaves_bright") +minetest.register_alias("moretrees:conifer_sapling", "moretrees:fir_sapling") + +minetest.register_alias("conifers:trunk", "moretrees:fir_trunk") +minetest.register_alias("conifers:trunk_reversed", "moretrees:fir_trunk_sideways") +minetest.register_alias("conifers:leaves", "moretrees:fir_leaves") +minetest.register_alias("conifers:leaves_special", "moretrees:fir_leaves_bright") +minetest.register_alias("conifers:sapling", "moretrees:fir_sapling") + +minetest.register_alias("moretrees:jungletree_sapling", "default:junglesapling") +minetest.register_alias("moretrees:jungletree_trunk_sideways", "moreblocks:horizontal_jungle_tree") +minetest.register_alias("moretrees:jungletree_planks", "default:junglewood") +minetest.register_alias("moretrees:jungletree_leaves_green", "default:jungleleaves") + +minetest.register_alias("moretrees:acacia_trunk", "default:acacia_tree") +minetest.register_alias("moretrees:acacia_planks", "default:acacia_wood") +minetest.register_alias("moretrees:acacia_sapling", "default:acacia_sapling") +minetest.register_alias("moretrees:acacia_leaves", "default:acacia_leaves") + +minetest.register_alias("moretrees:pine_trunk", "moretrees:cedar_trunk") +minetest.register_alias("moretrees:pine_planks", "moretrees:cedar_planks") +minetest.register_alias("moretrees:pine_sapling", "moretrees:cedar_sapling") +minetest.register_alias("moretrees:pine_leaves", "moretrees:cedar_leaves") +minetest.register_alias("moretrees:pine_cone", "moretrees:cedar_cone") +minetest.register_alias("moretrees:pine_nuts", "moretrees:cedar_nuts") +minetest.register_alias("moretrees:pine_sapling_ongen", "moretrees:cedar_sapling_ongen") + +minetest.register_alias("moretrees:dates", "moretrees:dates_f4") diff --git a/mods/moretrees/saplings.lua b/mods/moretrees/saplings.lua new file mode 100644 index 00000000..72392754 --- /dev/null +++ b/mods/moretrees/saplings.lua @@ -0,0 +1,84 @@ +-- sapling growth +-- these tables only affect hand-placed saplings +-- mapgen-placed always use their biome def settings, which are much more +-- limited, in the interest of speed. + +local dirt_surfaces = { + set = true, + ["default:dirt"] = true, + ["default:dirt_with_grass"] = true, + ["default:dirt_with_dry_grass"] = true, + ["default:dirt_with_coniferous_litter"] = true, + ["default:dirt_with_rainforest_litter"] = true, + ["woodsoils:dirt_with_leaves_1"] = true, + ["woodsoils:dirt_with_leaves_2"] = true, + ["woodsoils:grass_with_leaves_1"] = true, + ["woodsoils:grass_with_leaves_2"] = true +} + +local conifer_surfaces = { + set = true, + ["default:dirt"] = true, + ["default:dirt_with_grass"] = true, + ["default:dirt_with_dry_grass"] = true, + ["default:dirt_with_coniferous_litter"] = true, + ["default:dirt_with_rainforest_litter"] = true, + ["woodsoils:dirt_with_leaves_1"] = true, + ["woodsoils:dirt_with_leaves_2"] = true, + ["woodsoils:grass_with_leaves_1"] = true, + ["woodsoils:grass_with_leaves_2"] = true, + ["default:dirt_with_snow"] = true +} + +local sand_surfaces = { + set = true, + ["default:sand"] = true, + ["default:desert_sand"] = true, + ["cottages:loam"] = true, + -- note, no silver sand here. + -- too cold for a palm, too... well... sandy for anything else. +} + +for i in ipairs(moretrees.treelist) do + local treename = moretrees.treelist[i][1] + local tree_model = treename.."_model" + local tree_biome = treename.."_biome" + local surfaces + local grow_function = moretrees[tree_model] + + if treename == "spruce" + or treename == "fir" + or treename == "cedar" + or treename == "pine" then + surfaces = conifer_surfaces + elseif string.find(treename, "palm") then + surfaces = sand_surfaces + else + surfaces = dirt_surfaces + end + + if treename == "spruce" + or treename == "fir" + or treename == "birch" + or treename == "jungletree" then + grow_function = "moretrees.grow_"..treename + end + + biome_lib:dbg(dump(moretrees[tree_biome].surface)) + + biome_lib:grow_plants({ + grow_delay = moretrees.sapling_interval, + grow_chance = moretrees.sapling_chance, + grow_plant = "moretrees:"..treename.."_sapling", + grow_nodes = surfaces, + grow_function = grow_function, + }) + + biome_lib:grow_plants({ + grow_delay = 2, + grow_chance = 1, + grow_plant = "moretrees:"..treename.."_sapling_ongen", + grow_nodes = surfaces, + grow_function = grow_function, + }) +end diff --git a/mods/moretrees/screenshot.lua b/mods/moretrees/screenshot.lua new file mode 100644 index 00000000..28a8c255 --- /dev/null +++ b/mods/moretrees/screenshot.lua @@ -0,0 +1,168 @@ +-- Usage: +-- - Create a new world +-- - Set world mapgen: v6 +-- - Set world seed: 2625051331357512570 +-- - Enable the moretrees mod +-- - Edit the moretrees source +-- - Disable all trees in default_settings.lua +-- - Recommended: make saplings grow fast in default_settings.lua: +-- sapling_interval = 5 +-- sapling_chance = 1 +-- - Apply the patch below to moretrees +-- (so that jungle trees are always large, and differently-colored): +-- use 'git apply --ignore-space-change' +-- - Make sure this file (you are reading) will be loaded when minetest starts ! +-- (e.g. add 'dofile(modpath.."/screenshot.lua")' to init.lua) +-- - Start minetest +-- - Goto 700,y,-280 (approximately) +-- - Make sure the world is loaded between x = 650 .. 780 and z = -350 .. -180 +-- - Give the chat command '/make-scene' +-- - Wait & walk/fly around until all trees have grown +-- - goto the platform at 780, 30, -277 +-- - Set the viewing range to 300, with fog enabled +-- - Take a screenshot. + +-- Patch to apply to moretrees +--[[ +diff --git a/init.lua b/init.lua +index 8189ffd..afd4644 100644 +--- a/init.lua ++++ b/init.lua +@@ -225,9 +225,12 @@ moretrees.ct_rules_b1 = "[-FBf][+FBf]" + moretrees.ct_rules_a2 = "FF[FF][&&-FBF][&&+FBF][&&---FBF][&&+++FBF]F/A" + moretrees.ct_rules_b2 = "[-fB][+fB]" + ++local jleaves = 1 + function moretrees.grow_jungletree(pos) + local r1 = math.random(2) + local r2 = math.random(3) ++ r1 = jleaves ++ jleaves = jleaves % 2 + 1 + if r1 == 1 then + moretrees.jungletree_model.leaves2 = "moretrees:jungletree_leaves_red" + else +@@ -235,6 +238,7 @@ function moretrees.grow_jungletree(pos) + end + moretrees.jungletree_model.leaves2_chance = math.random(25, 75) + ++ r2=3 + if r2 == 1 then + moretrees.jungletree_model.trunk_type = "single" + moretrees.jungletree_model.iterations = 2 +]] + + +minetest.register_chatcommand("make-scene", { + func = function() + minetest.place_node({x=780, y=30, z=-277}, {name="default:obsidian"}) + minetest.place_node({x=780, y=30, z=-278}, {name="default:obsidian"}) + minetest.place_node({x=781, y=30, z=-277}, {name="default:obsidian"}) + minetest.place_node({x=781, y=30, z=-278}, {name="default:obsidian"}) + minetest.place_node({x=781, y=30, z=-276}, {name="default:obsidian"}) + minetest.place_node({x=780, y=30, z=-276}, {name="default:obsidian"}) + + for z = -360, -300 do + local dy=2 + for x = 630 + (-z - 360)/3, 660 + (-z - 300)/3 do + for y = 5, 22 do + minetest.place_node({x=x, y=y, z=z}, {name="default:desert_stone"}) + end + for y = 23, 25 + dy do + minetest.place_node({x=x, y=y, z=z}, {name="default:desert_sand"}) + end + dy = 0 + end + end + + minetest.place_node({x=717, y=2, z=-298}, {name = "moretrees:palm_sapling"}) + minetest.place_node({x=713, y=2, z=-302}, {name = "moretrees:palm_sapling"}) + minetest.place_node({x=713, y=2, z=-307}, {name = "moretrees:palm_sapling"}) + minetest.place_node({x=717, y=2, z=-318}, {name = "moretrees:palm_sapling"}) + minetest.place_node({x=723, y=2, z=-320}, {name = "moretrees:palm_sapling"}) + + minetest.place_node({x=645, y=26, z=-314}, {name="moretrees:date_palm_sapling"}) + minetest.place_node({x=653, y=26, z=-322}, {name="moretrees:date_palm_sapling"}) + minetest.place_node({x=649, y=26, z=-334}, {name="moretrees:date_palm_sapling"}) + minetest.place_node({x=662, y=26, z=-342}, {name="moretrees:date_palm_sapling"}) + + minetest.place_node({x=672, y=5, z=-305}, {name="moretrees:oak_sapling"}) + minetest.place_node({x=690, y=6, z=-322}, {name="moretrees:oak_sapling"}) + minetest.place_node({x=695, y=7, z=-335}, {name="moretrees:oak_sapling"}) + minetest.place_node({x=699, y=4, z=-301}, {name="moretrees:oak_sapling"}) + + minetest.place_node({x=751, y=5, z=-254}, {name="moretrees:apple_tree_sapling"}) + minetest.place_node({x=729, y=3, z=-275}, {name="moretrees:apple_tree_sapling"}) + minetest.place_node({x=747, y=4, z=-270}, {name="moretrees:apple_tree_sapling"}) + + minetest.place_node({x=671, y=5, z=-283}, {name="default:junglesapling"}) + minetest.place_node({x=680, y=4, z=-287}, {name="default:junglesapling"}) + minetest.place_node({x=702, y=4, z=-288}, {name="default:junglesapling"}) + + minetest.place_node({x=646, y=12, z=-199}, {name="moretrees:spruce_sapling"}) + minetest.place_node({x=644, y=14, z=-177}, {name="moretrees:spruce_sapling"}) + minetest.place_node({x=678, y=9, z=-211}, {name="moretrees:spruce_sapling"}) + minetest.place_node({x=663, y=10, z=-215}, {name="moretrees:spruce_sapling"}) + + minetest.place_node({x=637, y=3, z=-263}, {name="moretrees:sequoia_sapling"}) + minetest.place_node({x=625, y=3, z=-250}, {name="moretrees:sequoia_sapling"}) + minetest.place_node({x=616, y=3, z=-233}, {name="moretrees:sequoia_sapling"}) + minetest.place_node({x=635, y=3, z=-276}, {name="moretrees:sequoia_sapling"}) + minetest.place_node({x=681, y=11, z=-260}, {name="moretrees:sequoia_sapling"}) + minetest.place_node({x=682, y=10, z=-247}, {name="moretrees:sequoia_sapling"}) + + minetest.place_node({x=737, y=7, z=-195}, {name="moretrees:cedar_sapling"}) + minetest.place_node({x=720, y=8, z=-189}, {name="moretrees:cedar_sapling"}) + minetest.place_node({x=704, y=7, z=-187}, {name="moretrees:cedar_sapling"}) + + minetest.place_node({x=731, y=2, z=-227}, {name="moretrees:poplar_sapling"}) + minetest.place_node({x=721, y=2, z=-233}, {name="moretrees:poplar_sapling"}) + minetest.place_node({x=712, y=1, z=-237}, {name="moretrees:poplar_sapling"}) + minetest.place_node({x=743, y=3, z=-228}, {name="moretrees:poplar_small_sapling"}) + minetest.place_node({x=750, y=3, z=-230}, {name="moretrees:poplar_small_sapling"}) + minetest.place_node({x=731, y=5, z=-233}, {name="moretrees:poplar_small_sapling"}) + + minetest.place_node({x=702, y=2, z=-274}, {name="moretrees:birch_sapling"}) + minetest.place_node({x=697, y=2, z=-271}, {name="moretrees:birch_sapling"}) + minetest.place_node({x=696, y=2, z=-264}, {name="moretrees:birch_sapling"}) + minetest.place_node({x=710, y=2, z=-265}, {name="moretrees:birch_sapling"}) + + minetest.place_node({x=707, y=8, z=-247}, {name="moretrees:fir_sapling"}) + minetest.place_node({x=699, y=10, z=-254}, {name="moretrees:fir_sapling"}) + minetest.place_node({x=729, y=5, z=-261}, {name="moretrees:fir_sapling"}) + minetest.place_node({x=732, y=5, z=-252}, {name="moretrees:fir_sapling"}) + minetest.place_node({x=741, y=4, z=-262}, {name="moretrees:fir_sapling"}) + + minetest.place_node({x=751, y=2, z=-286}, {name="moretrees:willow_sapling"}) + + minetest.place_node({x=760, y=5, z=-223}, {name="moretrees:rubber_tree_sapling"}) + minetest.place_node({x=762, y=5, z=-230}, {name="moretrees:rubber_tree_sapling"}) + minetest.place_node({x=766, y=5, z=-243}, {name="moretrees:rubber_tree_sapling"}) + minetest.place_node({x=764, y=6, z=-252}, {name="moretrees:rubber_tree_sapling"}) + end +}) + +--[[ +The following is a search/replace command suitable for vi (/vim) or sed, to convert minetest log +messages to equivalent lua commands: + +s/.*\(\(moretrees\|default\)[^ ]*\) at (\([-0-9]\+\),\([-0-9]\+\),\([-0-9]\+\)).*/\t\tminetest.place_node({x=\3, y=\4, z=\5}, {name="\1"})/ + +E.g. a minetest log line of the following kind: + 2016-07-03 11:30:50: ACTION[Server]: singleplayer places node moretrees:rubber_tree_sapling at (760,5,-223) +Becomes: + minetest.place_node({x=760, y=5, z=-223}, {name="moretrees:rubber_tree_sapling"}) +(Except that the example log line above has an extra space added, so it won't be converted) + +vi/vim users: Add the minetest log lines to this file, then enter the following command, with + replaced with the search/replace expression above. + :% + +sed users: Add the minetest log lines to this file, then execute the following command at the shell +prompt with replaced by the search/replace expression above. Don't forget the +single-quotes. + sed '' < screenshot.lua > screenshot-new.lua + +Windows users: You're probably out of luck. And the effort of doing such a thing is probably +larger anyway than the effort of copying an existing line and typing things manually. +]] + diff --git a/mods/moretrees/screenshot.png b/mods/moretrees/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..b9ab5de102f23b90876bfcc629d7e24b1f2b5ce2 GIT binary patch literal 103526 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 i$Ak=kB2`3*=>G>5*({>7zg02-0000Ug8;T zF7$R=!=zmEZ4KrpCYeWj3Y}3i}v;cGw? zLsQQK(`K&5vg)iYmHrBIGuW+_g61v=y6WY!PU&sU<0RG1WtaKR=bthw-IJCgpDlFU zF!|lV!c9);7Yqp%yAPo!@0@yvsTH=(S*A59Mmwf@FK%&O*6*>f#p&Xzuo=~M zyQlk}Sr)vs&3V&A&kcRl@0y#y}kCGvE)f0(BNCvXVC01Y2M20GM$J8My}SYV{RQdvs7n2gHFJt#MP?FGiHeiMb2O- z%v`a1ZmV-$K}Cqnm6w7`cgpRHYdmWB(ct{lUsHdGRI+?aL$SlN-a z8M~JzubUmSs6TYgjOc9(6Lu_4TsJFvVPEL3rAe!&MV{WAy=HpU~`{bJo7)DO;B&Z=M^sWMbI11qoXgBy61@e`#;w(Y5KPHf3#@7q??k z;-R(aFV9q6+go^JU*Y;$F$?=bW_1M4?G9cyD`rt&=(%0_N7kgRm=dvRUflA@;j5-b zt)3peb8*s&DUs`E#%!DuJEJXN<4~3mA%XpEv{U>hg4P43W5;+~Lm5lfq>o7oTp=h_zeyqTzUX45P_0mkG)w|5?ieH?nMxg8C?6D73sTNX^{iJGJ8p>XYVl>e;Y z230GstB06X1mt9LS8E?#uwqfpJ2CcaLgG(y(-$pVm-0+XfNi6h+J)mswT@l6YcKNd ilED6mc>kooObq6GeMK%yMm`6+iow&>&t;ucLK6UuS6!O` literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_apple_tree_leaves.png b/mods/moretrees/textures/moretrees_apple_tree_leaves.png new file mode 100644 index 0000000000000000000000000000000000000000..75ec063a8c2412f70f5ee48775c66cb6055dd8b8 GIT binary patch literal 351 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}cz{oct4o52qAsVp1y@>^LTHJU zSE{IUj7Z^3RV95+BNx7eR(abnAyaSuk~wNJn(TQ~mD76^;u~f2CMxGnP||bY%j{E1 zX_wERtZeMgZ{;s&6)0%x%MUcWH1>Z2kdiG4@(cct2QWmoJnSq)yfth?FhnzQY0GSgpX&Ao=pKK*uL{IuJq z?a9)XYS*{>45FUZ1VugXlwxZVU;C|V%2|dR4NMgYSGWZVm=f%3eUu(6Bs3JVXg+%@X%_ Tl{#SnbR~nQtDnm{r-UW|`>BjB literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_apple_tree_sapling.png b/mods/moretrees/textures/moretrees_apple_tree_sapling.png new file mode 100644 index 0000000000000000000000000000000000000000..04f93fd462bacd7c39efe3c0895bc6f97e9dba59 GIT binary patch literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHV5AX?b)t@LBXTzgb%>!Y$nYt(e zrI<>B{DK)6$|j$+0P;dTT^vI=qDzl$vw!-QFY zwP3@NCyz2#-xW{Xy=~G5WzWu#pq~qGPYYYPY5S>`t54@DoIl~P=JPw22YVi>8_zfX Zz*M!E?~r0NdmGRK22WQ%mvv4FO#tj#K)V0{ literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_apple_tree_trunk.png b/mods/moretrees/textures/moretrees_apple_tree_trunk.png new file mode 100644 index 0000000000000000000000000000000000000000..573fd8559e2b99c7e2aa392061dcc8331b5829ea GIT binary patch literal 1066 zcmWlYTTEL80EV0Sf-^YO#OUI(7Zb%z-C~S;m>Fy^Xr%>qD5YI#IlbRbOHVJS_xpv@ zdrP4`?d<3kS}3I#C@_%VqRG4@1SD=oommz&WS5wj;0sawlmGjlzlR?kAoaAKJbe;} z!?ogjyKWqB+y8BO;h68fe+t0iP8<#N4Rs?zX+E9*d^#o-OG4hTPG^b+Bl($vR-;*( zn_sUjhr^K!mPjQM0Tku)IbN5;uGXfL2_=v3Fqy(0KYNS`%fw2Vbi$yw=?oBGG@;Rw z$$$w~DCMF=Eaf*C&T*`frSfb}IxZWR$pTi3#h`WD?9s`f&*cqz&;aUWQ;5yg zZI@B27*}Z#b)$XbSi$FjOotH}A@@bRKDWzWt*;tXGO+|=bGTw2TPhNa zF#s6^nk_~)Yeb8!#8>u;3#E?$fDB}utFk*YAahp9?fa8 zC{-{(8J-Mz37>VN9;Z+wrqO6>g^12%FmPh z+Ipe5Qms~mJi5h*B%^UYmuk?-V^eWNDdDh3fC2m<;ra+bpaBFXNT!g9g8-g9OacG` zzPE$PrH_JCVt-FJp=(^mp-_71qeGE!jPq9Y)8jw=O7fAQS?+QYy5(wCmKRna}<0?Q+nkX`?5MErLT z&V(WH2TStexBHKN*-+l=_|i`bQrgc`*`L6y>ODj?MZd83#NTo@-Wk35^!)AYH`kBe zd$r}`kM`Pk9z7sL&pigQ55GRtTV`p!q02A-_|nnzi1URO{}M_*f1t9(|sj%=82OTCzSzM6f9f_R2tL4bR4 zt$$i}acO^BK2A$TR#Q!Wd2f7KJ-Co>o^efte|2qWV5WCbXiGC~Pc~XsPfbchuYp{% zh-AB!cC(3Qyq0%SPDr|wbFqeEYGz-LXGTj%LYHkycvd^MjcbTvLwi^}tbJEVML(x_ zQj26nMnpejdQ`>$007rXL_t&-8AZWWR>eRN1;EDL9iDsKT_zd5`(F`W7)(L&%3|*W7~eDOd8*bg!K# zOtS=`Z+0>=L-=BfUFL!Cl?olWZpU;WGYh03_5EEm*mh)!{7q4hCuWS{+?8?^-=GAQ tf4M$CyYQ~O?Y>g0WbcEP)i`NI@?kn{Z5{c2J#iPN;cPk&6~70002jNkl literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_beech_leaves.png b/mods/moretrees/textures/moretrees_beech_leaves.png new file mode 100644 index 0000000000000000000000000000000000000000..8463f530188073a5528dbd5bfb2fa24f09cd691b GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHV5AX?b)s4{52~}4#lap4K1d7E7 z_I3d&){-E<;NSoM|7YMcTQM0ZkmBj$7{YO#^&q1liy;TghN&N94L&q5YOra%j=!v0 zu}x0(i2k)rj~;Z~+c~%3dfmO&RSKKA*X;atzV%(obm8{%zkVGEpYx_!;BBh-uBJsg w8y?LpI`}kd@(pLPxdk)tOlpF literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_beech_sapling.png b/mods/moretrees/textures/moretrees_beech_sapling.png new file mode 100644 index 0000000000000000000000000000000000000000..ff42cc4bb05bfc7ac8f697cf206924363ae1acc0 GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHV5AX?b1=7-?oceOCN}<9)@|;C- zDo}{IB*-rqNdGE3at}!PdAc};aLBSAWaK>TAi#1Uazz7gXM>l=L)MrVzpqb`WXKTi za0%>Pu+!AS_}zrkf4{eU`swGUYW(_o*Vg4;n@u`i2U_$!XE18WX1-Zn!MJlJd$4oj S-!DLu89ZJ6T-G@yGywqpkU3QV literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_beech_trunk.png b/mods/moretrees/textures/moretrees_beech_trunk.png new file mode 100644 index 0000000000000000000000000000000000000000..06b4ae9c38cd4ce65aaa8760dfeddafd2373d006 GIT binary patch literal 980 zcmWkt=X2Y10R5!{N=gzrv14mmlC_5=S;Mky*|BUlwv#w+lCq&K6w2O|O`*)P%HF#x zU1`(Z(%q~kcN}+o;LqS6;ChG;@4YYY?!9|=Z+p8n*wu-20sy)i_3But(EnJqJY+%b z84qQ}=JH4xfax8p|J}F}fMuK7!xJ^vpxZ^gpi(wZ)LhX~NsC9Du3WMB(Xy76$yOm< zcV&%*4HnUv#Hg>OiT<%lMoIQJi&`VEv@4mGpSA?F=__jobW1|hbbpW)vLY^%(RyBP z7S)Q)IXpJ#$~H$7G`eIkHitHf3Xen#8XgZ!CIM-5+~zQYK@AojE~lk@bgN?4bMjb_$x4JNV1dc{I^E1G8ik~(xXGe29t|vBA!8bYmNLwE)l`zP zyh`~h%_6;ZPa&h-zDDa*Jg1OFld%*st0dQCC4<9E5p!fBucc}(??`yvlZWyuk3j2c zww6M2O0t#{Ga?@3q!bGIPRiBDR#6);*omrDwpb^uBoQ3mm)EJ1!8Sb660wrQRy{c< zlb%iw=H#-;Wd%%Sk-SO|6;&x2^Hj3wDI(tI>r|_3x)NdVxDk3%aKT{m8f^<$Bd?hP zF5yuQjpQ_v!y*k&R+Dj^MHw_QQb@~0Or>C3BC58Krr=ZpqWZg77~;`B9*fe6o}$i- z_?oY!R3g?6SA%<8m9#}-xS$#gTy{7wP1RhvoM9UUt(0K{hZB?00h8m=-oWH+0nc#Z zI7tSHa7cuTcWVsdh=eWUoC3b4 zJahNZWSMMg(S`72FLHe@Xaq^{`765E{PFH>OlS2Q(r8CbGNq6_eG}?{X(pC?7_cm39FdKq(%$x&L)$~gmgB*}jNCi9#~-`+{Buj-+I z$I4wdOwZmiw+OCYIWx2K##J{hThV!Vc4F@MpMP)pBWA5v!<&LetyP^0Hf;M33XS(> literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_beech_trunk_top.png b/mods/moretrees/textures/moretrees_beech_trunk_top.png new file mode 100644 index 0000000000000000000000000000000000000000..72859852e950b4b6344c3ca79b3ea4383c1b2e57 GIT binary patch literal 926 zcmV;P17ZA$P)B*}I@hgnWjrZxKrYv*XY0<7 z>(Z6#%8c8wbaMhY+<;9Ki z*_`0Dc<|n~(V1Q3#FBPVI`7@JkX*QRGdcJYwRP>%k=3DN-L!Mtuya8(Bh8Fc?a`Ivzk%YqdhF4jGbgLKS6fMwqZc-?caA{Y@%&A>0%bMB@N9Y8 z7=nehtB;?FKFc5?tGY|lM1Xd3vGopS8HZ+8cC<_K2oM`Lv4cloOiop2cMGowfws4F z_6>?^otT`H%Q*Q6Y%6!q0AbDS>Hdzqp)ePL?dZjq)=jTny+0hyHy03~;$tK0r-oM! z?mu5IRvQUyFZI{XjBxt|hqB+N>s-G^hu6YiU0rr07*qoM6N<$f*WPr AssI20 literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_beech_wood.png b/mods/moretrees/textures/moretrees_beech_wood.png new file mode 100644 index 0000000000000000000000000000000000000000..d6e3f9d74badc8f29fab7d20b4441823c364565f GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHV5AX?bjds`U$TUyz)|puBvZ*_W z|6kZypj5P{i(?3ftn9%?-evRk1BzCBeSMXv;*!*lizQ^DRr7&GgFk*YdTTC;2bMZJMoma{1&cnZ^Is XI*6)Tf9S6VTEpP!>gTe~DWM4fL25xj literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_birch_leaves.png b/mods/moretrees/textures/moretrees_birch_leaves.png new file mode 100644 index 0000000000000000000000000000000000000000..547f133b13bf38d28f501bca5b37d162851bfe3c GIT binary patch literal 459 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMf%mAMdS9UW7hGGUeeQ8bu21Y#w zaZPbfD+VnOErwtQX)OtcG6n`626ht$8Er{rDAeKjXFhI|HfS9OM528KumhIj^sSO$g?2E711b!T-=cTI+H2E$N84L1#jXa+4W zErvt}hHM5MKOG$(9c^!IhExWIbOv32U4~=^hD@O27>um;$p9(ik|4j}|0Dy3!g+i9 zfZEr2x;TbNTxLDkn#kXE?yRt?y!QO9@WRWs{87;}<2Ud%ipjmG`EX;EJktT; z2Mx+fKjb_Ph%<6my;={=ivP4^ zaJWunj?qqd{ZHF`hw*}Ce>+@R6yheXkveAoK>nG!rtC8F-aViI@O1TaS?83{1OSM3 Bs3-sc literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_birch_sapling.png b/mods/moretrees/textures/moretrees_birch_sapling.png new file mode 100644 index 0000000000000000000000000000000000000000..afb03f3b0796cf32a8fa8a37c7705f83bcb1385a GIT binary patch literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa2=EDU1=4EOJpcdy7vlvn3}y(t zdGqGWmoJk93l;p?@lCIHXxUHx3vIVCg!0DAXR AYybcN literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_birch_trunk.png b/mods/moretrees/textures/moretrees_birch_trunk.png new file mode 100644 index 0000000000000000000000000000000000000000..2b222f7b728fbdd6ff2433ab3043585327270062 GIT binary patch literal 975 zcmV;=12FuFP)bpwg3C_f^k`HOgV^dT(g~!xUr!B z{`d3i*6K`0nDEcw&NMN&olmf@xOS(8Y*%V~%D`;@8S{( z#m%~|+tJ6}(Z|upxR8KrQ$R23;@SWI{*!J~|M%?w`S8)ix44^yvzUPY`trA=m4ISQ z$GE2d{`JMWuEDdZ-`Uad=-&VO^YiWG&d0aJx2D|D#IdHG+tI}G>f)M-eY2#Hx~!YJ ztE8rymE6n%B+5-qpylq?*pbx6#G8x2c%Y$G*C(q|Lvx zwWgZ0q?@3QfZ^4|kb-Wmpp&|*nxK$hodytBx>uEDpgq?3ZHo0XuGfQ58oteu#z zq=}e?am2W(lY(x+v!chmteS~?f@@H>uAAxM*=98_+0etwv!=DIqO6#R|Mu+J)5x`{ zox`)Fx2vF8IVkh$;P7$n0T4+yESgjvhOH;tYfNdRYk;aTx>W=(a@*=gykRa9U1^nRUCEw7zTA z_9^?PPh`-R6yV>&ehO%2YF+oF{yv6n>p8f%8Q26x6fAdd>78(f;k42wKHjrug%q`P zJ+tb2&M+9MEAudM3Ip|c1Sap@+r@C&L`{WJR9;iZEjTH!vb~dGPq?wF##yjK6Eh1B zwKC*qYzherJ>?#h5Wl;isilTt&(s-{n{!hF?0jQ$4mH;9Vwg5(!TgSFe|uYN@3@NU xq9Y7PmMoiB?q}oZ&c&v%iEz-)u*9N?&A*?ZgKopFk#SQ-$Fi5qx}Kzqa?s1L zzNe1R%&^bJr@yC-$+ekuS4qUGjH-xnly6(m%dWqthtt%+sgQTj$gI)Mwb$3r%ea}) z#H_}!mRL!TEG(skZAdvWLN+ka%&gJUwm~;9)6>1pzMsCQh{djvO+GQu$*ixCbY;)YQbz!lcZ*oY>gd(bBj* zG%Zd)GD0{ov)2r500037NkliF5LSp{=DdEh!}{`qxx%?VsvnSqK>JGUXP!6-Austz$t1LQH&iL36jw zI_(i9mp_3fE-zo}ncTYc>cwEcKmtvUR%dsZkKaFSEJOteyhrMiHcxIpzV8=1jR6P; zyYk$&EU#N+=|O4_<-na+`$wm%V@nRxt8u;qft-)mXB!i`VUO2qzgr-nr$gSmp1|*aYW*Th@2Do{sA`1YQX=^ymtTq002ovPDHLkV1iSzsYU<* literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_birch_wood.png b/mods/moretrees/textures/moretrees_birch_wood.png new file mode 100644 index 0000000000000000000000000000000000000000..621f8eec9ce18d07d035e6be2d642ae5dd631b70 GIT binary patch literal 1075 zcmV-31kC%1P)dCjSC&#QRgy^U!(0BJJ-(y4ZoW);@4 zbIqxC+p&4zx`4r(VU1n}h*bdPzk}YfbLhf`?!}Gex`X4th~2Ss@yeF#x_;ZMapSy* zaXbKyUI59XYu2@U@6DO^%$M`Uj^np>lwktq!HaP_0Nb^F<-Cf@n`Pa&hR>{S@x_#8 zEdcMwj_AUR=DK<8y@AS^V4G_Y)vtBfv3PJV0Oh)c?#Y*RIRK+|JHL}e{??x5zmRi0 z0M@U2&7)b#o?*ewT0HNb=9kI+p~blr*qGyaHe=F z?8T7fy@tAwNt0s?;JAI}zlGMWdD^#r$)0Gjg+bl3eRx9vznNZ43;^P~h}EolkY*Kt zNC0g#0O-P#*s*}#yoINEGuEzibwB{%y@uVhdEmN+-Lr1&!iCnUZsWL$nQ0Z2W(6<-LlQW)Q`rW7V;E>%^3oW*@?tVZWAD zznNI(y?)lKWu|^M#GhrJbt%@r9q-CanD%P%X-LZYrt7&000RP~o>%x83uWsGEd&!<- zx{X!hx`EB6X4tWD>&1xArftHPTXj4D``Dh$qh-~sb=$Xj;<|p@v3|*)X4tQI=E8{9 zt7fElDaoH$)~|Ehvvbp|ZPTl6j$Rnbp=NVI0Nb;8%A{%4t8v}6dC8w;;JSX^w}aEE zaMGu7$DCnkF96A*ZrZVS&!%!OD_cH(h z0T@X{K~xx51;N2e0znu6;Qi;Hota&B5S1-R3BoKXJVX&hPZ83=j$Ncfy+gi0hn}Dy zx_YT&b?#D^Gz;vem8Q{(E6&bL-v{+6&Zcz!|_JUFDJAn41(g^vVq&mTYQ zVwjeW>*AYiF5tXPKX$wR&fg-`phi z8ym}RY)pC$LSm!|hbIbfTc3R({)Z6!v;JqftJyY zGhHI?{GX@ib4ea3= zPlnWjCv)}-JX&!eHvGNiSskvm=32(tygsT6d@C|IzK6^g)(Km3=MDS%IsK1onKtkJ dnttF8`>8MDXUanb*@3QL@O1TaS?83{1ON~hhr9p) literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_cedar_leaves.png b/mods/moretrees/textures/moretrees_cedar_leaves.png new file mode 100644 index 0000000000000000000000000000000000000000..e6de4829367c815615988c4d36808a134cc20e1a GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHV5AX?bRmu<)G~<-;=Hb<31ByL% zxgiRqSWANZg8u^n!|!c;!9alwPZ!4!j_a%k8wFb&IG7Lo@nB72mf~_~W7<>j_xhLJ z8J@;cFABCVXuQ7Ii&ty5-1@{5vCCV2&v{jlB%i3a`@rwjeNq}P+uaxKjJ9fh5tEyf xl4&yggKPH>PQj?HDHWSfK4_NRy!hTvX0d9~KfK|(5R-$c9p+{ALdv=OLc9LC2f^BY! zV@bAaRngN z49puIy?bZYru%=tyAVUegA#p4j=pxih_LJ?U-lJixtJJc3fDb|{S+f`f0fhcK=!2F z*$+NyHB`J?c$JNXfsKQqt(N7vyo7HR$G-R6KF5t&wqF;mQTV{$I6C_~@0WY? zfBz#Mo&$pCJ7f*NtabQO8OI#HGMame>G@rcGotOqcD!1@zi|D``>gZJVjh@Xwd<9* r{xj!oVn%Lv=Am6v7`)UnX3o^FpAaSxRhIEp2V||MtDnm{r-UW|k=sKV literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_cedar_trunk.png b/mods/moretrees/textures/moretrees_cedar_trunk.png new file mode 100644 index 0000000000000000000000000000000000000000..ea685e3a91100ba3cdb73d4b4983e701fb216d93 GIT binary patch literal 1074 zcmV-21kL-2P)BZ^jdNbOoQR@^Z=;26Ur9D_ zRX&%1Y;#*iY*apBNi)o?m3dxEe_%z4YgF34sE>PUmVj@Na#?X!Ky_F?Yg9swZ&hVW zH;#5;dtgVNf^VjXa+7#sc3nwvSVLt^IelPEVM#fEU`BUgOjSNBaa2BSSVvYtF=IzG zYEnC1LNIbzLwQ?6k8f3LPdai|LTyq$oPB7vmVb0tL#~Q&;J>KHs+GW>hk0I1nS5n% zRzq%4J8@M)d0a(vSVMebO?6sErh#Z>Nj7y+JEDYba#%raP&|ZYPlabub5=l-b6kLE zREK9xjBZw)d}N}0UU*+ib67-tUP_U1ScYg%Yfm|fZCGteGmvjsQ8y@TR6&MmRANdv zc344lTuM$pFjYb_fM`|Fsf~qYOKed;n|WY!Qa*@iQk#2Yd{a4CLo%d-XKqY3k#%B^ zaa?InJ%nUQgJDR5V@!u_T90;Mg=kTGVohvJH*Zxxa#KLGl6!?{RA)^(k8oOKO*KO@ zBym+grG#u)LNk|iT6|kWqJU>~RzXEFBSteNk8xV2eqp4Da&S*MlyFvAK`c@`Dsxjk zUPCdCa$R{|NqSsFRzNI)Uq_jFVofbv zSZ7W;T0=0Mby$X6KzLh3hiOw_L@B=&g#7RTb*B~?0reE2gsgtN+zd0RMCXA-8&W_+-`Vs zsMYl|q13=IHU_lp$zn{}p^S&s$EV0395o3k#IT;1(@FyZoFOI7Z+^=6h5uy;{sPG} sn`ypqA(*)bO$5R<%W4A@nU)8L|B>{4p{EVKi~s-t07*qoM6N<$f?E)^UjP6A literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_cedar_trunk_top.png b/mods/moretrees/textures/moretrees_cedar_trunk_top.png new file mode 100644 index 0000000000000000000000000000000000000000..01aed1d7dd0b0d627abcbdaf441f1b434b83ed7f GIT binary patch literal 451 zcmV;!0X+VRP)+E%UER@SGpohz;?fD)hKr?354m zv{l=Q4n;F5@R$|yt3mRrJ@c|qLoz7}1qF%#0075HL_t&-8AZWGb^}2S1we(F8O$Dr zW|IE>&y|;zt7wOWgS4mlZnLcG%d7Rx?rR1Ty)1K(QbdV3#{i`+C~tL)*|Kvz2rJj9 z5F|{~#Nio)KE&e1a^b0j2M~H`y%Fam3rh#WN_iF8u#IBn351SsZT6=1CTMvC;l21` zvL1DmENc)xr72Z5?Q51s?m_rak$D`oWiC>K5(?{!%EVY@ao>q%T-%(p_hTs%e?bGb t=cgxhbi6oQylu9Leugy6_?G~r{U7tZFU5qk?Y{s3002ovPDHLkV1nQ6y%7Ka literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_cedar_wood.png b/mods/moretrees/textures/moretrees_cedar_wood.png new file mode 100644 index 0000000000000000000000000000000000000000..8680bd5ba2ccd575391ac8812c20f6cfc066d3bf GIT binary patch literal 648 zcmV;30(bq1P)9Zv}Kl0+U(<^v{;i zf(O=x2zp5ZSu_Ffz;w=l2j`n6;*AM{PXpeH2%lmEky!*gAp!2aY@=iZ?X+4~GXdI% z2*-N|onZv41g>7q2{mmluDYV591 z-H8a`j0sFE0ZJ#a*t zF9GC|6zQQeZwBIl^N}}UQ{swRx$zYwOsPWf97_g9pfT>aWaN<&>#IjGpYwbG008(&L_t&-(+$FdcEnH=0Ki+@w%x96W)XF>vGMf( zU(lWzcr5*f|Gt`)VzIeiSp)JAsn)aY_GgE?8-$hNNtTC1NjezC)jbvrAz^x4VBbHS z;@{0PbOLWTX3jIaf;X=lrm;VUqnb{SDHR7)(gwG528_6)z_F}p6#E$Q4ARp;b<=L` z{S&n%_7XrQ3`;BZ&66-}-M7w9uV8_T7KbT6O0J!L4@Fr3$4>dSeIQ@Daexp5JF7`L z38tg!M4NQT7Uc4tF!sjti+tA*Ji~+nw;b_pOwJNE!Xibmw5qDf?4#VU9DdtTV!#@G i^?R5!^aQh5-1!5su1FJ=;Ez`T0000EVVcKeJw3*q5bGpq*8lxa_m$hLPROJXnbUckHJ0zY*HMx;H-z!ZByZp6{lJ- z(1N`TJaY7!;iEa}J`48Lq1VI(of7Ofag7~rL_~|29(o{LgHRo!de~`%bciuvfDQ#( zG-y+xQw<{@77F!3L^aq!Mlf<%qG%ApxEXc|RtXF|$N;?nCJ`(mu2Lt0O@fz&*d~U% z3N2OGMsZ8qsfC7*?Ia~dpa#3NF!0eRhDU*>Y8Zv+Bs)}bR1OM80jf8nRSt&&8XiZ| zT#aTWY%(Y+;Ee2<$(8cAGHEtb${sEj#@5!^%t|JkW^?Jad_Gsm7cQ|y zl1wE^#S;7c;j{Fch1_~EpU#$`$3mO@t=9 z>HdFN_wq6I9r{S6_tf#hlQqATb#`AUqb~Tr^817RQ^M#cFY2aXI{EF#iJ?{kpTpD+wTpZzCF_QhiiP&K6l0I9~<3~mdn2W>w(XFZQ3yQ`pu*vKK~g#+IZr|t3S*f z+W-E@^uphci;LMGoz$7BhFJ4#@r|DQdm`V>-6-#hRa#MTupD3qUu*wxyz2A-X%7Kk L*!xq*!Q=k}Ktn^y literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_coconut_0.png b/mods/moretrees/textures/moretrees_coconut_0.png new file mode 100644 index 0000000000000000000000000000000000000000..644a65f8ec7ce650d68d1549cec46744741b1862 GIT binary patch literal 877 zcmWlWTWl0n7{|}-6c!4#C2FL~1Nva95mO0~rqp!`+t3EtU|XPt1}Y?&n3#}QjWKE{ zsfi{&Ai<=-zNly*h~Z`=rjig5Gzx+4ZfEDRmzn9@_AJ&~Plt zC^v~v?<_*k9FP9~b{|5-={;|a4&VcYjIX318@Ez%LuP?_u$<#TPl3wA{9ke=W@$Vq z9LTIICGFTfUE>;J+>zP3!hn#dh>4oYyE5yEw1bJt`MBq^z|EKROhZmDi%d120g*3uVELjv&n z0k)ep=yP)>`<}TtMZ=4H?WVwdf7xt;cYbySQs3tq=Z1HG-IpdQFXH!EAvh+<6%jS z1(|j-v}q{7JuXTyD~E4MaBq&yr9eztB4f%)z)trw>`h!NE)VDH*3D@82@V7CDFWmJ!3aqXC`<< zGXA*|Ab%_Q4VDN7T1X;51jt~J43K1iAV{*Ma+v=Zix5Y4?F@hMH2t267pspCj(>pA znkSn@pmWjn7zU??b`J!zD~Q!kbRM?UDn>sKh5JX>$Bs^JZ13Lu+KsE%ul?z4h)(c* zbDw&FlO4BDUH$Un*p*u|7tY*VJ4Wq`9O}OoxpZiJU~k*q{q&>w{KDfzY-{(H&94)! zv**qp96K=1ZAr4sww}O>X!N=B6BFkT^86cpf6Pq>LbpHniRu13&wuxhuYLE{DC*&_E>o%l65W{{v~0C2Rly literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_coconut_1.png b/mods/moretrees/textures/moretrees_coconut_1.png new file mode 100644 index 0000000000000000000000000000000000000000..e2889bce06ec4581d231b6cf901801296188ffd5 GIT binary patch literal 429 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!Lb6AYF9SoB8UsT^3j@P1pisjL z28L1t28LG&3=CE?7#PG0=Ijcz0ZMcQ_=LCuX(j_EmV6fGIA*3OCMGW?=1gXmY!>DO zW+opdCJ!d25ReFSE;Dm2Gjj$rlP?ocoH?7BrGNH0~1JNAQMv%m~GAkvMUrU2(%@T>Hq)#R!Wb%fUeOf3GxH_gpG@f zooV5(-OP-O9^d+Qn*HXLE8l){UwQxe=O3Fdh=fJIJ#Rk+GhaVb#9)6>N3wZSxikFjEaeZfrh$;Ee$P8rfliirsL$`=N{)69muJ; kV9lacYnSHcel-Zt}%1&z2`pfbDsBk-cykfuk`bs)}j@RhK~hrnAFIwKiA^LMI}GzgU}M(F5Cgam+&4j@z%j?ix{LhGs!nyssSm>7u= z_c0+ZMF9k_`(7l6kPNnPD#nSJWD>HEkSr0*7WbJ1Z(${@z&Hl~;{!r=iPd6)(=krQ zSi`DViRlT-1fg0;XelK+LiB`a*r*Kt~V(^EsmUW|kdFtPunUf|!o^1Wnk(xIjcH4iF~!ZzFT4!^(z1g;>Kd0yOsK+_+*s&^v95S_;KZ%{$F24tbfM3YCeth_w{(JPOI@mcUSj& z^9bzSPTjSiA0Ib9F0JMc3_r%FGF&{Ti+aHzUg3ZS=Mtx+u5WIN zR47t4+hYA?^;d2-wp`t>&D&Lwou4y(R%@&AZu_0Kdxv!TLc;;x_d!Q#amis3bNhEmz{Q+|$7Oq?xxpB!%nIvGIe_*b(E_}s-w4_4cg!!vNqZY0RSs%P6%ygq( zB1=fg?A@M`mX(;E8X6w>r?q-*+p8j*&F`${WvJw8dwW}rp~_$=vUirh{q!MvNAIE= aLAeM;E{|w2KYzCb(jm1XUVdw%_V{0SkwPE< literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_coconut_milk.png b/mods/moretrees/textures/moretrees_coconut_milk.png new file mode 100644 index 0000000000000000000000000000000000000000..9a54ad8afce53b244e3260e2f2af1bea83d502ba GIT binary patch literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFfwi8J4 zl?3?(0|gO)!S%qM6F?a+PZ!4!j_b)gxLJ8_NOZ}{Iw>4$-CX|uUL<$QohIYFclT_? z&oF4R8kaFM&L~X#{?1r{O&}pXhTSmBF)Rfr%bRmORQUOg-Q|pLyHgg=TzSR=XexuJ LtDnm{r-UW|C`)Ea literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_coconut_milk_inv.png b/mods/moretrees/textures/moretrees_coconut_milk_inv.png new file mode 100644 index 0000000000000000000000000000000000000000..f6365787a6d94eae5b58d1c0320ff58e5a197bac GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UASkfJR9T^xl_H+M9WCik>N`m}? z85qhYpS1w;3OrpLLnNm5_Iq{Rf7ND|+Wo-Rx;( zfF)VX$J}o{+}y$3vq=ox}au uHMa?B93O@1EZ;}$`70Epsd+004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00006VoOIv0RI600RN!9r;`8x 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 literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_date_nut_snack.png b/mods/moretrees/textures/moretrees_date_nut_snack.png new file mode 100644 index 0000000000000000000000000000000000000000..1766dab2558cb1fc02a4a7f18d108f3a052558b7 GIT binary patch literal 450 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7e6l0AZa85pY67#JE_7#My5g&JNk zFq9fFFuY1&V6d9Oz#v{QXIG#NP-1d`Plzj!PLW~ll3{3*VQ5uk>rmzbG8&b+I#sxU z+;9ob5OLNZVFnvL>4nJa0`Jj<`$ah1rZ%mHd|ig|a+d978Nl zzrA42*I*#v5_sSVkJ-%xBkz6x-|jf@&7&iJf0D_hFW--*w62)t$8%Y!tA}y+CY994 zd1^hkBnrAVJ(_cUj}|vObDr|8b@Ip7iS~9go}d4WmEl??w@pdvj>Cm<-x&k{d`qm) Z;MYFQF0m+`=PS@w22WQ%mvv4FO#oVNhrR#+ literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_date_palm_leaves.png b/mods/moretrees/textures/moretrees_date_palm_leaves.png new file mode 100644 index 0000000000000000000000000000000000000000..de0f569df10c84f819a4a92d7868053d6e004dae GIT binary patch literal 757 zcmWkqSxA&o6#nl0|Ns7zVx@s&Hjc~8*yuQmON0B8GdV*lu2>P624;|CWJNyMWJ*{V z6;aW?iVxv~`J!zaC`DOXkwuh>5n_TwRAkX~e7I-3-*>)qPDe>`K~O+=0DvH`$5lpt z<aEad&-J{=2*bj1}sv^Hw)}@0CU@b^z(qW@zOwPCcvso3M42diMr_(ZUM7GP#nkMfI@Onf)Pb8!yv%`g@_i& zsRWP&jTEjj8$=py&9RotX^@?eNGOsE!q~W)4~4b}6B5}(>Lw#hRn`G^#)-9>!zfGC z)5JmZ>s9DD;-S!B34l%&G(dzv41<}mc%pM|1B(N*P;-WG0RtCwA0tB?;e})eO9D@U z$RVOEmX4{w$o+o*MAnaSx-e@hD=tUwmv?nbN$ti0SJPxecLOEM8a z39U)kJ~{ErpPe<7=6g9Qk6O1_ntjgt1UXczVq2p z+jeGTcGHDD7dyONx~?5{PoEEEzSsTcf$r*#%n-B1)joVXu>KFGkqAITb{VzR5Nr%)4Tg@s%JXq)_h}AVNu3(U(1H}@46HB2OoT%8>qRqb-1%& z$k_7rdfuDChco}CPmQg5eBYr9ctJk|4ie z28U-i(m004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw0008(P)t-snR9E2acodXMG*`O z3kV2CH#dJ}V0~$1Uq?VwJva&n1q})c7!wj^R8)ayWsGWQIwvDBCnQomJA!6oiga>H zJvcWjCrdv(HYz7ECM8-zJybe2DIFRwB_l;QG+jnMO+Y=TjD(bQZlHjCyPuedacE0C zI1vpD2?z&PM@5`?a+-5(ZdOoTL_9q$C<_P%H!CWIW?_tHUsO9XJ1r?KAssgU2{9rab5u);WLl|!a-D&CgJ@rC zO+sTuJ1`&_3I+uU1_eJWBZ6N~HY_P^R8Cz-LOd-gJuWLvI5dJ{R;h}9sEU4YSx-JJ zCodr#LN6*lEhHTi4L>+EZB|c*Xj_zZXj4EtIVdI*4GSU~79bcEC>|PVQA&ttUzKxf zZBR-xB_b>%A+MH)FC!pHIWuZfNiilPJSrtbD<(`ZCpst~CmR<*E+6Audp1y?~lqjYJMV_Jh)QG;Sufnr*MWLhK~8y^`LF(@Y}Ass|D zFAN6;d{s(hL_IGeA2=r?RX;n8aczljWl}#mE+Zc}DJ6_;Wt)M1Y+6_-ARmBPRY@~2 zW=BALR!v?;KP4R-4GIYr5Do_g1SA_5RX;RoO+QvaIw&6;FeD$Yfq0K)TU|ms8WImH z92XuH6G}HTc2`npN<~yWH7Fe#CLI_V6A)xhNqb*aY*0x)Ehr@$7(q2NAsQG$Fe{{j zdz*N2l5AprSWY!2A|V(SCmkDFNk?~QX9olWL^UvRSXGjAagB0sKQuE{Nk@ZjX-+>n zPe418aczBGSs@x12?z*)X=gw*GcG76n}~>_gn^H9Zd6A_3J3=W1Oy`)7hy?2X;DN+ zI4>X=7A+$mTt_^snw_JJi$yyYCOkTU$RdD=i@$MKdg5Q&fs+ zV0>6f|NsBMm)h0<0004EOGiZbJ7Z^N00009a7bBm000XT000XT0n*)m`~Uy|2XskI zMF-#n7ZNWQY_qa(0003SNklaB*^Tbai%j zczJqze0_cZe}I94gM@{Khlq)ai;Rtq0FPXdk&=^?m6n&7nVOrNodBMnn4qDeqok## zr>Lo_tE>R6uCK7Mva__cwsg0+xw^XmyuCTTzrex5!^FkL$H>Xb0L!_|&Cbuz(bCg7 z)YaD4*Z|qu+uYsW-{9fmg(+7?(gvN^7HhI_4fB20ec3}t@OVD0000< KMNUMnLSTZhT5tvc literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_date_palm_trunk_top.png b/mods/moretrees/textures/moretrees_date_palm_trunk_top.png new file mode 100644 index 0000000000000000000000000000000000000000..329ba46482f348353c8301e285aa46be3c02260c GIT binary patch literal 673 zcmV;S0$%-zP)zlpI!jqoQqrnSTRp|w)b?eH+(yO z(*dK0eXaE}B7F7s{az8!vS-Dbvv^{eDB>}Kn-ytue zBocy8uO_m{eb)Fo3fNW$WiqvOzLzUwW#1%Nb80dyOk2SDVKr`grbHS>a|-CW)- z033ZhX6qnFP8A{q2cS_EfC|99a}}zL`g?|DOlFg|-FCKmhM^}(N&+H_oTuXNcPfCC zXS!*mJOdC#5p2wE=RwH)a6LXa1P~<=04e1I(6*bB%P5HoSsXq;l$=*;yGfF&s-~NI z!eVFO0LVo40Q_|4Lh#XO6b9_%%b8`AN~ID30l*?Q>_qqmviK&1^R6 z@27Fr-fYti0007hNklVz?J9`2Nx+S~awlq%SII(BO^TlDsbN^i) z^39i5-upB`7d+C$$B+kfUVtm#e%l28En{DV)1l}b`X004mbbf%O-mhN^tWt2b;07Wj&=gVI8>-*P(R&`yE z+TgxFaLq)PJLfisZO-%H{Nu3WDU+En#;otx`{UuRxof%|LnI$P{ZI<&oK;4L;ETL) z&LQHURV}Mh$fny7LSl?bf?6y5@$2tr^^8%xe)|gkFUv#-!38_XC(395Fh+Bpr3qqH zlsrjo^s{odTCPTIVvGRbAXqb|oE2v5%`hqCVlwZBBQi{F^hGX=F-GYzI7(><;l0JO zJDr+#`_A)(EuWsl1Hqg7_4WNt2*G=AyhTJt5ozLrCxjGv5o08Tgb?0t?jG9>UcI=g zU)BW|#*fpYN|SVR+%lRPKT07H=&swJbYIG{NHYLHCfK5y3n4~ln|Ax;Y;_?otQnI? zZFI`$vaD9i)n?!HR$nZh;Nw3Jf8Sm+mgPJsy-7^Htp70 zyQt>By!`F**=LNVdekvSWlacSQb^n%_m`i3aeH^$TRpT!Ddl4@-sU{3@(CfNEX!(I zZ~xtlqai8cbTa+puRmR|&o7_9S-(EGgUkxa#Jl~wZXaW8y94L^p>0mX@jq*rdtomT RgTMd)002ovPDHLkV1h9gTaN$$ literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_dates.png b/mods/moretrees/textures/moretrees_dates.png new file mode 100644 index 0000000000000000000000000000000000000000..cd8d57848af3351cdd9e12275214853c13258a60 GIT binary patch literal 9421 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 T-?(7^00000NkvXXu0mjfaC4O0 literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_dates_f0.png b/mods/moretrees/textures/moretrees_dates_f0.png new file mode 100644 index 0000000000000000000000000000000000000000..b75d59a3a70856dc5b62b4665ab6029957dabc08 GIT binary patch literal 3848 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 v9>B~f!Jj~Kd>hjWMN{@lpQ)H~1%L literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_dates_f1.png b/mods/moretrees/textures/moretrees_dates_f1.png new file mode 100644 index 0000000000000000000000000000000000000000..535150bfb493e506e5493be49375e039d327fe46 GIT binary patch literal 4137 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 P)u;pfNgLBz93kmHQ~`Gw literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_dates_f2.png b/mods/moretrees/textures/moretrees_dates_f2.png new file mode 100644 index 0000000000000000000000000000000000000000..e2e299c8f2578d300cc164247091c3d2b3d63aaf GIT binary patch literal 9070 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 literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_dates_f3.png b/mods/moretrees/textures/moretrees_dates_f3.png new file mode 100644 index 0000000000000000000000000000000000000000..eef43f0b873e517ecab4d9c54002a399a459869a GIT binary patch literal 8295 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 literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_dates_f4.png b/mods/moretrees/textures/moretrees_dates_f4.png new file mode 100644 index 0000000000000000000000000000000000000000..78f38f981880c679ebd8c8549bb7e68cf288f1bd GIT binary patch literal 9237 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

Lf!oz@)m(qiVKF=!$ rzx=CvmUWc7zJKyh{>eZ2$Kn41lk**bHIkI200000NkvXXu0mjf;L;ZU literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_dates_fn.png b/mods/moretrees/textures/moretrees_dates_fn.png new file mode 100644 index 0000000000000000000000000000000000000000..db889130c700814997e1de032991d4d3f22f0ef2 GIT binary patch literal 2589 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 bn@5L_j((Zdv^Tm5ea-;Q+=^0R%DnL(XF!p} literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_dates_m0.png b/mods/moretrees/textures/moretrees_dates_m0.png new file mode 100644 index 0000000000000000000000000000000000000000..4ff61e7f8a820e655afe548025b7e2bb0e6a679f GIT binary patch literal 4138 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 W{@hEwR%+Bu9WXVrGOX9fJoq11uz!mH literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_dates_n.png b/mods/moretrees/textures/moretrees_dates_n.png new file mode 100644 index 0000000000000000000000000000000000000000..c12a3d992b2fdcf3b3126be10fcf6b4e5064ff27 GIT binary patch literal 2107 zcmZWqdpy(KA3xjJ+$Gnclq4!1HH0+GW|ng8aaTk1+fq#z*R1c@^C-6|VwTCRC>H&) z^n_aUxYZ+Rx-7I(5e;34CVpSfzrS-{=X}n2f6nW5&gXqTmvg?}WOWro6##%b#gpg{ zOK4>%q2aj$ANdFt>!LmV_X3b&4&!V9ey-@p0XSs?zyuWlCoTZ`jMBS)&aeU<0=3v2XQts|8+n}psCzXROaz9V)tLyg&a`8RPYYNn^ zqy4irF4Qpp>-GXck^kyT9+P1tLiAasbArySn@{O1dr|w;5R;2q{|nW}NqRCHGdF5? z=tf%Ei9XyIc7p|}7b&%*GI67cbQ9fkp|0KW<%ppwJ-;YAV&ejo%Uu|Q9$ms_it#F@ z9FX+tj;e_Nfv&GxK?aa4ZLZ4f%ipn&X|b)>=RVoO7{H~XM<#6@t0dDtpPK-(kSWq*v@Ujob<*3*YjVYod>M=9l7k(LHuSy z9w7CmX&e^)nbwpViyPGy7GyC@P}zkfkq_$)C-;<9u#@u~PeP&8f~-RH3|YEs%D%zw zJ!a6GUbz?H1-**tdH(ZV5K)zihC+rMmviBjHe*%rB~7!SYcYKof@1$;2bCe3M{&qP zuIcYapOkf7FV(DJeqvO0Y!>G5d@m#W8fm}3U{i*p-D9^Z;)fnPlqdLW#Vb(%?!5V| z#yfF%s;^FzD8}z5ph4r}+nb|PJ-@Et&U68FAt$R50gQJ#eQ_IFI?`z<%+BgZ?BO~8 zjKy6Ik;_?U*%9grT!*K}P9^P}$&rvqFSW`&OFrit<`{kUlh-O40UNFXjx|l*uc6_n zsACzxS{g`hJ2?gOcFqY|53Kj($ct}`Rfl>|!~p*ckFVGB)3%08W6WnlsMAS3kLV_L zZ;@bxAVhy9Os9lfRhdTtIi$}bk$OpVEUf!aY);E9Jw|53wKOq1Tm$`b6(tQ=2@JZpwct}%qZ9hw?y6yC6c~_kGDCh zV$;n8jBkN+s3ylc^21Zw9L?}Be#L2-C2)6Ql{M>^vN zaBG8FN;MxEAxcll?yt4-AG!W~#rWr|F7=R%+`n+Myd%4!oag=cvTgpMUToOSE|Ma8nk*YFd$>fgEXv~A^q zPqnu}XRyXdd|rHRsK?$rfQMa1_+yOkmDR-WILC$%P04z}WT78%Jd>Ph?h{f_Q<&U) zWF-!ZGZ0@3b49yL6$KSZMjjq~WM7O`qh_=ql;}1OLa}6v0t_^nU6?(H=bN7fVS%q~ z>%*fNSx|QLTkrYs1hxKxeUpe{@WKwaRGBbg8;R-;NMU$D9KVP~ms-9Ku?%^%BUmYi z*fzh)7IKbpVqp51CWqCorxgbxjBGTNcN8H(+U zqzWJCP!rEfwh9Y)@Nrw5N~T+8;?AY)HNSe~V(;DU)|fHNX3!yu%+PEyu`37$dMYLWiwMeYK&A``VjY zA|b&vF^2o-$fF(1 zm?s`Rsy^7l{-e_K6Cx0?v9m!8M-EzQgW;+i6yyZ`y91}Mr=1S9sx&(eE-U0AS_Vzw zbdg_UCd!1y!mu^}W)IidQV~t`Mr=waps6$G=bYvX==yf+QQ&Gbr;4s+=Z7-5dUu|q z>sHKqvT8d_5WeA_d^#cNy60a6S+(iG6-H@K>sgp%(B5`UT;XkiWn9!M30!=^Em_-wq4JX8SezgX$ z@Yh2<5~Lg_)^>HVHR0?u)`)fZ&{$s*?G=V!Wdn+FG#BfrNO87i{4tfbwRbAE9w|@ExL;f3xB9q3`CWbB z#jS>u*LG01R?m*d)qMYJ+kp%m+j$|j6Oq9eZS|VJAt6(`f#kbmtF-a9XGmp{pVnOT zI=Ec8Q8^utM5Te9X9m6b=3kY3hYjA# literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_fir_cone.png b/mods/moretrees/textures/moretrees_fir_cone.png new file mode 100644 index 0000000000000000000000000000000000000000..45eef92832404f6538000d8c61a3bab9161332ca GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF&X_y&&~wODjZ}ua&@i1v6nNAzc)y#FZXniNWGiseXvLJq;Yz)5_NfU;$3XO?p@oQCB35;^elF`o6Zoh WD0)e2Py0cjRScf4elF{r5}E)=eqi|k literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_fir_leaves.png b/mods/moretrees/textures/moretrees_fir_leaves.png new file mode 100644 index 0000000000000000000000000000000000000000..6643b87b29d545702587947d50a6fd2693e6511d GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHV5AX?bm2^_(k`olvlj0EO1Bz{G z&dvf-tR+Ey!T*7P;rBMaV4y&Tr;B3<$92|&je;!>9Lxv)c(5ihOK~~0G3_b%d;QDq z3{PXJ7X{lFG+tlq#j7=2Zhhj3*ySz1=e#ONl26pzec<=%J}Hft?e2?qMq9PMh{?@K w$uyb$!L|Dbr(o39l#0zKA2iEuUVQH-vskt0AKq|X380+}p00i_>zopr0IE_*+yDRo literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_fir_leaves_bright.png b/mods/moretrees/textures/moretrees_fir_leaves_bright.png new file mode 100644 index 0000000000000000000000000000000000000000..e3b2e6f30370de20888642c9d82fcad2c2113349 GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHV5AX?bwN5aQGndrzQW4jb0E$^X zZT13EtR+Ey!T*7P;rBMaV4y&Tr;B3<$92|&je;!>9Lxv)c(5ihOK~~0G3_b%d;QDq z3{PXJ7X{lFG+tlq#j7=2Zhhj3*ySz1=e#ONl26pzec<=%J}Hft?e2?qMq9PMh{?@K w$uyb$!L|Dbr(o39l#0zKA2iEuUVQH-vskt0AKq|XkXsl$UHx3vIVCg!04@GWt^fc4 literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_fir_nuts.png b/mods/moretrees/textures/moretrees_fir_nuts.png new file mode 100644 index 0000000000000000000000000000000000000000..a53414948effacf40f749a3ee097af0b74243e4f GIT binary patch literal 361 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 literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_jungletree_leaves_yellow.png b/mods/moretrees/textures/moretrees_jungletree_leaves_yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..d116455e563b4241a8ff674b8271ba130e28510c GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHV5AX?bt!OtcZ!wBVHuUy228tc> zJA4R8v6ck+1^@p4|33qt*^0?PffP>{#}JO|tOpqdSqwQ?Hcb5>Yw)3gQG-q6b^K-3 zifwYLNA$04di0><-p;uN*X!=Ju2R^{y=LdH^R4evrVF>9|MlxY_?$P*0&i2rcQq~2 w+3;v)(ZQ!tlW#bS%`KRDXJW%|mFtg~J2fR3j%+ud4z!QK)78&qol`;+01{44ZU6uP literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_oak_leaves.png b/mods/moretrees/textures/moretrees_oak_leaves.png new file mode 100644 index 0000000000000000000000000000000000000000..aa587c5d73bd0638a2dba007dbec99b2bd0b0c8c GIT binary patch literal 730 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GXl47_9?*LR>98C4fj-k6+hX7>JCW z#q?}Nlyvwcb!Y7t*#6(liy6Rp$Y+9YbZfcv*m2OoF6=g09hW zK#g)5yg&rh2o&cLW;3uC0kVZ zV#?fxev&{fqDtIAPs!@>162Y|mNyiT)8_{|Ow~%*$X^Pi*ils3Tu9$rLR^(c-Bv`= zL{QID0%(+$vzWGvn1+L>iiMDlo47jAd~0E#Q}?Gn{RE^kOM?7@3s??C#g|+y`NvrN z@A&kWZ~y%_78cm^f3C!zX_w#q|6kDhU*JmZ|Noc&|C9Rq<_aSt3v=bIf4^Cb=P~bO zxBLGg+RT@UDd0bINhRZdynx|O|L#_xrB6Lw977~7vmRt_IuanjdLZuhw%prt#xsBH zzW>*MLuiUu!+WRNbxPO&9F^b6#dXT!rkC;R51)N`L}WJ4>wc}cre-0}<4B%> zy^i(H_|@JWY&I+Q=FIzc1-EQ2E|3s)e?43Jbi|!YMwLrGIb2G-xn+t zG?U>tn6|$xvbIja$7i;QsNn4{kG%FYGOakW`hHaEmfF96D%5#XmN7oJILQ0BXGwj{ zU(v^XTU*RlbxT-e9?M~TaiyZtNj@z~_hro-t?3np2Ul(EnL739$-L(?PPDBv=h`xL g(Q@PK_bz_p*KqUOzovYZ4$#94p00i_>zopr0DRT@-~a#s literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_oak_sapling.png b/mods/moretrees/textures/moretrees_oak_sapling.png new file mode 100644 index 0000000000000000000000000000000000000000..eef6a7217514002dcd9aca627233b9c83139603a GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9JOMr-u0UEgja_{*n~N4})n{_C*`6Yko5=Wee1 zxnGFwm6?>}_lr>R|IU!XJn0-a9r&Aj(!-n^Oj*E^YHBW> zg69qtgAU_BGE~VjwZY^>sV87Yv~odpkk!e=jdIScS6UE-!=S0|VUr{_HJYyEy8S4E zYNVMcQDDhJoJ@u=F%O!n7o7%Jr7 z@)}{?4v|(QNRXatA!$@fO-iLj*EK&q($`I9qIfLeWN?>GF0v@4bij!_Q3|vBZ3cNK z&tubhJ!Uq7xlM?S#|=0Q^J)N&qXDlOAzUcowFr4oKSN|_Vtk-GXxBIP z6|-@&l4t6B({#vf)~Sc`OgP}^VR4^bNBQhA(#=NvYFP&zu!nqTf^uOtgR-MtDQvF| zXJJ?w3%FAef5?M+t%lklyVI(}tOlzIu^VA4s?}>12S@r;9sEuKm+)EK76g$=3Je*< zEgG>Q2fzG$_PeE{V}tc$x88o^ z^jqNmy`R2*|Jf0CarnUes~^AqCRjW3&AW$7$sm2Rxc`L@K3WH>_ue~lEfLZLc3&Nu zdijTSu=dW=qYT-lRQbcbSB`)G5Ue%Ii@RW+qD^}>a(m|6Ww5$8wV~V27eaD1e!KSN zI{2dy_pNqH#3Jq`;_|_-mciPgjTN^*%4zSo6dSnyd9!gccjuZ}wqx;vCt7*&rRMBs zdCFn8KB>Q8*_oYwW)^JxxUc)N(}nt_AD%e2fu!rIse$!E!(aTOg1$%4hjWeQ%*!SHf~*4GAk=KHZmz55Hl<+H8CzSF)&w1MMp(JIWsao zJUTx-IfP<0lWjatJ0LhJ7e6l=EG#TAFfg5UK!{~Ga8oUeXgQT`JYz{HM>HI2Pb-&j zK8|TQRzM?=YdcFf9w;a%T0aevp|whQ z9~EnT1;VV(+blCf(=~=sHjqTX8WaXW5+aTQV zv5Hm}R%W8#0O29oB%|nrH?iLY;kD0G8D;SjO>Wjf_-H+I*9pa(%q1uwu{bTI_hmHt zK2U`_6=SrvOUd~+P>tJ@{l&TYrG=yO$M>&5pLM7!{0RWU_b=p%K3ck|>a+j=002ov JPDHLkV1lKu$BF;| literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_oak_wood.png b/mods/moretrees/textures/moretrees_oak_wood.png new file mode 100644 index 0000000000000000000000000000000000000000..05d02f9559e8bcaceb1c96751b1fcfd29d49a8c9 GIT binary patch literal 618 zcmV-w0+s!VP)=EEr}?DKjP%byqOBj8ix&7qo^+E+P}VkXTtlB(8x+850T!1_NzT zEEW(6QavGeSTJrC^h)sN4Gm>mOuYyMo3I#eV7k*tch-Ehw z4+t$G5{zg$opnHqXE=gkHKuz*o_0Z@ctWRqM456vm2Nx>2n4ErMR-{;vV}>FX*#5O zLp3NCoOC~sYdd;cF_UdPpm#wD2Lz95IuQ&8iDo#KZ#|=VLYHtpwhZ%(0002>NkloK|7Vah8U77C=FXhOqx5Mb`JEne^c8b!pq>yv!%7a#>bvU?bw*x^8#u zqQ&?tQ2?vD?->Ef=o+Kgp%7)e7K!xr(@P;DTAjgkJ6!FpF0R6JuE8Bo_n|6LQDv|h z>qJgOa|%Fs#^USV*{QD0ikQMyQ$VEcWq!&Etf_L4=lQ&r*G`V?gL0miOF+_sIw>+5 z1@`4`62neCO^cqgJ|qFtS6dn&;j@pEjdL0J8>}rle~7<9HR_jp2mk;807*qoM6N<$ Ef&?1ruZw-6vlsDl3r31vouMYG-i8y$?Z*=wCOd~+QcL_HBHhqwRWK;$qEncP z3Y*HPAo`&Lg^5r-*)!{~$PLYTX#O5w~>7Qz&z zs18#X>SoMwDihdpxQ4Myhar5s&@>^hL+wYs8rvqSHe$_SilGhgVF!*3h7RmmDr49; zBcxEZqH4pN=c8VPehd-ZpCSyR_F<0T$RQ-rt)-}u+6=~SED3ZSlr&Q4LL0^qM%j#e zgi;^k2sLR|C9!^jx*csN4r$+nkU-mtYYR#z8Xqe>So^WW5z?$|#t=l^h)l#YhM1wW z1+(-ai_k-%6-7NC*pQ1<51{o^+edj2PoA<)ioIaPlERfky9T8Xy;PyG`c`G|NwPX6yj=3rQ+|20XW9`+NU59>tJ@&h%+w%!;cX9_rZhL^mK)_?-{F-DhcQuxt>+GyneSzmk1+_DFK3pG literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_palm_sapling.png b/mods/moretrees/textures/moretrees_palm_sapling.png new file mode 100644 index 0000000000000000000000000000000000000000..aaa3415d340890c45b1b970156eeff145a975d45 GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`j-D=#Ar_~T6C|cMSk3%uZ?w$A z*t6|`$RU$VuZ@4)#gwCrJK8eUZVBXcd6cnQF=VnOZc1iOV+iGuWMkubT)@EaWtxj~ UHqb951#Jj73CQtEnaSV~Ttb5ix>9B*q(F+?@ySY@%eShru?;6|j)R}p; z)(7{lQyc~dcC)A|Y`ix=CT3;h-y6w}P3x~L$#MImS5eD*Oyc|8eR|2V6`PGrEBD#m zSo^Ut#OFnIg7CewiH~ZnI;+xk&xZere5{HGFRIPh$NJ|C qV`}sdSKd{pZaiWM_gS&(7rSV)$e(Gtac_X`WAJqKb6Mw<&;$TWEM<}a literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_palm_trunk_top.png b/mods/moretrees/textures/moretrees_palm_trunk_top.png new file mode 100644 index 0000000000000000000000000000000000000000..fe07ae34e1b60b88d281cf38c010c835e5346ac7 GIT binary patch literal 400 zcmV;B0dM|^P)I~&@kd()R< zPB$6KfNhB0f4CfPZtu>g^EK?CuYj=r>Hh*-_a$xXGKY=;0000hL>#DRDveent!yuSO&?h{7Q2sSPcRc2 z5C=pm5t?5oNh}hHR3n&OCP^(5yOCFDWXR~`qw0%mjb2_wtOt5r4xQbr2fKRuF zS+|H=QZf{>dPTN{SGkH`xQSe~gHyDBPHs-10{{R3@JU2LR2b6*!2^QBP!s^bx3;a? zc9J%2Y~%C(2iY0utkj)4Rp*nIC|;bm>Og#!(RXtj%-WYCVHn8pBh_)dS9ppo!`I3s_d56kDy_Cunq?!TB9WTj5P2_5&DGEg5}yft%q-PoiZl1LN0qmYWh8xtqwEzGB07*qoM6N<$f-a{2&;S4c literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_poplar_leaves.png b/mods/moretrees/textures/moretrees_poplar_leaves.png new file mode 100644 index 0000000000000000000000000000000000000000..64568bc8019b9abec180e8ed2df82ea5e8769380 GIT binary patch literal 563 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!Lb6AYF9SoB8UsT^3j@P1pisjL z28L1t28LG&3=CE?7#PG0=Ijcz0ZQx&@Ck7R(h_+R#+}A$)oL2G8cO9#I!!t{4LWAs zW~x=Hrk$p`O}eVpss^nFT6J3LHR>jvCPp1bYBg$d#d4Z;no4C#`px<}jXGNOS_Ul! zM(sx0_1e<;(w2Re3Z)8q&3YES7Un(Xl6jJLlkJ2vgf(h3tR`4V?NMQuIvxknRu*4XPpV>0}37Uba4!kxGdUt)9H|bhztKh%_$zj-q{ANEFnvD7VUWW z?f?C!Z(pC8$;y^BBlFWmiLTC_NoTffnW9%56MQynmh=~aJ#&k_GZw}P9Em<>+-NGW zS9$HVAJ*?aPFWEX^4a0wF(>0jMs2yrJXfY{d3$7?koD1d&l;@XsoW5a*5Ug*Wkr>e z1@q~cKsig>%UW?MZ*yeqPIAX3vvzL(aIXD5w4LWAsW+t5`8nqgdd6GJf zI_fp*a>a6b&3cx7md2gNT6J0}X{n)cQDWI*Ditb9WlAY&DL($5$`#7yJ?2t*Ql+KE zMY&malkJ2vgms&AQ&VFD{9QC^G!#k|!Xg6`lHv?n4dhDXJp8>QW1^JGm9!hQQ?k-y z;-ht%bfV*9gCfJiV?yIn)BgYe|3)~n0_ZZvk|4ie28U-i(m;O zkH}&M25un`X1sK_?hjCqy~NYkmHh!blQ<`9RYiOkP^iq)#W6(Ua&kfggPR&#$bmCW zr_xiCQ{4q0JV<%u^sM-^!N!kD*^eGS5Pu-(A|xOrCMf#YRY+j^gegMP+=M1foH{xD zfs0VUlc1nyp^iciM1@5K#hip5goFlPzW`MKMDW4$2hL?PXH471w<^8l>xG)t`3$KH Z42j&Vk2JO{0fsgMgQu&X%Q~loCIDF$ig5q{ literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_poplar_small_sapling.png b/mods/moretrees/textures/moretrees_poplar_small_sapling.png new file mode 100644 index 0000000000000000000000000000000000000000..fb9bd03078fcd3e6c90c8b6c52342096de2f019d GIT binary patch literal 347 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!Lb6AYF9SoB8UsT^3j@P1pisjL z28L1t28LG&3=CE?7#PG0=Ijcz0ZJqX_=LCuX`>D!t$Hn;1|73*Gm}mejam)KJV~8K z9rYS@xnjAn$iRf8IO9%ZhXSQ6wH%;50sMjD8d;3=**-JcqUD+S7Gx1o9&N>s$2NZJkba4!kxSX7@Krtc3NjM?R z@#*GG8#gWHC@3&0T*y&S`1!*kjt?KXITmqnaCUbr;^^q~E?AH?ampmOt>JEBXA_G) b1+X#n&SsMMzB2MY&_D)HS3j3^P6y_T(NSVRG_80h87V3#Bu;=4uBJaL>~qKTLr)o2!J(302bN?_ejm&-7dQl?#|~6xmYI7$E-$uw-y@PIvl2{wzf?MRPATTY;QcuPzVYe zjl$GA4T|KmxojfsbvxTT#3V^fj*QrChKA-Ezt3Z|AOVIdW>PMftyLlQdNH%zS}v5* z$&6Z~XqAhHwhRpxi`wqaCRt-L6_4^^httxZOWCYwr&h&s9EQ0{`F=m;leCHK4*SH& zc!(CZ+bmbMmdeFKUk39yOZ^2e?t+YlK#=j^o&bS6oYn?OJ;#OnGkr8kwRcHT3)u&3#z~x^eQHFfH(4Sq zCy|T7Y{+G|wa6vWD4*_4v?-)COQ(3YHxbe5lx~kZo6R6*Bgt@>%hA#<$t5yoQx9T7 z2TKD?kXGs;Cd|eoTsjtMQ^;%t8K9X~Wk)obrYK5hfXn%!rW>-k9NWjY2WUUkqtE2C zBZnC!e}u@*$4#dD2ACFnWRX0ccT@02kyX4Z#E?<7diYu?W z`kIy3UI$iPf5VM8t-kq|TW?#lcHQlF+zHlisJW}Q?(X`A#*LerM9rIlSkfYuwYJII zI~1K=N|hQw8m+Dy)+4B)$7nKJtiWb>I9-_AKmP(8`tqx8V|DBq>I#6wL?=uL_fyTP#+TAr!@P7$m6d?cr literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_poplar_trunk.png b/mods/moretrees/textures/moretrees_poplar_trunk.png new file mode 100644 index 0000000000000000000000000000000000000000..47672fb9a555b739a9520f88843aa1bcc35aaf02 GIT binary patch literal 980 zcmV;_11tQAP)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw0006gP)t-sYiDPEcX@z#dRkgj zX=PxPjg4?`YD`f_gMNIKi;7`nV3m}XU}a;7gN1x_c2ZYSdUbM?j*W0{Ygb%Ve0+JD zlaWnIK!%8kZEtUbfPr;zZcDbwlah>(cy@DGSx|d>dZ(hIad2r!PC|ZtcWZ8E ze}R0Mk&c>{nUIZ zU}j!`fPILAgJNM_XliJjo0?)}Tzh_apPrb1fqQ0bZij<}QCCfdgN1Z)aEXbCkdKU3 zT2p|7fR2cRkBo4nv|GubaJSrsDFTdU}|QOl#+XUcw1s$mXnx`kBn<>Yl(x0e1U#EN5x zPe@EkPDxEm&&UL^vKX>+a`W;F3X6(MN004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw0003{P)t-sQB_oacX@z#dRkgj zX=PxPjg4?`YD`f_gMNIKi;8=BbyQbQXlG(|adKN;U6zo9dv$4&i+-M&j-Q&3u&bh} zq?@Ormz|i6g?@2)b7y8@R&HrtR9H}5Wn_?veA3I6+t#hy)vMUjq}tS|-Po?z(W7u{ zU}R`zVQ6QOiha+>lGM$e)6JR7!-j@`a%X5|ZEfpu_hQc+2hjE;qUdvkAWU13^zd3K?hnU05q ziinAJba8rndjJ3b^7z$600001VoOIvZ&e6kfdBvi32;bRa{vGf5&!@T5&_cPe*6Fc z00(qQO+^Rb2LcQ`6`IUf4gdfE`AI}UR2b6@j#oPaK@>o*UZN(F%_3&*?2O11WC=1s zuvk{~-g__q|IxgkbG`%6)ZEhA*51+C)t&0;g%tGl4-BR=L)n~{&-=q8qfi(l6dA(+ zk#jL#gozRjq|(L^B{-j)g6T3314@x{2T*SYW-HV%iApfR8J(Mlg$h=sbv_alSX+dp zav%dEtWX9OF4tjYRjer@t;49sXdN~-nPiseSQ{thwqV=GkR`-ccL;{q*oD1)R}gWm zl@JUM4&msS34M}SV-kYAbP8wZ7m5%fW$gZqe+gIDH@A0Ql#LqcOzqx(fXAojm)E!V hkI%2~;?Hm4?;mcIEz9jEwa5Sf002ovPDHLkV1idzO4k4Y literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_poplar_wood.png b/mods/moretrees/textures/moretrees_poplar_wood.png new file mode 100644 index 0000000000000000000000000000000000000000..55e6b44ef59201f5a2e2077f6a54a71a8f1bd095 GIT binary patch literal 726 zcmV;{0xA88P)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw0003yP)t-sp_5*%pJ|+rTC}Hc zt)g?Sn{>CSbe)o1s-9}IsB^8OaJQ{_uA*6tjWNg%EO|^zn#Ij zke-=q#Jrcry_uhqT&9 zxUPD|y_d$mo5{eQvZ;5`%B-)Xcht_a*U`DLpK+<2WU8HHqm^H;p>M06W}=mBv!!sH zmtUrtWw57vshw%Bqi(USbg`j)pqYBu(z>*&e5svin~qqmpK6_uU9XjMte08wR0004E zOGiX#%WU)_00009a7bBm000XT000XT0n*)m`~Uy|2XskIMF-#q0t`D9n#@-Y0002> zNkl5J2J4*y}JmvWsCM3q%uJ?2$z@_TDx2-roNWjOX(I4nSLbp`){_ zyQjCWe_(KE7|qiQqec!Jn_JsEyLKd>3cO8@`>07*qo IM6N<$f;rw|`2YX_ literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_raw_coconut.png b/mods/moretrees/textures/moretrees_raw_coconut.png new file mode 100644 index 0000000000000000000000000000000000000000..ca318edc421dfba35d6d2498c6547da4031188ca GIT binary patch literal 466 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMft^l79*NYb~o;-Q-)TvXCA3r{J z?AVnnSDrtAe);m{{o7Yuy?XV}pFi{aOBPKkee~$ji4!LlPcHlT@#B&ybYT06J)4)Vm{EQ0+O@xb|IVLKGPkdIUVq8Kg9o2JeLAP7=-8gM zhj*^}@#Dw7t;^^47cZSsapcI6@87>ac<|u$>(`$?eR}ok)wy%$&YwU3?Afz-@7}GL zQMGVl+13r<;#~BFJ8QS`SSDU&+p&AfAi)I(D|O>lT?6|T}hB%@PA4G!>-?j zWvfqlG&m9t`7Mk7G3yW0Y5fJqxE*fr zJzDjtxxr-S8V8AOTa(tY1QvBKS18eWn(o;BWtlD0!nm+X1LJS6moDRWV>GzTo)O9* zbv>@+?rx4Riab*Vmw%r7{R@Z8{a0<-fv6 z72D)gkLX|9^yopyy`6IluGigbU8S&@d(F;Y=Ud;UOc!oH|LfO*@Huaq1>UBL?`m44 wv*FRqqJvMPCf{%tn_DpR&cue_D%T$|cWO#79NBI@9cUker>mdKI;Vst03#|+i~s-t literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_rubber_tree_sapling.png b/mods/moretrees/textures/moretrees_rubber_tree_sapling.png new file mode 100644 index 0000000000000000000000000000000000000000..d2e06d058026c898b038d171b517e0ff6f117319 GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9JOMr-u0UF?nnzQL<^TWx<=Y*n z0{M(3L4Lsu4$p3+0XdeQE{-7_vdIY!%)D9-jje1vJVKsaygW8hUBVJOEVf8X+z9hx tRGpT=(7A`zp(&ebLPA!9FuQ^dL%<)-og&XXnt_Hec)I$ztaD0e0s!WjCFlSE literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_rubber_tree_trunk.png b/mods/moretrees/textures/moretrees_rubber_tree_trunk.png new file mode 100644 index 0000000000000000000000000000000000000000..c5da574c14b26650375d2478e3cbfbed4c637683 GIT binary patch literal 693 zcmV;m0!safP) zv#%x_5k@yECK?eX8WOUutUWd(MK~*1PDdaV4nH;}F(esEJ1is^5GETCNjxt>G$leb zCQdyrB^eM?N<=p+AeWDaP(v~^C>%5@8&NCVIxr$D9u+w&AX7v$ zJTW9KAsHtd6Gb>DR75l?9~C+*Aw4i5IxQe69TPY!9w!&KqHAFQiOFk`0 zIx9^)E>1x+NjfPzFCr%!5+oWCXI)dVuBtx8X(isZyfA+ddY}7r*26_w$WcMrR{3N(KNxN=qVDiN)>) zPD->>Kx2uKG=|DU036>Yzf&g#KzyaLY<>}gNGb}_YZsMo>S$OnH}}YaVZnsDONa2t%Ocz2oBz2pb76Ee-HbKYRApGz85Yb#DI1r~yLSDWLkF7>$9-UE6&u$r1`P zAs@SXiBv*o&z$V*S#NIK_tGx5F+ zHbTOZ5CMa=?X699OJ@6>=gyta_gaitax|RdG+;S`A(F#~GdLHGd96BuR&qL3rk(NH z$-+!eP+$eK_RxW0lSbZHw^S|y7F^1bsGWdajJhz*Iw$DfGc-_DnitJawbG~wOZHhb zrL#OHjm*!pdw1_>UsabaSSf`VS4b9=g#}LUbCLp!XL5|sO=YK=CE&YH#^eeH6$A`w5lg9TBuXO^uaok*=t!1>LX&NJgr$`_d6Eu+iUV#` z0!l(crk%3lO0!;RXH-@k5o|infYEB0LL`(D^7974sBsunR*iyCNHHnEQ$*n`M>xS6 zO`$PZCl{Nr6g`?!m~JAw(0vZ^2St8;2%*@Qh=#7No zK(wYR8k_pJ+PyyU>C#AOzW$;J6HWdHWMT?T^>SzdL{H$X<{{v@v$AuHSJDcmO>jA2fS8jau zn~SeM+rBU~y?7~@)S~{F+LX3M|c1<)qGa_z8Fo{hyfk!iNKrVz-I(AVygito3dQy#K zL!@<5rEyDzT0NL*NVkVsn`J?*cu}f(PDwW zIwd|WAW$_XPB$hjAQ(Fgy|J9Jqlz;s z9ifnNw5E@%oPxl$p`(&@ub_syt(U^LqeC1_gZK(J& zW9yryBfJ7_8&PG@PKR34Okj|YJuT0@N`I}WJ^Y3cW4H~m)ggp?gdJH*DZP`0bE5W; zh|S2%j7PEyAs~;6k@0O_RDqWfgx2R)>vygDvhPI>mmMdfgofF=2?YRel(uZ%WG*aDR!nFvJjG-yM>&l$&I%uNROXN*VvWo|x&Cs{^c)U&&cI dv9am!%|G(;CKk$H=^_9C002ovPDHLkV1jdyuQ>n! literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_sequoia_leaves.png b/mods/moretrees/textures/moretrees_sequoia_leaves.png new file mode 100644 index 0000000000000000000000000000000000000000..594c958353255103ba1f8091e905ea42a210f431 GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHV5AX?bjY$_WFynOc;#JXL2a0*r z_jds)){-E<;Qv6t@Ov9yFi;@F)5S4_<2viXM!^;b4(0=YJXn*MrMMj0nD!L>z5Zo) zhNrRAi-PS78m}+*;?@~ literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_sequoia_sapling.png b/mods/moretrees/textures/moretrees_sequoia_sapling.png new file mode 100644 index 0000000000000000000000000000000000000000..b11bc0b7cf0a73c19d00d0767078eaf8d8a9448c GIT binary patch literal 209 zcmV;?051QDP)unTMRF9a}(Ox+@gRHbQSr*_RK{&Q>Na%3#8`{`%Z@aCaw zuI!*#d#-{V#6)LZkOdo$V3yeSxo=X&&T_<2Y z9&SDuP#gk_LJ@O46;K!ecRLecAOMp^5o#jB!Md6q3U_kR-z&zIG&C; zG5T~`Wmf_OVSg%jhwWKLlPJ{4(iv^^V|^*>{OgAURm$`j9$H@Dbn;d5}!7`-*| zp^ySc;}`$Wi(&N52cvI3u)h7k`nmbQ`u2m;`1S+qFU;o$B!6c?>CGT!00000NkvXX Hu0mjfjVsmH literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_sequoia_trunk_top.png b/mods/moretrees/textures/moretrees_sequoia_trunk_top.png new file mode 100644 index 0000000000000000000000000000000000000000..d1891fd3190e8a6bf67f5decea14ebe05a60eb65 GIT binary patch literal 594 zcmV-Y0z-G-4|#QZ65bK|5(LD~d)! zjY>wAR5?5r6IUf7STP}aL@shbE1P3qxMoF>R8XZ{KAdD=qjGPTURi}oGNg5Jsa`;q zT2^>CG=@tvfj&8yUs{bxM2ba0fwi)nPOg{ZfcNGOo&52m|$IYH!_k{QHDW0 zQ7s;yX=j#QScE`2j7UR~Q%;jsQhho$N+}yiC>w)-I~xE10Ov_WK~xwS1;GP?#6T1U zz`wT5S!--tNhY?t-~BJKRWt+#0002Mm*ij1nuWsFc5Y{QxbU zp9b|-+-)$iV;Y+h2z}#Vx?3#om8#VwsDU5_%yWW7)4IFT7_aZ5h@_` zkD_CiIBLwYvAzaE<>avAMb0Ri6y=aWxJz5iu z$`Vyky0NLc?R^l3o4jWpoyODLvyFRBKE7hn^LmkzraJopX;?fz)Xpw0$LHhE*@Dxb g#x)-Rzya{(KWULhjF&M=<^TWy07*qoM6N<$f=CtVkN^Mx literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_sequoia_wood.png b/mods/moretrees/textures/moretrees_sequoia_wood.png new file mode 100644 index 0000000000000000000000000000000000000000..2e43595bb84f19b0d05b17e1198a18ffd046b62e GIT binary patch literal 1037 zcmWlYSyvln06;&wXiNQUT&lIP;sPTeTWB*OkYutwp!P^+kJ28%J!;nzWC_zh!6MPUvS45D*>~2WCH*oX~G?AmHf}9 z^=r;A-pa0JLx+ym0dQh!%RfyU0a%x0EKcL8-devCPqli6N%gTVE>%xQ>a4RZtlxnN zUc6fd83az*^~03H#~MUdFF3InUwycVX)l2ZFX6MQ<2)7jQcXoLRZGNd>I6s3wzB~b zo_6S`?V2d9ZY_b6tY)UhY)9a<3!CGqxke_*XhhDK@RaDhFn2Z6TL7 z<qn)-x}q7LNbsg~9eq$$C_3>8s?u*nEmD|rwB`tZdO9ltf+^CnF<|!`%Lrx;>z=EtHSG#x-Gsnb2OWk{0v*9+y(N-ao`^ZBMo3g}X_F01kTZm7RmwvQ zD)S;%G|gcGjUJ+vQ%>z(#m>3{=&P0=X=D0T$QUVaErk zhCPP47F(AbMmaoDV@~sCJ|D(8s;@FP-oZp2c*JW+HnV#al2n~3;lzd%(qTiX;Lyi; zV~nTct*p>S3l4RdRrRCWhIHj|ju2XyK#h6UqoWWQG@~JhHpr-scG^W&6LDbyyYghG z-A5=Uc+;ds#pXkwslrcJg=|==!8B@=3$E(0UFRc}q7{ueH31to<0XBhY=S@qI~L^# zk=6PsWmgdl+EhWSX54~}kh|=8FjH?9IlT*kouzP4jU-$ezfJE!U|+c;%xG8yPMRzB zRpfZ`q3F`bI6UIk1*{cKg|NF6T5_SlYLlFSL*VB2<9`B>B_(m4bNfP;Boay|;XD_?^kQdqNwgx_bwtr>8~_y?_1uiLX*(yH=wHpUpm|U mf9s=fPkoaK_x8O0^5r`2@65m-&Awt}?QcLDt@ymYap*r=M18;j literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_spruce_cone.png b/mods/moretrees/textures/moretrees_spruce_cone.png new file mode 100644 index 0000000000000000000000000000000000000000..1c9da85042cc66b0bde478f47cfca7f15dbf2d74 GIT binary patch literal 496 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU&(N0G|-o zH#4TMDvWr(WKKhh!O4<0Y(cP#OCmAF__9^kHWxG;NmtnJEF|3eie8Fq5J;$n2Qc?-jg zw&i6n4RPx5GyHLL%9G7?Zyoj<7^<7ZKX6PGo;(uSYDRh&O|)aR5905qbt-yM2JC3hRH=& zR92cJ-A=<;9^`H2w&Vps%Dp7WFZe%I0K@S)VfjEKi#=T&LnJOI7dSKX1VqJ3hdQ_h z_;N=&Or1X4)tTM1VQypRk7y9RerCdmZHP zbny3!x_N=e^FTzn=lwfUo(C=+IdJHh;LW9B%eL`p_-)@_T;%q3PPg`~{D%w-e4I8u U2I>#IfYvj3y85}Sb4q9e07@+49RL6T literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_spruce_leaves.png b/mods/moretrees/textures/moretrees_spruce_leaves.png new file mode 100644 index 0000000000000000000000000000000000000000..6643b87b29d545702587947d50a6fd2693e6511d GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHV5AX?bm2^_(k`olvlj0EO1Bz{G z&dvf-tR+Ey!T*7P;rBMaV4y&Tr;B3<$92|&je;!>9Lxv)c(5ihOK~~0G3_b%d;QDq z3{PXJ7X{lFG+tlq#j7=2Zhhj3*ySz1=e#ONl26pzec<=%J}Hft?e2?qMq9PMh{?@K w$uyb$!L|Dbr(o39l#0zKA2iEuUVQH-vskt0AKq|X380+}p00i_>zopr0IE_*+yDRo literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_spruce_nuts.png b/mods/moretrees/textures/moretrees_spruce_nuts.png new file mode 100644 index 0000000000000000000000000000000000000000..130c11c830d397f479851b154d3c3c791e29acdb GIT binary patch literal 365 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}dw@@fYrLCrL9lhSn^A6nRfeBM zvZrxgpjEW1QLMXhnvZF$t5Id7Lq&vrVX$?Qr)ivraZ!j(x{qnFgI<)YVWO95inm$3 zhe?F9LAsAwf|qHkw^@ddd8VIPn3H~vzh$zQNt}mCZjg0~mq~t*b*8U*lBaQ+w`shm zNrta^nzvbun^8fKHP9{A`mBjSO1C7)FZe$RfMMx-?!Q2d8J;eVArg|T2U(e#7#LVK zY~H<_*)ZXM{rqSKhNkN^j1C4f&pFiE3QrL&unc8k*jIi?q9)(Q-X(U=#~-o{61=}x z^vf%-`BtoFU~I5uYDnr{aFuoaeLhEJe+~0&mbqp8I*I{|3JeVOp5E#&k8W`|544lP M)78&qol`;+0L9vf-v9sr literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_spruce_sapling.png b/mods/moretrees/textures/moretrees_spruce_sapling.png new file mode 100644 index 0000000000000000000000000000000000000000..0275afb53bacf1a384acfa0d1a3eda7548a145f3 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|u0UEUkyTEZIp)ug1wamC zNswPKgTu2MX+Vyhr;B3jRdrZFfMZH}UPWh0H;ivnfMiQk8xI)d0S^mHh*GCa8*8RP&sy5LX~)0by`An zRX(AEWou75ifvJOT|{C>Gh#+EW=b|=Ml+jzUyyTFglJ8QY*1rJGlFGHg=tQAS3#eE zWMoJ*iEL4OT0@3tPH0RxriW>HTSRkIK6+e4fMH2-RzGx8KB9zXdRjwiO*w#INSb_K zd09g6d(9gF009L_L_t&-(*?l;fPIo1i&`)f|xbZFn0a_bq=4LNeT)7(n#`sJL>x7b-yYlfkg7i!k1!Z@10|S z(jn$x<01=QH{yJ$z@=n;nFoIWjNHX_K-9FSfe z9TNtaWFL-Q9aJ|FS2+@9Lls~@6Fw;ohFBYLNf%>56m?A)8W9Bv1_Dwx5nMbIeNq|? z2m)b16j?eFkzXEdM;3om8i!dNdQcgBQ5k4N6$k|ZZb%n+PZ@Je7+X6Mfm9kF6b1$a z0dh+h3kL#(RvUs<8*4@uX+;)yP8j8H#p(b60O?6YK~xyi1;GPi#840b(5dZq%_OVX zwm;_n*XesOHD}$ln=QU~in9LNNkBs!+Q&o8{OzwoFa=c%Nm4Q7r8{&e5-73Fa)Zg2 zs{Y&CjSsIMUeSA_)$h&G8#e{$DLtRgf!qYS)BH3(7&K;~N~v3AH7^r{G&>G$6{inx zk;d`;2zJ+*ccuiLv|6v`_5z+RsF9?`C~kRBq7BdOB&jC{F%;bF7-!#Emr zN3Ya56n$?My|uY2#?k6W5Aw?r6D=pV3>lZ35>AI7B9s`3e z(0T?N_UjLTlx9hgU+{k-0YlIig?6B(C7v#hArhBa54I*UI|?vt(-{_pJf$iem$zR z?4OSci;SJeQn5pCeHnhR8C?)rc&35bp5a8etyR{p#T%M7X!{GAZPh)uOSwmkeb?Q) zf9pz8ilxp=H1 Nc)I$ztaD0e0sxp>kf;Cv literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_willow_sapling.png b/mods/moretrees/textures/moretrees_willow_sapling.png new file mode 100644 index 0000000000000000000000000000000000000000..18414de443f17c0994ae3ebbfdda45f640192245 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%``JOJ0Ar_~T6C}PkXifZT?>g)2 z(}@4xs!j$cXSwcGWIHjV^8l~XshuaxlrI~lDed5O+{PNK%yan1qI(fMj?-MW2`&?i zl{w6i@;|AV(Mozb_lHasi3vAM4#l)xe))q(@m88sn?S0uo%0F5QzeEB3^R7M2&hTL Rp9NaY;OXk;vd$@?2>|z|J4gTk literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_willow_trunk.png b/mods/moretrees/textures/moretrees_willow_trunk.png new file mode 100644 index 0000000000000000000000000000000000000000..a3bd5f06d82b3feee7aa3bbd7a6d861da9795841 GIT binary patch literal 630 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GXl47|R2ELR@`40>T0#^mX*}vn#AE zo#La@gT4LL6_u^btW%TnY|YJ+BBDKPEHe^ginBBF^YWeT9m4`6?JTU#P0V8>t{gIyfmgS-QD)HQ9*tr7!0&GmFLl2aptLhLN9V*`Rboc*j#%yVNxLVbNb zU41j6BP~r#^>mGWy#q`POyWaAQlcXLJ-uBWT#faNOLDVQqoaboz2ZXxGE(z$<09?N zt^8bET&%5=qM~)RbF@$n9{v#?5!OH@`=iVO^li;VSk@vyhD&4`PS3JfXE%Jz44jR**GcXD*GvCc}2 zOOJ`RvvJCZjdFMP4Dj#>_Vq8!Nb+&@3ifdJa&q->@e1|wtj$fgGBx*fat`rwKPkhP z42+3go-U3d5|XCpY`G2@NU$aB`>|}T+fjKI{|9zi~erYX1Sz0hamp_Fv{STPFp#Tmt%n N!PC{xWt~$(69B)@*dqV{ literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_willow_trunk_top.png b/mods/moretrees/textures/moretrees_willow_trunk_top.png new file mode 100644 index 0000000000000000000000000000000000000000..c54c1820df271cfe141865393475610d378debd2 GIT binary patch literal 513 zcmV+c0{;DpP)@0X=iO*T6}0`c4Aa0Ix~pBowQ!S#K6__n zg>P-exOS_XNP>1Zdv7#AH8e>*Jb7hfyscq+ZZm;vX_|{cWmHp4KtE<&E1;1>Y+)@v zGcvB7NwuU-!Lw|@vTL@bQA0R4zp!S7csR15OJY(`hk7`ReL6idF_MHmxTsflYB7j= zId^O_shCDJEi9vxL^Lcb0Tuq20002kNklum z3Mc>o008Ph{qw#t3_4j|7H>VE=(XV`o60<9W|nGzR8z*=p|b>E=q&X>aI@3+c$OT^ z*K1uaLGVf;C&{3to=?kb5Iobb#yU-F&a~Np;BKmo&|@$NHn1xY8vU?ntI@BW5n`iHedb|w0 zZ6}o@B@@4(2!(sQyf{CzZ|skKq3ADCQ4au60My|h1Fbk8$0BNi00000NkvXXu0mjf D_TSTp literal 0 HcmV?d00001 diff --git a/mods/moretrees/textures/moretrees_willow_wood.png b/mods/moretrees/textures/moretrees_willow_wood.png new file mode 100644 index 0000000000000000000000000000000000000000..21c57428be981ae7dd79c17cc2b6402949dfdb2b GIT binary patch literal 565 zcmV-50?Pe~P)jPC*-2NFI%LGA$+$XI3P@qfbvl9Dr*r&9-!AR3pf) zV?Hw#%Cc+0q);;}5}blJsEj+tt6iIcHfvcXQbZkwa4(5+Fnwq&#Hd+dP$7zQF>zif zJ24bXJ{r24L1R)PI4%=|Z7xhe8?KQ(KQtC(QzKnXAVD@3jC3)XfHuIQO~t8Nyq!a( zi8{WZNxz~@!lhG_do;J0Ky+a#HZ2plnL)v&QaLabtByRZkUhPgMzoecm3%bAr&d%( z9i)gkn0_@iEE1A=Gf_hvy`Dt7oIq$gGR2b6*!2^QBP!s^bx3=xtOxoCXzVCmOoq=SSlu4Opt%uI$GbZ@v%j9q5(i@MLy=QI_L}ad&eH2PyIu zNg!5H9{FekKs%D?$Xa|;)sE*2kT=<$Vr|EoHfs^?f@S6IBzG5A)_}MIYOkqDBooE1pHfai20S>h1I&#?(A%$(Ckh00000NkvXXu0mjf D%?s?Z literal 0 HcmV?d00001 diff --git a/mods/moretrees/tree_biomes.txt b/mods/moretrees/tree_biomes.txt new file mode 100644 index 00000000..b6a4fd0f --- /dev/null +++ b/mods/moretrees/tree_biomes.txt @@ -0,0 +1,34 @@ + + Elevation Temperature Nearness to Nearby What nodes Perlin Avoid +Tree type (m) (approx., °C) some node water to spawn on seed diff radius +-------------------------------------------------------------------------------------------------------------- +jungle tree - 5 to +10 above +15 water, 20 10 dirt_with_grass 329 5 +fir above +25 -20 to +10 n/a n/a dirt_with_grass 359 8 +firs on snow above +15 -20 to +10 n/a n/a snow:snow 359 8 +palm - 1 to + 1 +15 to +32 water, 15 10 sand 330 5 +date palm - 1 to +10 above +39 water, 20h,20v 100 desert_sand 339 10 +date palm +11 to +30 above +39 water, 1h,30v 1 desert_sand 340 10 +apple + 1 to +10 +23 to +32 n/a n/a dirt_with grass 331 15 +oak 0 to +10 + 4 to +16 n/a n/a dirt_with grass 332 15 +sequoia 0 to +10 -30 to +50 n/a n/a dirt_with grass 333 10 +birch +10 to +15 -20 to +10 n/a n/a dirt_with grass 334 5 +spruce above +20 -20 to +10 n/a n/a dirt_with grass 335 10 +cedar n/a n/a water, 15 5 dirt_with grass 336 10 +willow - 5 to + 5 n/a water, 15 5 dirt_with grass 337 20 +rubber - 5 to + 5 above +32 water, 15 10 dirt_with_grass 338 20 +poplar n/a -10 to +26 water, 15h,5v 1 dirt_with_grass 341,342,343 10 + +beech n/a n/a n/a n/a dirt_with_grass 2 10 + + +Notes: +------ + +Beech trees are meant to replace default trees, but are themselves disabled by default. They grow in the same areas +as the default ones do, and under the same conditions. + +Fir trees appear in a snow biome only with older versions of SPlizard's Snow Biomes mod. In more recent versions, +these trees will not grow, due to an engine bug. + +Cedar trees replace, and are identical to, the original pine trees, as the minetest default game now has (a completely +different type of) pine trees. diff --git a/mods/moretrees/tree_models.lua b/mods/moretrees/tree_models.lua new file mode 100644 index 00000000..eb6541e6 --- /dev/null +++ b/mods/moretrees/tree_models.lua @@ -0,0 +1,275 @@ +moretrees.beech_model={ + axiom="FFFFFBFB", + rules_a="[&&&GGF[++^Fd][--&Fd]//Fd[+^Fd][--&Fd]]////[&&&GGF[++^Fd][--&Fd]//Fd[+^Fd][--&Fd]]////[&&&GGF[++^Fd][--&Fd]//Fd[+^Fd][--&Fdd]]", + rules_b="[&&&F[++^Fd][--&d]//d[+^d][--&d]]////[&&&F[++^Fd][--&d]//d[+^d][--&d]]////[&&&F[++^Fd][--&Fd]//d[+^d][--&d]]", + rules_c="/", + rules_d="F", + trunk="moretrees:beech_trunk", + leaves="moretrees:beech_leaves", + angle=30, + iterations=2, + random_level=0, + trunk_type="single", + thin_branches=true +} + +moretrees.apple_tree_model={ + axiom="FFFFFAFFBF", + rules_a="[&&&FFFFF&&FFFF][&&&++++FFFFF&&FFFF][&&&----FFFFF&&FFFF]", + rules_b="[&&&++FFFFF&&FFFF][&&&--FFFFF&&FFFF][&&&------FFFFF&&FFFF]", + trunk="moretrees:apple_tree_trunk", + leaves="moretrees:apple_tree_leaves", + angle=30, + iterations=2, + random_level=0, + trunk_type="single", + thin_branches=true, + fruit="default:apple", + fruit_chance=15, +} + +moretrees.oak_model={ + axiom="FFFFFFA", + rules_a="[&FFBFA]////[&BFFFA]////[&FBFFA]", + rules_b="[&FFFA]////[&FFFA]////[&FFFA]", + trunk="moretrees:oak_trunk", + leaves="moretrees:oak_leaves", + angle=30, + iterations=5, + random_level=2, + trunk_type="crossed", + thin_branches=false, + fruit="moretrees:acorn", + fruit_chance=3, +} + +moretrees.poplar_model={ + axiom="TTTaaBCCCCCCCCCCCcccBBB[[f]&&G++f++Gf++Gf++Gf++G--]G[[f]&&G++f++Gf++Gf++Gf++G--]Gff", + rules_a="T", + rules_b="[[T]&&G++f++ff++ff++ff++f--]G", + rules_c="[[T]&&G++f++ff++ff++ff++f--G++[d]G[d]G++G[d]G[d]G[d]G++G[d]G[d]G[d]G++G[d]G[d]G[d]G++G[d]G]G", + rules_d="f", + trunk="moretrees:poplar_trunk", + leaves="moretrees:poplar_leaves", + angle=45, + iterations=0, + random_level=0, + trunk_type="single", + thin_branches=false, +} + +moretrees.poplar_small_model={ + axiom="TT[T]BCCCCccBBff", + rules_a="T", + rules_b="[[f]&&G++f++Gf++Gf++Gf++G--]G", + rules_c="[[T]&&G++f++[d]Gf++[d]Gf++[d]Gf++[d]G--]G", + rules_d="f", + trunk="moretrees:poplar_trunk", + leaves="moretrees:poplar_leaves", + angle=45, + iterations=0, + random_level=0, + trunk_type="single", + thin_branches=false, +} + +moretrees.sequoia_model={ + axiom="FFFFFFFFFFddccA///cccFddcFA///ddFcFA/cFFddFcdBddd/A/ccdcddd/ccAddddcFBcccAccFdFcFBcccc/BFdFFcFFdcccc/B", + rules_a="[&&&GGF[++^FFdd][--&Fddd]//Fdd[+^Fd][--&Fdd]]////[&&&GGF[++^FFdd][--&Fddd]//Fdd[+^Fd][--&Fdd]]////[&&&GGF[++^FFdd][--&Fddd]//Fdd[+^Fd][--&Fdd]]", + rules_b="[&&&GGF[++^Fdd][--&Fdd]//dd[+^d][--&Fd]]////[&&&GGF[++^Fdd][--&Fdd]//dd[+^d][--&Fd]]////[&&&GGF[++^Fdd][--&Fdd]//dd[+^d][--&Fd]]", + rules_c="/", + rules_d="F", + trunk="moretrees:sequoia_trunk", + leaves="moretrees:sequoia_leaves", + angle=30, + iterations=2, + random_level=0, + trunk_type="crossed", + thin_branches=true +} + +moretrees.birch_model1={ + axiom="FFFFFdddccA/FFFFFFcA/FFFFFFcB", + rules_a="[&&&dddd^^ddddddd][&&&---dddd^^ddddddd][&&&+++dddd^^ddddddd][&&&++++++dddd^^ddddddd]", + rules_b="[&&&ddd^^ddddd][&&&---ddd^^ddddd][&&&+++ddd^^ddddd][&&&++++++ddd^^ddddd]", + rules_c="/", + rules_d="F", + trunk="moretrees:birch_trunk", + leaves="moretrees:birch_leaves", + angle=30, + iterations=2, + random_level=0, + trunk_type="single", + thin_branches=true +} + +moretrees.birch_model2={ + axiom="FFFdddccA/FFFFFccA/FFFFFccB", + rules_a="[&&&dFFF^^FFFdd][&&&---dFFF^^FFFdd][&&&+++dFFF^^FFFdd][&&&++++++dFFF^^FFFdd]", + rules_b="[&&&dFF^^FFFd][&&&---dFFF^^FFFd][&&&+++dFF^^FFFd][&&&++++++dFF^^FFFd]", + rules_c="/", + rules_d="F", + trunk="moretrees:birch_trunk", + leaves="moretrees:birch_leaves", + angle=30, + iterations=2, + random_level=0, + trunk_type="single", + thin_branches=true +} + +-- Coconuts can't be generated as fruit, because there is no support for the +-- special fruit trunks that allow coconuts to regrow at the correct position +-- in the tree. +-- So, a placeholder fruit trunk is spawned. An ABM will convert it to the final +-- fruit trunk, and generate the actual coconuts. +moretrees.palm_model={ + axiom="FFcccccc&FFFFFdddRA//A//A//A//A//A", + rules_a="[&fb&bbb[++f--&ffff&ff][--f++&ffff&ff]&ffff&bbbb&b]", + rules_b="f", + rules_c="/", + rules_d="F", + trunk="moretrees:palm_trunk", + leaves="moretrees:palm_leaves", + angle=30, + iterations=2, + random_level=0, + trunk_type="single", + thin_branches=true, + fruit="moretrees:palm_fruit_trunk_gen", + fruit_chance=0 +} + +-- Dates can't be generated as fruit, because there is no support for the +-- special (male and female) fruit trunks that allow dates to regrow at the +-- correct position in the tree. +-- So, a generic fruit trunk is spawned. An ABM will convert it to a male +-- or female fruit trunk, and generate the actual dates. +moretrees.date_palm_model={ + axiom="TTTTddddddddddccccccccccRT[TGGGGT]".. + "ccccc[&&a]ccccc[&&a]ccccc[&&a]ccccc[&&a]ccccc[&&a]ccccc[&&a]".. + "GGccccc[&a]ccccc[&a]ccccc[&a]ccccc[&a]ccccc[&a]ccccc[&a]".. + "GGccccc[a]ccccc[a]ccccc[a]ccccc[a]ccccc[a]ccccc[a]", + rules_a="Gffb&bbb[++f--&ffff&ff][--f++&ffff&ff]&ff&ff&bb&bb&bb", + rules_b="f", + rules_c="/", + rules_d="F", + trunk="moretrees:date_palm_trunk", + leaves="moretrees:date_palm_leaves", + angle=18, + iterations=1, + random_level=0, + trunk_type="single", + thin_branches=false, + fruit="moretrees:date_palm_fruit_trunk", + fruit_chance=0 +} + +moretrees.spruce_model1={ + axiom="FFFFFAFFFFFFBFFFFFFCFFFFFFDFFFFFF[&&&F^^FF][&&&++F^^FF][&&&++++F^^FF][&&&++++++F^^FF][&&&--F^^FF][&&&----F^^FF][FFFFf]", + rules_a="[&&&FFFFFF^^FFF][&&&++FFFFFF^^FFF][&&&++++FFFFFF^^FFF][&&&++++++FFFFFF^^FFF][&&&--FFFFFF^^FFF][&&&----FFFFFF^^FFF]", + rules_b="[&&&FFFFF^^FFF][&&&++FFFFF^^FFF][&&&++++FFFFF^^FFF][&&&++++++FFFFF^^FFF][&&&--FFFFF^^FFF][&&&----FFFFF^^FFF]", + rules_c="[&&&FFFF^^FFF][&&&++FFFF^^FFF][&&&++++FFFF^^FFF][&&&++++++FFFF^^FFF][&&&--FFFF^^FFF][&&&----FFFF^^FFF]", + rules_d="[&&&FFF^^FFF][&&&++FFF^^FFF][&&&++++FFF^^FFF][&&&++++++FFF^^FFF][&&&--FFF^^FFF][&&&----FFF^^FFF]", + trunk="moretrees:spruce_trunk", + leaves="moretrees:spruce_leaves", + angle=30, + iterations=2, + random_level=0, + trunk_type="crossed", + thin_branches=true, + fruit="moretrees:spruce_cone", + fruit_chance=8 +} + +moretrees.spruce_model2={ + axiom="FFFFFFBFFFFFFCFFFFFFDFFFFFF[&&&F^^FF][&&&++F^^FF][&&&++++F^^FF][&&&++++++F^^FF][&&&--F^^FF][&&&----F^^FF][FFFFf]", + rules_b="[&&&FFFFF^^FFF][&&&++FFFFF^^FFF][&&&++++FFFFF^^FFF][&&&++++++FFFFF^^FFF][&&&--FFFFF^^FFF][&&&----FFFFF^^FFF]", + rules_c="[&&&FFFF^^FFF][&&&++FFFF^^FFF][&&&++++FFFF^^FFF][&&&++++++FFFF^^FFF][&&&--FFFF^^FFF][&&&----FFFF^^FFF]", + rules_d="[&&&FFF^^FFF][&&&++FFF^^FFF][&&&++++FFF^^FFF][&&&++++++FFF^^FFF][&&&--FFF^^FFF][&&&----FFF^^FFF]", + trunk="moretrees:spruce_trunk", + leaves="moretrees:spruce_leaves", + angle=30, + iterations=2, + random_level=0, + trunk_type="crossed", + thin_branches=true, + fruit="moretrees:spruce_cone", + fruit_chance=8 +} + +moretrees.cedar_model={ + axiom="FFFFFcccdddB///cFdFB////cFdFB///cFdFB///cFdFA///cFdFA///cFdFB[FF]f", + rules_a="[&&&TTTT[++^TFdd][--&TFd]//Tdd[+^Fd][--&Fdd]]", + rules_b="[&&&TTT[++^Fdd][--&Fdd]//dd[+^d][--&Fd]]", + rules_c="/", + rules_d="F", + trunk="moretrees:cedar_trunk", + leaves="moretrees:cedar_leaves", + angle=30, + iterations=2, + random_level=0, + trunk_type="single", + thin_branches=true, + fruit="moretrees:cedar_cone", + fruit_chance=8 +} + +moretrees.willow_model={ + axiom="FFFFFFFFccA", + rules_a="[&FF&FFFF&&F&FFFFFFFdddd][**&FF&FFFF&&F&FFFFFFFdddd][//&FF&FFFF&&F&FFFFFFFdddd][////&FF&FFFF&&F&FFFFFFFdddd][//////&FF&FFFF&&F&FFFFFFFdddd][////////&FF&FFFF&&F&FFFFFFFdddd]", + rules_c="/", + rules_d="F", + trunk="moretrees:willow_trunk", + leaves="moretrees:willow_leaves", + angle=30, + iterations=2, + random_level=0, + trunk_type="crossed", + thin_branches=true +} + +moretrees.rubber_tree_model={ + axiom="FFFFA", + rules_a="[&FFBFA]////[&BFFFA]////[&FBFFA]", + rules_b="[&FFA]////[&FFA]////[&FFA]", + trunk="moretrees:rubber_tree_trunk", + leaves="moretrees:rubber_tree_leaves", + angle=35, + iterations=3, + random_level=1, + trunk_type="double", + thin_branches=true +} + +moretrees.jungletree_model={ + axiom=nil, + rules_a=nil, + rules_b=nil, + trunk="moretrees:jungletree_trunk", + leaves="default:jungleleaves", + leaves2=nil, + leaves2_chance=nil, + angle=45, + iterations=nil, + random_level=2, + trunk_type=nil, + thin_branches=true, + fruit_chance=15, + fruit="vines:vine" +} + +moretrees.fir_model={ + axiom="FFFAF[&&-F][&&+F][&&---F][&&+++F]Fff", + rules_a=nil, + rules_b=nil, + trunk="moretrees:fir_trunk", + leaves=nil, + angle=45, + iterations=7, + random_level=5, + trunk_type="single", + thin_branches=true, + fruit="moretrees:fir_cone", + fruit_chance=8 +} diff --git a/mods/trees_lib/LICENSE.txt b/mods/trees_lib/LICENSE.txt new file mode 100644 index 00000000..e5ab03e1 --- /dev/null +++ b/mods/trees_lib/LICENSE.txt @@ -0,0 +1,502 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/mods/trees_lib/README.md b/mods/trees_lib/README.md new file mode 100644 index 00000000..98b86fe0 --- /dev/null +++ b/mods/trees_lib/README.md @@ -0,0 +1,122 @@ +Trees are common. Yet they are all registered manually so far. And plugging +in to their growing mechanism with mods is difficult. + +Author: Sokomine +Contact: see https://github.com/Sokomine + +License: LGPL (same as minetest_game) for the trees_lib from 11.04.2017 onward + (trees_lib_examples may contain code from other mods) + +List of files: + init.lua The actual trees_lib. + +If you want to see some examples, take a look at + https://github.com/Sokomine/trees_lib_examples +which contains the following additional files: + init.lua Just runs dofile on the other files. + trees_lib_growing_functions.lua Some tree growing functions as examples. + example_tree.lua A complex example for one tree. + trees.lua Replacement for default/trees.lua + +Not covered by trees_lib: +* fuel receipes for the tree, wood, leaves nodes +* crafting of tree into wood (use trees_lib.register_on_new_tree_type for those) +* leafdecay + +If you want to test trees_lib with the default mod, do the following: + +1. (optional) remove/comment out all receipes for tree trunk -> 4 wood in default/crafting.lua +2. (optional) remove/comment out all tree, wood, leaves and fruit nodes in default/nodes.lua + If doing so, also remove/comment out all calls of default.register_leafdecay plus all + leafdecay-related functions in default/functions.lua. +3. (optional) rename the file default/trees.lua in order to create a backup. +4. copy trees_lib_examples/trees.lua to default/trees.lua + +If you want to add a new tree using trees_lib, do the following: + +1. Create a mod (MODNAME) +2. Find a name for your tree (TREENAME) +3. Create the following textures for your new tree: + MODNAME/textures/MODNAME_TREENAME_tree_top.png + MODNAME/textures/MODNAME_TREENAME_tree.png + MODNAME/textures/MODNAME_TREENAME_wood.png + MODNAME/textures/MODNAME_TREENAME_sapling.png + MODNAME/textures/MODNAME_TREENAME_leaves.png + MODNAME/textures/MODNAME_TREENAME_fruit.png +4. Make your mod depend on trees_lib by adding a line trees_lib to + MODNAME/depends.txt +5. Actually register the tree somewhere in your mod: + trees_lib.register_tree( TREENAME, minetest.get_current_modname() ) + All other parameters to trees_lib.register_tree are optional. + + +Important functions: + +register_tree + +trees_lib.register_tree(tree_name, nodes, growing_methods, grows_on_node_type_list, can_grow_function, select_how_to_grow_function, interval, chance ) + * tree_name needs to be unique withhin each mod, but not necessarily + withhin the entire game. This parameter is required. + * nodes may contain further information about the nodes the tree is composed + of (tree, wood, leaves, leaves2, leaves3, leaves4, leaves5, sapling, fruit). + Specify everything you want to override here (i.e. diffrent node name, + textures, drawtype, ...). Specify node_name = "air" (see trees.lua) if you + don't want a particular node (mostly used for trees that have no fruit) + * growing_methods is a list of how the sapling can be grown into a full tree. + Each entry needs one of the following entries: + use_function = function_to_grow_the_sapling + or + use_schematic = path_to_the_schematic_file + or + use_schematic = table_containing_the_schematic + or + use_lsystem = table_containing_lsystem_growth_data + In addition, the following values are usually needed: + xoff = x_offset, zoff = z_offset, yoff = y_offset (how deep burried), + height = height (total height of the tree) + These values describe which area the Voxelmanip needs to load or how + far away from the sapling's position the schematic ought to be placed. + * grows_on_node_type_list is a list of nodenames (or groups in the form + of i.e "group:stone") on which the sapling will grow. + * can_grow_function will be called when the abm for a sapling fires: + if can_grow( pos, node, ground_found ) returns + 1, the tree will grow + 0, the tree will try again next time (i.e. too dark) + -1, the tree really doesn't like this place and fails to grow, + usually turning into dry shrub + * select_how_to_grow_function can modify the way a tree will grow: + select_how_to_grow( pos, node, growing.how_to_grow, ground_found ) + It can either return a number (thus choosing one of the growing methods + from the growing_methods parameter), or its own new growing method. + * interval + The interval parameter for the abm for the growing of the sapling. + Default value is 10. + * chance + The chance parameter for the abm for the growing of the sapling. + Default value is 50. + + +trees_lib.register_on_new_tree_type( new_tree_type_function ) + The function new_tree_type_function will be called once for each registered + tree with the following parameters: + new_tree_type_function( tree_name, mod_prefix, nodes ) + This is useful for i.e. adding craft receipes and further nodes. See + trees.lua for an example. + If trees have allready been registered when the new function is registered, + it will be called for each known tree once, and of course for all + subsequently registered trees. + + +trees_lib.failed_to_grow( pos, node ) + This function is called when a tree failed to grow (i.e. because it does not + like the ground it is placed on). The default action is to turn the sapling + into dry shrub. + +trees_lib.a_tree_has_grown( pos, node, how_to_grow ) + Called whenever a tree has successfully grown. Useful i.e. for logging (see + trees.lua) + +trees_lib.tree_abm_grow_tree( pos, node, sapling_data, how_to_grow, force_grow ) + The actual function that lets the tree grow. + + diff --git a/mods/trees_lib/init.lua b/mods/trees_lib/init.lua new file mode 100644 index 00000000..f32eca2e --- /dev/null +++ b/mods/trees_lib/init.lua @@ -0,0 +1,656 @@ + +trees_lib = {} + +-- place this node if a sapling does not like the environment and refuses +-- to grow into a tree there +trees_lib.place_when_tree_cant_grow = {name="default:dry_shrub"}; + +----------------------------------------------------------------------------- +-- compatibility functions so that trees_lib can work without default mod +----------------------------------------------------------------------------- +trees_lib.sound_leaves = function() + if( default and default.node_sound_leaves_defaults) then + return default.node_sound_leaves_defaults(table) + else + return nil + end +end + +trees_lib.sound_wood = function() + if( default and default.node_sound_wood_defaults) then + return default.node_sound_wood_defaults(table) + else + return nil + end +end + +-- copy of default.after_place_leaves +trees_lib.after_place_leaves = function(pos, placer, itemstack, pointed_thing) + local node = minetest.get_node(pos) + node.param2 = 1 + minetest.set_node(pos, node) +end + +-- generalized function called after placing fruits +trees_lib.after_place_fruit = function(pos, placer, itemstack, pointed_thing) + if placer:is_player() then + -- find out the node name (this function is for all fruits that do not override it) + local node = minetest.get_node( pos ); + if( node and node.name) then + minetest.set_node(pos, {name = node.name, param2 = 1}) + end + end +end + + +----------------------------------------------------------------------------- +-- the various node definitions that are common to all nodes of that type +-- (unless overriden) +----------------------------------------------------------------------------- +trees_lib.node_def_tree = { + --description = "TREENAME Tree", + --tiles = nodes.tree.tiles, + paramtype2 = "facedir", + is_ground_content = false, + -- moretrees uses snappy=1 here as well + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = trees_lib.sound_wood, + on_place = minetest.rotate_node + } + +trees_lib.node_def_wood = { + --description = "TREENAME Wood Planks", + --tiles = nodes.wood.tiles, + is_ground_content = false, + -- moretrees uses snappy=1 here + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, + sounds = trees_lib.sound_wood, + } + +trees_lib.node_def_leaves = { + --description = "TREENAME Leaves", + --tiles = nodes[k].tiles, + --special_tiles = nodes[k].special_tiles, + + -- moretrees has some options for this + drawtype = "allfaces_optional", + waving = 1, + visual_scale = 1.3, + paramtype = "light", + is_ground_content = false, + -- moretrees sets moretrees_leaves=1, leafdecay = decay + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + sounds = trees_lib.sound_leaves, + after_place_node = trees_lib.after_place_leaves, + -- the drop part of the node definition needs to be constructed + -- for each leaf individually + } + + +trees_lib.node_def_fruit = { + --description = "TREENAME Fruit", + drawtype = "plantlike", + visual_scale = 1.0, + --tiles = nodes.fruit.tiles, + --inventory_image = nodes.fruit.tiles[1], + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = false, + selection_box = { + type = "fixed", + fixed = {-0.2, -0.5, -0.2, 0.2, 0, 0.2} + }, + groups = {fleshy = 3, dig_immediate = 3, flammable = 2, + leafdecay = 3, leafdecay_drop = 1}, + sounds = trees_lib.sound_leaves, + -- store that this fruit has been placed manually + after_place_node = trees_lib.after_place_fruit, + -- a fruit that wants to be eatable ought to supply the following line in + -- its fruit definition: + --on_use = minetest.item_eat(food_points), + } + +trees_lib.node_def_sapling = { + --description = "TREENAME sapling", + drawtype = "plantlike", + visual_scale = 1.0, + --tiles = nodes.sapling.tiles, + --inventory_image = nodes.sapling.tiles[1], + --wield_image = nodes.sapling.tiles[1], + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = trees_lib.sound_leaves, + } + +----------------------------------------------------------------------------- +-- internal functions for handling identification of nodes (i.e. what is a +-- trunk, what is a leaf, which nodes can be replaced by new trees) +----------------------------------------------------------------------------- +-- those are helpful for fast lookup (either by name or content id) +trees_lib.is_tree = {} +trees_lib.is_wood = {} +trees_lib.is_leaf = {} +trees_lib.is_sapling = {} +trees_lib.is_fruit = {} +trees_lib.ignore = {} + +-- trees are allowed to replace these nodes when growing +-- (in addition to leaves, saplings and fruits from other trees) +trees_lib.ignore_list = { + "air","ignore", + "default:water_source","default:water_flowing", + "default:snow","default:ice"} + +trees_lib.build_lookup_table = function( node_name, node_type, value, allow_removal_by_other_saplings ) + if( not( node_name ) + or node_name == "" + or not( minetest.registered_nodes[ node_name ]) + or not( trees_lib[ node_type ])) then + return; + end + local id = minetest.get_content_id( node_name ); + -- we store by id and nodename both for faster lookup + trees_lib[ node_type ][ id ] = value; + trees_lib[ node_type ][ node_name ] = value; + -- if this is set, then other saplings can overwrite these nodes during + -- their growth (i.e. replacing leaves with tree trunks) + if( allow_removal_by_other_saplings ) then + trees_lib.ignore[ id ] = value; + trees_lib.ignore[ node_name ] = value; + end +end + +-- actually store the information from the ignore list +for _,v in ipairs( trees_lib.ignore_list ) do + trees_lib.build_lookup_table( v,"ignore", v, 1 ); +end + + + +----------------------------------------------------------------------------- +-- allow to call a function whenever a new tree has been registered +----------------------------------------------------------------------------- +-- contains a list of all functions that need to be called whenever a new tree +-- type is registered using trees_lib.register_tree(..) +trees_lib.register_on_new_tree_type_function_list = {} + +-- the function new_tree_type_function will be called once for each tree type; +-- use this for adding the 1 tree -> 4 wood craft receipe +trees_lib.register_on_new_tree_type = function( new_tree_type_function ) + + -- call the function for all tree types that have been registered up + -- until now + for k,v in pairs( trees_lib.is_sapling) do + new_tree_type_function( v.tree_name, v.mod_prefix, v.nodes ); + end + + -- store the function so that it will get called at all subsequent + -- registrations of new trees + table.insert( trees_lib.register_on_new_tree_type_function_list, + new_tree_type_function ); + +end + + +----------------------------------------------------------------------------- +-- mix basic node definition (see below), default constructed values (which +-- are derived from modname and treename) as fallback and user (=user of the +-- trees_lib) specified node defintion up into one node definition and +-- register the node (provided it does not exist yet) +----------------------------------------------------------------------------- +trees_lib.register_one_node = function( def_common, def_default, def_user, node_type, sapling_node_name, cid ) + if( not( def_user)) then + def_user = {}; + end + -- find out which node we are supposed to register + local node_name = def_user.node_name; + if( not( node_name )) then + node_name = def_default.node_name; + end + -- if the node is alrady registered, then abort + if( minetest.registered_nodes[ node_name ]) then + -- store the content id of this node for this type + cid[ node_type ] = minetest.get_content_id( node_name ); + def_user.node_name = node_name; + return def_user; + end + + -- create the new node definition + local node_def = {}; + -- first, add all entries from def_common + for k,v in pairs( def_common ) do + node_def[ k ] = v; + end + -- then try the default values + for k,v in pairs( def_default) do + node_def[ k ] = v; + end + -- last, apply all user supplied node definitions and thus overwrite + -- common and default definitions + for k,v in pairs( def_user ) do + node_def[ k ] = v; + end + + -- set inventory_image and wield_image for plantlike nodes + if( node_def.drawtype + and node_def.drawtype=="plantlike" + and not( node_def.inventory_image )) then + node_def.inventory_image = node_def.tiles[1]; + node_def.wield_image = node_def.tiles[1]; + end + + -- the node name does not belong into the node definition + node_def.node_name = nil; + + -- actually register the new node + minetest.register_node( node_name, node_def ); + + + -- make sure the node name gets saved + def_user.node_name = node_name; + + -- can this node (in theory) be overwritten by other trees? + local allow_overwrite = nil; + if( node_type=="leaf" or node_type=="fruit" or node_type=="sapling") then + allow_overwrite = 1; + end + -- enter all these node names into a table for fast lookup + -- (without having to resort to checking the group) + -- the trees_lib.is_sapling field will later on contain more helpful information; + -- the sapling needs to be the first node registered for this to work reliably + trees_lib.build_lookup_table( node_name, "is_"..node_type, sapling_node_name, allow_overwrite ); + + -- store the content id of the newly registered node + cid[ node_type ] = minetest.get_content_id( node_name ); + return def_user; +end + + + +----------------------------------------------------------------------------- +-- nodes for the trees: trunk, planks, leaves, sapling and fruit +----------------------------------------------------------------------------- +-- (internal function) +-- * there can be up to 5 diffrent leaves types +-- * Note: craft receipes for fuel (tree, wood, leaves) do not need to be +-- added because default already contains general craft receipes +-- based on the respective groups. +-- * Note: The craft receipe for 1 tree -> 4 wood can be done via +-- trees_lib.register_on_new_tree_type +trees_lib.register_tree_nodes = function( tree_name, mod_prefix, nodes ) + + -- gather all the relevant content ids + local cid = {}; + + local tree_name_upcase = tree_name:gsub("^%l", string.upper); + local texture_prefix = mod_prefix.."_"..tree_name; + + if( not( nodes )) then + nodes = {}; + end + + -- the sapling node name will act as a reference in the lookup table later on; + -- therefore, we need to determine how the node will be called early enough + local sapling_node_name = mod_prefix..':'..tree_name..'_sapling'; + if( nodes.sapling and nodes.sapling.node_name ) then + sapling_node_name = nodes.sapling.node_name; + end + + -- register the sapling + nodes.sapling = trees_lib.register_one_node( trees_lib.node_def_sapling, + { + node_name = sapling_node_name, + description = tree_name_upcase.." Sapling", + tiles = { texture_prefix.."_sapling.png", + }, + }, nodes.sapling, "sapling", sapling_node_name, cid ); + + + -- register the tree trunk + nodes.tree = trees_lib.register_one_node( trees_lib.node_def_tree, + { + node_name = mod_prefix..':'..tree_name..'_tree', + description = tree_name_upcase.." Tree", + tiles = { texture_prefix.."_tree_top.png", + texture_prefix.."_tree_top.png", + texture_prefix.."_tree.png", + }, + }, nodes.tree, "tree", sapling_node_name, cid ); + + -- register the wood that belongs to the tree + nodes.wood = trees_lib.register_one_node( trees_lib.node_def_wood, + { + node_name = mod_prefix..':'..tree_name..'_wood', + description = tree_name_upcase.." Planks", + tiles = { texture_prefix.."_wood.png", + }, + }, nodes.wood, "wood", sapling_node_name, cid ); + + + -- default drop rate for the sapling (1/20) + local sapling_rarity = 20; + if( nodes.sapling and nodes.sapling.rarity ) then + sapling_rarity = nodes.sapling.rarity; + end + + -- register the leaves; some trees may have more than one type of leaves (i.e. moretrees jungletrees) + local leaves_id = {'leaves','leaves2','leaves3','leaves4','leaves5'}; + for _,k in ipairs( leaves_id ) do + -- not all leaf types need to exist; we just expect at least one type of leaves to be there + if( nodes[ k ] or k=='leaves') then + -- we need to determine the node name now as leaves tend to drop themshelves sometimes + local leaves_node_name = mod_prefix..':'..tree_name..'_'..k; + if( nodes[ k ] and nodes[ k ].node_name ) then + leaves_node_name = nodes[ k ].node_name; + end + nodes[ k ] = trees_lib.register_one_node( trees_lib.node_def_leaves, + { + node_name = leaves_node_name, + description = tree_name_upcase.." Leaves", + tiles = { texture_prefix.."_"..k..".png", + }, +-- special_tiles = { texture_prefix.."_"..k.."_simple.png", }, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = { sapling_node_name}, + rarity = sapling_rarity, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = { leaves_node_name}, + } + } + }, + }, nodes[ k ], "leaf", sapling_node_name, cid); + + -- also store the content ids of all leaf types + cid[ k ] = cid[ "leaf" ]; + end + end + + -- register the fruit + nodes.fruit = trees_lib.register_one_node( trees_lib.node_def_fruit, + { + node_name = mod_prefix..':'..tree_name..'_fruit', + description = tree_name_upcase.." Fruit", + tiles = { texture_prefix.."_fruit.png", + }, + }, nodes.fruit, "fruit", sapling_node_name, cid ); + + -- return the ids we've gathered + return cid; +end + + + +----------------------------------------------------------------------------- +-- growing of the trees from saplings +----------------------------------------------------------------------------- +-- turn saplings that failed to grow (because they don't like the ground or +-- environment) into dry shrub, thus allowing dry shrub farming; +-- override this function if you don't like this feature +trees_lib.failed_to_grow = function( pos, node ) + minetest.set_node( pos, trees_lib.place_when_tree_cant_grow); +end + +-- this function is called just before a tree actually grows; +-- the function ought to return how_to_grow for normal tree growth; +-- returning another way of growing is also possible (i.e. diffrent +-- model when growing in flower pots/on stone) +trees_lib.change_tree_growth = function( pos, node, how_to_grow ) + return how_to_grow; +end + + +-- this function is called whenever a sapling of type node has grown +-- into a tree using how_to_grow at position pos +trees_lib.a_tree_has_grown = function( pos, node, how_to_grow ) + return; +end + +-- called by the abm running on the saplings; +-- if force is set, the tree will grow even if it usually wouldn't in that +-- environment +trees_lib.tree_abm_called = function( pos, node, active_object_count, active_object_count_wider, force_grow) + -- if we don't have further information about that sapling, then abort + if( not( node ) + or not( node.name ) + or not( trees_lib.is_sapling[ node.name ])) then + -- turn into dry shrub (because we don't know what to do with + -- this sapling) + trees_lib.failed_to_grow( pos, node ); + return; + end + + -- get information about what we're supposed to do with that sapling + local sapling_data = trees_lib.is_sapling[ node.name ]; + + -- the type of ground might be of intrest for further functions (i.e. can_grow, select_how_to_grow) + local ground_found = nil; + -- a quick check of the ground; sapling_data.grows_on has to be a list of all + -- ground types acceptable for the tree + if( not(force_grow) and sapling_data.grows_on and type( sapling_data.grows_on )=="table") then + local node_under = minetest.get_node_or_nil({x = pos.x, y = pos.y - 1, z = pos.z}); + -- abort if this check cannot be done + if( not(node_under) or node_under.name=="ignore") then + return; + end + -- search all acceptable ground names + for _,g in ipairs( sapling_data.grows_on ) do + if( g==node_under.name ) then + ground_found = g; + elseif( not( ground_found) + and string.sub(g,1,6)=="group:" + and minetest.get_item_group( node_under.name, string.sub(g,7))~=0 ) then + ground_found = g; + end + end + -- abort if the tree does not like this type of ground + if( not( ground_found )) then + -- trun into dry shrub + trees_lib.failed_to_grow( pos, node ); + return; + end + end + + -- the tree may come with a more complex function that checks if it can grow there + if( not(force_grow) and sapling_data.can_grow and type( sapling_data.can_grow)=="function" ) then + -- the parameter ground_found is nil if the tree did not specify any demands for a particular ground + local ret = sapling_data.can_grow( pos, node, ground_found ); + if( ret < 1 ) then + -- trun into dry shrub if growing failed finally (and was not just delayed) + if( ret==0 ) then + trees_lib.failed_to_grow( pos, node, ground_found ); + end + return; + end + end + + -- each tree can have several ways of growing + local how_to_grow = nil; + -- the sapling may - depending on the circumstances - choose a specific growth function + -- instead of a random one + if( sapling_data.select_how_to_grow and type( sapling_data.select_how_to_grow)=="function") then + -- ground_found is nil if the tree did not specify any demands for a particular ground + how_to_grow = sapling_data.select_how_to_grow( pos, node, sapling_data.how_to_grow, ground_found ); + -- the select_how_to_grow function may either return a table or a number indicating which + -- growth method to select + if( how_to_grow and type(how_to_grow)=="number" and sapling_data.how_to_grow[ how_to_grow ]) then + how_to_grow = sapling_data.how_to_grow[ how_to_grow ]; + end + else -- else select a random one + how_to_grow = sapling_data.how_to_grow[ math.random( 1, #sapling_data.how_to_grow )]; + end + + -- this function may change the way the tree grows (i.e. select a special method for trees growing in flower pots or on stone ground) + how_to_grow = trees_lib.change_tree_growth( pos, node, how_to_grow ); + + -- actually grow the tree in a seperate function + trees_lib.tree_abm_grow_tree( pos, node, sapling_data, how_to_grow, force_grow ); +end + + +-- actually grow the tree from a sapling +trees_lib.tree_abm_grow_tree = function( pos, node, sapling_data, how_to_grow, force_grow ) + -- abort if no way was found to grow the tree + if( not( how_to_grow ) or type(how_to_grow)~="table") then + trees_lib.failed_to_grow( pos, node ); + return; + + -- grow the tree using a function (like the old apple trees did) + elseif( how_to_grow.use_function and type(how_to_grow.use_function)=="function") then + + -- get the voxelmanip data + local vm = minetest.get_voxel_manip() + local minp, maxp = vm:read_from_map( + {x = pos.x - how_to_grow.xoff, y = pos.y - how_to_grow.yoff, z = pos.z - how_to_grow.zoff}, + {x = pos.x + how_to_grow.xoff, y = pos.y + how_to_grow.height, z = pos.z + how_to_grow.zoff} + ) + local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) + local data = vm:get_data() + + how_to_grow.use_function( data, a, pos, sapling_data, how_to_grow.extra_params ); + + -- write the data back + vm:set_data(data) + vm:write_to_map() + vm:update_map() + + + -- grow the tree using a schematic + elseif( how_to_grow.use_schematic + and (type(how_to_grow.use_schematic)=="string" + or type(how_to_grow.use_schematic)=="table")) then + -- TODO: use voxelmanip + -- remove the sapling + minetest.set_node( pos, {name="air"}); + -- TODO: determine xoff, yoff and zoff when registering the tree + -- (if yoff is not given, then use 0) + minetest.place_schematic( + {x = pos.x - how_to_grow.xoff, + y = pos.y - how_to_grow.yoff, + z = pos.z - how_to_grow.zoff}, + how_to_grow.use_schematic, -- full path to the .mts file + "random", -- rotation + how_to_grow.use_replacements, -- use the same schematic for diffrent trees + false -- no overwriting of existing nodes + ); + + -- grow the tree using L-system + elseif( how_to_grow.use_lsystem and type(how_to_grow.use_lsystem)=="table") then + -- remove the sapling + minetest.set_node( pos, {name="air"}); + -- spawn the l-system tree + minetest.spawn_tree(pos, how_to_grow.use_lsystem ); + + -- else prevent call of success function below + else + return; + end + + trees_lib.a_tree_has_grown( pos, node, how_to_grow ); +end + + +----------------------------------------------------------------------------- +-- register a new tree +----------------------------------------------------------------------------- +trees_lib.register_tree = function( tree_name, nodes, growing_methods, grows_on_node_type_list, can_grow_function, select_how_to_grow_function, interval, chance ) + -- the tree name is the minimum needed in order to register a new tree + if( not( tree_name )) then + return; + end + + -- we may have to register nodes - and those have to be registered under the name of whichever mod called this function and is the "current" mod + local mod_prefix = ""; + -- set it to the current mod - this cannot be done in the line above as that would set mod_prefix to trees_lib and not to the calling mod + mod_prefix = minetest.get_current_modname(); + + + -- register tree trunk, wood, leaves and fruit (provided they are not defined yet) + local cid_list = trees_lib.register_tree_nodes( tree_name, mod_prefix, nodes ); + + -- a sapling will be needed for growing the tree + if( not( nodes.sapling ) + or not( nodes.sapling.node_name ) + or not( growing_methods )) then + return; + end + + -- store information about the new tree type in the sapling table + trees_lib.is_sapling[ nodes.sapling.node_name ] = { + + -- minetest.get_content_id for tree, wood, leaves1..n, sapling, fruit + cid = cid_list, + + -- node name of the sapling + sapling = nodes.sapling.node_name, + + -- values passed on to all functions registered via + -- trees_lib.register_on_new_tree_type = function( new_tree_type_function ) + tree_name = tree_name, + mod_prefix = mod_prefix, + nodes = nodes, + + -- list of node names (can contain groups, i.e. "group:soil") + -- on which the sapling will grow; + -- note: the parameter ground_found to the functions below can only be + -- passed on if grows_on has been specified (else the sapling does + -- not do any ground checks on its own) + grows_on = grows_on_node_type_list, + + -- are all the requirements met for growing at pos? + -- sapling will only grow if + -- growing.can_grow( pos, node, ground_found ) + -- returns a value >0; if 0 is returned, the sapling will fail to grow + -- and be turned into dry shrub; if a value <0 is returned, nothing will + -- happen (the sapling can try again later on) + -- (usful for i.e. requiring water nearby, or other + -- more complex requirements) + can_grow = can_grow_function, + + -- has to be either nil (for selecting a random way) + -- or return a specific growth function like the ones in + -- the list how_to_grow (see below) when called with + -- growing.select_how_to_grow( pos, node, growing.how_to_grow, ground_found ) + select_how_to_grow = select_how_to_grow_function, + + -- list of all methods that can turn the sapling into a + -- tree; can be a function, a file name containing a schematic + -- or a table for L-system trees; + -- this table/list is REQUIRED + how_to_grow = growing_methods, + }; + + -- a new tree was registered - call all functions that want to be told about new trees + for i,new_tree_type_function in ipairs( trees_lib.register_on_new_tree_type_function_list ) do + new_tree_type_function( tree_name, mod_prefix, nodes ); + end + + -- set default values for the tree-growing abm if none are set + if( not( interval)) then + interval = 10; + end + if( not( chance )) then + chance = 50; + end + -- now add the abm that lets the tree grow + minetest.register_abm({ + nodenames = { nodes.sapling.node_name }, + interval = interval, + chance = chance, + action = trees_lib.tree_abm_called, + }); +end diff --git a/mods/vines/.luacheckrc b/mods/vines/.luacheckrc new file mode 100644 index 00000000..bf997801 --- /dev/null +++ b/mods/vines/.luacheckrc @@ -0,0 +1,13 @@ + +unused_args = false + +read_globals = { + "minetest", + "default", + "ItemStack", + "biome_lib", +} + +globals = { + "vines", +} diff --git a/mods/vines/LICENSE.md b/mods/vines/LICENSE.md new file mode 100644 index 00000000..fb677883 --- /dev/null +++ b/mods/vines/LICENSE.md @@ -0,0 +1,4 @@ +License +======= +- Code WTFPL +- Texture CC diff --git a/mods/vines/README.md b/mods/vines/README.md new file mode 100644 index 00000000..89fdb270 --- /dev/null +++ b/mods/vines/README.md @@ -0,0 +1,56 @@ +# Vines + +## Features +- Rope block for spawning rope that slowly drops into the deep. +- Vines are climbable and slowly grow downward. +- Shears that allow the collecting of vines. +- Spawns vines on jungletree leaves. +- Roots on the bottom of dirt and dirt with grass nodes. +- Spawns vines on trees located in swampy area. +- Jungle vines that spawn on the side of jungletrees + +## API +The API is very minimal. It allows the registering of vines and the spawning of +existing vines on nodes of your own. + +If you want vines to spawn on a certain node then you can choose which vine by +adding to the node groups the unique group of that vine. This is determined by +the name of the vine ( see vines.lua ) appended with '_vines'. +An example would be. + +"willow_vines" or "jungle_vines" + +There are two types of vines. One that spawns at the bottom of nodes and uses the +plantlike drawtype, and vines that spawn on the side that use signlike +drawtype. The type is determined by the spawn_on_side property in the biome +table. + +### Example +*taken from mod* + +```lua + + vines.register_vine( name, definitions, biome ) + + --e.g. + + vines.register_vine( 'vine', { + description = "Vines", + average_length = 9 + }, biome ) + +``` + +### definitions +|key| type| description| +|---| ---| ---| +|description| string|The vine's tooltip description| +|average_length|int| The average length of vines| + +For biome definitions please see the [plants_lib API documentation](https://github.com/VanessaE/plantlife_modpack/blob/master/API.txt) + +## Notice +Vines use after_destruct on registered leave nodes to remove vines from which +the leaves are removed. This is done by using the override function. +Malfunctions may occur if other mods override the after_destruct of these nodes +also. diff --git a/mods/vines/aliases.lua b/mods/vines/aliases.lua new file mode 100644 index 00000000..fce72187 --- /dev/null +++ b/mods/vines/aliases.lua @@ -0,0 +1,11 @@ +-- used to remove the old vine nodes. This gives room for the new nodes +minetest.register_alias( 'vines:root', 'air' ) +minetest.register_alias( 'vines:root_rotten', 'air' ) +minetest.register_alias( 'vines:vine', 'air' ) +minetest.register_alias( 'vines:vine_rotten', 'air' ) +minetest.register_alias( 'vines:side', 'air' ) +minetest.register_alias( 'vines:side_rotten', 'air' ) +minetest.register_alias( 'vines:jungle', 'air' ) +minetest.register_alias( 'vines:jungle_rotten', 'air' ) +minetest.register_alias( 'vines:willow', 'air' ) +minetest.register_alias( 'vines:willow_rotten', 'air' ) diff --git a/mods/vines/bower.json b/mods/vines/bower.json new file mode 100644 index 00000000..108a7c16 --- /dev/null +++ b/mods/vines/bower.json @@ -0,0 +1,18 @@ +{ + "name": "vines", + "description": "Vines that spawn on trees and rope", + "keywords": [ + "vines", + "trees", + "rope", + "jungle" + ], + "homepage": "https://github.com/bas080/vines/", + "screenshots": [ + "https://raw.githubusercontent.com/bas080/vines/forum/screenshot.png" + ], + "authors": [ + "bas080" + ], + "license": "WTFPL" +} diff --git a/mods/vines/crafts.lua b/mods/vines/crafts.lua new file mode 100644 index 00000000..19e658b9 --- /dev/null +++ b/mods/vines/crafts.lua @@ -0,0 +1,14 @@ +minetest.register_craft({ + output = 'vines:rope_block', + recipe = vines.recipes['rope_block'] +}) + +minetest.register_craft({ + output = 'vines:shears', + recipe = vines.recipes['shears'] +}) + +minetest.register_craftitem("vines:vines", { + description = "Vines", + inventory_image = "vines_item.png", +}) diff --git a/mods/vines/depends.txt b/mods/vines/depends.txt new file mode 100644 index 00000000..573e6e18 --- /dev/null +++ b/mods/vines/depends.txt @@ -0,0 +1,3 @@ +default +biome_lib +moretrees? diff --git a/mods/vines/description.txt b/mods/vines/description.txt new file mode 100644 index 00000000..3664f432 --- /dev/null +++ b/mods/vines/description.txt @@ -0,0 +1 @@ +Adds climbable vines that are spawned on trees. diff --git a/mods/vines/functions.lua b/mods/vines/functions.lua new file mode 100644 index 00000000..a2f15660 --- /dev/null +++ b/mods/vines/functions.lua @@ -0,0 +1,129 @@ +vines.register_vine = function( name, defs, biome ) + local groups = { vines=1, snappy=3, flammable=2 } + + local vine_name_end = 'vines:'..name..'_end' + local vine_name_middle = 'vines:'..name..'_middle' + + local vine_image_end = "vines_"..name.."_end.png" + local vine_image_middle = "vines_"..name.."_middle.png" + + local drop_node = vine_name_end + + biome.spawn_plants = { vine_name_end } + + local vine_group = 'group:'..name..'_vines' + biome.spawn_surfaces[ #biome.spawn_surfaces + 1 ] = vine_group + + local selection_box = { type = "wallmounted", } + local drawtype = 'signlike' + if ( not biome.spawn_on_side ) then + --different properties for bottom and side vines. + selection_box = { type = "fixed", fixed = { -0.4, -1/2, -0.4, 0.4, 1/2, 0.4 }, } + drawtype = 'plantlike' + end + + minetest.register_node( vine_name_end, { + description = defs.description, + walkable = false, + climbable = true, + wield_image = vine_image_end, + drop = "", + sunlight_propagates = true, + paramtype = "light", + paramtype2 = "wallmounted", + buildable_to = false, + tiles = { vine_image_end }, + drawtype = drawtype, + inventory_image = vine_image_end, + groups = groups, + sounds = default.node_sound_leaves_defaults(), + selection_box = selection_box, + on_construct = function( pos ) + local timer = minetest.get_node_timer( pos ) + timer:start( math.random(5, 10) ) + end, + on_timer = function( pos ) + local node = minetest.get_node( pos ) + local bottom = {x=pos.x, y=pos.y-1, z=pos.z} + local bottom_node = minetest.get_node( bottom ) + if bottom_node.name == "air" then + if not ( math.random( defs.average_length ) == 1 ) then + minetest.set_node( pos, { name = vine_name_middle, param2 = node.param2 } ) + minetest.set_node( bottom, { name = node.name, param2 = node.param2 } ) + local timer = minetest.get_node_timer( bottom_node ) + timer:start( math.random(5, 10) ) + end + end + end, + after_dig_node = function(pos, node, oldmetadata, user) + vines.dig_vine( pos, drop_node, user ) + end + }) + + minetest.register_node( vine_name_middle, { + description = "Matured "..defs.description, + walkable = false, + climbable = true, + drop = "", + sunlight_propagates = true, + paramtype = "light", + paramtype2 = "wallmounted", + buildable_to = false, + tiles = { vine_image_middle }, + wield_image = vine_image_middle, + drawtype = drawtype, + inventory_image = vine_image_middle, + groups = groups, + sounds = default.node_sound_leaves_defaults(), + selection_box = selection_box, + on_destruct = function( pos ) + local bottom = {x=pos.x, y=pos.y-1, z=pos.z} + local bottom_node = minetest.get_node( bottom ) + if minetest.get_item_group( bottom_node.name, "vines") > 0 then + minetest.after( 0, minetest.remove_node, bottom ) + end + end, + after_dig_node = function( pos, node, oldmetadata, user ) + vines.dig_vine( pos, drop_node, user ) + end + }) + + biome_lib:spawn_on_surfaces( biome ) + + local override_nodes = function( nodes, def ) + local function override( index, registered ) + local node = nodes[ index ] + if index > #nodes then return registered end + if minetest.registered_nodes[node] then + minetest.override_item( node, def ) + registered[#registered+1] = node + end + override( index+1, registered ) + end + override( 1, {} ) + end + + override_nodes( biome.spawn_surfaces,{ + on_destruct = function( pos ) + local pos_min = { x = pos.x -1, y = pos.y - 1, z = pos.z - 1 } + local pos_max = { x = pos.x +1, y = pos.y + 1, z = pos.z + 1 } + local positions = minetest.find_nodes_in_area( pos_min, pos_max, "group:vines" ) + for index, position in pairs(positions) do + minetest.remove_node( position ) + end + end + }) + +end + +vines.dig_vine = function( pos, node_name, user ) + --only dig give the vine if shears are used + if not user then return false end + local wielded = user:get_wielded_item() + if 'vines:shears' == wielded:get_name() then + local inv = user:get_inventory() + if inv then + inv:add_item("main", ItemStack( node_name )) + end + end +end diff --git a/mods/vines/init.lua b/mods/vines/init.lua new file mode 100644 index 00000000..72eda930 --- /dev/null +++ b/mods/vines/init.lua @@ -0,0 +1,14 @@ +vines = { + name = 'vines', + recipes = {} +} + +dofile( minetest.get_modpath( vines.name ) .. "/functions.lua" ) +dofile( minetest.get_modpath( vines.name ) .. "/aliases.lua" ) +dofile( minetest.get_modpath( vines.name ) .. "/recipes.lua" ) +dofile( minetest.get_modpath( vines.name ) .. "/crafts.lua" ) +dofile( minetest.get_modpath( vines.name ) .. "/nodes.lua" ) +dofile( minetest.get_modpath( vines.name ) .. "/shear.lua" ) +dofile( minetest.get_modpath( vines.name ) .. "/vines.lua" ) + +print("[Vines] Loaded!") diff --git a/mods/vines/mod.conf b/mods/vines/mod.conf new file mode 100644 index 00000000..39ea365f --- /dev/null +++ b/mods/vines/mod.conf @@ -0,0 +1,2 @@ + +name = vines diff --git a/mods/vines/nodes.lua b/mods/vines/nodes.lua new file mode 100644 index 00000000..6a1ee226 --- /dev/null +++ b/mods/vines/nodes.lua @@ -0,0 +1,83 @@ +minetest.register_node("vines:rope_block", { + description = "Rope", + sunlight_propagates = true, + paramtype = "light", + tiles = { + "default_wood.png^vines_rope.png", + "default_wood.png^vines_rope.png", + "default_wood.png", + "default_wood.png", + "default_wood.png^vines_rope.png", + "default_wood.png^vines_rope.png", + }, + groups = { flammable=2, choppy=2, oddly_breakable_by_hand=1 }, + after_place_node = function(pos) + local p = {x=pos.x, y=pos.y-1, z=pos.z} + local n = minetest.get_node(p) + if n.name == "air" then + minetest.add_node(p, {name="vines:rope_end"}) + end + end, + after_dig_node = function(pos, node, digger) + local p = {x=pos.x, y=pos.y-1, z=pos.z} + local n = minetest.get_node(p) + while ( n.name == 'vines:rope' or n.name == 'vines:rope_end' ) do + minetest.remove_node(p) + p = {x=p.x, y=p.y-1, z=p.z} + n = minetest.get_node(p) + end + end +}) + +minetest.register_node("vines:rope", { + description = "Rope", + walkable = false, + climbable = true, + sunlight_propagates = true, + paramtype = "light", + drop = "", + tiles = { "vines_rope.png" }, + drawtype = "plantlike", + groups = {flammable=2, not_in_creative_inventory=1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7}, + }, +}) + +minetest.register_node("vines:rope_end", { + description = "Rope", + walkable = false, + climbable = true, + sunlight_propagates = true, + paramtype = "light", + drop = "", + tiles = { "vines_rope_end.png" }, + drawtype = "plantlike", + groups = {flammable=2, not_in_creative_inventory=1}, + sounds = default.node_sound_leaves_defaults(), + after_place_node = function(pos) + local yesh = {x = pos.x, y= pos.y-1, z=pos.z} + minetest.add_node(yesh, {name="vines:rope"}) + end, + selection_box = { + type = "fixed", + fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7}, + }, + on_construct = function( pos ) + local timer = minetest.get_node_timer( pos ) + timer:start( 1 ) + end, + on_timer = function( pos, elapsed ) + local p = {x=pos.x, y=pos.y-1, z=pos.z} + local n = minetest.get_node(p) + if n.name == "air" then + minetest.set_node(pos, {name="vines:rope"}) + minetest.add_node(p, {name="vines:rope_end"}) + else + local timer = minetest.get_node_timer( pos ) + timer:start( 1 ) + end + end +}) diff --git a/mods/vines/recipes.lua b/mods/vines/recipes.lua new file mode 100644 index 00000000..d64dcea4 --- /dev/null +++ b/mods/vines/recipes.lua @@ -0,0 +1,12 @@ +vines.recipes['rope_block'] = { + {'', 'group:wood', ''}, + {'', 'group:vines', ''}, + {'', 'group:vines', ''} +} + +vines.recipes['shears'] = { + {'', 'default:steel_ingot', ''}, + {'group:stick', 'group:wood', 'default:steel_ingot'}, + {'', '', 'group:stick'} +} + diff --git a/mods/vines/screenshot.png b/mods/vines/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..b386f6942a66a3ee1603e2192b4f1e83811056f0 GIT binary patch literal 189723 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%0A4>^eInton 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 z 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 literal 0 HcmV?d00001 diff --git a/mods/vines/shear.lua b/mods/vines/shear.lua new file mode 100644 index 00000000..b42a3e7c --- /dev/null +++ b/mods/vines/shear.lua @@ -0,0 +1,15 @@ +minetest.register_tool("vines:shears", { + description = "Shears", + inventory_image = "vines_shears.png", + wield_image = "vines_shears.png", + stack_max = 1, + max_drop_level=3, + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=0, + groupcaps={ + snappy={times={[3]=0.2}, uses=60, maxlevel=3}, + wool={times={[3]=0.2}, uses=60, maxlevel=3} + } + }, +}) diff --git a/mods/vines/textures/vines_item.png b/mods/vines/textures/vines_item.png new file mode 100644 index 0000000000000000000000000000000000000000..c66242ef03c7b9da9d6d794b0c1620d59948a468 GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHV5AX?b1=5;|vW9`GhJm`KdYTja z=Y0YSF_r}R1v5B2yO9RuxOuubhH%KT9^~XaV8Fw0;I*_%+G422W literal 0 HcmV?d00001 diff --git a/mods/vines/textures/vines_jungle_end.png b/mods/vines/textures/vines_jungle_end.png new file mode 100644 index 0000000000000000000000000000000000000000..6c8d3395c22672f89f94543474ad4f43278cdedd GIT binary patch literal 497 zcmVujv1rY!M02y>e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00CJ^L_t(I%Y~A$YQr!TMeh@e z+CfW6OlTbt#bC(PX31bkw@xL{&&U__7y4(0bm#{JGH7tO&=4G`6JvFegsVD<7IQiG z;>Wv>?%!T8+AYynJ)`p)+wqhhZax9P>(Oor0H!PmdLPl#^S9?TTMT?SO$4f8Lk^~i zz}HVjE(`!F<9|3i7p{g4^;Pd=xEeOZVBd#$B(z?rx8rFir^!5mjEyM^f{YE71wm!p z=)8u?IN7h!dF{FLtBe!P76U&b0CMI~r-{I7eIOThoOOlMM0AE##{d0{wU*>ol+^Cm&4>?Wd5davw zRoK2wSrEzCpw+wQ&M#vFrZNs08>ESFVUz_?ng|z$8`&O}_m>5M>Ac3>^%bqw2dIpD nbD&)l2>s0VjG*VUy6yi3S<@2v-*6nm00000NkvXXu0mjf8G_Cw literal 0 HcmV?d00001 diff --git a/mods/vines/textures/vines_jungle_middle.png b/mods/vines/textures/vines_jungle_middle.png new file mode 100644 index 0000000000000000000000000000000000000000..bf838a508be60cdd6252a7c8b507f8411f54035f GIT binary patch literal 481 zcmV<70UrK|P)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00Bu!L_t(I%Y{)0sY);n~uK-~2bh`ooE^~t31$1}+ZFyQOC)S+A9;)y_hD>4) zpFb5DGXSVmp77$Fxe5<7R-;~X6&^^SnYDLAXpM_Evw0^^w~qn*h`G!Oe#BJf1eHqG zSq+s+YF^e^ZF!?tsU%t~Cw4^uWW+8`Vh`^hzhumY7hUEg_BzcfmH$2yt>f5fj@gUb zdSQ;^M{IL1^xk5<3#c)5^7Qm_i9+w~YJS9Lb9Z|oT=7uuE^m8aRvpUS<)zMQQmJHQ zUkpgnSxtV#jJGux$J{N(u@{a0$cuJVOFXz78UA-8}d8j9U XCd?@z9_?7J00000NkvXXu0mjf+WNek literal 0 HcmV?d00001 diff --git a/mods/vines/textures/vines_root_end.png b/mods/vines/textures/vines_root_end.png new file mode 100644 index 0000000000000000000000000000000000000000..4fc3f87ab0a05cd3c41e89ae40d8829b1abbcea7 GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^4e$wZWnd^2HRM;864O?e)Ao@w z)zfq|GYGV-;sh#SED7=pW^j0RBMrn!@^*J&=wOxg0CG4BJR*x37`TN&n2}-D90{Nx zdx@v7EBk#WE*5JY<3)2KfkM`vE{-7_*OL|!S3j3^P6|8H^kfr%mp^OJZQ|+rHaLL1*_{CV{rM#c~|UZ})K~+$w!**TIl{HI0Kgi;tOE f{frFTrL&9-JDa5>j(GDd0-5XS>gTe~DWM4fl07o0 literal 0 HcmV?d00001 diff --git a/mods/vines/textures/vines_rope.png b/mods/vines/textures/vines_rope.png new file mode 100644 index 0000000000000000000000000000000000000000..0045c4c35a084711061a59701654079f83e79e41 GIT binary patch literal 106 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`hMq2tAr_~T6AtkHvyPDb!~bCm zYqG%nMwburX&jcb4zelS^x5@xidDS{kK5sdC9RAM*{%thtAdu80W~vty85}Sb4q9e E0Kr`!{Qv*} literal 0 HcmV?d00001 diff --git a/mods/vines/textures/vines_rope_end.png b/mods/vines/textures/vines_rope_end.png new file mode 100644 index 0000000000000000000000000000000000000000..faf2c715528eea4e5416474050c71f15ab18c70d GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ww^AIAr_~T6AtkHvyPDb!~bCm zYqG%nMwburX&jcb4zelS^x5@xidDS{kK18}que2eEq4kSvX^KGbaFZ{L}y07tlW}j Q2{eeo)78&qol`;+0BD{hLI3~& literal 0 HcmV?d00001 diff --git a/mods/vines/textures/vines_shears.png b/mods/vines/textures/vines_shears.png new file mode 100644 index 0000000000000000000000000000000000000000..c4c39f9f298edced48186240884a246b3a76e75e GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ot`d^Ar_~T6Bd{im|prPpOwsW zOeK3?)z?@5MYY5J=xb;w+!dIRwuzU~QhG^ejgGjP5i^}vjDP8vkA`UE+W}2*= z!C>Zm;i-oai`(QJhD}K`*k-7yt1tiG*x2~L)6eGwn_@Og<-{c+oQD){Cnj}vcK%PC su_UBxU8jz-N0FT#v&Xin6SNr~M6Eu(Vft@wpraT(UHx3vIVCg!0M8;tkpKVy literal 0 HcmV?d00001 diff --git a/mods/vines/textures/vines_side_end.png b/mods/vines/textures/vines_side_end.png new file mode 100644 index 0000000000000000000000000000000000000000..5b3b28f76e585cb09573ba442a233ecac2606782 GIT binary patch literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa4)6(aRbXHcQ5TRj6p=9(Q*o8i z2~{#mQa8`mwyQMQ=-5;QRK{2mlujB>_g?hR;hHzX@P7p{dO)%j|OmHxe@NJM`XJa!9 zOKfX%U|!(CxtM8pvw%_a)tSADM;0)ykXYe-g)!2)&5~!$85tf%HclQM9Ud+oJ|BmP gOl)jrY&i@J2X1nEE>b(W4QK&_r>mdKI;Vst0EpK+8vpSh^Qc9jMq>H^5(Pm(_c1C?@=1o?qzFxdV)Xd#f1=;`7Z!XcZS@b1#hBO70AVRViP zKgVX!d^2h5WT)$CY;0k(^(KE3?iP`l5uWYy=++(00~5AcB{R)9n7a9N_rouXp7QXB zE%z0vGGo5_z^wh?vePjSk1Q&9^UOlmes2cj9T|pWCk#_-Po8=Nvenbo&t;ucLK6T$ CqDuAv literal 0 HcmV?d00001 diff --git a/mods/vines/textures/vines_vine_end.png b/mods/vines/textures/vines_vine_end.png new file mode 100644 index 0000000000000000000000000000000000000000..062857be82e564fd8b9b580e31b17db7a9b63c74 GIT binary patch literal 364 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP~6Bi4Qu;^jI0HDxMPZ!4!i_>$1Hug0+h|H#@DhpvU+36F|78!oX}BsxH{MJmUq=e?9^HTRp7zOMId)T}?VRVa8Shea9b zd^tO1+MFdHv)xwfcm7ZMypv6KJDXR(cwki0_gaRt(}JJObd+Fy$8QaH zTVUy#yx$>s`;Pb>xVMy<#@LAFE0P{tII4R z)wyp@6&!pZEpNQ1#mk3euqyM3^5ux^!w%0cXn56I>JL_N?JsHhqEk1kt1x#-oiL z>m)paa}LzUuq6aHCoymcf717n4NPpvV>nSTiAivF(js1mZ~EK5I2vd^F4FV#l$_7V kGTF$Exx??&5f&wetQ~8n6f|=s16{-5>FVdQ&MBb@0022Y0ssI2 literal 0 HcmV?d00001 diff --git a/mods/vines/textures/vines_willow_end.png b/mods/vines/textures/vines_willow_end.png new file mode 100644 index 0000000000000000000000000000000000000000..b5b8e5941d2450477d76778b7d62c3dfb2f2834c GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa2=EDUO)Oww&}CqiXVCG}(e>BW z3(z~TLE+!KR+rSZT0k|7B|(0{3=Yq3q=7g|-tI089jvk*Kn`btM`SSr1Gg{;GcwGY zBLNg-FY)wsWxvnF#UjT$-6G}zP{`TS#W95AdU8TSKx%?O8UvG=pu%E?6A2{=2_7a5 zMiP!Z6Is|cSg{FCa7s+k+>yk_%Erbhz^kOlvp^(*&BaNAg^}Sc3#;8?uep4&bb4ie2Fp&OLcH|zA3i5Pu4B?PvJ-ASm$xwjxfaku0ml=Fj zbdRiaS+|t?UM%yJGdz6Ua&F*&@cd_gIg|Fc)uDkPq^hd`QmX j#{KCVC#dBw@%+i${({FW`MtUe&~ye*S3j3^P6> /home/minetest/.minetest/minetest.conf echo "port = "$mt_port"" >> /home/minetest/.minetest/minetest.conf echo "enable_rollback_recording = "$mt_enable_rollback_recording"" >> /home/minetest/.minetest/minetest.conf echo "default_privs = "$mt_default_privs"" >> /home/minetest/.minetest/minetest.conf +echo "mg_name = "$mt_mg_name"" >> /home/minetest/.minetest/minetest.conf echo "Fix privileges on /home/minetest" chown minetest:minetest /home/minetest/ -cR