Updated planflife modpack : bug fixes, less laggy, etc..
|
@ -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
|
|
||||||
else
|
|
||||||
if inv:room_for_item("main", name) then
|
|
||||||
inv:add_item("main", name)
|
|
||||||
end
|
|
||||||
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,
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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 = {
|
||||||
|
|
329
mods/plantlife_modpack/mushroom/models/plantlife_mushroom.obj
Normal 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
|
Before Width: | Height: | Size: 125 B |
BIN
mods/plantlife_modpack/mushroom/textures/mushroom_brown_3d.png
Normal file
After Width: | Height: | Size: 5.0 KiB |
BIN
mods/plantlife_modpack/mushroom/textures/mushroom_brown_inv.png
Normal file
After Width: | Height: | Size: 4.2 KiB |
Before Width: | Height: | Size: 123 B |
BIN
mods/plantlife_modpack/mushroom/textures/mushroom_red_3d.png
Normal file
After Width: | Height: | Size: 2.7 KiB |
BIN
mods/plantlife_modpack/mushroom/textures/mushroom_red_inv.png
Normal file
After Width: | Height: | Size: 5.2 KiB |
|
@ -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
|
||||||
|
|
|
@ -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
|
neighbors = {table}, -- List of neighboring nodes that need to be
|
||||||
-- 14.
|
-- immediately next to the node the plant is about to
|
||||||
neighbors = {table}, -- List of neighboring nodes that need to be
|
-- spawn on. Can also be a string with a single node
|
||||||
-- immediately next to the node the plant is
|
-- name. It is both passed to the ABM as the
|
||||||
-- about to spawn on. Can also be a string
|
-- "neighbors" parameter, and is used to manually
|
||||||
-- with a single node name. It is both passed
|
-- check the adjacent nodes. It only takes one of
|
||||||
-- to the ABM as the "neighbors" parameter,
|
-- these for the spawn routine to mark the target as
|
||||||
-- and is used to manually check the
|
-- spawnable. Defaults to nil (ignored).
|
||||||
-- adjacent nodes. It only takes one of these
|
ncount = num, -- There must be at least this many of the above
|
||||||
-- for the spawn routine to mark the target as
|
-- neighbors in the eight spaces immediately
|
||||||
-- spawnable. Defaults to nil (ignored).
|
-- surrounding the node the plant is about to spawn on
|
||||||
ncount = num, -- There must be at least this many of the
|
-- for it to happen. If not provided, this check is
|
||||||
-- above neighbors in the eight spaces
|
-- disabled.
|
||||||
-- immediately surrounding the node the plant
|
facedir = num, -- The value passed to the param2 variable when adding
|
||||||
-- is about to spawn on for it to happen. If
|
-- the node to the map. Defaults to 0. Be sure that
|
||||||
-- not provided, this check is disabled.
|
-- the value you use here (and the range thereof) is
|
||||||
facedir = num, -- The value passed to the param2 variable
|
-- appropriate for the type of node you're spawning.
|
||||||
-- when adding the node to the map. Defaults
|
random_facedir = {table}, -- If set, the table should contain two values.
|
||||||
-- to 0. Be sure that the value you use here
|
-- If they're both provided, the spawned plant will be
|
||||||
-- (and the range thereof) is appropriate for
|
-- given a random facedir value in the range specified
|
||||||
-- the type of node you're spawning.
|
-- by these two numbers. Overrides the facedir
|
||||||
random_facedir = {table}, -- If set, the table should contain two
|
-- parameter above, if it exists. Use {0,3} if you
|
||||||
-- values. If they're both provided, the
|
-- want the full range for wallmounted nodes, or {2,5}
|
||||||
-- spawned plant will be given a random
|
-- for most everything else, or any other pair of
|
||||||
-- facedir value in the range specified by
|
-- numbers appropriate for the node you want to spawn.
|
||||||
-- these two numbers. Overrides the facedir
|
depth_max = num, -- If the object spawns on top of a water source, the
|
||||||
-- parameter above, if it exists. Use {0,3}
|
-- water must be at most this deep. Defaults to 1.
|
||||||
-- if you want the full range for wallmounted
|
min_elevation = num, -- Surface must be at this altitude or higher to
|
||||||
-- nodes, or {2,5} for most everything else,
|
-- spawn at all. Defaults to -31000...
|
||||||
-- or any other pair of numbers in the 0 to 5
|
max_elevation = num, -- ...but must be no higher than this altitude.
|
||||||
-- range, as appropriate for the node you want
|
-- Defaults to +31000.
|
||||||
-- to spawn.
|
near_nodes = {table}, -- List of nodes that must be somewhere in the
|
||||||
verticals_list = {table}, -- List of nodes that should be considered
|
-- vicinity in order for the plant to spawn. Can also
|
||||||
-- to be natural walls.
|
-- be a string with a single node name. If not
|
||||||
alt_wallnode = "string", -- If specified, this node will be
|
-- provided, this check is disabled.
|
||||||
-- 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.
|
|
||||||
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.
|
||||||
-- only the space above the target is checked.
|
air_count = num, -- How many of the surrounding nodes need to be air
|
||||||
-- This does not check for air at the sides or
|
-- for the above check to return true. If omitted,
|
||||||
-- below the target.
|
-- only the space above the target is checked.
|
||||||
air_count = num, -- How many of the surrounding nodes need to
|
plantlife_limit = num, -- The value compared against the generic "plants
|
||||||
-- be air for the above check to return true.
|
-- can grow here" Perlin noise layer. Smaller numbers
|
||||||
-- If omitted, only the space above the target
|
-- result in more abundant plants. Range of -1 to +1,
|
||||||
-- is checked.
|
-- with values in the range of about 0 to 0.5 being
|
||||||
plantlife_limit = num, -- The value compared against the generic
|
-- most useful. Defaults to 0.1.
|
||||||
-- "plants can grow here" Perlin noise layer.
|
temp_min = num, -- Minimum temperature needed for the desired object
|
||||||
-- Smaller numbers result in more abundant
|
-- to spawn. This is a 2d Perlin value, which has an
|
||||||
-- plants. Range of -1 to +1, with values in
|
-- inverted range of +1 to -1. Larger values
|
||||||
-- the range of about 0 to 0.5 being most
|
-- represent *colder* temperatures, so this value is
|
||||||
-- useful. Defaults to 0.1.
|
-- actually the upper end of the desired Perlin range.
|
||||||
temp_min = num, -- Minimum temperature needed for the desired
|
-- See the temperature map section at the bottom of
|
||||||
-- object to spawn. This is a 2d Perlin
|
-- this document for details on how these values work.
|
||||||
-- value, which has an inverted range of +1 to
|
-- Defaults to +1 (unlimited coldness).
|
||||||
-- -1. Larger values represent *colder*
|
temp_max = num, -- Maximum temperature/lower end of the Perlin range.
|
||||||
-- temperatures, so this value is actually the
|
-- Defaults to -1 (unlimited heat).
|
||||||
-- upper end of the desired Perlin range. See
|
humidity_min = num, -- Minimum humidity for the plant to spawn in. Like
|
||||||
-- the temperature map section at the bottom
|
-- the temperature map, this is a Perlin value where
|
||||||
-- of this document for details on how these
|
-- lower numbers mean more humidity in the area.
|
||||||
-- values work. Defaults to +1 (unlimited
|
-- Defaults to +1 (0% humidity).
|
||||||
-- 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
|
||||||
|
@ -250,87 +231,78 @@ here than are available in the ABM-based spawner, as some stuff doesn't make
|
||||||
sense at map-generation time.
|
sense at map-generation time.
|
||||||
|
|
||||||
biome = {
|
biome = {
|
||||||
surface = something, -- What node(s). May be a string such as
|
surface = something, -- What node(s). May be a string such as
|
||||||
-- "default:dirt_with_grass" or a table with
|
-- "default:dirt_with_grass" or a table with
|
||||||
-- multiple such entries.
|
-- multiple such entries.
|
||||||
|
|
||||||
---- Everything else is optional, but you'll definitely want to use
|
---- Everything else is optional, but you'll definitely want to use
|
||||||
---- some of these other fields to limit where and under what
|
---- some of these other fields to limit where and under what
|
||||||
---- 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.
|
||||||
}
|
}
|
||||||
|
@ -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:
|
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
|
-- "default:dirt_with_grass".
|
||||||
-- surrounding material. Defaults to
|
|
||||||
-- "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
|
|
@ -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 string.find(verts, minetest.get_node({ x=pos.x-1, y=pos.y, z=pos.z }).name) then return 3 end
|
if randomflag then
|
||||||
if string.find(verts, minetest.get_node({ x=pos.x+1, y=pos.y, z=pos.z }).name) then return 2 end
|
local walltab = {}
|
||||||
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-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
|
return nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -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(),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
4
mods/plantlife_modpack/vines/LICENSE.md
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
License
|
||||||
|
=======
|
||||||
|
- Code WTFPL
|
||||||
|
- Texture CC
|
56
mods/plantlife_modpack/vines/README.md
Normal 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.
|
11
mods/plantlife_modpack/vines/aliases.lua
Normal 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' )
|
14
mods/plantlife_modpack/vines/crafts.lua
Normal 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",
|
||||||
|
})
|
|
@ -1,2 +1,3 @@
|
||||||
default
|
default
|
||||||
plants_lib
|
plants_lib
|
||||||
|
moretrees?
|
||||||
|
|
132
mods/plantlife_modpack/vines/functions.lua
Normal 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
|
|
@ -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!")
|
||||||
|
|
83
mods/plantlife_modpack/vines/nodes.lua
Normal 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
|
||||||
|
})
|
|
@ -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
|
|
12
mods/plantlife_modpack/vines/recipes.lua
Normal 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'}
|
||||||
|
}
|
||||||
|
|
15
mods/plantlife_modpack/vines/shear.lua
Normal 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}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
})
|
Before Width: | Height: | Size: 233 B |
Before Width: | Height: | Size: 196 B |
Before Width: | Height: | Size: 225 B |
Before Width: | Height: | Size: 223 B |
BIN
mods/plantlife_modpack/vines/textures/vines_jungle_end.png
Normal file
After Width: | Height: | Size: 497 B |
BIN
mods/plantlife_modpack/vines/textures/vines_jungle_middle.png
Normal file
After Width: | Height: | Size: 481 B |
Before Width: | Height: | Size: 201 B |
BIN
mods/plantlife_modpack/vines/textures/vines_root_end.png
Normal file
After Width: | Height: | Size: 215 B |
Before Width: | Height: | Size: 201 B After Width: | Height: | Size: 201 B |
Before Width: | Height: | Size: 194 B After Width: | Height: | Size: 194 B |
Before Width: | Height: | Size: 233 B |
BIN
mods/plantlife_modpack/vines/textures/vines_side_end.png
Normal file
After Width: | Height: | Size: 247 B |
Before Width: | Height: | Size: 225 B After Width: | Height: | Size: 225 B |
Before Width: | Height: | Size: 187 B |
BIN
mods/plantlife_modpack/vines/textures/vines_vine_end.png
Normal file
After Width: | Height: | Size: 364 B |
Before Width: | Height: | Size: 187 B After Width: | Height: | Size: 187 B |
Before Width: | Height: | Size: 196 B |
BIN
mods/plantlife_modpack/vines/textures/vines_willow_end.png
Normal file
After Width: | Height: | Size: 226 B |
Before Width: | Height: | Size: 196 B After Width: | Height: | Size: 196 B |
Before Width: | Height: | Size: 190 B |
97
mods/plantlife_modpack/vines/vines.lua
Normal 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
|
||||||
|
})
|