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 15f87123..00000000 Binary files a/mods/plantlife_modpack/mushroom/textures/mushroom_brown.png and /dev/null differ 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 00000000..c36f5240 Binary files /dev/null and b/mods/plantlife_modpack/mushroom/textures/mushroom_brown_3d.png differ diff --git a/mods/plantlife_modpack/mushroom/textures/mushroom_brown_inv.png b/mods/plantlife_modpack/mushroom/textures/mushroom_brown_inv.png new file mode 100644 index 00000000..c9a7b3c8 Binary files /dev/null and b/mods/plantlife_modpack/mushroom/textures/mushroom_brown_inv.png differ diff --git a/mods/plantlife_modpack/mushroom/textures/mushroom_red.png b/mods/plantlife_modpack/mushroom/textures/mushroom_red.png deleted file mode 100644 index 0b83830f..00000000 Binary files a/mods/plantlife_modpack/mushroom/textures/mushroom_red.png and /dev/null differ diff --git a/mods/plantlife_modpack/mushroom/textures/mushroom_red_3d.png b/mods/plantlife_modpack/mushroom/textures/mushroom_red_3d.png new file mode 100644 index 00000000..dc80e323 Binary files /dev/null and b/mods/plantlife_modpack/mushroom/textures/mushroom_red_3d.png differ 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 00000000..796f8674 Binary files /dev/null and b/mods/plantlife_modpack/mushroom/textures/mushroom_red_inv.png differ 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 fdeaeaeb..00000000 Binary files a/mods/plantlife_modpack/vines/textures/new/sidevine.png and /dev/null differ 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 3ac6ea51..00000000 Binary files a/mods/plantlife_modpack/vines/textures/new/vinesdead.png and /dev/null differ diff --git a/mods/plantlife_modpack/vines/textures/old/vines_vine2.png b/mods/plantlife_modpack/vines/textures/old/vines_vine2.png deleted file mode 100644 index c755da90..00000000 Binary files a/mods/plantlife_modpack/vines/textures/old/vines_vine2.png and /dev/null differ diff --git a/mods/plantlife_modpack/vines/textures/old/vines_vine_rotten2.png b/mods/plantlife_modpack/vines/textures/old/vines_vine_rotten2.png deleted file mode 100644 index c66e12e2..00000000 Binary files a/mods/plantlife_modpack/vines/textures/old/vines_vine_rotten2.png and /dev/null differ 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 00000000..6c8d3395 Binary files /dev/null and b/mods/plantlife_modpack/vines/textures/vines_jungle_end.png differ 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 00000000..bf838a50 Binary files /dev/null and b/mods/plantlife_modpack/vines/textures/vines_jungle_middle.png differ 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 49f88c05..00000000 Binary files a/mods/plantlife_modpack/vines/textures/vines_root.png and /dev/null differ 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 00000000..4fc3f87a Binary files /dev/null and b/mods/plantlife_modpack/vines/textures/vines_root_end.png differ diff --git a/mods/plantlife_modpack/vines/textures/new/bottomvine.png b/mods/plantlife_modpack/vines/textures/vines_root_middle.png similarity index 100% rename from mods/plantlife_modpack/vines/textures/new/bottomvine.png rename to mods/plantlife_modpack/vines/textures/vines_root_middle.png diff --git a/mods/plantlife_modpack/vines/textures/shears.png b/mods/plantlife_modpack/vines/textures/vines_shears.png similarity index 100% rename from mods/plantlife_modpack/vines/textures/shears.png rename to mods/plantlife_modpack/vines/textures/vines_shears.png diff --git a/mods/plantlife_modpack/vines/textures/vines_side.png b/mods/plantlife_modpack/vines/textures/vines_side.png deleted file mode 100644 index fdeaeaeb..00000000 Binary files a/mods/plantlife_modpack/vines/textures/vines_side.png and /dev/null differ 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 00000000..5b3b28f7 Binary files /dev/null and b/mods/plantlife_modpack/vines/textures/vines_side_end.png differ diff --git a/mods/plantlife_modpack/vines/textures/vines_side_rotten.png b/mods/plantlife_modpack/vines/textures/vines_side_middle.png similarity index 100% rename from mods/plantlife_modpack/vines/textures/vines_side_rotten.png rename to mods/plantlife_modpack/vines/textures/vines_side_middle.png diff --git a/mods/plantlife_modpack/vines/textures/vines_vine.png b/mods/plantlife_modpack/vines/textures/vines_vine.png deleted file mode 100644 index 8afffe89..00000000 Binary files a/mods/plantlife_modpack/vines/textures/vines_vine.png and /dev/null differ 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 00000000..062857be Binary files /dev/null and b/mods/plantlife_modpack/vines/textures/vines_vine_end.png differ diff --git a/mods/plantlife_modpack/vines/textures/new/vineslive.png b/mods/plantlife_modpack/vines/textures/vines_vine_middle.png similarity index 100% rename from mods/plantlife_modpack/vines/textures/new/vineslive.png rename to mods/plantlife_modpack/vines/textures/vines_vine_middle.png diff --git a/mods/plantlife_modpack/vines/textures/vines_vine_rotten.png b/mods/plantlife_modpack/vines/textures/vines_vine_rotten.png deleted file mode 100644 index 3ac6ea51..00000000 Binary files a/mods/plantlife_modpack/vines/textures/vines_vine_rotten.png and /dev/null differ diff --git a/mods/plantlife_modpack/vines/textures/vines_willow_end.png b/mods/plantlife_modpack/vines/textures/vines_willow_end.png new file mode 100644 index 00000000..b5b8e594 Binary files /dev/null and b/mods/plantlife_modpack/vines/textures/vines_willow_end.png differ diff --git a/mods/plantlife_modpack/vines/textures/vines_willow.png b/mods/plantlife_modpack/vines/textures/vines_willow_middle.png similarity index 100% rename from mods/plantlife_modpack/vines/textures/vines_willow.png rename to mods/plantlife_modpack/vines/textures/vines_willow_middle.png diff --git a/mods/plantlife_modpack/vines/textures/vines_willow_rotten.png b/mods/plantlife_modpack/vines/textures/vines_willow_rotten.png deleted file mode 100644 index 3c0622f7..00000000 Binary files a/mods/plantlife_modpack/vines/textures/vines_willow_rotten.png and /dev/null differ 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 +})