1
0
mirror of https://github.com/sys4-fr/server-nalc.git synced 2024-12-25 02:00:37 +01:00

Updated planflife modpack : bug fixes, less laggy, etc..

This commit is contained in:
LeMagnesium 2015-02-24 18:16:22 +01:00
parent 82d743415e
commit 70b36257ea
46 changed files with 1086 additions and 771 deletions

View File

@ -31,6 +31,27 @@ end
----------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------
-- Sickle -- 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 -- turns nodes with group flora=1 & flower=0 into cut grass
local function sickle_on_use(itemstack, user, pointed_thing, uses) local function sickle_on_use(itemstack, user, pointed_thing, uses)
local pt = pointed_thing local pt = pointed_thing
@ -43,8 +64,8 @@ local function sickle_on_use(itemstack, user, pointed_thing, uses)
end end
local under = minetest.get_node(pt.under) local under = minetest.get_node(pt.under)
local p = {x=pt.under.x, y=pt.under.y+1, z=pt.under.z} local above_pos = {x=pt.under.x, y=pt.under.y+1, z=pt.under.z}
local above = minetest.get_node(p) local above = minetest.get_node(above_pos)
-- return if any of the nodes is not registered -- return if any of the nodes is not registered
if not minetest.registered_nodes[under.name] then if not minetest.registered_nodes[under.name] then
@ -54,29 +75,19 @@ local function sickle_on_use(itemstack, user, pointed_thing, uses)
return return
end 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 -- check if something that can be cut using fine tools
if minetest.get_item_group(under.name, "snappy") > 0 then if minetest.get_item_group(under.name, "snappy") > 0 then
-- check if flora but no flower -- 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 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 -- turn the node into cut grass, wear out item and play sound
minetest.set_node(pt.under, {name="dryplants:grass"}) minetest.set_node(pt.under, {name="dryplants:grass"})
else -- otherwise get the drop else -- otherwise dig the node
local inv = user:get_inventory() if not minetest.node_dig(pt.under, under, user) then
local name = minetest. get_node(pt.under).name return
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 end
else
if inv:room_for_item("main", name) then
inv:add_item("main", name)
end
end
minetest.remove_node(pt.under)
end end
minetest.sound_play("default_dig_crumbly", { minetest.sound_play("default_dig_crumbly", {
pos = pt.under, pos = pt.under,
@ -84,9 +95,12 @@ local function sickle_on_use(itemstack, user, pointed_thing, uses)
}) })
itemstack:add_wear(65535/(uses-1)) itemstack:add_wear(65535/(uses-1))
return itemstack 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.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", { minetest.sound_play("default_dig_crumbly", {
pos = pt.under, pos = pt.under,
gain = 0.5, gain = 0.5,

View File

@ -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 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 :-) 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 if not keys["sneak"] then
local node = minetest.get_node(pt.under) local node = minetest.get_node(pt.under)
local waterlily = math.random(1,8) local waterlily = math.random(1,8)

View File

