From 70b36257ea5bfb176de348784d1c669315c1182a Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Tue, 24 Feb 2015 18:16:22 +0100 Subject: [PATCH] Updated planflife modpack : bug fixes, less laggy, etc.. --- mods/plantlife_modpack/dryplants/init.lua | 60 +- mods/plantlife_modpack/flowers_plus/init.lua | 2 +- mods/plantlife_modpack/mushroom/init.lua | 36 +- .../mushroom/models/plantlife_mushroom.obj | 329 +++++++++++ .../mushroom/textures/mushroom_brown.png | Bin 125 -> 0 bytes .../mushroom/textures/mushroom_brown_3d.png | Bin 0 -> 5094 bytes .../mushroom/textures/mushroom_brown_inv.png | Bin 0 -> 4266 bytes .../mushroom/textures/mushroom_red.png | Bin 123 -> 0 bytes .../mushroom/textures/mushroom_red_3d.png | Bin 0 -> 2731 bytes .../mushroom/textures/mushroom_red_inv.png | Bin 0 -> 5279 bytes .../nature_classic/global_function.lua | 5 +- .../{ => plants_lib}/API.txt | 515 ++++++++---------- mods/plantlife_modpack/plants_lib/init.lua | 26 +- mods/plantlife_modpack/trunks/nodes.lua | 8 +- mods/plantlife_modpack/vines/LICENSE.md | 4 + mods/plantlife_modpack/vines/README.md | 56 ++ mods/plantlife_modpack/vines/aliases.lua | 11 + mods/plantlife_modpack/vines/crafts.lua | 14 + mods/plantlife_modpack/vines/depends.txt | 1 + mods/plantlife_modpack/vines/functions.lua | 132 +++++ mods/plantlife_modpack/vines/init.lua | 408 +------------- mods/plantlife_modpack/vines/nodes.lua | 83 +++ mods/plantlife_modpack/vines/readme.txt | 43 -- mods/plantlife_modpack/vines/recipes.lua | 12 + mods/plantlife_modpack/vines/shear.lua | 15 + .../vines/textures/new/sidevine.png | Bin 233 -> 0 bytes .../vines/textures/new/vinesdead.png | Bin 196 -> 0 bytes .../vines/textures/old/vines_vine2.png | Bin 225 -> 0 bytes .../vines/textures/old/vines_vine_rotten2.png | Bin 223 -> 0 bytes .../vines/textures/vines_jungle_end.png | Bin 0 -> 497 bytes .../vines/textures/vines_jungle_middle.png | Bin 0 -> 481 bytes .../vines/textures/vines_root.png | Bin 201 -> 0 bytes .../vines/textures/vines_root_end.png | Bin 0 -> 215 bytes .../bottomvine.png => vines_root_middle.png} | Bin .../textures/{shears.png => vines_shears.png} | Bin .../vines/textures/vines_side.png | Bin 233 -> 0 bytes .../vines/textures/vines_side_end.png | Bin 0 -> 247 bytes ..._side_rotten.png => vines_side_middle.png} | Bin .../vines/textures/vines_vine.png | Bin 187 -> 0 bytes .../vines/textures/vines_vine_end.png | Bin 0 -> 364 bytes .../vineslive.png => vines_vine_middle.png} | Bin .../vines/textures/vines_vine_rotten.png | Bin 196 -> 0 bytes .../vines/textures/vines_willow_end.png | Bin 0 -> 226 bytes ...nes_willow.png => vines_willow_middle.png} | Bin .../vines/textures/vines_willow_rotten.png | Bin 190 -> 0 bytes mods/plantlife_modpack/vines/vines.lua | 97 ++++ 46 files changed, 1086 insertions(+), 771 deletions(-) create mode 100644 mods/plantlife_modpack/mushroom/models/plantlife_mushroom.obj delete mode 100644 mods/plantlife_modpack/mushroom/textures/mushroom_brown.png create mode 100644 mods/plantlife_modpack/mushroom/textures/mushroom_brown_3d.png create mode 100644 mods/plantlife_modpack/mushroom/textures/mushroom_brown_inv.png delete mode 100644 mods/plantlife_modpack/mushroom/textures/mushroom_red.png create mode 100644 mods/plantlife_modpack/mushroom/textures/mushroom_red_3d.png create mode 100644 mods/plantlife_modpack/mushroom/textures/mushroom_red_inv.png rename mods/plantlife_modpack/{ => plants_lib}/API.txt (53%) create mode 100644 mods/plantlife_modpack/vines/LICENSE.md create mode 100644 mods/plantlife_modpack/vines/README.md create mode 100644 mods/plantlife_modpack/vines/aliases.lua create mode 100644 mods/plantlife_modpack/vines/crafts.lua create mode 100644 mods/plantlife_modpack/vines/functions.lua create mode 100644 mods/plantlife_modpack/vines/nodes.lua delete mode 100644 mods/plantlife_modpack/vines/readme.txt create mode 100644 mods/plantlife_modpack/vines/recipes.lua create mode 100644 mods/plantlife_modpack/vines/shear.lua delete mode 100644 mods/plantlife_modpack/vines/textures/new/sidevine.png delete mode 100644 mods/plantlife_modpack/vines/textures/new/vinesdead.png delete mode 100644 mods/plantlife_modpack/vines/textures/old/vines_vine2.png delete mode 100644 mods/plantlife_modpack/vines/textures/old/vines_vine_rotten2.png create mode 100644 mods/plantlife_modpack/vines/textures/vines_jungle_end.png create mode 100644 mods/plantlife_modpack/vines/textures/vines_jungle_middle.png delete mode 100644 mods/plantlife_modpack/vines/textures/vines_root.png create mode 100644 mods/plantlife_modpack/vines/textures/vines_root_end.png rename mods/plantlife_modpack/vines/textures/{new/bottomvine.png => vines_root_middle.png} (100%) rename mods/plantlife_modpack/vines/textures/{shears.png => vines_shears.png} (100%) delete mode 100644 mods/plantlife_modpack/vines/textures/vines_side.png create mode 100644 mods/plantlife_modpack/vines/textures/vines_side_end.png rename mods/plantlife_modpack/vines/textures/{vines_side_rotten.png => vines_side_middle.png} (100%) delete mode 100644 mods/plantlife_modpack/vines/textures/vines_vine.png create mode 100644 mods/plantlife_modpack/vines/textures/vines_vine_end.png rename mods/plantlife_modpack/vines/textures/{new/vineslive.png => vines_vine_middle.png} (100%) delete mode 100644 mods/plantlife_modpack/vines/textures/vines_vine_rotten.png create mode 100644 mods/plantlife_modpack/vines/textures/vines_willow_end.png rename mods/plantlife_modpack/vines/textures/{vines_willow.png => vines_willow_middle.png} (100%) delete mode 100644 mods/plantlife_modpack/vines/textures/vines_willow_rotten.png create mode 100644 mods/plantlife_modpack/vines/vines.lua diff --git a/mods/plantlife_modpack/dryplants/init.lua b/mods/plantlife_modpack/dryplants/init.lua index 3c8b30ae..b33304fd 100644 --- a/mods/plantlife_modpack/dryplants/init.lua +++ b/mods/plantlife_modpack/dryplants/init.lua @@ -31,6 +31,27 @@ end ----------------------------------------------------------------------------------------------- -- Sickle ----------------------------------------------------------------------------------------------- +local function sickle_can_break(pos, deff, player) + local def = ItemStack({name=deff.name}):get_definition() + + if not def.diggable or (def.can_dig and not def.can_dig(pos,player)) then + minetest.log("info", player:get_player_name() .. " tried to sickle " + .. def.name .. " which is not diggable " + .. minetest.pos_to_string(pos)) + return + end + + if minetest.is_protected(pos, player:get_player_name()) then + minetest.log("action", player:get_player_name() + .. " tried to sickle " .. def.name + .. " at protected position " + .. minetest.pos_to_string(pos)) + minetest.record_protection_violation(pos, player:get_player_name()) + return + end + + return true +end -- turns nodes with group flora=1 & flower=0 into cut grass local function sickle_on_use(itemstack, user, pointed_thing, uses) local pt = pointed_thing @@ -41,11 +62,11 @@ local function sickle_on_use(itemstack, user, pointed_thing, uses) if pt.type ~= "node" then return end - + local under = minetest.get_node(pt.under) - local p = {x=pt.under.x, y=pt.under.y+1, z=pt.under.z} - local above = minetest.get_node(p) - + local above_pos = {x=pt.under.x, y=pt.under.y+1, z=pt.under.z} + local above = minetest.get_node(above_pos) + -- return if any of the nodes is not registered if not minetest.registered_nodes[under.name] then return @@ -53,30 +74,20 @@ local function sickle_on_use(itemstack, user, pointed_thing, uses) if not minetest.registered_nodes[above.name] then return end - - local node = minetest.get_node(pt.under) + + if not sickle_can_break(pt.under, under, user) then + return + end -- check if something that can be cut using fine tools if minetest.get_item_group(under.name, "snappy") > 0 then -- check if flora but no flower if minetest.get_item_group(under.name, "flora") == 1 and minetest.get_item_group(under.name, "flower") == 0 then -- turn the node into cut grass, wear out item and play sound minetest.set_node(pt.under, {name="dryplants:grass"}) - else -- otherwise get the drop - local inv = user:get_inventory() - local name = minetest. get_node(pt.under).name - - local the_drop = minetest.registered_nodes[name].drop - - if the_drop ~= nil then - if inv:room_for_item("main", the_drop) then - inv:add_item("main", the_drop) - end - else - if inv:room_for_item("main", name) then - inv:add_item("main", name) - end + else -- otherwise dig the node + if not minetest.node_dig(pt.under, under, user) then + return end - minetest.remove_node(pt.under) end minetest.sound_play("default_dig_crumbly", { pos = pt.under, @@ -84,9 +95,12 @@ local function sickle_on_use(itemstack, user, pointed_thing, uses) }) itemstack:add_wear(65535/(uses-1)) return itemstack - elseif string.find(node.name, "default:dirt_with_grass") then + elseif string.find(under.name, "default:dirt_with_grass") then + if minetest.is_protected(above_pos, user:get_player_name()) or above.name ~= "air" then + return + end minetest.set_node(pt.under, {name="dryplants:grass_short"}) - minetest.set_node(pt.above, {name="dryplants:grass"}) + minetest.set_node(above_pos, {name="dryplants:grass"}) minetest.sound_play("default_dig_crumbly", { pos = pt.under, gain = 0.5, diff --git a/mods/plantlife_modpack/flowers_plus/init.lua b/mods/plantlife_modpack/flowers_plus/init.lua index 990c393b..788ba2d9 100644 --- a/mods/plantlife_modpack/flowers_plus/init.lua +++ b/mods/plantlife_modpack/flowers_plus/init.lua @@ -90,7 +90,7 @@ for i in ipairs(lilies_list) do if place_pos and not minetest.is_protected(place_pos, placer:get_player_name()) then local nodename = "default:cobble" -- if this block appears, something went....wrong :-) - if place_pos == nil then return itemstack end -- pour éviter crash avec nénuphare + if not keys["sneak"] then local node = minetest.get_node(pt.under) local waterlily = math.random(1,8) diff --git a/mods/plantlife_modpack/mushroom/init.lua b/mods/plantlife_modpack/mushroom/init.lua index c8952914..71e3ecbe 100644 --- a/mods/plantlife_modpack/mushroom/init.lua +++ b/mods/plantlife_modpack/mushroom/init.lua @@ -8,11 +8,11 @@ mushroom = {} minetest.register_node("mushroom:brown",{ description = "Brown Mushroom", - drawtype = "plantlike", + drawtype = "mesh", + mesh = "plantlife_mushroom.obj", + tiles = {"mushroom_brown_3d.png"}, sunlight_propagates = true, - tiles = {"mushroom_brown.png"}, - inventory_image = "mushroom_brown.png", - wield_image = "mushroom_brown.png", + inventory_image = "mushroom_brown_inv.png", groups = {oddly_breakable_by_hand=3,attached_node=1}, paramtype = "light", walkable = false, @@ -26,11 +26,11 @@ minetest.register_node("mushroom:brown",{ minetest.register_node("mushroom:red",{ description = "Red Mushroom", - drawtype = "plantlike", + drawtype = "mesh", + mesh = "plantlife_mushroom.obj", + tiles = {"mushroom_red_3d.png"}, sunlight_propagates = true, - tiles = {"mushroom_red.png"}, - inventory_image = "mushroom_red.png", - wield_image = "mushroom_red.png", + inventory_image = "mushroom_red_inv.png", groups = {oddly_breakable_by_hand=3,attached_node=1}, paramtype = "light", walkable = false, @@ -78,12 +78,12 @@ minetest.register_node("mushroom:spore_red",{ minetest.register_node("mushroom:brown_natural",{ description = "Brown Mushroom (Naturally Spawned)", - drawtype = "plantlike", + drawtype = "mesh", + mesh = "plantlife_mushroom.obj", + tiles = {"mushroom_brown_3d.png"}, sunlight_propagates = true, - tiles = {"mushroom_brown.png"}, - inventory_image = "mushroom_brown.png", - wield_image = "mushroom_brown.png", - groups = {oddly_breakable_by_hand=3}, + inventory_image = "mushroom_brown_inv.png", + groups = {oddly_breakable_by_hand=3, not_in_creative_inventory=1}, paramtype = "light", walkable = false, selection_box = { @@ -95,12 +95,12 @@ minetest.register_node("mushroom:brown_natural",{ minetest.register_node("mushroom:red_natural",{ description = "Red Mushroom (Naturally Spawned)", - drawtype = "plantlike", + drawtype = "mesh", + mesh = "plantlife_mushroom.obj", + tiles = {"mushroom_red_3d.png"}, sunlight_propagates = true, - tiles = {"mushroom_red.png"}, - inventory_image = "mushroom_red.png", - wield_image = "mushroom_red.png", - groups = {oddly_breakable_by_hand=3}, + inventory_image = "mushroom_red_inv.png", + groups = {oddly_breakable_by_hand=3, not_in_creative_inventory=1}, paramtype = "light", walkable = false, selection_box = { diff --git a/mods/plantlife_modpack/mushroom/models/plantlife_mushroom.obj b/mods/plantlife_modpack/mushroom/models/plantlife_mushroom.obj new file mode 100644 index 00000000..bce1ed6e --- /dev/null +++ b/mods/plantlife_modpack/mushroom/models/plantlife_mushroom.obj @@ -0,0 +1,329 @@ +# Blender v2.73 (sub 0) OBJ File: 'plantlife_mushroom.blend' +# www.blender.org +o Cylinder +v 0.261489 -0.177877 -0.000000 +v 0.165972 -0.203714 -0.000000 +v 0.210761 -0.224729 -0.000000 +v 0.258520 -0.211811 -0.000000 +v 0.185335 -0.171215 -0.184553 +v 0.116925 -0.199423 -0.118862 +v 0.148161 -0.219252 -0.151707 +v 0.182366 -0.205148 -0.184553 +v 0.001484 -0.155130 -0.260997 +v -0.001484 -0.189063 -0.168096 +v -0.002969 -0.206030 -0.214547 +v -0.001484 -0.189063 -0.260997 +v -0.182366 -0.139045 -0.184553 +v -0.119894 -0.178704 -0.118862 +v -0.154099 -0.192808 -0.151707 +v -0.185335 -0.172979 -0.184553 +v -0.258520 -0.132382 -0.000000 +v -0.168941 -0.174413 -0.000000 +v -0.216699 -0.187331 -0.000000 +v -0.261489 -0.166316 -0.000000 +v -0.182366 -0.139045 0.184553 +v -0.119894 -0.178704 0.118862 +v -0.154099 -0.192808 0.151707 +v -0.185335 -0.172979 0.184553 +v 0.001484 -0.155130 0.260997 +v -0.001484 -0.189063 0.168096 +v -0.002969 -0.206030 0.214547 +v -0.001484 -0.189063 0.260997 +v 0.185335 -0.171215 0.184553 +v 0.116925 -0.199423 0.118862 +v 0.148161 -0.219252 0.151708 +v 0.182366 -0.205148 0.184553 +v 0.059333 -0.075538 0.000000 +v 0.044915 -0.074277 -0.034942 +v 0.010106 -0.071232 -0.049416 +v -0.024704 -0.068186 -0.034942 +v -0.039122 -0.066925 0.000000 +v -0.024704 -0.068186 0.034942 +v 0.010106 -0.071232 0.049416 +v 0.044915 -0.074277 0.034942 +v 0.004580 -0.119744 -0.206430 +v 0.149993 -0.132466 -0.145968 +v 0.004580 -0.119744 0.206430 +v -0.140833 -0.107022 0.145968 +v 0.210225 -0.137736 -0.000000 +v 0.149993 -0.132466 0.145968 +v -0.201064 -0.101752 -0.000000 +v -0.140833 -0.107022 -0.145968 +v 0.033054 -0.500000 -0.079800 +v 0.025067 -0.177627 -0.060518 +v 0.079800 -0.500000 -0.033054 +v 0.060518 -0.177627 -0.025067 +v 0.079800 -0.500000 0.033054 +v 0.060518 -0.177627 0.025067 +v 0.033054 -0.500000 0.079800 +v 0.025067 -0.177627 0.060518 +v -0.033054 -0.500000 0.079800 +v -0.025067 -0.177627 0.060518 +v -0.079800 -0.500000 0.033054 +v -0.060518 -0.177627 0.025067 +v -0.079800 -0.500000 -0.033054 +v -0.060518 -0.177627 -0.025067 +v -0.033054 -0.500000 -0.079800 +v -0.025067 -0.177627 -0.060518 +v 0.014323 -0.253674 -0.065067 +v 0.012105 -0.382623 -0.072780 +v 0.052438 -0.253674 -0.026952 +v 0.054739 -0.382623 -0.030146 +v 0.052438 -0.253674 0.026952 +v 0.054739 -0.382623 0.030146 +v 0.014323 -0.253674 0.065067 +v 0.012105 -0.382623 0.072780 +v -0.039580 -0.253674 0.065067 +v -0.048187 -0.382623 0.072780 +v -0.077695 -0.253674 0.026952 +v -0.090820 -0.382623 0.030146 +v -0.077695 -0.253674 -0.026952 +v -0.090820 -0.382623 -0.030146 +v -0.039580 -0.253674 -0.065067 +v -0.048187 -0.382623 -0.072780 +vt 0.261010 0.917920 +vt 0.235559 0.983636 +vt 0.016350 0.764426 +vt 0.080814 0.737724 +vt 0.545568 0.235207 +vt 0.764778 0.454417 +vt 0.690996 0.484978 +vt 0.517617 0.311599 +vt 0.235559 0.235207 +vt 0.515845 0.302693 +vt 0.261010 0.302693 +vt 0.578125 0.234375 +vt 0.765625 0.234375 +vt 0.765625 0.312500 +vt 0.578125 0.312500 +vt 0.015625 0.234375 +vt 0.203125 0.234375 +vt 0.203125 0.312500 +vt 0.015625 0.312500 +vt 0.390625 0.312500 +vt 0.578125 0.390625 +vt 0.390625 0.390625 +vt 0.016350 0.454417 +vt 0.080814 0.482889 +vt 0.545569 0.983636 +vt 0.515845 0.917920 +vt 0.099043 0.730173 +vt 0.272422 0.903553 +vt 0.290733 0.368408 +vt 0.490395 0.368408 +vt 0.149550 0.709253 +vt 0.149550 0.509591 +vt 0.764778 0.764426 +vt 0.696041 0.737725 +vt 0.696041 0.482889 +vt 0.099043 0.484978 +vt 0.203125 0.390625 +vt 0.765625 0.390625 +vt 0.272422 0.311599 +vt 0.631577 0.509591 +vt 0.390625 0.234375 +vt 0.517617 0.903553 +vt 0.690996 0.730173 +vt 0.432320 0.675133 +vt 0.473823 0.633629 +vt 0.015625 0.390625 +vt 0.490395 0.850435 +vt 0.290733 0.850435 +vt 0.631577 0.709253 +vt 0.373624 0.533431 +vt 0.332121 0.574934 +vt 0.473823 0.574934 +vt 0.432320 0.533431 +vt 0.332121 0.633630 +vt 0.373624 0.675133 +vt 0.935126 0.767633 +vt 0.998032 0.830539 +vt 0.998032 0.919502 +vt 0.935126 0.982408 +vt 0.846164 0.982408 +vt 0.783257 0.919502 +vt 0.783258 0.830539 +vt 0.846164 0.767633 +vt 0.375000 0.187500 +vt 0.375000 0.031250 +vt 0.500000 0.031250 +vt 0.500000 0.187500 +vt 0.625000 0.031250 +vt 0.625000 0.187500 +vt 0.750000 0.031250 +vt 0.750000 0.187500 +vt 0.875000 0.031250 +vt 0.875000 0.187500 +vt 1.000000 0.031250 +vt 1.000000 0.187500 +vt 0.000000 0.031250 +vt 0.125000 0.031250 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.250000 0.031250 +vt 0.250000 0.187500 +vt 0.542224 0.015885 +vt 0.601585 0.075246 +vt 0.601585 0.159195 +vt 0.542224 0.218556 +vt 0.458275 0.218556 +vt 0.398914 0.159195 +vt 0.398914 0.075246 +vt 0.458275 0.015885 +vt 0.625000 0.125000 +vt 0.500000 0.125000 +vt 0.750000 0.125000 +vt 0.875000 0.125000 +vt 1.000000 0.125000 +vt 0.125000 0.125000 +vt 0.000000 0.125000 +vt 0.250000 0.125000 +vt 0.375000 0.125000 +vn -0.147000 -0.987300 0.060400 +vn -0.648700 -0.460200 0.606100 +vn -0.898800 -0.438400 0.000000 +vn -0.172000 -0.985100 0.000000 +vn 0.672500 0.376500 0.637100 +vn 0.935400 0.353500 0.000000 +vn 0.529200 0.848500 0.000000 +vn 0.396700 0.860200 0.320400 +vn -0.044900 -0.513100 -0.857100 +vn 0.558900 -0.565900 -0.606100 +vn -0.026600 -0.997800 -0.060400 +vn -0.086800 -0.992500 -0.085500 +vn -0.044900 -0.513100 0.857100 +vn 0.037800 0.432000 0.901100 +vn -0.596900 0.487600 0.637100 +vn -0.648700 -0.460200 -0.606100 +vn -0.596900 0.487600 -0.637100 +vn 0.037800 0.432000 -0.901100 +vn 0.809000 -0.587800 0.000000 +vn 0.672500 0.376500 -0.637100 +vn -0.147000 -0.987300 -0.060400 +vn -0.086800 -0.992500 0.085500 +vn -0.859800 0.510500 0.000000 +vn -0.372100 0.928200 0.000000 +vn -0.240600 0.916500 -0.319400 +vn -0.085100 -0.972600 0.216400 +vn -0.237500 -0.959200 0.153000 +vn 0.130500 -0.991400 0.000000 +vn 0.067400 -0.985900 0.153000 +vn 0.558900 -0.565900 0.606100 +vn -0.026600 -0.997800 0.060400 +vn -0.001700 -1.000000 0.000000 +vn -0.240600 0.916500 0.319400 +vn 0.077500 0.888400 0.452400 +vn -0.300700 -0.953700 0.000000 +vn 0.077500 0.888400 -0.452400 +vn 0.396700 0.860200 -0.320400 +vn 0.086200 0.978700 -0.186300 +vn 0.217800 0.967000 -0.132200 +vn -0.085100 -0.972600 -0.216400 +vn 0.067400 -0.985900 -0.153000 +vn -0.237500 -0.959200 -0.153000 +vn 0.086200 0.978700 0.186300 +vn -0.044600 0.990300 0.131300 +vn 0.272600 0.962100 0.000000 +vn 0.217800 0.967000 0.132200 +vn -0.098600 0.995100 0.000000 +vn -0.044600 0.990300 -0.131300 +vn -0.273500 -0.626100 -0.730200 +vn -0.402500 0.040600 -0.914500 +vn 0.360300 0.084000 -0.929000 +vn 0.335600 -0.581700 -0.740900 +vn 0.369900 0.027700 -0.928600 +vn 0.921100 -0.031200 -0.388000 +vn 0.913800 0.116800 -0.388800 +vn 0.921100 -0.031200 0.388000 +vn 0.913800 0.116800 0.388800 +vn 0.369900 0.027700 0.928600 +vn 0.360300 0.084000 0.929000 +vn -0.391600 0.105700 0.914000 +vn -0.402500 0.040600 0.914500 +vn -0.914200 0.156600 0.373800 +vn -0.927200 0.012400 0.374500 +vn -0.914200 0.156600 -0.373800 +vn -0.927200 0.012400 -0.374500 +vn -0.391600 0.105700 -0.914000 +vn 0.774400 -0.552100 -0.309000 +vn 0.774400 -0.552100 0.309000 +vn 0.335600 -0.581700 0.740900 +vn -0.273500 -0.626100 0.730200 +vn -0.690800 -0.658600 0.298100 +vn -0.690800 -0.658600 -0.298100 +vn 0.416700 -0.004500 -0.909100 +vn 0.925800 -0.089300 -0.367400 +vn 0.925800 -0.089300 0.367400 +vn 0.416700 -0.004500 0.909100 +vn -0.344300 0.121400 0.931000 +vn -0.896600 0.212200 0.388700 +vn -0.896600 0.212200 -0.388700 +vn -0.344300 0.121400 -0.931000 +s 1 +f 23/1/1 24/2/2 20/3/3 19/4/4 +f 29/5/5 1/6/6 45/7/7 46/8/8 +f 12/9/9 8/5/10 7/10/11 11/11/12 +f 24/12/2 28/13/13 25/14/14 21/15/15 +f 12/16/9 16/17/16 13/18/17 9/19/18 +f 4/20/19 8/15/10 5/21/20 1/22/6 +f 16/23/16 12/9/9 11/11/12 15/24/21 +f 28/25/13 24/2/2 23/1/1 27/26/22 +f 13/2/17 17/3/23 47/27/24 48/28/25 +f 10/29/26 11/11/12 7/10/11 6/30/27 +f 18/31/28 19/4/4 15/24/21 14/32/29 +f 4/6/19 32/33/30 31/34/31 3/35/32 +f 17/3/23 21/23/15 44/36/33 47/27/24 +f 32/18/30 4/20/19 1/22/6 29/37/5 +f 8/5/10 4/6/19 3/35/32 7/10/11 +f 8/15/10 12/14/9 9/38/18 5/21/20 +f 25/9/14 29/5/5 46/8/8 43/39/34 +f 6/30/27 7/10/11 3/35/32 2/40/35 +f 16/17/16 20/41/3 17/20/23 13/18/17 +f 31/34/31 32/33/30 28/25/13 27/26/22 +f 5/33/20 9/25/18 41/42/36 42/43/37 +f 41/42/36 35/44/38 34/45/39 42/43/37 +f 15/24/21 11/11/12 10/29/26 14/32/29 +f 20/41/3 24/12/2 21/15/15 17/20/23 +f 1/6/6 5/33/20 42/43/37 45/7/7 +f 19/4/4 20/3/3 16/23/16 15/24/21 +f 28/19/13 32/18/30 29/37/5 25/46/14 +f 26/47/40 27/26/22 23/1/1 22/48/41 +f 21/23/15 25/9/14 43/39/34 44/36/33 +f 9/25/18 13/2/17 48/28/25 41/42/36 +f 23/1/1 19/4/4 18/31/28 22/48/41 +f 2/40/35 3/35/32 31/34/31 30/49/42 +f 43/39/34 39/50/43 38/51/44 44/36/33 +f 45/7/7 33/52/45 40/53/46 46/8/8 +f 42/43/37 34/45/39 33/52/45 45/7/7 +f 46/8/8 40/53/46 39/50/43 43/39/34 +f 44/36/33 38/51/44 37/54/47 47/27/24 +f 47/27/24 37/54/47 36/55/48 48/28/25 +f 48/28/25 36/55/48 35/44/38 41/42/36 +f 35/44/38 36/55/48 37/54/47 38/51/44 39/50/43 40/53/46 33/52/45 34/45/39 +f 6/56/27 2/57/35 30/58/42 26/59/40 22/60/41 18/61/28 14/62/29 10/63/26 +f 63/64/49 80/65/50 66/66/51 49/67/52 +f 65/66/53 67/68/54 68/69/55 66/67/51 +f 67/68/54 69/70/56 70/71/57 68/69/55 +f 69/70/56 71/72/58 72/73/59 70/71/57 +f 71/72/58 73/74/60 74/75/61 72/73/59 +f 73/76/60 75/77/62 76/78/63 74/79/61 +f 75/77/62 77/80/64 78/81/65 76/78/63 +f 77/80/64 79/65/66 80/64/50 78/81/65 +f 49/82/52 51/83/67 53/84/68 55/85/69 57/86/70 59/87/71 61/88/72 63/89/49 +f 50/66/73 52/68/74 67/90/54 65/91/53 +f 52/68/74 54/70/75 69/92/56 67/90/54 +f 66/66/51 68/68/55 51/69/67 49/67/52 +f 54/70/75 56/72/76 71/93/58 69/92/56 +f 68/68/55 70/70/57 53/71/68 51/69/67 +f 56/72/76 58/74/77 73/94/60 71/93/58 +f 70/70/57 72/72/59 55/73/69 53/71/68 +f 58/76/77 60/77/78 75/95/62 73/96/60 +f 72/72/59 74/74/61 57/75/70 55/73/69 +f 60/77/78 62/80/79 77/97/64 75/95/62 +f 74/76/61 76/77/63 59/78/71 57/79/70 +f 62/80/79 64/65/80 79/98/66 77/97/64 +f 76/77/63 78/80/65 61/81/72 59/78/71 +f 31/34/31 27/26/22 26/47/40 30/49/42 +f 78/80/65 80/65/50 63/64/49 61/81/72 +f 79/98/66 64/65/80 50/66/73 65/91/53 +f 79/65/66 65/66/53 66/67/51 80/64/50 diff --git a/mods/plantlife_modpack/mushroom/textures/mushroom_brown.png b/mods/plantlife_modpack/mushroom/textures/mushroom_brown.png deleted file mode 100644 index 15f871239aabe7c5583d5eb003e8f7339301748c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`E}kxqAr_~T6C_v{H%vta1 zaBs?a{$-xmcrJJJbeb_l8u#!n@+@NPsQdlxZM}elm@=n=w1e1!6ATmFW-uy9O}Aoj X_~CcHT}=aM90P-=tDnm{r-UW|ZKNgL diff --git a/mods/plantlife_modpack/mushroom/textures/mushroom_brown_3d.png b/mods/plantlife_modpack/mushroom/textures/mushroom_brown_3d.png new file mode 100644 index 0000000000000000000000000000000000000000..c36f52403417a829c5713f32d2acae51cfd7330b GIT binary patch literal 5094 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 literal 0 HcmV?d00001 diff --git a/mods/plantlife_modpack/mushroom/textures/mushroom_red_inv.png b/mods/plantlife_modpack/mushroom/textures/mushroom_red_inv.png new file mode 100644 index 0000000000000000000000000000000000000000..796f86742e7b85709d81fffac5fa3fe72470af90 GIT binary patch literal 5279 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 literal 0 HcmV?d00001 diff --git a/mods/plantlife_modpack/nature_classic/global_function.lua b/mods/plantlife_modpack/nature_classic/global_function.lua index 592005a6..45e567f0 100644 --- a/mods/plantlife_modpack/nature_classic/global_function.lua +++ b/mods/plantlife_modpack/nature_classic/global_function.lua @@ -43,10 +43,7 @@ end function nature:grow_node(pos, nodename) if pos ~= nil then - if not minetest.get_node_light(pos, nil) or not nature.minimum_growth_light then return end - -- FIXME: WARN VANESSAE, OR MAYBE IT IS A MISSING CONFIGURATION'S PARAMETER - - local light_enough = minetest.get_node_light(pos, nil) + local light_enough = (minetest.get_node_light(pos, nil) or 0) >= nature.minimum_growth_light if is_not_young(pos) and light_enough then diff --git a/mods/plantlife_modpack/API.txt b/mods/plantlife_modpack/plants_lib/API.txt similarity index 53% rename from mods/plantlife_modpack/API.txt rename to mods/plantlife_modpack/plants_lib/API.txt index 8075865f..8f6455ca 100644 --- a/mods/plantlife_modpack/API.txt +++ b/mods/plantlife_modpack/plants_lib/API.txt @@ -1,6 +1,6 @@ This document describes the Plantlife mod API. -Last revision: 2014-05-24 +Last revision: 2015-02-16 ========= @@ -64,9 +64,9 @@ biome = { 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. + -- 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 @@ -74,151 +74,132 @@ biome = { 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 in the 0 to 5 - -- range, as appropriate for the node you want - -- to spawn. - 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. - depth_max = num, -- If the object spawns on top of a water - -- source, the water must be at most this - -- deep. Defaults to 1 node. - 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. + 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 (check only 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. - -- so 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 amount - -- in question. - 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% - -- relative humidity). + -- 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). - spawn_on_side = bool, -- Set this to true to 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). + -- 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. + -- 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 @@ -250,87 +231,78 @@ 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. + 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 or omitted, this check is skipped. - -- Avoid using excessively large radii or you - -- will slow down the map generator. - 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, -- maximum 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 highest Perlin - -- temperature map value). - temp_max = num, -- warmest allowable temperature to spawn a - -- plant (lowest Perlin temperature 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. - 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. + 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 four nodes surrounding the above - -- space, and the four nodes above those, - -- resulting in a two-node-deep cross-shaped - -- empty region above the spawn target. - -- Useful when adding trees to snow biomes. - -- Defaults to false. + -- 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. } @@ -370,61 +342,53 @@ 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 = { - grow_plant = "string", -- Name of the node to be grown into something - -- else. This value is passed to the ABM as - -- the "nodenames" parameter, so it is the - -- plants themselves that are the ABM trigger, - -- rather than the ground they spawned on. A - -- plant will only grow if the node above it - -- is air. Can also be a table, but note that - -- all nodes referenced therein will be grown - -- into the same object. - grow_delay = num, -- Passed as the ABM "interval" parameter, as - -- with spawning. + grow_plant = "string", -- Name of the node to be grown into something + -- else. This value is passed to the ABM as the + -- "nodenames" parameter, so it is the plants + -- themselves that are the ABM trigger, rather than + -- the ground they spawned on. A plant will only grow + -- if the node above it is air. Can also be a table, + -- but note that all nodes referenced therein will be + -- grown into the same 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. + -- 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 - -- growing and eventually dieing. Defaults to - -- "default:dirt_with_grass". + -- 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}, -- List of nodes that should be considered - -- to be wall surfaces when growing the plant - -- vertically. If not provided, the walls - -- check is skipped. + 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 parameter - -- 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". + -- 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. } @@ -457,13 +421,16 @@ and grow_result is ignored. ===== -find_adjacent_wall(pos, verticals) +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) @@ -490,11 +457,11 @@ call the usual spawn_tree() functions. This rerouting exists as a way for other mods to hook into plants_lib's tree-growing functions in general, perhaps to execute something extra whenever a tree is spawned. -plantslib: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. +plantslib: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. plantslib: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 diff --git a/mods/plantlife_modpack/plants_lib/init.lua b/mods/plantlife_modpack/plants_lib/init.lua index dba332be..fc7bf172 100644 --- a/mods/plantlife_modpack/plants_lib/init.lua +++ b/mods/plantlife_modpack/plants_lib/init.lua @@ -483,7 +483,7 @@ function plantslib:spawn_on_surfaces(sd,sp,sr,sc,ss,sa) and pos.y >= biome.min_elevation and pos.y <= biome.max_elevation then - local walldir = plantslib:find_adjacent_wall(p_top, biome.verticals_list) + local walldir = plantslib: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.set_node(p_top, { name = biome.alt_wallnode, param2 = walldir }) @@ -555,7 +555,7 @@ function plantslib:grow_plants(opts) 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 = plantslib:find_adjacent_wall(p_top, options.verticals_list) + walldir = plantslib:find_adjacent_wall(p_top, options.verticals_list, options.choose_random_wall) end if n_top.name == "air" and (not options.need_wall or (options.need_wall and walldir)) then @@ -612,12 +612,24 @@ end -- 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 plantslib:find_adjacent_wall(pos, verticals) +function plantslib:find_adjacent_wall(pos, verticals, randomflag) local verts = dump(verticals) - 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 + 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 diff --git a/mods/plantlife_modpack/trunks/nodes.lua b/mods/plantlife_modpack/trunks/nodes.lua index 4f76695b..48635664 100644 --- a/mods/plantlife_modpack/trunks/nodes.lua +++ b/mods/plantlife_modpack/trunks/nodes.lua @@ -29,7 +29,9 @@ for i in pairs(NoDe) do buildable_to = true, node_box = {type = "fixed", fixed = flat_stick}, groups = { - dig_immediate=3, -- almost literally immediate, like just picking up + choppy=2, + oddly_breakable_by_hand=2, + flammable=3, attached_node=1, not_in_creative_inventory=iNV }, @@ -67,7 +69,7 @@ minetest.register_node("trunks:moss", { walkable = false, node_box = {type = "fixed", fixed = flat_moss}, selection_box = {type = "fixed", fixed = flat_stick},--{type = "wallmounted"}, - groups = {dig_immediate=2--[[,attached_node=1]]}, -- falling moss is too annoying + groups = {snappy = 3, flammable = 3 }, sounds = default.node_sound_leaves_defaults(), }) @@ -86,7 +88,7 @@ minetest.register_node("trunks:moss_fungus", { walkable = false, node_box = {type = "fixed", fixed = flat_moss}, selection_box = {type = "fixed", fixed = flat_stick},--{type = "wallmounted"}, - groups = {dig_immediate=2--[[,attached_node=1]]}, -- falling moss is too annoying + groups = {snappy = 3, flammable = 3 }, sounds = default.node_sound_leaves_defaults(), }) diff --git a/mods/plantlife_modpack/vines/LICENSE.md b/mods/plantlife_modpack/vines/LICENSE.md new file mode 100644 index 00000000..fb677883 --- /dev/null +++ b/mods/plantlife_modpack/vines/LICENSE.md @@ -0,0 +1,4 @@ +License +======= +- Code WTFPL +- Texture CC diff --git a/mods/plantlife_modpack/vines/README.md b/mods/plantlife_modpack/vines/README.md new file mode 100644 index 00000000..89fdb270 --- /dev/null +++ b/mods/plantlife_modpack/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/plantlife_modpack/vines/aliases.lua b/mods/plantlife_modpack/vines/aliases.lua new file mode 100644 index 00000000..fce72187 --- /dev/null +++ b/mods/plantlife_modpack/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/plantlife_modpack/vines/crafts.lua b/mods/plantlife_modpack/vines/crafts.lua new file mode 100644 index 00000000..19e658b9 --- /dev/null +++ b/mods/plantlife_modpack/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/plantlife_modpack/vines/depends.txt b/mods/plantlife_modpack/vines/depends.txt index d1473e18..4146336c 100644 --- a/mods/plantlife_modpack/vines/depends.txt +++ b/mods/plantlife_modpack/vines/depends.txt @@ -1,2 +1,3 @@ default plants_lib +moretrees? diff --git a/mods/plantlife_modpack/vines/functions.lua b/mods/plantlife_modpack/vines/functions.lua new file mode 100644 index 00000000..5ffb3c91 --- /dev/null +++ b/mods/plantlife_modpack/vines/functions.lua @@ -0,0 +1,132 @@ +vines.register_vine = function( name, defs, biome ) + --different properties for bottom and side vines. + local selection_box + 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 + 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 = true, + tile_images = { 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 = true, + tile_images = { 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 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 minetest.get_item_group( bottom_node.name, "vines") then + minetest.remove_node( bottom ) + end + end, + after_dig_node = function( pos, node, oldmetadata, user ) + vines.dig_vine( pos, drop_node, user ) + end + }) + + plantslib:spawn_on_surfaces( biome ) + + local override_nodes = function( nodes, defs ) + 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, defs ) + registered[#registered+1] = node + end + override( index+1, registered ) + end + override( 1, {} ) + end + + override_nodes( biome.spawn_surfaces,{ + after_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/plantlife_modpack/vines/init.lua b/mods/plantlife_modpack/vines/init.lua index 4491870c..72eda930 100644 --- a/mods/plantlife_modpack/vines/init.lua +++ b/mods/plantlife_modpack/vines/init.lua @@ -1,402 +1,14 @@ ---[[TODO - ropebox rope break results in bottom rope dissapearing and bottom drop rope node to appear at the new bottom - and rope does not drop anything!!!! -]] - -vines = {} - -local mod_name = "vines" -local average_height = 12 -local spawn_interval = 90 -local vines_group = {attached_node=1,vines=1,snappy=3,flammable=2,hanging_node=1,vines_cleanup=1} - -vines.growth_interval = 300 -vines.growth_chance = 2 -vines.rot_interval = 300 -vines.rot_chance = 8 - -local jungle_leaves_list = { - "default:jungleleaves", - "moretrees:jungle_leaves_red", - "moretrees:jungle_leaves_yellow", - "moretrees:jungle_leaves_green" +vines = { + name = 'vines', + recipes = {} } --- Nodes -minetest.register_node("vines:rope_block", { - description = "Rope", - sunlight_propagates = true, - paramtype = "light", - tile_images = { - "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", - }, - drawtype = "cube", - groups = {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' do - minetest.remove_node(p) - p = {x=p.x, y=p.y-1, z=p.z} - n = minetest.get_node(p) - end - if n.name == 'vines:rope_end' then - minetest.remove_node(p) - end - end -}) - -minetest.register_node("vines:rope", { - description = "Rope", - walkable = false, - climbable = true, - sunlight_propagates = true, - paramtype = "light", - drop = "", - tile_images = { "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}, - }, - on_destruct = function() - - end, -}) - -minetest.register_node("vines:rope_end", { - description = "Rope", - walkable = false, - climbable = true, - sunlight_propagates = true, - paramtype = "light", - drop = "", - tile_images = { "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) - 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}, - }, -}) - -minetest.register_node("vines:side", { - description = "Vine", - walkable = false, - climbable = true, - drop = "", - sunlight_propagates = true, - paramtype = "light", - paramtype2 = "wallmounted", - buildable_to = true, - tile_images = { "vines_side.png" }, - drawtype = "signlike", - inventory_image = "vines_side.png", - groups = vines_group, - sounds = default.node_sound_leaves_defaults(), - selection_box = { - type = "wallmounted", - }, - after_dig_node = function(pos, oldnode, oldmetadata, user) - local wielded if user:get_wielded_item() ~= nil then wielded = user:get_wielded_item() else return end - if 'vines:shears' == wielded:get_name() then - local inv = user:get_inventory() - if inv then - inv:add_item("main", ItemStack(oldnode.name)) - end - end - end -}) - -minetest.register_node("vines:side_rotten", { - description = "Vine", - walkable = false, - climbable = false, - drop = "", - sunlight_propagates = true, - paramtype = "light", - paramtype2 = "wallmounted", - buildable_to = true, - tile_images = { "vines_side_rotten.png" }, - drawtype = "signlike", - inventory_image = "vines_side.png", - groups = {snappy = 3,flammable=2, hanging_node=1,vines_cleanup=1}, - sounds = default.node_sound_leaves_defaults(), - selection_box = { - type = "wallmounted", - }, -}) - -minetest.register_node("vines:willow", { - description = "Vine", - walkable = false, - climbable = true, - drop = "", - sunlight_propagates = true, - paramtype = "light", - paramtype2 = "wallmounted", - buildable_to = true, - tile_images = { "vines_willow.png" }, - drawtype = "signlike", - inventory_image = "vines_willow.png", - groups = vines_group, - sounds = default.node_sound_leaves_defaults(), - selection_box = { - type = "wallmounted", - }, - after_dig_node = function(pos, oldnode, oldmetadata, user) - local wielded if user:get_wielded_item() ~= nil then wielded = user:get_wielded_item() else return end - if 'vines:shears' == wielded:get_name() then - local inv = user:get_inventory() - if inv then - inv:add_item("main", ItemStack(oldnode.name)) - end - end - end -}) - -minetest.register_node("vines:willow_rotten", { - description = "Vine", - walkable = false, - climbable = false, - sunlight_propagates = true, - paramtype = "light", - drop = "", - paramtype2 = "wallmounted", - buildable_to = true, - tile_images = { "vines_willow_rotten.png" }, - drawtype = "signlike", - inventory_image = "vines_willow.png", - groups = {snappy = 3,flammable=2, hanging_node=1,vines_cleanup=1}, - sounds = default.node_sound_leaves_defaults(), - selection_box = { - type = "wallmounted", - }, -}) - -minetest.register_node("vines:root", { - description = "Vine", - walkable = false, - climbable = true, - sunlight_propagates = true, - paramtype = "light", - buildable_to = true, - tile_images = { "vines_root.png" }, - drawtype = "plantlike", - inventory_image = "vines_root.png", - groups = {vines=1,snappy = 3,flammable=2, hanging_node=1,vines_cleanup=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:vine", { - description = "Vine", - walkable = false, - climbable = true, - sunlight_propagates = true, - drop = "", - paramtype = "light", - buildable_to = true, - tile_images = { "vines_vine.png" }, - drawtype = "plantlike", - inventory_image = "vines_vine.png", - groups = vines_group, - sounds = default.node_sound_leaves_defaults(), - selection_box = { - type = "fixed", - fixed = {-0.3, -1/2, -0.3, 0.3, 1/2, 0.3}, - }, - after_dig_node = function(pos, oldnode, oldmetadata, user) - local wielded if user:get_wielded_item() ~= nil then wielded = user:get_wielded_item() else return end - if 'vines:shears' == wielded:get_name() then - local inv = user:get_inventory() - if inv then - inv:add_item("main", ItemStack(oldnode.name)) - end - end - end -}) - -minetest.register_node("vines:vine_rotten", { - description = "Rotten vine", - walkable = false, - climbable = true, - drop = "", - sunlight_propagates = true, - paramtype = "light", - buildable_to = true, - tile_images = { "vines_vine_rotten.png" }, - drawtype = "plantlike", - inventory_image = "vines_vine_rotten.png", - groups = {snappy = 3,flammable=2, hanging_node=1,vines_cleanup=1}, - sounds = default.node_sound_leaves_defaults(), - selection_box = { - type = "fixed", - fixed = {-0.3, -1/2, -0.3, 0.3, 1/2, 0.3}, - }, -}) - --- vine rotting - -minetest.register_abm({ - nodenames = {"vines:vine", "vines:side", "vines:willow"}, - interval = vines.rot_interval, - chance = vines.rot_chance, - action = function(pos, node, active_object_count, active_object_count_wider) - if minetest.find_node_near(pos, 5, "group:tree") == nil then - local walldir = node.param2 - minetest.add_node(pos, {name=node.name.."_rotten", param2 = walldir}) - end - end -}) - --- vine growth - -minetest.register_abm({ - nodenames = {"vines:vine", "vines:side", "vines:willow"}, - interval = vines.growth_interval, - chance = vines.growth_chance, - action = function(pos, node, active_object_count, active_object_count_wider) - local p = {x=pos.x, y=pos.y-1, z=pos.z} - local n = minetest.get_node(p) - if n.name == "air" then - local walldir = node.param2 - minetest.add_node(p, {name=node.name, param2 = walldir}) - end - end -}) - --- cleanup if the initial tree is missing entirely (e.g. has been dug away) - -minetest.register_abm({ - nodenames = {"group:vines_cleanup"}, - interval = 10, - chance = 5, - action = function(pos, node, active_object_count, active_object_count_wider) - if not minetest.find_node_near(pos, 1, jungle_leaves_list) then - local p_top = {x=pos.x, y=pos.y+1, z=pos.z} - if minetest.get_item_group(minetest.get_node(p_top).name, "vines_cleanup") == 0 then - minetest.remove_node(pos) - end - end - end -}) - --- rope extension - -minetest.register_abm({ - nodenames = {"vines:rope_end"}, - interval = 1, - chance = 1, - drop = "", - action = function(pos, node, active_object_count, active_object_count_wider) - local p = {x=pos.x, y=pos.y-1, z=pos.z} - local n = minetest.get_node(p) - --remove if top node is removed - if n.name == "air" then - minetest.set_node(pos, {name="vines:rope"}) - minetest.add_node(p, {name="vines:rope_end"}) - end - end -}) ---Craft -minetest.register_craft({ - output = 'vines:rope_block', - recipe = { - {'', 'default:wood', ''}, - {'', 'vines:side', ''}, - {'', 'vines:side', ''}, - } -}) - -minetest.register_craftitem("vines:vines", { - description = "Vines", - inventory_image = "vines_item.png", -}) ---spawning -plantslib:spawn_on_surfaces({ - avoid_nodes = {"vines:vine"}, - avoid_radius = 5, - spawn_delay = spawn_interval, - spawn_plants = {"vines:vine"}, - spawn_chance = 10, - spawn_surfaces = {"default:dirt_with_grass","default:dirt"}, - spawn_on_bottom = true, - plantlife_limit = -0.9, -}) - -plantslib:spawn_on_surfaces({ - avoid_nodes = {"vines:vine", "vines:side"}, - avoid_radius = 3, - spawn_delay = spawn_interval, - spawn_plants = {"vines:side"}, - spawn_chance = 10, - spawn_surfaces = jungle_leaves_list, - spawn_on_side = true, - near_nodes = {"default:jungletree"}, - near_nodes_size = 5, - plantlife_limit = -0.9, -}) - -plantslib:spawn_on_surfaces({ - spawn_plants = {"vines:willow"}, - spawn_delay = spawn_interval, - spawn_chance = 3, - spawn_surfaces = {"moretrees:willow_leaves"}, - spawn_on_side = true, - near_nodes = {"default:water_source"}, - near_nodes_size = 2, - near_nodes_vertical = 5, - near_nodes_count = 1, - plantlife_limit = -0.9, -}) - ---Shears jojoa1997's shears -minetest.register_tool("vines:shears", { - description = "Shears", - inventory_image = "shears.png", - wield_image = "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}, maxwear=0.05, maxlevel=3}, - wool={times={[3]=0.2}, maxwear=0.05, maxlevel=3} - } - }, -}) - -minetest.register_craft({ - output = 'vines:shears', - recipe = { - {'', 'default:steel_ingot', ''}, - {'default:stick', 'default:wood', 'default:steel_ingot'}, - {'', '', 'default:stick'}, - } -}) +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/plantlife_modpack/vines/nodes.lua b/mods/plantlife_modpack/vines/nodes.lua new file mode 100644 index 00000000..ab14b28a --- /dev/null +++ b/mods/plantlife_modpack/vines/nodes.lua @@ -0,0 +1,83 @@ +minetest.register_node("vines:rope_block", { + description = "Rope", + sunlight_propagates = true, + paramtype = "light", + tile_images = { + "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 = "", + tile_images = { "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 = "", + tile_images = { "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) + 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/plantlife_modpack/vines/readme.txt b/mods/plantlife_modpack/vines/readme.txt deleted file mode 100644 index 0228a77f..00000000 --- a/mods/plantlife_modpack/vines/readme.txt +++ /dev/null @@ -1,43 +0,0 @@ - __ __ ___ __ _ _______ _______ -| | | || | | | | || || | -| |_| || | | |_| || ___|| _____| -| || | | || |___ | |_____ -| || | | _ || ___||_____ | - | | | | | | | || |___ _____| | - |___| |___| |_| |__||_______||_______| - -BY: bas080 -DESCRIPTION: Vines and ropebox -VERSION: 2.2.1 -LICENCE: WTFPL -FORUM: http://forum.minetest.net/viewtopic.php?id=2344 - -Changelog ---------- -2.2.1 -* Also spawn on leaves that are near jungletree -* Uses default wood texture -* Drops actual vines -* Changed craft - -2.2 -* Spawns on all leaves that are near water - -2.1 -* Removed rope(end) from creative inventory - -2.0 -* Root vines texture and node (no spawn) -* Side vines spawn on leaves -* Willow vines spawns on moretrees willow leaves -* Ropebox after_dig_node re-defined - -1.5 -* Added side vines -* Uses plant_lib api -* Original vines do not spawn anymore but are still there. - -1.0 -* Vines spawn beneath leave nodes -* Has rotten and non rotten vines -* Ropebox with craft diff --git a/mods/plantlife_modpack/vines/recipes.lua b/mods/plantlife_modpack/vines/recipes.lua new file mode 100644 index 00000000..d2b928a9 --- /dev/null +++ b/mods/plantlife_modpack/vines/recipes.lua @@ -0,0 +1,12 @@ +vines.recipes['rope_block'] = { + {'', 'default:wood', ''}, + {'', 'group:vines', ''}, + {'', 'group:vines', ''} +} + +vines.recipes['shears'] = { + {'', 'default:steel_ingot', ''}, + {'default:stick', 'default:wood', 'default:steel_ingot'}, + {'', '', 'default:stick'} +} + diff --git a/mods/plantlife_modpack/vines/shear.lua b/mods/plantlife_modpack/vines/shear.lua new file mode 100644 index 00000000..996cfdcd --- /dev/null +++ b/mods/plantlife_modpack/vines/shear.lua @@ -0,0 +1,15 @@ +minetest.register_tool("vines:shears", { + description = "Shears", + inventory_image = "vines_shears.png", + wield_image = "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}, maxwear=0.05, maxlevel=3}, + wool={times={[3]=0.2}, maxwear=0.05, maxlevel=3} + } + }, +}) diff --git a/mods/plantlife_modpack/vines/textures/new/sidevine.png b/mods/plantlife_modpack/vines/textures/new/sidevine.png deleted file mode 100644 index fdeaeaebe9e12c0b2d9b27d6eda922dd93de354a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHF4e$wZ1=5m+A~NP;Dy}j*p-N^M zT6UENBI*Ljf<{T|=GodnaRt^p4}cojOM?7@fiwt&ro4&(QYoG;jv*Yf$qDPO#2vBA zoX+T+k@|(np!sIaG-2nbNo;I#ue~Ox-&WT&Ft{I-|0p&_@qj>;_8!JF3ESdc9^R0B z$(W7pbF3QI)$Ycug4u@?Vl$U-sJ&#U^Xx<9`Vy;c*+R^BWEg}@^cJl<-1QV>ucxb@ J%Q~loCID5^M|J=J diff --git a/mods/plantlife_modpack/vines/textures/new/vinesdead.png b/mods/plantlife_modpack/vines/textures/new/vinesdead.png deleted file mode 100644 index 3ac6ea510dba4daa1a523ba119da56c2b2b38734..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`-JULvAr_~T6B?KzYghii_3qVw z$q5W*h63^`eBu{4L)C9H9CnD^p>UF|;Y&l~mQ5-#Op%6@oJ7=>S2w?O4eU9~TF_c? zWs-cyi!RZ#Pc)1fJRX}csI*^a5IFWMKIhekoe%8wm^Z9cyt&^+x*OtIiQvEB4iFbwxGE6`rns JF6*2UngB%oPGI-%;tsfxXA zN)T@0g=dC9Iku7@zhEE@1bNHYCjzMgPZ!4!4q4WNdj$^ygTe~ HDWM4f$w^6m diff --git a/mods/plantlife_modpack/vines/textures/vines_jungle_end.png b/mods/plantlife_modpack/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/plantlife_modpack/vines/textures/vines_jungle_middle.png b/mods/plantlife_modpack/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/plantlife_modpack/vines/textures/vines_root.png b/mods/plantlife_modpack/vines/textures/vines_root.png deleted file mode 100644 index 49f88c055ceac9451de44ecaf4d52df45f72091b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHF4e$wZ1=6C1{IcSr%2Hz5K5~YE zs`fg{j%EgB(SAU2kf5?0P~22c6DTNGrnnENfwLsYFBnKeKyk|Kg+P{*r;B3|8H^kfr%mp^OJZQ|+rHaLL1*_{CV{rM#c~|UZ})K~+$w!**TIl{HI0Kgi;tOE f{frFTrL&9-JDa5>j(GDd0-5XS>gTe~DWM4fl07o0 diff --git a/mods/plantlife_modpack/vines/textures/vines_root_end.png b/mods/plantlife_modpack/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;_8!JF3ESdc9^R0B z$(W7pbF3QI)$Ycug4u@?Vl$U-sJ&#U^Xx<9`Vy;c*+R^BWEg}@^cJl<-1QV>ucxb@ J%Q~loCID5^M|J=J diff --git a/mods/plantlife_modpack/vines/textures/vines_side_end.png b/mods/plantlife_modpack/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+8vpyp@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 diff --git a/mods/plantlife_modpack/vines/textures/vines_vine_end.png b/mods/plantlife_modpack/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)wUF|;Y&l~mQ5-#Op%6@oJ7=>S2w?O4eU9~TF_c? zWs-cyi!RZ#Pc)1fJRX}csI*^a5IFWMKIhekoe%8wm^Z9cyt&^+x*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?ue#7I$S)X3|0+9j4@d=hx;Tb#$g&>X$m?V%z-pi#enDx|f%r$g z6aFnw&=peNu)n3(H=!lwhw1ADv+|YsbDlICgaw~nV-|k6?DPSi#;U;Hs^DIpoF{dX gjmdKI;Vst0Pw3mfdBvi diff --git a/mods/plantlife_modpack/vines/vines.lua b/mods/plantlife_modpack/vines/vines.lua new file mode 100644 index 00000000..cb16b6dd --- /dev/null +++ b/mods/plantlife_modpack/vines/vines.lua @@ -0,0 +1,97 @@ +vines.register_vine( 'root', { + description = "Roots", + average_length = 9, +},{ + choose_random_wall = true, + avoid_nodes = {"vines:root_middle"}, + avoid_radius = 5, + spawn_delay = 500, + spawn_chance = 10, + spawn_surfaces = { + "default:dirt_with_grass", + "default:dirt" + }, + spawn_on_bottom = true, + plantlife_limit = -0.6, + humidity_min = 0.4, +}) + +vines.register_vine( 'vine', { + description = "Vines", + average_length = 5, +},{ + choose_random_wall = true, + avoid_nodes = {"group:vines"}, + avoid_radius = 5, + spawn_delay = 500, + spawn_chance = 100, + spawn_surfaces = { + "default:leaves", + "default:jungleleave", + "moretrees:jungetree_leaves_red", + "moretrees:jungetree_leaves_yellow", + "moretrees:jungetree_leaves_green" + }, + spawn_on_bottom = true, + plantlife_limit = -0.9, + humidity_min = 0.7, +}) + +vines.register_vine( 'side', { + description = "Vines", + average_length = 3, +},{ + choose_random_wall = true, + avoid_nodes = {"group:vines"}, + choose_random_wall = true, + avoid_radius = 3, + spawn_delay = 500, + spawn_chance = 100, + spawn_surfaces = { + "default:leaves", + "default:jungleleaves", + "moretrees:jungletree_leaves_red", + "moretrees:jungletree_leaves_yellow", + "moretrees:jungletree_leaves_green" + }, + spawn_on_side = true, + plantlife_limit = -0.9, + humidity_min = 0.4, +}) + +vines.register_vine( 'jungle', { + description = "Jungle Vines", + average_length = 7, +},{ + choose_random_wall = true, + avoid_nodes = {"group:vines"}, + avoid_radius = 5, + spawn_delay = 500, + spawn_chance = 100, + spawn_surfaces = { + "default:jungletree", + "moretrees:jungletree_trunk" + }, + spawn_on_side = true, + plantlife_limit = -0.4, + humidity_min = 0.2, +}) + +vines.register_vine( 'willow', { + description = "Willow Vines", + average_length = 9, +},{ + choose_random_wall = true, + avoid_nodes = { "vines:willow_middle" }, + avoid_radius = 5, + near_nodes = { 'default:water_source' }, + near_nodes_size = 1, + near_nodes_vertical = 7, + near_nodes_count = 1, + plantlife_limit = -0.8, + spawn_chance = 10, + spawn_delay = 500, + spawn_on_side = true, + spawn_surfaces = {"moretrees:willow_leaves"}, + humidity_min = 0.5 +})