@ -8,11 +8,11 @@ mushroom = {}
minetest.register_node("mushroom:brown",{ minetest.register_node("mushroom:brown",{
description = "Brown Mushroom", description = "Brown Mushroom",
drawtype = "plantlike", drawtype = "mesh",
mesh = "plantlife_mushroom.obj",
tiles = {"mushroom_brown_3d.png"},
sunlight_propagates = true, sunlight_propagates = true,
tiles = {"mushroom_brown.png"}, inventory_image = "mushroom_brown_inv.png",
inventory_image = "mushroom_brown.png",
wield_image = "mushroom_brown.png",
groups = {oddly_breakable_by_hand=3,attached_node=1}, groups = {oddly_breakable_by_hand=3,attached_node=1},
paramtype = "light", paramtype = "light",
walkable = false, walkable = false,
@ -26,11 +26,11 @@ minetest.register_node("mushroom:brown",{
minetest.register_node("mushroom:red",{ minetest.register_node("mushroom:red",{
description = "Red Mushroom", description = "Red Mushroom",
drawtype = "plantlike", drawtype = "mesh",
mesh = "plantlife_mushroom.obj",
tiles = {"mushroom_red_3d.png"},
sunlight_propagates = true, sunlight_propagates = true,
tiles = {"mushroom_red.png"}, inventory_image = "mushroom_red_inv.png",
inventory_image = "mushroom_red.png",
wield_image = "mushroom_red.png",
groups = {oddly_breakable_by_hand=3,attached_node=1}, groups = {oddly_breakable_by_hand=3,attached_node=1},
paramtype = "light", paramtype = "light",
walkable = false, walkable = false,
@ -78,12 +78,12 @@ minetest.register_node("mushroom:spore_red",{
minetest.register_node("mushroom:brown_natural",{ minetest.register_node("mushroom:brown_natural",{
description = "Brown Mushroom (Naturally Spawned)", description = "Brown Mushroom (Naturally Spawned)",
drawtype = "plantlike", drawtype = "mesh",
mesh = "plantlife_mushroom.obj",
tiles = {"mushroom_brown_3d.png"},
sunlight_propagates = true, sunlight_propagates = true,
tiles = {"mushroom_brown.png"}, inventory_image = "mushroom_brown_inv.png",
inventory_image = "mushroom_brown.png", groups = {oddly_breakable_by_hand=3, not_in_creative_inventory=1},
wield_image = "mushroom_brown.png",
groups = {oddly_breakable_by_hand=3},
paramtype = "light", paramtype = "light",
walkable = false, walkable = false,
selection_box = { selection_box = {
@ -95,12 +95,12 @@ minetest.register_node("mushroom:brown_natural",{
minetest.register_node("mushroom:red_natural",{ minetest.register_node("mushroom:red_natural",{
description = "Red Mushroom (Naturally Spawned)", description = "Red Mushroom (Naturally Spawned)",
drawtype = "plantlike", drawtype = "mesh",
mesh = "plantlife_mushroom.obj",
tiles = {"mushroom_red_3d.png"},
sunlight_propagates = true, sunlight_propagates = true,
tiles = {"mushroom_red.png"}, inventory_image = "mushroom_red_inv.png",
inventory_image = "mushroom_red.png", groups = {oddly_breakable_by_hand=3, not_in_creative_inventory=1},
wield_image = "mushroom_red.png",
groups = {oddly_breakable_by_hand=3},
paramtype = "light", paramtype = "light",
walkable = false, walkable = false,
selection_box = { selection_box = {

View File

@ -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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 125 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 123 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

View File

@ -43,10 +43,7 @@ end
function nature:grow_node(pos, nodename) function nature:grow_node(pos, nodename)
if pos ~= nil then if pos ~= nil then
if not minetest.get_node_light(pos, nil) or not nature.minimum_growth_light then return end local light_enough = (minetest.get_node_light(pos, nil) or 0)
-- FIXME: WARN VANESSAE, OR MAYBE IT IS A MISSING CONFIGURATION'S PARAMETER
local light_enough = minetest.get_node_light(pos, nil)
>= nature.minimum_growth_light >= nature.minimum_growth_light
if is_not_young(pos) and light_enough then if is_not_young(pos) and light_enough then

View File

@ -1,6 +1,6 @@
This document describes the Plantlife mod API. 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_delay = number, -- same as sdelay, above.
spawn_chance = number, -- same as schance, above. spawn_chance = number, -- same as schance, above.
spawn_surfaces = {table}, -- List of node names on which the plants spawn_surfaces = {table}, -- List of node names on which the plants
-- should be spawned. As with the single- -- should be spawned. As with the single-node "ssurface"
-- node "ssurface" option in the legacy API, -- option in the legacy API, you should not put stone, air,
-- you should not put stone, air, etc. here. -- etc. here.
---- From here down are a number of optional parameters. You will ---- 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 ---- 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_nodes = {table}, -- same meaning as savoid, above
avoid_radius = num, -- same as sradius avoid_radius = num, -- same as sradius
seed_diff = num, -- The Perlin seed difference value passed to seed_diff = num, -- The Perlin seed difference value passed to the
-- the minetest.get_perlin() function. -- minetest.get_perlin() function. Used along with
-- Used along with the global Perlin controls -- the global Perlin controls below to create the
-- below to create the "biome" in which the -- "biome" in which the plants will spawn. Defaults
-- plants will spawn. Defaults to 0 if not -- to 0 if not provided.
-- provided. light_min = num, -- Minimum amount of light necessary to make a plant
light_min = num, -- Minimum amount of light necessary to make a -- spawn. Defaults to 0.
-- plant spawn. Defaults to 0. light_max = num, -- Maximum amount of light needed to spawn. Defaults
light_max = num, -- Maximum amount of light needed to spawn. -- to the engine's MAX_LIGHT value of 14.
-- Defaults to the engine's MAX_LIGHT value of
-- 14.
neighbors = {table}, -- List of neighboring nodes that need to be neighbors = {table}, -- List of neighboring nodes that need to be
-- immediately next to the node the plant is -- immediately next to the node the plant is about to
-- about to spawn on. Can also be a string -- spawn on. Can also be a string with a single node
-- with a single node name. It is both passed -- name. It is both passed to the ABM as the
-- to the ABM as the "neighbors" parameter, -- "neighbors" parameter, and is used to manually
-- and is used to manually check the -- check the adjacent nodes. It only takes one of
-- adjacent nodes. It only takes one of these -- these for the spawn routine to mark the target as
-- for the spawn routine to mark the target as
-- spawnable. Defaults to nil (ignored). -- spawnable. Defaults to nil (ignored).
ncount = num, -- There must be at least this many of the ncount = num, -- There must be at least this many of the above
-- above neighbors in the eight spaces -- neighbors in the eight spaces immediately
-- immediately surrounding the node the plant -- surrounding the node the plant is about to spawn on
-- is about to spawn on for it to happen. If -- for it to happen. If not provided, this check is
-- 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. -- 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 near_nodes_size = num, -- How large of an area to check for the above
-- node. Specifically, this checks a flat -- node. Specifically, this checks a flat, horizontal
-- horizontal area centered on the node to be -- area centered on the node to be spawned on.
-- spawned on. Defaults to 0, but is ignored -- Defaults to 0, but is ignored if the above
-- if the above near_nodes value is not set. -- near_nodes value is not set.
near_nodes_vertical = num, -- Used with the size value above, this near_nodes_vertical = num, -- Used with the size value above, this extends
-- extends the vertical range of the near -- the vertical range of the near nodes search.
-- nodes search. Basically, this turns the -- Basically, this turns the flat region described
-- flat region described above into a cuboid -- above into a cuboid region. The area to be checked
-- region. The area to be checked will extend -- will extend this high and this low above/below the
-- this high AND this low above/below the -- target node, centered thereon. Defaults to 1 (only
-- target node, centered thereon. Defaults to -- check the layer above, the layer at, and the layer
-- 1 (check only the layer above, the layer -- below the target node), but is ignored if
-- at, and the layer below the target node), -- near_nodes is not set.
-- but is ignored if near_nodes is not set. near_nodes_count = num, -- How many of the above nodes must be within that
near_nodes_count = num, -- How many of the above nodes must be within -- radius. Defaults to 1 but is ignored if near_nodes
-- that radius. Defaults to 1 but is ignored -- isn't set. Bear in mind that the total area to be
-- if near_nodes isn't set. Bear in mind that -- checked is equal to:
-- the total area to be checked is equal to -- (near_nodes_size^2)*near_nodes_vertical*2
-- (near_nodes_size^2)*near_nodes_vertical*2. -- For example, if size is 10 and vertical is 4, then
-- so for example, if size is 10 and vertical -- the area is (10^2)*8 = 800 nodes in size, so you'll
-- is 4 then the area is (10^2)*8 = 800 nodes -- want to make sure you specify a value appropriate
-- in size, so you'll want to make sure you -- for the size of the area being tested.
-- specify a value appropriate for the amount air_size = num, -- How large of an area to check for air above and
-- in question. -- around the target. If omitted, only the space
air_size = num, -- How large of an area to check for air -- above the target is checked. This does not check
-- above and around the target. If omitted, -- 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. -- only the space above the target is checked.
-- This does not check for air at the sides or plantlife_limit = num, -- The value compared against the generic "plants
-- below the target. -- can grow here" Perlin noise layer. Smaller numbers
air_count = num, -- How many of the surrounding nodes need to -- result in more abundant plants. Range of -1 to +1,
-- be air for the above check to return true. -- with values in the range of about 0 to 0.5 being
-- If omitted, only the space above the target -- most useful. Defaults to 0.1.
-- is checked. temp_min = num, -- Minimum temperature needed for the desired object
plantlife_limit = num, -- The value compared against the generic -- to spawn. This is a 2d Perlin value, which has an
-- "plants can grow here" Perlin noise layer. -- inverted range of +1 to -1. Larger values
-- Smaller numbers result in more abundant -- represent *colder* temperatures, so this value is
-- plants. Range of -1 to +1, with values in -- actually the upper end of the desired Perlin range.
-- the range of about 0 to 0.5 being most -- See the temperature map section at the bottom of
-- useful. Defaults to 0.1. -- this document for details on how these values work.
temp_min = num, -- Minimum temperature needed for the desired -- Defaults to +1 (unlimited coldness).
-- object to spawn. This is a 2d Perlin temp_max = num, -- Maximum temperature/lower end of the Perlin range.
-- value, which has an inverted range of +1 to -- Defaults to -1 (unlimited heat).
-- -1. Larger values represent *colder* humidity_min = num, -- Minimum humidity for the plant to spawn in. Like
-- temperatures, so this value is actually the -- the temperature map, this is a Perlin value where
-- upper end of the desired Perlin range. See -- lower numbers mean more humidity in the area.
-- the temperature map section at the bottom -- Defaults to +1 (0% humidity).
-- 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).
humidity_max = num, -- Maximum humidity for the plant to spawn at. humidity_max = num, -- Maximum humidity for the plant to spawn at.
-- Defaults to -1 (100% humidity). -- Defaults to -1 (100% humidity).
spawn_on_side = bool, -- Set this to true to spawn the node on one verticals_list = {table}, -- List of nodes that should be considered to be
-- side of the target node rather than the -- natural walls.
-- top. The code will search for an airspace alt_wallnode = "string", -- If specified, this node will be substituted in
-- to the side of the target, then spawn the -- place of the plant(s) defined by spawn_plants
-- plant at the first one found. The above -- above, if the spawn target has one or more adjacent
-- facedir and random_facedir parameters are -- walls. In such a case, the two above facedir
-- ignored in this case. If the above -- parameters will be ignored.
-- parameters for selecting generic wall nodes spawn_on_side = bool, -- Set this to true to immediately spawn the node on
-- are provided, this option is ignored. -- one side of the target node rather than the top.
-- Important note: the facedir values assigned -- The code will search for an airspace to the side of
-- by this option only make sense with -- the target, then spawn the plant at the first one
-- wallmounted nodes (nodes which don't use -- found. The above facedir and random_facedir
-- facedir won't be affected). -- 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 spawn_on_bottom = bool, -- If set to true, spawn the object below the
-- target node instead of above it. The above -- target node instead of above it. The above
-- spawn_on_side variable takes precedence -- spawn_on_side variable takes precedence over this
-- over this one if both happen to be true. -- one if both happen to be true. When using this
-- When using this option with the random -- option with the random facedir function above, the
-- facedir function above, the values given to -- values given to the facedir parameter are for
-- the facedir parameter are for regular -- regular nodes, not wallmounted.
-- nodes, not wallmounted. spawn_replace_node = bool, -- If set to true, the target node itself is
spawn_replace_node = bool, -- If set to true, the target node itself -- replaced by the spawned object. Overrides the
-- is replaced by the spawned object. -- spawn_on_bottom and spawn_on_side settings.
-- 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 [*] spawn_plants must be either a table or a string. If it's a table, the
@ -259,78 +240,69 @@ biome = {
---- conditions the objects are spawned. ---- conditions the objects are spawned.
below_nodes = {table}, -- List of nodes that must be below the target below_nodes = {table}, -- List of nodes that must be below the target
-- node. Useful in snow biomes to keep -- node. Useful in snow biomes to keep objects from
-- objects from spawning in snow that's on the -- spawning in snow that's on the wrong surface for
-- wrong surface for that object. -- that object.
avoid_nodes = {table}, -- List of nodes to avoid when spawning. avoid_nodes = {table}, -- List of nodes to avoid when spawning. Groups are
-- Groups are not supported here. -- not supported here.
avoid_radius = num, -- how much distance to leave between the avoid_radius = num, -- How much distance to leave between the object to be
-- object to be added and the objects to be -- added and the objects to be avoided. If this or
-- avoided. If this or the avoid_nodes value -- the avoid_nodes value is nil/omitted, this check is
-- is nil or omitted, this check is skipped. -- skipped. Avoid using excessively large radii.
-- Avoid using excessively large radii or you rarity = num, -- How rare should this object be in its biome? Larger
-- will slow down the map generator. -- values make objects more rare, via:
rarity = num, -- how rare should this object be in its -- math.random(1,100) > this
-- biome? Larger values make objects more max_count = num, -- The absolute maximum number of your object that
-- rare, via: math.random(1,100) > this -- should be allowed to spawn in a 5x5x5 mapblock area
max_count = num, -- The absolute maximum number of your object -- (80x80x80 nodes). Defaults to 5, but be sure you
-- that should be allowed to spawn in a 5x5x5 -- set this to some reasonable value depending on your
-- mapblock area (80x80x80 nodes). Defaults -- object and its size if 5 is insufficient.
-- to 5, but be sure you set this to some seed_diff = num, -- Perlin seed-diff value. Defaults to 0, which
-- reasonable value depending on your object -- causes the function to inherit the global value of
-- and its size if 5 is insufficient. -- 329.
seed_diff = num, -- perlin seed-diff value. Defaults to 0, neighbors = {table}, -- What ground nodes must be right next to and at the
-- which causes the function to inherit the -- same elevation as the node to be spawned on.
-- global value of 329. ncount = num, -- At least this many of the above nodes must be next
neighbors = {table}, -- What ground nodes must be right next to and -- to the node to spawn on. Any value greater than 8
-- at the same elevation as the node to be -- will probably cause the code to never spawn
-- spawned on. -- anything. Defaults to 0.
ncount = num, -- at least this many of the above nodes must depth = num, -- How deep/thick of a layer the spawned-on node must
-- be next to the node to spawn on. Any value -- be. Typically used for water.
-- greater than 8 will probably cause the code min_elevation = num, -- Minimum elevation in meters/nodes. Defaults to
-- to never spawn anything. Defaults to 0. -- -31000 (unlimited).
depth = num, -- how deep/thick of a layer the spawned-on max_elevation = num, -- Max elevation. Defaults to +31000 (unlimited).
-- node must be. Typically used for water. near_nodes = {table}, -- what nodes must be in the general vicinity of the
min_elevation = num, -- minimum elevation in meters/nodes. -- object being spawned.
-- Defaults to -31000 (unlimited). near_nodes_size = num, -- how wide of a search area to look for the nodes
max_elevation = num, -- maximum elevation. Defaults to +31000 -- in that list.
-- (unlimited). near_nodes_vertical = num, -- How high/low of an area to search from the
near_nodes = {table}, -- what nodes must be in the general vicinity -- target node.
-- of the object being spawned. near_nodes_count = num, -- at least this many of those nodes must be in
near_nodes_size = num, -- how wide of a search area to look for -- the area.
-- the nodes in that list. plantlife_limit = num, -- The value compared against the generic "plants
near_nodes_vertical = num, -- How high/low of an area to search from -- can grow here" Perlin noise layer. Smaller numbers
-- the target node. -- result in more abundant plants. Range of -1 to +1,
near_nodes_count = num, -- at least this many of those nodes must be -- with values in the range of about 0 to 0.5 being
-- in the area. -- most useful. Defaults to 0.1.
plantlife_limit = num, -- The value compared against the generic temp_min = num, -- Coldest allowable temperature for a plant to spawn
-- "plants can grow here" Perlin noise layer. -- (that is, the largest Perlin value).
-- Smaller numbers result in more abundant temp_max = num, -- warmest allowable temperature to spawn a plant
-- plants. Range of -1 to +1, with values in -- (lowest Perlin value).
-- the range of about 0 to 0.5 being most verticals_list = {table}, -- Same as with the spawn_on_surfaces function.
-- useful. Defaults to 0.1. check_air = bool, -- Flag to tell the mapgen code to check for air above
temp_min = num, -- coldest allowable temperature for a plant -- the spawn target. Defaults to true if not
-- to spawn (that is, the highest Perlin -- explicitly set to false. Set this to false VERY
-- temperature map value). -- SPARINGLY, as it will slow the map generator down.
temp_max = num, -- warmest allowable temperature to spawn a delete_above = bool, -- Flag to tell the mapgen code to delete the two
-- plant (lowest Perlin temperature value). -- nodes directly above the spawn target just before
verticals_list = {table}, -- Same as with the spawn_on_surfaces -- adding the plant or tree. Useful when generating
-- function. -- in snow biomes. Defaults to false.
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.
delete_above_surround = bool, -- Flag to tell the mapgen code to also delete_above_surround = bool, -- Flag to tell the mapgen code to also
-- delete the four nodes surrounding the above -- delete the five nodes surrounding the above space,
-- space, and the four nodes above those, -- and the five nodes above those, resulting in a two-
-- resulting in a two-node-deep cross-shaped -- node-deep cross-shaped empty region above/around
-- empty region above the spawn target. -- the spawn target. Useful when adding trees to snow
-- Useful when adding trees to snow biomes. -- biomes. Defaults to false.
-- Defaults to false.
spawn_replace_node = bool, -- same as with the ABM spawner. spawn_replace_node = bool, -- same as with the ABM spawner.
random_facedir = {table}, -- same as with the ABM spawner. random_facedir = {table}, -- same as with the ABM spawner.
} }
@ -371,59 +343,51 @@ a biome definition table as the only parameter. These are defined like so:
options = { options = {
grow_plant = "string", -- Name of the node to be grown into something grow_plant = "string", -- Name of the node to be grown into something
-- else. This value is passed to the ABM as -- else. This value is passed to the ABM as the
-- the "nodenames" parameter, so it is the -- "nodenames" parameter, so it is the plants
-- plants themselves that are the ABM trigger, -- themselves that are the ABM trigger, rather than
-- rather than the ground they spawned on. A -- the ground they spawned on. A plant will only grow
-- plant will only grow if the node above it -- if the node above it is air. Can also be a table,
-- is air. Can also be a table, but note that -- but note that all nodes referenced therein will be
-- all nodes referenced therein will be grown -- grown into the same object.
-- into the same object. grow_delay = num, -- Passed as the ABM "interval" parameter, as with
grow_delay = num, -- Passed as the ABM "interval" parameter, as -- spawning.
-- with spawning.
grow_chance = num, -- Passed as the ABM "chance" parameter. grow_chance = num, -- Passed as the ABM "chance" parameter.
grow_result = "string", -- Name of the node into which the grow_plant grow_result = "string", -- Name of the node into which the grow_plant
-- node(s) should transform when the ABM -- node(s) should transform when the ABM executes.
-- executes.
---- Everything from here down is optional. ---- Everything from here down is optional.
dry_early_node = "string", -- This value is ignored except for jungle dry_early_node = "string", -- This value is ignored except for jungle
-- grass (a corner case needed by that mod), -- grass (a corner case needed by that mod), where it
-- where it indicates which node the grass -- indicates which node the grass must be on in order
-- must be on in order for it to turn from -- for it to turn from the short size to
-- the short size to "default:dry_shrub" -- "default:dry_shrub" instead of the medium size.
-- instead of the medium size. grow_nodes = {table}, -- One of these nodes must be under the plant in
grow_nodes = {table}, -- One of these nodes must be under the plant -- order for it to grow at all. Normally this should
-- in order for it to grow at all. Normally -- be the same as the list of surfaces passed to the
-- this should be the same as the list of -- spawning ABM as the "nodenames" parameter. This is
-- surfaces passed to the spawning ABM as the -- so that the plant can be manually placed on
-- "nodenames" parameter. This is so that the -- something like a flower pot or something without it
-- plant can be manually placed on something -- necessarily growing and perhaps dieing. Defaults
-- like a flower pot or something without it -- to "default:dirt_with_grass".
-- growing and eventually dieing. Defaults to
-- "default:dirt_with_grass".
facedir = num, -- Same as with spawning a plant. facedir = num, -- Same as with spawning a plant.
need_wall = bool, -- Set this to true if you the plant needs to need_wall = bool, -- Set this to true if you the plant needs to grow
-- grow against a wall. Defaults to false. -- against a wall. Defaults to false.
verticals_list = {table}, -- List of nodes that should be considered verticals_list = {table}, -- same as with spawning a plant.
-- to be wall surfaces when growing the plant choose_random_wall = bool, -- same as with spawning a plant.
-- vertically. If not provided, the walls
-- check is skipped.
grow_vertically = bool, -- Set this to true if the plant needs to grow grow_vertically = bool, -- Set this to true if the plant needs to grow
-- vertically, as in climbing poison ivy. -- vertically, as in climbing poison ivy. Defaults to
-- Defaults to false. -- false.
height_limit = num, -- Set this to limit how tall the desired node height_limit = num, -- Set this to limit how tall the desired node can
-- can grow. The mod will search straight -- grow. The mod will search straight down from the
-- down from the position being spawned at to -- position being spawned at to find a ground node,
-- find a ground node, set via the parameter -- set via the field below. Defaults to 5 nodes.
-- below. Defaults to 5 nodes. ground_nodes = {table}, -- What nodes should be treated as "the ground"
ground_nodes = {table}, -- What nodes should be treated as "the -- below a vertically-growing plant. Usually this
-- ground" below a vertically-growing plant. -- should be the same as the grow_nodes table, but
-- Usually this should be the same as the -- might also include, for example, water or some
-- grow_nodes table, but might also include, -- other surrounding material. Defaults to
-- for example, water or some other
-- surrounding material. Defaults to
-- "default:dirt_with_grass". -- "default:dirt_with_grass".
grow_function = something, -- [*] see below. grow_function = something, -- [*] see below.
seed_diff = num, -- [*] 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 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 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 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. 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) 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, other mods to hook into plants_lib's tree-growing functions in general,
perhaps to execute something extra whenever a tree is spawned. perhaps to execute something extra whenever a tree is spawned.
plantslib:generate_tree(pos, treemodel) is called any time a plantslib:generate_tree(pos, treemodel) is called any time a tree is spawned
tree is spawned at map generation time. 'pos' is the position of the block on at map generation time. 'pos' is the position of the block on which the tree
which the tree is to be placed. 'treemodel' is the standard L-Systems tree is to be placed. 'treemodel' is the standard L-Systems tree definition table
definition table expected by the spawn_tree() function. Refer to the 'trunk' expected by the spawn_tree() function. Refer to the 'trunk' field in that
field in that table to derive the name of the tree being spawned. table to derive the name of the tree being spawned.
plantslib:grow_tree(pos, treemodel) does the same sort of thing whenever a 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 tree is spawned within the abm-based growing code, for example when growing a

View File

@ -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.min_elevation
and pos.y <= biome.max_elevation and pos.y <= biome.max_elevation
then 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 biome.alt_wallnode and walldir then
if n_top.name == "air" then if n_top.name == "air" then
minetest.set_node(p_top, { name = biome.alt_wallnode, param2 = walldir }) 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 root_node = minetest.get_node({x=pos.x, y=pos.y-options.height_limit, z=pos.z})
local walldir = nil local walldir = nil
if options.need_wall and options.verticals_list then 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 end
if n_top.name == "air" and (not options.need_wall or (options.need_wall and walldir)) if n_top.name == "air" and (not options.need_wall or (options.need_wall and walldir))
then then
@ -612,12 +612,24 @@ end
-- function to decide if a node has a wall that's in verticals_list{} -- function to decide if a node has a wall that's in verticals_list{}
-- returns wall direction of valid node, or nil if invalid. -- 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) local verts = dump(verticals)
if randomflag then
local walltab = {}
if string.find(verts, minetest.get_node({ x=pos.x-1, y=pos.y, z=pos.z }).name) then walltab[#walltab + 1] = 3 end
if string.find(verts, minetest.get_node({ x=pos.x+1, y=pos.y, z=pos.z }).name) then walltab[#walltab + 1] = 2 end
if string.find(verts, minetest.get_node({ x=pos.x , y=pos.y, z=pos.z-1 }).name) then walltab[#walltab + 1] = 5 end
if string.find(verts, minetest.get_node({ x=pos.x , y=pos.y, z=pos.z+1 }).name) then walltab[#walltab + 1] = 4 end
if #walltab > 0 then return walltab[math.random(1, #walltab)] end
else
if string.find(verts, minetest.get_node({ x=pos.x-1, y=pos.y, z=pos.z }).name) then return 3 end if string.find(verts, minetest.get_node({ x=pos.x-1, y=pos.y, z=pos.z }).name) then return 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+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 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 string.find(verts, minetest.get_node({ x=pos.x , y=pos.y, z=pos.z+1 }).name) then return 4 end
end
return nil return nil
end end

View File

@ -29,7 +29,9 @@ for i in pairs(NoDe) do
buildable_to = true, buildable_to = true,
node_box = {type = "fixed", fixed = flat_stick}, node_box = {type = "fixed", fixed = flat_stick},
groups = { groups = {
dig_immediate=3, -- almost literally immediate, like just picking up choppy=2,
oddly_breakable_by_hand=2,
flammable=3,
attached_node=1, attached_node=1,
not_in_creative_inventory=iNV not_in_creative_inventory=iNV
}, },
@ -67,7 +69,7 @@ minetest.register_node("trunks:moss", {
walkable = false, walkable = false,
node_box = {type = "fixed", fixed = flat_moss}, node_box = {type = "fixed", fixed = flat_moss},
selection_box = {type = "fixed", fixed = flat_stick},--{type = "wallmounted"}, 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(), sounds = default.node_sound_leaves_defaults(),
}) })
@ -86,7 +88,7 @@ minetest.register_node("trunks:moss_fungus", {
walkable = false, walkable = false,
node_box = {type = "fixed", fixed = flat_moss}, node_box = {type = "fixed", fixed = flat_moss},
selection_box = {type = "fixed", fixed = flat_stick},--{type = "wallmounted"}, 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(), sounds = default.node_sound_leaves_defaults(),
}) })

View File

@ -0,0 +1,4 @@
License
=======
- Code WTFPL
- Texture CC

View File

@ -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.

View File

@ -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' )

View File

@ -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",
})

View File

@ -1,2 +1,3 @@
default default
plants_lib plants_lib
moretrees?

View File

@ -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

View File

@ -1,402 +1,14 @@
--[[TODO vines = {
ropebox rope break results in bottom rope dissapearing and bottom drop rope node to appear at the new bottom name = 'vines',
and rope does not drop anything!!!! recipes = {}
]]
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"
} }
-- Nodes dofile( minetest.get_modpath( vines.name ) .. "/functions.lua" )
minetest.register_node("vines:rope_block", { dofile( minetest.get_modpath( vines.name ) .. "/aliases.lua" )
description = "Rope", dofile( minetest.get_modpath( vines.name ) .. "/recipes.lua" )
sunlight_propagates = true, dofile( minetest.get_modpath( vines.name ) .. "/crafts.lua" )
paramtype = "light", dofile( minetest.get_modpath( vines.name ) .. "/nodes.lua" )
tile_images = { dofile( minetest.get_modpath( vines.name ) .. "/shear.lua" )
"default_wood.png^vines_rope.png", dofile( minetest.get_modpath( vines.name ) .. "/vines.lua" )
"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'},
}
})
print("[Vines] Loaded!") print("[Vines] Loaded!")

View File

@ -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
})

View File

@ -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

View File

@ -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'}
}

View File

@ -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}
}
},
})

Binary file not shown.

Before

Width:  |  Height:  |  Size: 233 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 196 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 225 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 223 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 497 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 481 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 201 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 B

View File

Before

Width:  |  Height:  |  Size: 201 B

After

Width:  |  Height:  |  Size: 201 B

View File

Before

Width:  |  Height:  |  Size: 194 B

After

Width:  |  Height:  |  Size: 194 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 233 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 247 B

View File

Before

Width:  |  Height:  |  Size: 225 B

After

Width:  |  Height:  |  Size: 225 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 187 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 364 B

View File

Before

Width:  |  Height:  |  Size: 187 B

After

Width:  |  Height:  |  Size: 187 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 196 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 226 B

View File

Before

Width:  |  Height:  |  Size: 196 B

After

Width:  |  Height:  |  Size: 196 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 190 B

View File

@ -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
})