Updated planflife modpack : bug fixes, less laggy, etc..
@@ -31,6 +31,27 @@ end
 | 
			
		||||
-----------------------------------------------------------------------------------------------
 | 
			
		||||
-- Sickle
 | 
			
		||||
-----------------------------------------------------------------------------------------------
 | 
			
		||||
local function sickle_can_break(pos, deff, player)
 | 
			
		||||
	local def = ItemStack({name=deff.name}):get_definition()
 | 
			
		||||
 | 
			
		||||
	if not def.diggable or (def.can_dig and not def.can_dig(pos,player)) then
 | 
			
		||||
		minetest.log("info", player:get_player_name() .. " tried to sickle "
 | 
			
		||||
		.. def.name .. " which is not diggable "
 | 
			
		||||
		.. minetest.pos_to_string(pos))
 | 
			
		||||
		return
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	if minetest.is_protected(pos, player:get_player_name()) then
 | 
			
		||||
		minetest.log("action", player:get_player_name()
 | 
			
		||||
			.. " tried to sickle " .. def.name
 | 
			
		||||
			.. " at protected position "
 | 
			
		||||
			.. minetest.pos_to_string(pos))
 | 
			
		||||
		minetest.record_protection_violation(pos, player:get_player_name())
 | 
			
		||||
		return
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	return true
 | 
			
		||||
end
 | 
			
		||||
-- turns nodes with group flora=1 & flower=0 into cut grass
 | 
			
		||||
local function sickle_on_use(itemstack, user, pointed_thing, uses)
 | 
			
		||||
	local pt = pointed_thing
 | 
			
		||||
@@ -41,11 +62,11 @@ local function sickle_on_use(itemstack, user, pointed_thing, uses)
 | 
			
		||||
	if pt.type ~= "node" then
 | 
			
		||||
		return
 | 
			
		||||
	end
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	local under = minetest.get_node(pt.under)
 | 
			
		||||
	local p = {x=pt.under.x, y=pt.under.y+1, z=pt.under.z}
 | 
			
		||||
	local above = minetest.get_node(p)
 | 
			
		||||
	
 | 
			
		||||
	local above_pos = {x=pt.under.x, y=pt.under.y+1, z=pt.under.z}
 | 
			
		||||
	local above = minetest.get_node(above_pos)
 | 
			
		||||
 | 
			
		||||
	-- return if any of the nodes is not registered
 | 
			
		||||
	if not minetest.registered_nodes[under.name] then
 | 
			
		||||
		return
 | 
			
		||||
@@ -53,30 +74,20 @@ local function sickle_on_use(itemstack, user, pointed_thing, uses)
 | 
			
		||||
	if not minetest.registered_nodes[above.name] then
 | 
			
		||||
		return
 | 
			
		||||
	end
 | 
			
		||||
	
 | 
			
		||||
	local node = minetest.get_node(pt.under)
 | 
			
		||||
 | 
			
		||||
	if not sickle_can_break(pt.under, under, user) then
 | 
			
		||||
		return
 | 
			
		||||
	end
 | 
			
		||||
	-- check if something that can be cut using fine tools
 | 
			
		||||
	if minetest.get_item_group(under.name, "snappy") > 0 then
 | 
			
		||||
		-- check if flora but no flower
 | 
			
		||||
		if minetest.get_item_group(under.name, "flora") == 1 and minetest.get_item_group(under.name, "flower") == 0 then
 | 
			
		||||
			-- turn the node into cut grass, wear out item and play sound
 | 
			
		||||
			minetest.set_node(pt.under, {name="dryplants:grass"})
 | 
			
		||||
		else -- otherwise get the drop
 | 
			
		||||
			local inv = user:get_inventory()
 | 
			
		||||
			local name = minetest. get_node(pt.under).name
 | 
			
		||||
			
 | 
			
		||||
			local the_drop = minetest.registered_nodes[name].drop
 | 
			
		||||
			
 | 
			
		||||
			if the_drop ~= nil then
 | 
			
		||||
				if inv:room_for_item("main", the_drop) then
 | 
			
		||||
					inv:add_item("main", the_drop)
 | 
			
		||||
				end
 | 
			
		||||
			else
 | 
			
		||||
				if inv:room_for_item("main", name) then
 | 
			
		||||
					inv:add_item("main", name)
 | 
			
		||||
				end
 | 
			
		||||
		else -- otherwise dig the node
 | 
			
		||||
			if not minetest.node_dig(pt.under, under, user) then
 | 
			
		||||
				return
 | 
			
		||||
			end
 | 
			
		||||
			minetest.remove_node(pt.under)
 | 
			
		||||
		end
 | 
			
		||||
		minetest.sound_play("default_dig_crumbly", {
 | 
			
		||||
			pos = pt.under,
 | 
			
		||||
@@ -84,9 +95,12 @@ local function sickle_on_use(itemstack, user, pointed_thing, uses)
 | 
			
		||||
		})
 | 
			
		||||
		itemstack:add_wear(65535/(uses-1))
 | 
			
		||||
		return itemstack
 | 
			
		||||
	elseif string.find(node.name, "default:dirt_with_grass") then
 | 
			
		||||
	elseif string.find(under.name, "default:dirt_with_grass") then
 | 
			
		||||
		if minetest.is_protected(above_pos, user:get_player_name()) or above.name ~= "air" then
 | 
			
		||||
			return
 | 
			
		||||
		end
 | 
			
		||||
		minetest.set_node(pt.under, {name="dryplants:grass_short"})
 | 
			
		||||
		minetest.set_node(pt.above, {name="dryplants:grass"})
 | 
			
		||||
		minetest.set_node(above_pos, {name="dryplants:grass"})
 | 
			
		||||
		minetest.sound_play("default_dig_crumbly", {
 | 
			
		||||
			pos = pt.under,
 | 
			
		||||
			gain = 0.5,
 | 
			
		||||
 
 | 
			
		||||
@@ -90,7 +90,7 @@ for i in ipairs(lilies_list) do
 | 
			
		||||
			if place_pos and not minetest.is_protected(place_pos, placer:get_player_name()) then
 | 
			
		||||
 | 
			
		||||
			local nodename = "default:cobble" -- if this block appears, something went....wrong :-)
 | 
			
		||||
					if place_pos == nil  then return itemstack end -- pour éviter crash avec nénuphare
 | 
			
		||||
 | 
			
		||||
				if not keys["sneak"] then
 | 
			
		||||
					local node = minetest.get_node(pt.under)
 | 
			
		||||
					local waterlily = math.random(1,8)
 | 
			
		||||
 
 | 
			
		||||
@@ -8,11 +8,11 @@ mushroom = {}
 | 
			
		||||
 | 
			
		||||
minetest.register_node("mushroom:brown",{
 | 
			
		||||
	description = "Brown Mushroom",
 | 
			
		||||
	drawtype = "plantlike",
 | 
			
		||||
	drawtype = "mesh",
 | 
			
		||||
	mesh = "plantlife_mushroom.obj",
 | 
			
		||||
	tiles = {"mushroom_brown_3d.png"},
 | 
			
		||||
	sunlight_propagates = true,
 | 
			
		||||
	tiles = {"mushroom_brown.png"},
 | 
			
		||||
	inventory_image = "mushroom_brown.png",
 | 
			
		||||
	wield_image = "mushroom_brown.png",
 | 
			
		||||
	inventory_image = "mushroom_brown_inv.png",
 | 
			
		||||
	groups = {oddly_breakable_by_hand=3,attached_node=1},
 | 
			
		||||
	paramtype = "light",
 | 
			
		||||
	walkable = false,
 | 
			
		||||
@@ -26,11 +26,11 @@ minetest.register_node("mushroom:brown",{
 | 
			
		||||
 | 
			
		||||
minetest.register_node("mushroom:red",{
 | 
			
		||||
	description = "Red Mushroom",
 | 
			
		||||
	drawtype = "plantlike",
 | 
			
		||||
	drawtype = "mesh",
 | 
			
		||||
	mesh = "plantlife_mushroom.obj",
 | 
			
		||||
	tiles = {"mushroom_red_3d.png"},
 | 
			
		||||
	sunlight_propagates = true,
 | 
			
		||||
	tiles = {"mushroom_red.png"},
 | 
			
		||||
	inventory_image = "mushroom_red.png",
 | 
			
		||||
	wield_image = "mushroom_red.png",
 | 
			
		||||
	inventory_image = "mushroom_red_inv.png",
 | 
			
		||||
	groups = {oddly_breakable_by_hand=3,attached_node=1},
 | 
			
		||||
	paramtype = "light",
 | 
			
		||||
	walkable = false,
 | 
			
		||||
@@ -78,12 +78,12 @@ minetest.register_node("mushroom:spore_red",{
 | 
			
		||||
 | 
			
		||||
minetest.register_node("mushroom:brown_natural",{
 | 
			
		||||
	description = "Brown Mushroom (Naturally Spawned)",
 | 
			
		||||
	drawtype = "plantlike",
 | 
			
		||||
	drawtype = "mesh",
 | 
			
		||||
	mesh = "plantlife_mushroom.obj",
 | 
			
		||||
	tiles = {"mushroom_brown_3d.png"},
 | 
			
		||||
	sunlight_propagates = true,
 | 
			
		||||
	tiles = {"mushroom_brown.png"},
 | 
			
		||||
	inventory_image = "mushroom_brown.png",
 | 
			
		||||
	wield_image = "mushroom_brown.png",
 | 
			
		||||
	groups = {oddly_breakable_by_hand=3},
 | 
			
		||||
	inventory_image = "mushroom_brown_inv.png",
 | 
			
		||||
	groups = {oddly_breakable_by_hand=3, not_in_creative_inventory=1},
 | 
			
		||||
	paramtype = "light",
 | 
			
		||||
	walkable = false,
 | 
			
		||||
	selection_box = {
 | 
			
		||||
@@ -95,12 +95,12 @@ minetest.register_node("mushroom:brown_natural",{
 | 
			
		||||
 | 
			
		||||
minetest.register_node("mushroom:red_natural",{
 | 
			
		||||
	description = "Red Mushroom (Naturally Spawned)",
 | 
			
		||||
	drawtype = "plantlike",
 | 
			
		||||
	drawtype = "mesh",
 | 
			
		||||
	mesh = "plantlife_mushroom.obj",
 | 
			
		||||
	tiles = {"mushroom_red_3d.png"},
 | 
			
		||||
	sunlight_propagates = true,
 | 
			
		||||
	tiles = {"mushroom_red.png"},
 | 
			
		||||
	inventory_image = "mushroom_red.png",
 | 
			
		||||
	wield_image = "mushroom_red.png",
 | 
			
		||||
	groups = {oddly_breakable_by_hand=3},
 | 
			
		||||
	inventory_image = "mushroom_red_inv.png",
 | 
			
		||||
	groups = {oddly_breakable_by_hand=3, not_in_creative_inventory=1},
 | 
			
		||||
	paramtype = "light",
 | 
			
		||||
	walkable = false,
 | 
			
		||||
	selection_box = {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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)
 | 
			
		||||
    if pos ~= nil then
 | 
			
		||||
        if not minetest.get_node_light(pos, nil) or not nature.minimum_growth_light then return end
 | 
			
		||||
	-- FIXME: WARN VANESSAE, OR MAYBE IT IS A MISSING CONFIGURATION'S PARAMETER
 | 
			
		||||
 | 
			
		||||
	local light_enough = minetest.get_node_light(pos, nil)
 | 
			
		||||
        local light_enough = (minetest.get_node_light(pos, nil) or 0)
 | 
			
		||||
                >= nature.minimum_growth_light 
 | 
			
		||||
 | 
			
		||||
        if is_not_young(pos) and light_enough then
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
This document describes the Plantlife mod API.
 | 
			
		||||
 | 
			
		||||
Last revision: 2014-05-24
 | 
			
		||||
Last revision: 2015-02-16
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
=========
 | 
			
		||||
@@ -64,9 +64,9 @@ biome = {
 | 
			
		||||
	spawn_delay = number,	-- same as sdelay, above.
 | 
			
		||||
	spawn_chance = number,	-- same as schance, above.
 | 
			
		||||
	spawn_surfaces = {table}, -- List of node names on which the plants
 | 
			
		||||
				-- should be spawned.  As with the single-
 | 
			
		||||
				-- node "ssurface" option in the legacy API,
 | 
			
		||||
				-- you should not put stone, air, etc. here.
 | 
			
		||||
				-- should be spawned.  As with the single-node "ssurface"
 | 
			
		||||
				-- option in the legacy API, you should not put stone, air,
 | 
			
		||||
				-- etc. here.
 | 
			
		||||
 | 
			
		||||
	---- From here down are a number of optional parameters.  You will
 | 
			
		||||
	---- most likely want to use at least some of these to limit how and
 | 
			
		||||
@@ -74,151 +74,132 @@ biome = {
 | 
			
		||||
 | 
			
		||||
	avoid_nodes = {table},	-- same meaning as savoid, above
 | 
			
		||||
	avoid_radius = num,	-- same as sradius
 | 
			
		||||
	seed_diff = num,	-- The Perlin seed difference value passed to
 | 
			
		||||
				-- the minetest.get_perlin() function.
 | 
			
		||||
				-- Used along with the global Perlin controls
 | 
			
		||||
				-- below to create the "biome" in which the
 | 
			
		||||
				-- plants will spawn.  Defaults to 0 if not
 | 
			
		||||
				-- provided.
 | 
			
		||||
	light_min = num,	-- Minimum amount of light necessary to make a
 | 
			
		||||
				-- plant spawn.  Defaults to 0.
 | 
			
		||||
	light_max = num,	-- Maximum amount of light needed to spawn. 
 | 
			
		||||
				-- Defaults to the engine's MAX_LIGHT value of
 | 
			
		||||
				-- 14.
 | 
			
		||||
	neighbors = {table},	-- List of neighboring nodes that need to be
 | 
			
		||||
				-- immediately next to the node the plant is
 | 
			
		||||
				-- about to spawn on. Can also be a string
 | 
			
		||||
				-- with a single node name.  It is both passed
 | 
			
		||||
				-- to the ABM as the "neighbors" parameter,
 | 
			
		||||
				-- and is used to manually check the 
 | 
			
		||||
				-- adjacent nodes.  It only takes one of these
 | 
			
		||||
				-- for the spawn routine to mark the target as
 | 
			
		||||
				-- spawnable.  Defaults to nil (ignored).
 | 
			
		||||
	ncount = num,		-- There must be at least this many of the
 | 
			
		||||
				-- above neighbors in the eight spaces
 | 
			
		||||
				-- immediately surrounding the node the plant
 | 
			
		||||
				-- is about to spawn on for it to happen.  If
 | 
			
		||||
				-- not provided, this check is disabled.
 | 
			
		||||
	facedir = num,		-- The value passed to the param2 variable
 | 
			
		||||
				-- when adding the node to the map.  Defaults
 | 
			
		||||
				-- to 0.  Be sure that the value you use here
 | 
			
		||||
				-- (and the range thereof) is appropriate for
 | 
			
		||||
				-- the type of node you're spawning.
 | 
			
		||||
	random_facedir = {table}, -- If set, the table should contain two
 | 
			
		||||
				-- values. If they're both provided, the
 | 
			
		||||
				-- spawned plant will be given a random
 | 
			
		||||
				-- facedir value in the range specified by
 | 
			
		||||
				-- these two numbers.  Overrides the facedir
 | 
			
		||||
				-- parameter above, if it exists.  Use {0,3}
 | 
			
		||||
				-- if you want the full range for wallmounted
 | 
			
		||||
				-- nodes, or {2,5} for most everything else,
 | 
			
		||||
				-- or any other pair of numbers in the 0 to 5 
 | 
			
		||||
				-- range, as appropriate for the node you want
 | 
			
		||||
				-- to spawn.
 | 
			
		||||
	verticals_list = {table}, -- List of nodes that should be considered
 | 
			
		||||
				-- to be natural walls.
 | 
			
		||||
	alt_wallnode = "string", -- If specified, this node will be 
 | 
			
		||||
				-- substituted in place of the plant(s)
 | 
			
		||||
				-- defined by spawn_plants above, if the spawn
 | 
			
		||||
				-- target has one or more adjacent walls.  In
 | 
			
		||||
				-- such a case, the two above facedir
 | 
			
		||||
				-- parameters will be ignored.
 | 
			
		||||
	depth_max = num,	-- If the object spawns on top of a water
 | 
			
		||||
				-- source, the water must be at most this
 | 
			
		||||
				-- deep.  Defaults to 1 node.
 | 
			
		||||
	min_elevation = num,	-- Surface must be at this altitude or higher
 | 
			
		||||
				-- to spawn at all.  Defaults to -31000...
 | 
			
		||||
	max_elevation = num,	-- ...but must be no higher than this
 | 
			
		||||
				-- altitude.  Defaults to +31000.
 | 
			
		||||
	near_nodes = {table},	-- List of nodes that must be somewhere in the
 | 
			
		||||
				-- vicinity in order for the plant to spawn.
 | 
			
		||||
				-- Can also be a string with a single node
 | 
			
		||||
				-- name.  If not provided, this check is
 | 
			
		||||
				-- disabled.
 | 
			
		||||
	seed_diff = num,	-- The Perlin seed difference value passed to the
 | 
			
		||||
						-- minetest.get_perlin() function.  Used along with
 | 
			
		||||
						-- the global Perlin controls below to create the
 | 
			
		||||
						-- "biome" in which the plants will spawn.  Defaults
 | 
			
		||||
						-- to 0 if not provided.
 | 
			
		||||
	light_min = num,	-- Minimum amount of light necessary to make a plant
 | 
			
		||||
						-- spawn.  Defaults to 0.
 | 
			
		||||
	light_max = num,	-- Maximum amount of light needed to spawn.  Defaults
 | 
			
		||||
						-- to the engine's MAX_LIGHT value of 14.
 | 
			
		||||
	neighbors = {table}, -- List of neighboring nodes that need to be
 | 
			
		||||
						-- immediately next to the node the plant is about to
 | 
			
		||||
						-- spawn on. Can also be a string with a single node
 | 
			
		||||
						-- name.  It is both passed to the ABM as the
 | 
			
		||||
						-- "neighbors" parameter, and is used to manually
 | 
			
		||||
						-- check the adjacent nodes.  It only takes one of
 | 
			
		||||
						-- these for the spawn routine to mark the target as
 | 
			
		||||
						-- spawnable.  Defaults to nil (ignored).
 | 
			
		||||
	ncount = num,		-- There must be at least this many of the above
 | 
			
		||||
						-- neighbors in the eight spaces immediately
 | 
			
		||||
						-- surrounding the node the plant is about to spawn on
 | 
			
		||||
						-- for it to happen.  If not provided, this check is
 | 
			
		||||
						-- disabled.
 | 
			
		||||
	facedir = num,		-- The value passed to the param2 variable when adding
 | 
			
		||||
						-- the node to the map.  Defaults to 0.  Be sure that
 | 
			
		||||
						-- the value you use here (and the range thereof) is
 | 
			
		||||
						-- appropriate for the type of node you're spawning.
 | 
			
		||||
	random_facedir = {table}, -- If set, the table should contain two values.
 | 
			
		||||
						-- If they're both provided, the spawned plant will be
 | 
			
		||||
						-- given a random facedir value in the range specified
 | 
			
		||||
						-- by these two numbers.  Overrides the facedir
 | 
			
		||||
						-- parameter above, if it exists.  Use {0,3} if you
 | 
			
		||||
						-- want the full range for wallmounted nodes, or {2,5}
 | 
			
		||||
						-- for most everything else, or any other pair of
 | 
			
		||||
						-- numbers appropriate for the node you want to spawn.
 | 
			
		||||
	depth_max = num,	-- If the object spawns on top of a water source, the
 | 
			
		||||
						-- water must be at most this deep.  Defaults to 1.
 | 
			
		||||
	min_elevation = num, -- Surface must be at this altitude or higher to
 | 
			
		||||
						-- spawn at all.  Defaults to -31000...
 | 
			
		||||
	max_elevation = num, -- ...but must be no higher than this altitude.
 | 
			
		||||
						-- Defaults to +31000.
 | 
			
		||||
	near_nodes = {table}, -- List of nodes that must be somewhere in the
 | 
			
		||||
						-- vicinity in order for the plant to spawn. Can also
 | 
			
		||||
						-- be a string with a single node name.  If not
 | 
			
		||||
						-- provided, this check is disabled.
 | 
			
		||||
	near_nodes_size = num,	-- How large of an area to check for the above
 | 
			
		||||
				-- node.  Specifically, this checks a flat
 | 
			
		||||
				-- horizontal area centered on the node to be
 | 
			
		||||
				-- spawned on.  Defaults to 0, but is ignored
 | 
			
		||||
				-- if the above near_nodes value is not set.
 | 
			
		||||
	near_nodes_vertical = num, -- Used with the size value above, this
 | 
			
		||||
				-- extends the vertical range of the near 
 | 
			
		||||
				-- nodes search.  Basically, this turns the
 | 
			
		||||
				-- flat region described above into a cuboid
 | 
			
		||||
				-- region.  The area to be checked will extend
 | 
			
		||||
				-- this high AND this low above/below the
 | 
			
		||||
				-- target node, centered thereon.  Defaults to
 | 
			
		||||
				-- 1 (check only the layer above, the layer
 | 
			
		||||
				-- at, and the layer below the target node),
 | 
			
		||||
				-- but is ignored if near_nodes is not set.
 | 
			
		||||
	near_nodes_count = num,	-- How many of the above nodes must be within
 | 
			
		||||
				-- that radius.	Defaults to 1 but is ignored
 | 
			
		||||
				-- if near_nodes isn't set.  Bear in mind that
 | 
			
		||||
				-- the total area to be checked is equal to
 | 
			
		||||
				-- (near_nodes_size^2)*near_nodes_vertical*2.
 | 
			
		||||
				-- so for example, if size is 10 and vertical
 | 
			
		||||
				-- is 4 then the area is (10^2)*8 = 800 nodes
 | 
			
		||||
				-- in size, so you'll want to make sure you
 | 
			
		||||
				-- specify a value appropriate for the amount
 | 
			
		||||
				-- in question.
 | 
			
		||||
	air_size = num,		-- How large of an area to check for air
 | 
			
		||||
				-- above and around the target.  If omitted,
 | 
			
		||||
				-- only the space above the target is checked.
 | 
			
		||||
				-- This does not check for air at the sides or
 | 
			
		||||
				-- below the target.
 | 
			
		||||
	air_count = num,	-- How many of the surrounding nodes need to
 | 
			
		||||
				-- be air for the above check to return true.
 | 
			
		||||
				-- If omitted, only the space above the target
 | 
			
		||||
				-- is checked.
 | 
			
		||||
	plantlife_limit = num,	-- The value compared against the generic
 | 
			
		||||
				-- "plants can grow here" Perlin noise layer.
 | 
			
		||||
				-- Smaller numbers result in more abundant
 | 
			
		||||
				-- plants.  Range of -1 to +1, with values in 
 | 
			
		||||
				-- the range of about 0 to 0.5 being most
 | 
			
		||||
				-- useful.  Defaults to 0.1.
 | 
			
		||||
	temp_min = num,		-- Minimum temperature needed for the desired
 | 
			
		||||
				-- object to spawn.  This is a 2d Perlin
 | 
			
		||||
				-- value, which has an inverted range of +1 to
 | 
			
		||||
				-- -1.  Larger values represent *colder*
 | 
			
		||||
				-- temperatures, so this value is actually the
 | 
			
		||||
				-- upper end of the desired Perlin range.  See
 | 
			
		||||
				-- the temperature map section at the bottom
 | 
			
		||||
				-- of this document for details on how these
 | 
			
		||||
				-- values work.  Defaults to +1 (unlimited
 | 
			
		||||
				-- coldness).
 | 
			
		||||
	temp_max = num,		-- Maximum temperature/lower end of the Perlin
 | 
			
		||||
				-- range.  Defaults to -1 (unlimited heat).
 | 
			
		||||
	humidity_min = num,	-- Minimum humidity for the plant to spawn in.
 | 
			
		||||
				-- Like the temperature map, this is a Perlin
 | 
			
		||||
				-- value where lower numbers mean more
 | 
			
		||||
				-- humidity in the area.  Defaults to +1 (0%
 | 
			
		||||
				-- relative humidity).
 | 
			
		||||
						-- node.  Specifically, this checks a flat, horizontal
 | 
			
		||||
						-- area centered on the node to be spawned on.
 | 
			
		||||
						-- Defaults to 0, but is ignored if the above
 | 
			
		||||
						-- near_nodes value is not set.
 | 
			
		||||
	near_nodes_vertical = num, -- Used with the size value above, this extends
 | 
			
		||||
						-- the vertical range of the near nodes search.
 | 
			
		||||
						-- Basically, this turns the flat region described
 | 
			
		||||
						-- above into a cuboid region.  The area to be checked
 | 
			
		||||
						-- will extend this high and this low above/below the
 | 
			
		||||
						-- target node, centered thereon.  Defaults to 1 (only
 | 
			
		||||
						-- check the layer above, the layer at, and the layer
 | 
			
		||||
						-- below the target node), but is ignored if
 | 
			
		||||
						-- near_nodes is not set.
 | 
			
		||||
	near_nodes_count = num,	-- How many of the above nodes must be within that
 | 
			
		||||
						-- radius.  Defaults to 1 but is ignored if near_nodes
 | 
			
		||||
						-- isn't set.  Bear in mind that the total area to be
 | 
			
		||||
						-- checked is equal to:
 | 
			
		||||
						-- (near_nodes_size^2)*near_nodes_vertical*2 
 | 
			
		||||
						-- For example, if size is 10 and vertical is 4, then
 | 
			
		||||
						-- the area is (10^2)*8 = 800 nodes in size, so you'll
 | 
			
		||||
						-- want to make sure you specify a value appropriate
 | 
			
		||||
						-- for the size of the area being tested.
 | 
			
		||||
	air_size = num,		-- How large of an area to check for air above and
 | 
			
		||||
						-- around the target.  If omitted, only the space
 | 
			
		||||
						-- above the target is checked.  This does not check
 | 
			
		||||
						-- for air at the sides or below the target.
 | 
			
		||||
	air_count = num,	-- How many of the surrounding nodes need to be air
 | 
			
		||||
						-- for the above check to return true. If omitted,
 | 
			
		||||
						-- only the space above the target is checked.
 | 
			
		||||
	plantlife_limit = num, -- The value compared against the generic "plants
 | 
			
		||||
						-- can grow here" Perlin noise layer. Smaller numbers
 | 
			
		||||
						-- result in more abundant plants.  Range of -1 to +1,
 | 
			
		||||
						-- with values in the range of about 0 to 0.5 being
 | 
			
		||||
						-- most useful.  Defaults to 0.1.
 | 
			
		||||
	temp_min = num,		-- Minimum temperature needed for the desired object
 | 
			
		||||
						-- to spawn.  This is a 2d Perlin value, which has an
 | 
			
		||||
						-- inverted range of +1 to -1.  Larger values
 | 
			
		||||
						-- represent *colder* temperatures, so this value is
 | 
			
		||||
						-- actually the upper end of the desired Perlin range.
 | 
			
		||||
						-- See the temperature map section at the bottom of
 | 
			
		||||
						-- this document for details on how these values work.
 | 
			
		||||
						-- Defaults to +1 (unlimited coldness).
 | 
			
		||||
	temp_max = num,		-- Maximum temperature/lower end of the Perlin range.
 | 
			
		||||
						-- Defaults to -1 (unlimited heat).
 | 
			
		||||
	humidity_min = num,	-- Minimum humidity for the plant to spawn in. Like
 | 
			
		||||
						-- the temperature map, this is a Perlin value where
 | 
			
		||||
						-- lower numbers mean more humidity in the area.
 | 
			
		||||
						-- Defaults to +1 (0% humidity).
 | 
			
		||||
	humidity_max = num,	-- Maximum humidity for the plant to spawn at.
 | 
			
		||||
				-- Defaults to -1 (100% humidity).
 | 
			
		||||
	spawn_on_side = bool,	-- Set this to true to spawn the node on one
 | 
			
		||||
				-- side of the target node rather than the
 | 
			
		||||
				-- top.  The code will search for an airspace
 | 
			
		||||
				-- to the side of the target, then spawn the
 | 
			
		||||
				-- plant at the first one found.  The above
 | 
			
		||||
				-- facedir and random_facedir parameters are
 | 
			
		||||
				-- ignored in this case.  If the above
 | 
			
		||||
				-- parameters for selecting generic wall nodes
 | 
			
		||||
				-- are provided, this option is ignored.
 | 
			
		||||
				-- Important note: the facedir values assigned
 | 
			
		||||
				-- by this option only make sense with
 | 
			
		||||
				-- wallmounted nodes (nodes which don't use
 | 
			
		||||
				-- facedir won't be affected).
 | 
			
		||||
						-- Defaults to -1 (100% humidity).
 | 
			
		||||
	verticals_list = {table}, -- List of nodes that should be considered to be
 | 
			
		||||
						-- natural walls.
 | 
			
		||||
	alt_wallnode = "string", -- If specified, this node will be substituted in
 | 
			
		||||
						-- place of the plant(s) defined by spawn_plants
 | 
			
		||||
						-- above, if the spawn target has one or more adjacent
 | 
			
		||||
						-- walls.  In such a case, the two above facedir
 | 
			
		||||
						-- parameters will be ignored.
 | 
			
		||||
	spawn_on_side = bool, -- Set this to true to immediately spawn the node on
 | 
			
		||||
						-- one side of the target node rather than the top.
 | 
			
		||||
						-- The code will search for an airspace to the side of
 | 
			
		||||
						-- the target, then spawn the plant at the first one
 | 
			
		||||
						-- found.  The above facedir and random_facedir
 | 
			
		||||
						-- parameters are ignored in this case.  If the above
 | 
			
		||||
						-- parameters for selecting generic wall nodes are
 | 
			
		||||
						-- provided, this option is ignored.  Important note:
 | 
			
		||||
						-- the facedir values assigned by this option only
 | 
			
		||||
						-- make sense with wallmounted nodes (nodes which
 | 
			
		||||
						-- don't use facedir won't be affected).
 | 
			
		||||
	choose_random_wall = bool, -- if set to true, and searching for walls is
 | 
			
		||||
						-- being done, just pick any random wall if there is
 | 
			
		||||
						-- one, rather than returning the first one.
 | 
			
		||||
	spawn_on_bottom = bool,	-- If set to true, spawn the object below the
 | 
			
		||||
				-- target node instead of above it.  The above
 | 
			
		||||
				-- spawn_on_side variable takes precedence
 | 
			
		||||
				-- over this one if both happen to be true.
 | 
			
		||||
				-- When using this option with the random
 | 
			
		||||
				-- facedir function above, the values given to
 | 
			
		||||
				-- the facedir parameter are for regular
 | 
			
		||||
				-- nodes, not wallmounted.
 | 
			
		||||
	spawn_replace_node = bool, -- If set to true, the target node itself
 | 
			
		||||
				-- is replaced by the spawned object.
 | 
			
		||||
				-- Overrides the spawn_on_bottom and
 | 
			
		||||
				-- spawn_on_side settings.
 | 
			
		||||
						-- target node instead of above it.  The above
 | 
			
		||||
						-- spawn_on_side variable takes precedence over this
 | 
			
		||||
						-- one if both happen to be true. When using this
 | 
			
		||||
						-- option with the random facedir function above, the
 | 
			
		||||
						-- values given to the facedir parameter are for
 | 
			
		||||
						-- regular nodes, not wallmounted.
 | 
			
		||||
	spawn_replace_node = bool, -- If set to true, the target node itself is
 | 
			
		||||
						-- replaced by the spawned object.  Overrides the
 | 
			
		||||
						-- spawn_on_bottom and spawn_on_side settings.
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
[*] spawn_plants must be either a table or a string.  If it's a table, the
 | 
			
		||||
@@ -250,87 +231,78 @@ here than are available in the ABM-based spawner, as some stuff doesn't make
 | 
			
		||||
sense at map-generation time.
 | 
			
		||||
 | 
			
		||||
biome = {
 | 
			
		||||
	surface = something,	-- What node(s).  May be a string such as
 | 
			
		||||
				-- "default:dirt_with_grass" or a table with
 | 
			
		||||
				-- multiple such entries.
 | 
			
		||||
	surface = something, -- What node(s).  May be a string such as
 | 
			
		||||
						-- "default:dirt_with_grass" or a table with
 | 
			
		||||
						-- multiple such entries.
 | 
			
		||||
 | 
			
		||||
	---- Everything else is optional, but you'll definitely want to use
 | 
			
		||||
	---- some of these other fields to limit where and under what
 | 
			
		||||
	---- conditions the objects are spawned.
 | 
			
		||||
	
 | 
			
		||||
	below_nodes = {table},	-- List of nodes that must be below the target
 | 
			
		||||
				-- node.  Useful in snow biomes to keep
 | 
			
		||||
				-- objects from spawning in snow that's on the
 | 
			
		||||
				-- wrong surface for that object.
 | 
			
		||||
	avoid_nodes = {table},	-- List of nodes to avoid when spawning.
 | 
			
		||||
				-- Groups are not supported here.
 | 
			
		||||
	avoid_radius = num,	-- how much distance to leave between the
 | 
			
		||||
				-- object to be added and the objects to be
 | 
			
		||||
				-- avoided.  If this or the avoid_nodes value
 | 
			
		||||
				-- is nil or omitted, this check is skipped.
 | 
			
		||||
				-- Avoid using excessively large radii or you
 | 
			
		||||
				-- will slow down the map generator.
 | 
			
		||||
	rarity = num,		-- how rare should this object be in its
 | 
			
		||||
				-- biome? Larger values make objects more
 | 
			
		||||
				-- rare, via:  math.random(1,100) > this
 | 
			
		||||
	max_count = num,	-- The absolute maximum number of your object
 | 
			
		||||
				-- that should be allowed to spawn in a 5x5x5
 | 
			
		||||
				-- mapblock area (80x80x80 nodes).  Defaults
 | 
			
		||||
				-- to 5, but be sure you set this to some 
 | 
			
		||||
				-- reasonable value depending on your object
 | 
			
		||||
				-- and its size if 5 is insufficient.
 | 
			
		||||
	seed_diff = num,	-- perlin seed-diff value.  Defaults to 0, 
 | 
			
		||||
				-- which causes the function to inherit the
 | 
			
		||||
				-- global value of 329.
 | 
			
		||||
	neighbors = {table},	-- What ground nodes must be right next to and
 | 
			
		||||
				-- at the same elevation as the node to be
 | 
			
		||||
				-- spawned on.
 | 
			
		||||
	ncount = num,		-- at least this many of the above nodes must
 | 
			
		||||
				-- be next to the node to spawn on.  Any value
 | 
			
		||||
				-- greater than 8 will probably cause the code
 | 
			
		||||
				-- to never spawn anything.  Defaults to 0.
 | 
			
		||||
	depth = num,		-- how deep/thick of a layer the spawned-on
 | 
			
		||||
				-- node must be.  Typically used for water.
 | 
			
		||||
	min_elevation = num,	-- minimum elevation in meters/nodes.
 | 
			
		||||
				-- Defaults to -31000 (unlimited).
 | 
			
		||||
	max_elevation = num,	-- maximum elevation.  Defaults to +31000
 | 
			
		||||
				-- (unlimited).
 | 
			
		||||
	near_nodes = {table},	-- what nodes must be in the general vicinity
 | 
			
		||||
				-- of the object being spawned.
 | 
			
		||||
	near_nodes_size = num,	-- how wide of a search area to look for 
 | 
			
		||||
				-- the nodes in that list.
 | 
			
		||||
	near_nodes_vertical = num, -- How high/low of an area to search from
 | 
			
		||||
				-- the target node.
 | 
			
		||||
	near_nodes_count = num,	-- at least this many of those nodes must be
 | 
			
		||||
				-- in the area.
 | 
			
		||||
	plantlife_limit = num,	-- The value compared against the generic
 | 
			
		||||
				-- "plants can grow here" Perlin noise layer.
 | 
			
		||||
				-- Smaller numbers result in more abundant
 | 
			
		||||
				-- plants.  Range of -1 to +1, with values in 
 | 
			
		||||
				-- the range of about 0 to 0.5 being most
 | 
			
		||||
				-- useful.  Defaults to 0.1.
 | 
			
		||||
	temp_min = num,		-- coldest allowable temperature for a plant
 | 
			
		||||
				-- to spawn (that is, the highest Perlin
 | 
			
		||||
				-- temperature map value).
 | 
			
		||||
	temp_max = num,		-- warmest allowable temperature to spawn a
 | 
			
		||||
				-- plant (lowest Perlin temperature value).
 | 
			
		||||
	verticals_list = {table}, -- Same as with the spawn_on_surfaces
 | 
			
		||||
				-- function.
 | 
			
		||||
	check_air = bool,	-- Flag to tell the mapgen code to check for
 | 
			
		||||
				-- air above the spawn target.  Defaults to
 | 
			
		||||
				-- true if not explicitly set to false.
 | 
			
		||||
	delete_above = bool,	-- Flag to tell the mapgen code to delete the
 | 
			
		||||
				-- two nodes directly above the spawn target
 | 
			
		||||
				-- just before adding the plant or tree.
 | 
			
		||||
				-- Useful when generating in snow biomes.
 | 
			
		||||
				-- Defaults to false.
 | 
			
		||||
	below_nodes = {table}, -- List of nodes that must be below the target
 | 
			
		||||
						-- node.  Useful in snow biomes to keep objects from
 | 
			
		||||
						-- spawning in snow that's on the wrong surface for
 | 
			
		||||
						-- that object.
 | 
			
		||||
	avoid_nodes = {table}, -- List of nodes to avoid when spawning. Groups are
 | 
			
		||||
						-- not supported here.
 | 
			
		||||
	avoid_radius = num,	-- How much distance to leave between the object to be
 | 
			
		||||
						-- added and the objects to be avoided.  If this or
 | 
			
		||||
						-- the avoid_nodes value is nil/omitted, this check is
 | 
			
		||||
						-- skipped.  Avoid using excessively large radii.
 | 
			
		||||
	rarity = num,		-- How rare should this object be in its biome? Larger
 | 
			
		||||
						-- values make objects more rare, via:
 | 
			
		||||
						-- math.random(1,100) > this
 | 
			
		||||
	max_count = num,	-- The absolute maximum number of your object that
 | 
			
		||||
						-- should be allowed to spawn in a 5x5x5 mapblock area
 | 
			
		||||
						-- (80x80x80 nodes).  Defaults to 5, but be sure you
 | 
			
		||||
						-- set this to some reasonable value depending on your
 | 
			
		||||
						-- object and its size if 5 is insufficient.
 | 
			
		||||
	seed_diff = num,	-- Perlin seed-diff value.  Defaults to 0, which
 | 
			
		||||
						-- causes the function to inherit the global value of
 | 
			
		||||
						-- 329.
 | 
			
		||||
	neighbors = {table}, -- What ground nodes must be right next to and at the
 | 
			
		||||
						-- same elevation as the node to be spawned on.
 | 
			
		||||
	ncount = num,		-- At least this many of the above nodes must be next
 | 
			
		||||
						-- to the node to spawn on.  Any value greater than 8
 | 
			
		||||
						-- will probably cause the code to never spawn
 | 
			
		||||
						-- anything.  Defaults to 0.
 | 
			
		||||
	depth = num,		-- How deep/thick of a layer the spawned-on node must
 | 
			
		||||
						-- be.  Typically used for water.
 | 
			
		||||
	min_elevation = num, -- Minimum elevation in meters/nodes.  Defaults to
 | 
			
		||||
						-- -31000 (unlimited).
 | 
			
		||||
	max_elevation = num, -- Max elevation.  Defaults to +31000 (unlimited).
 | 
			
		||||
	near_nodes = {table}, -- what nodes must be in the general vicinity of the
 | 
			
		||||
						-- object being spawned.
 | 
			
		||||
	near_nodes_size = num, -- how wide of a search area to look for the nodes
 | 
			
		||||
						-- in that list.
 | 
			
		||||
	near_nodes_vertical = num, -- How high/low of an area to search from the
 | 
			
		||||
						-- target node.
 | 
			
		||||
	near_nodes_count = num,	-- at least this many of those nodes must be in
 | 
			
		||||
						-- the area.
 | 
			
		||||
	plantlife_limit = num, -- The value compared against the generic "plants
 | 
			
		||||
						-- can grow here" Perlin noise layer.  Smaller numbers
 | 
			
		||||
						-- result in more abundant plants.  Range of -1 to +1,
 | 
			
		||||
						-- with values in the range of about 0 to 0.5 being
 | 
			
		||||
						-- most useful.  Defaults to 0.1.
 | 
			
		||||
	temp_min = num,		-- Coldest allowable temperature for a plant to spawn
 | 
			
		||||
						-- (that is, the largest Perlin value).
 | 
			
		||||
	temp_max = num,		-- warmest allowable temperature to spawn a plant
 | 
			
		||||
						-- (lowest Perlin value).
 | 
			
		||||
	verticals_list = {table}, -- Same as with the spawn_on_surfaces function.
 | 
			
		||||
	check_air = bool,	-- Flag to tell the mapgen code to check for air above
 | 
			
		||||
						-- the spawn target.  Defaults to true if not
 | 
			
		||||
						-- explicitly set to false.  Set this to false VERY
 | 
			
		||||
						-- SPARINGLY, as it will slow the map generator down.
 | 
			
		||||
	delete_above = bool, -- Flag to tell the mapgen code to delete the two
 | 
			
		||||
						-- nodes directly above the spawn target just before
 | 
			
		||||
						-- adding the plant or tree.  Useful when generating
 | 
			
		||||
						-- in snow biomes.  Defaults to false.
 | 
			
		||||
	delete_above_surround = bool, -- Flag to tell the mapgen code to also
 | 
			
		||||
				-- delete the four nodes surrounding the above
 | 
			
		||||
				-- space, and the four nodes above those,
 | 
			
		||||
				-- resulting in a two-node-deep cross-shaped
 | 
			
		||||
				-- empty region above the spawn target.
 | 
			
		||||
				-- Useful when adding trees to snow biomes.
 | 
			
		||||
				-- Defaults to false.
 | 
			
		||||
						-- delete the five nodes surrounding the above space,
 | 
			
		||||
						-- and the five nodes above those, resulting in a two-
 | 
			
		||||
						-- node-deep cross-shaped empty region above/around
 | 
			
		||||
						-- the spawn target.  Useful when adding trees to snow
 | 
			
		||||
						-- biomes.  Defaults to false.
 | 
			
		||||
	spawn_replace_node = bool, -- same as with the ABM spawner.
 | 
			
		||||
	random_facedir = {table}, -- same as with the ABM spawner.
 | 
			
		||||
}
 | 
			
		||||
@@ -370,61 +342,53 @@ into something else over time.  This function has no return value, and accepts
 | 
			
		||||
a biome definition table as the only parameter.  These are defined like so:
 | 
			
		||||
 | 
			
		||||
options = {
 | 
			
		||||
	grow_plant = "string",	-- Name of the node to be grown into something
 | 
			
		||||
				-- else.  This value is passed to the ABM as
 | 
			
		||||
				-- the "nodenames" parameter, so it is the
 | 
			
		||||
				-- plants themselves that are the ABM trigger,
 | 
			
		||||
				-- rather than the ground they spawned on.  A
 | 
			
		||||
				-- plant will only grow if the node above it
 | 
			
		||||
				-- is air.  Can also be a table, but note that
 | 
			
		||||
				-- all nodes referenced therein will be grown
 | 
			
		||||
				-- into the same object.
 | 
			
		||||
	grow_delay = num,	-- Passed as the ABM "interval" parameter, as
 | 
			
		||||
				-- with spawning.
 | 
			
		||||
	grow_plant = "string", -- Name of the node to be grown into something
 | 
			
		||||
						-- else.  This value is passed to the ABM as the
 | 
			
		||||
						-- "nodenames" parameter, so it is the plants
 | 
			
		||||
						-- themselves that are the ABM trigger, rather than
 | 
			
		||||
						-- the ground they spawned on.  A plant will only grow
 | 
			
		||||
						-- if the node above it is air.  Can also be a table,
 | 
			
		||||
						-- but note that all nodes referenced therein will be
 | 
			
		||||
						-- grown into the same object.
 | 
			
		||||
	grow_delay = num,	-- Passed as the ABM "interval" parameter, as with
 | 
			
		||||
						-- spawning.
 | 
			
		||||
	grow_chance = num,	-- Passed as the ABM "chance" parameter.
 | 
			
		||||
	grow_result = "string",	-- Name of the node into which the grow_plant
 | 
			
		||||
				-- node(s) should transform when the ABM
 | 
			
		||||
				-- executes.
 | 
			
		||||
						-- node(s) should transform when the ABM executes.
 | 
			
		||||
 | 
			
		||||
	---- Everything from here down is optional.
 | 
			
		||||
 | 
			
		||||
	dry_early_node = "string", -- This value is ignored except for jungle
 | 
			
		||||
				-- grass (a corner case needed by that mod),
 | 
			
		||||
				-- where it indicates which node the grass
 | 
			
		||||
				-- must be on in order for it to turn from
 | 
			
		||||
				-- the short size to "default:dry_shrub"
 | 
			
		||||
				-- instead of the medium size.
 | 
			
		||||
	grow_nodes = {table},	-- One of these nodes must be under the plant
 | 
			
		||||
				-- in order for it to grow at all.  Normally
 | 
			
		||||
				-- this should be the same as the list of 
 | 
			
		||||
				-- surfaces passed to the spawning ABM as the
 | 
			
		||||
				-- "nodenames" parameter.  This is so that the
 | 
			
		||||
				-- plant can be manually placed on something
 | 
			
		||||
				-- like a flower pot or something without it
 | 
			
		||||
				-- growing and eventually dieing.  Defaults to
 | 
			
		||||
				-- "default:dirt_with_grass".
 | 
			
		||||
						-- grass (a corner case needed by that mod), where it
 | 
			
		||||
						-- indicates which node the grass must be on in order
 | 
			
		||||
						-- for it to turn from the short size to
 | 
			
		||||
						-- "default:dry_shrub" instead of the medium size.
 | 
			
		||||
	grow_nodes = {table}, -- One of these nodes must be under the plant in
 | 
			
		||||
						-- order for it to grow at all.  Normally this should
 | 
			
		||||
						-- be the same as the list of surfaces passed to the
 | 
			
		||||
						-- spawning ABM as the "nodenames" parameter.  This is
 | 
			
		||||
						-- so that the plant can be manually placed on
 | 
			
		||||
						-- something like a flower pot or something without it
 | 
			
		||||
						-- necessarily growing and perhaps dieing.  Defaults
 | 
			
		||||
						-- to "default:dirt_with_grass".
 | 
			
		||||
	facedir = num,		-- Same as with spawning a plant.
 | 
			
		||||
	need_wall = bool,	-- Set this to true if you the plant needs to
 | 
			
		||||
				-- grow against a wall.  Defaults to false.
 | 
			
		||||
	verticals_list = {table}, -- List of nodes that should be considered
 | 
			
		||||
				-- to be wall surfaces when growing the plant
 | 
			
		||||
				-- vertically.  If not provided, the walls
 | 
			
		||||
				-- check is skipped.
 | 
			
		||||
	need_wall = bool,	-- Set this to true if you the plant needs to grow
 | 
			
		||||
						-- against a wall.  Defaults to false.
 | 
			
		||||
	verticals_list = {table}, -- same as with spawning a plant.
 | 
			
		||||
	choose_random_wall = bool, -- same as with spawning a plant.
 | 
			
		||||
	grow_vertically = bool,	-- Set this to true if the plant needs to grow
 | 
			
		||||
				-- vertically, as in climbing poison ivy.
 | 
			
		||||
				-- Defaults to false.
 | 
			
		||||
	height_limit = num,	-- Set this to limit how tall the desired node
 | 
			
		||||
				-- can grow.  The mod will search straight
 | 
			
		||||
				-- down from the position being spawned at to
 | 
			
		||||
				-- find a ground node, set via the parameter
 | 
			
		||||
				-- below. Defaults to 5 nodes.
 | 
			
		||||
	ground_nodes = {table},	-- What nodes should be treated as "the
 | 
			
		||||
				-- ground" below a vertically-growing plant.
 | 
			
		||||
				-- Usually this should be the same as the
 | 
			
		||||
				-- grow_nodes table, but might also include,
 | 
			
		||||
				-- for example, water or some other
 | 
			
		||||
				-- surrounding material.  Defaults to
 | 
			
		||||
				-- "default:dirt_with_grass".
 | 
			
		||||
						-- vertically, as in climbing poison ivy. Defaults to
 | 
			
		||||
						-- false.
 | 
			
		||||
	height_limit = num,	-- Set this to limit how tall the desired node can
 | 
			
		||||
						-- grow.  The mod will search straight down from the
 | 
			
		||||
						-- position being spawned at to find a ground node,
 | 
			
		||||
						-- set via the field below. Defaults to 5 nodes.
 | 
			
		||||
	ground_nodes = {table},	-- What nodes should be treated as "the ground"
 | 
			
		||||
						-- below a vertically-growing plant. Usually this
 | 
			
		||||
						-- should be the same as the grow_nodes table, but
 | 
			
		||||
						-- might also include, for example, water or some
 | 
			
		||||
						-- other surrounding material.  Defaults to
 | 
			
		||||
						-- "default:dirt_with_grass".
 | 
			
		||||
	grow_function = something, -- [*] see below.
 | 
			
		||||
	seed_diff = num,	-- [*] see below.
 | 
			
		||||
}
 | 
			
		||||
@@ -457,13 +421,16 @@ and grow_result is ignored.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
=====
 | 
			
		||||
find_adjacent_wall(pos, verticals)
 | 
			
		||||
find_adjacent_wall(pos, verticals, randomflag)
 | 
			
		||||
 | 
			
		||||
Of the few helper functions, this one expects a position parameter and a table
 | 
			
		||||
with the list of nodes that should be considered as walls.  The code will
 | 
			
		||||
search around the given position for a neighboring wall, returning the first
 | 
			
		||||
one it finds as a facedir value, or nil if there are no adjacent walls.
 | 
			
		||||
 | 
			
		||||
If randomflag is set to true, the function will just return the facedir of any
 | 
			
		||||
random wall it finds adjacent to the target position.  Defaults to false if 
 | 
			
		||||
not specified.
 | 
			
		||||
 | 
			
		||||
=====
 | 
			
		||||
is_node_loaded(pos)
 | 
			
		||||
@@ -490,11 +457,11 @@ call the usual spawn_tree() functions.  This rerouting exists as a way for
 | 
			
		||||
other mods to hook into plants_lib's tree-growing functions in general,
 | 
			
		||||
perhaps to execute something extra whenever a tree is spawned.
 | 
			
		||||
 | 
			
		||||
plantslib:generate_tree(pos, treemodel) is called any time a
 | 
			
		||||
tree is spawned at map generation time.  'pos' is the position of the block on
 | 
			
		||||
which the tree is to be placed.  'treemodel' is the standard L-Systems tree
 | 
			
		||||
definition table expected by the spawn_tree() function.  Refer to the 'trunk'
 | 
			
		||||
field in that table to derive the name of the tree being spawned.
 | 
			
		||||
plantslib:generate_tree(pos, treemodel) is called any time a tree is spawned
 | 
			
		||||
at map generation time.  'pos' is the position of the block on which the tree
 | 
			
		||||
is to be placed.  'treemodel' is the standard L-Systems tree definition table
 | 
			
		||||
expected by the spawn_tree() function.  Refer to the 'trunk' field in that
 | 
			
		||||
table to derive the name of the tree being spawned.
 | 
			
		||||
 | 
			
		||||
plantslib:grow_tree(pos, treemodel) does the same sort of thing whenever a 
 | 
			
		||||
tree is spawned within the abm-based growing code, for example when growing a
 | 
			
		||||
@@ -483,7 +483,7 @@ function plantslib:spawn_on_surfaces(sd,sp,sr,sc,ss,sa)
 | 
			
		||||
				  and pos.y >= biome.min_elevation
 | 
			
		||||
				  and pos.y <= biome.max_elevation
 | 
			
		||||
				  then
 | 
			
		||||
					local walldir = plantslib:find_adjacent_wall(p_top, biome.verticals_list)
 | 
			
		||||
					local walldir = plantslib:find_adjacent_wall(p_top, biome.verticals_list, biome.choose_random_wall)
 | 
			
		||||
					if biome.alt_wallnode and walldir then
 | 
			
		||||
						if n_top.name == "air" then
 | 
			
		||||
							minetest.set_node(p_top, { name = biome.alt_wallnode, param2 = walldir })
 | 
			
		||||
@@ -555,7 +555,7 @@ function plantslib:grow_plants(opts)
 | 
			
		||||
			local root_node = minetest.get_node({x=pos.x, y=pos.y-options.height_limit, z=pos.z})
 | 
			
		||||
			local walldir = nil
 | 
			
		||||
			if options.need_wall and options.verticals_list then
 | 
			
		||||
				walldir = plantslib:find_adjacent_wall(p_top, options.verticals_list)
 | 
			
		||||
				walldir = plantslib:find_adjacent_wall(p_top, options.verticals_list, options.choose_random_wall)
 | 
			
		||||
			end
 | 
			
		||||
			if n_top.name == "air" and (not options.need_wall or (options.need_wall and walldir))
 | 
			
		||||
			  then
 | 
			
		||||
@@ -612,12 +612,24 @@ end
 | 
			
		||||
-- function to decide if a node has a wall that's in verticals_list{}
 | 
			
		||||
-- returns wall direction of valid node, or nil if invalid.
 | 
			
		||||
 | 
			
		||||
function plantslib:find_adjacent_wall(pos, verticals)
 | 
			
		||||
function plantslib:find_adjacent_wall(pos, verticals, randomflag)
 | 
			
		||||
	local verts = dump(verticals)
 | 
			
		||||
	if string.find(verts, minetest.get_node({ x=pos.x-1, y=pos.y, z=pos.z   }).name) then return 3 end
 | 
			
		||||
	if string.find(verts, minetest.get_node({ x=pos.x+1, y=pos.y, z=pos.z   }).name) then return 2 end
 | 
			
		||||
	if string.find(verts, minetest.get_node({ x=pos.x  , y=pos.y, z=pos.z-1 }).name) then return 5 end
 | 
			
		||||
	if string.find(verts, minetest.get_node({ x=pos.x  , y=pos.y, z=pos.z+1 }).name) then return 4 end
 | 
			
		||||
	if randomflag then
 | 
			
		||||
		local walltab = {}
 | 
			
		||||
		
 | 
			
		||||
		if string.find(verts, minetest.get_node({ x=pos.x-1, y=pos.y, z=pos.z   }).name) then walltab[#walltab + 1] = 3 end
 | 
			
		||||
		if string.find(verts, minetest.get_node({ x=pos.x+1, y=pos.y, z=pos.z   }).name) then walltab[#walltab + 1] = 2 end
 | 
			
		||||
		if string.find(verts, minetest.get_node({ x=pos.x  , y=pos.y, z=pos.z-1 }).name) then walltab[#walltab + 1] = 5 end
 | 
			
		||||
		if string.find(verts, minetest.get_node({ x=pos.x  , y=pos.y, z=pos.z+1 }).name) then walltab[#walltab + 1] = 4 end
 | 
			
		||||
 | 
			
		||||
		if #walltab > 0 then return walltab[math.random(1, #walltab)] end
 | 
			
		||||
 | 
			
		||||
	else
 | 
			
		||||
		if string.find(verts, minetest.get_node({ x=pos.x-1, y=pos.y, z=pos.z   }).name) then return 3 end
 | 
			
		||||
		if string.find(verts, minetest.get_node({ x=pos.x+1, y=pos.y, z=pos.z   }).name) then return 2 end
 | 
			
		||||
		if string.find(verts, minetest.get_node({ x=pos.x  , y=pos.y, z=pos.z-1 }).name) then return 5 end
 | 
			
		||||
		if string.find(verts, minetest.get_node({ x=pos.x  , y=pos.y, z=pos.z+1 }).name) then return 4 end
 | 
			
		||||
	end
 | 
			
		||||
	return nil
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -29,7 +29,9 @@ for i in pairs(NoDe) do
 | 
			
		||||
		buildable_to = true,
 | 
			
		||||
		node_box = {type = "fixed", fixed = flat_stick},
 | 
			
		||||
		groups = {
 | 
			
		||||
			dig_immediate=3, -- almost literally immediate, like just picking up
 | 
			
		||||
			choppy=2,
 | 
			
		||||
			oddly_breakable_by_hand=2,
 | 
			
		||||
			flammable=3,
 | 
			
		||||
			attached_node=1,
 | 
			
		||||
			not_in_creative_inventory=iNV
 | 
			
		||||
		},
 | 
			
		||||
@@ -67,7 +69,7 @@ minetest.register_node("trunks:moss", {
 | 
			
		||||
	walkable = false,
 | 
			
		||||
	node_box = {type = "fixed", fixed = flat_moss},
 | 
			
		||||
	selection_box = {type = "fixed", fixed = flat_stick},--{type = "wallmounted"},
 | 
			
		||||
	groups = {dig_immediate=2--[[,attached_node=1]]}, -- falling moss is too annoying
 | 
			
		||||
	groups = {snappy = 3, flammable = 3 },
 | 
			
		||||
	sounds = default.node_sound_leaves_defaults(),
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
@@ -86,7 +88,7 @@ minetest.register_node("trunks:moss_fungus", {
 | 
			
		||||
	walkable = false,
 | 
			
		||||
	node_box = {type = "fixed", fixed = flat_moss},
 | 
			
		||||
	selection_box = {type = "fixed", fixed = flat_stick},--{type = "wallmounted"},
 | 
			
		||||
	groups = {dig_immediate=2--[[,attached_node=1]]}, -- falling moss is too annoying
 | 
			
		||||
	groups = {snappy = 3, flammable = 3 },
 | 
			
		||||
	sounds = default.node_sound_leaves_defaults(),
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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
 | 
			
		||||
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
 | 
			
		||||
  ropebox rope break results in bottom rope dissapearing and bottom drop rope node to appear at the new bottom
 | 
			
		||||
  and rope does not drop anything!!!!
 | 
			
		||||
]]
 | 
			
		||||
 | 
			
		||||
vines = {}
 | 
			
		||||
 | 
			
		||||
local mod_name = "vines"
 | 
			
		||||
local average_height = 12
 | 
			
		||||
local spawn_interval = 90
 | 
			
		||||
local vines_group = {attached_node=1,vines=1,snappy=3,flammable=2,hanging_node=1,vines_cleanup=1}
 | 
			
		||||
 | 
			
		||||
vines.growth_interval = 300
 | 
			
		||||
vines.growth_chance = 2
 | 
			
		||||
vines.rot_interval = 300
 | 
			
		||||
vines.rot_chance = 8
 | 
			
		||||
 | 
			
		||||
local jungle_leaves_list = {
 | 
			
		||||
	"default:jungleleaves",
 | 
			
		||||
	"moretrees:jungle_leaves_red",
 | 
			
		||||
	"moretrees:jungle_leaves_yellow",
 | 
			
		||||
	"moretrees:jungle_leaves_green"
 | 
			
		||||
vines = {
 | 
			
		||||
  name = 'vines',
 | 
			
		||||
  recipes = {}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
-- Nodes
 | 
			
		||||
minetest.register_node("vines:rope_block", {
 | 
			
		||||
  description = "Rope",
 | 
			
		||||
  sunlight_propagates = true,
 | 
			
		||||
  paramtype = "light",
 | 
			
		||||
  tile_images = {
 | 
			
		||||
    "default_wood.png^vines_rope.png",
 | 
			
		||||
    "default_wood.png^vines_rope.png",
 | 
			
		||||
    "default_wood.png",
 | 
			
		||||
    "default_wood.png",
 | 
			
		||||
    "default_wood.png^vines_rope.png",
 | 
			
		||||
    "default_wood.png^vines_rope.png",
 | 
			
		||||
  },
 | 
			
		||||
  drawtype = "cube",
 | 
			
		||||
  groups = {choppy=2,oddly_breakable_by_hand=1},
 | 
			
		||||
  after_place_node = function(pos)
 | 
			
		||||
    local p = {x=pos.x, y=pos.y-1, z=pos.z}
 | 
			
		||||
    local n = minetest.get_node(p)
 | 
			
		||||
    if n.name == "air" then
 | 
			
		||||
      minetest.add_node(p, {name="vines:rope_end"})
 | 
			
		||||
    end
 | 
			
		||||
  end,
 | 
			
		||||
  after_dig_node = function(pos, node, digger)
 | 
			
		||||
    local p = {x=pos.x, y=pos.y-1, z=pos.z}
 | 
			
		||||
    local n = minetest.get_node(p)
 | 
			
		||||
    while n.name == 'vines:rope' do
 | 
			
		||||
      minetest.remove_node(p)
 | 
			
		||||
      p = {x=p.x, y=p.y-1, z=p.z}
 | 
			
		||||
      n = minetest.get_node(p)
 | 
			
		||||
    end
 | 
			
		||||
    if n.name == 'vines:rope_end' then
 | 
			
		||||
      minetest.remove_node(p)
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
minetest.register_node("vines:rope", {
 | 
			
		||||
  description = "Rope",
 | 
			
		||||
  walkable = false,
 | 
			
		||||
  climbable = true,
 | 
			
		||||
  sunlight_propagates = true,
 | 
			
		||||
  paramtype = "light",
 | 
			
		||||
  drop = "",
 | 
			
		||||
  tile_images = { "vines_rope.png" },
 | 
			
		||||
  drawtype = "plantlike",
 | 
			
		||||
  groups = {flammable=2, not_in_creative_inventory=1},
 | 
			
		||||
  sounds =  default.node_sound_leaves_defaults(),
 | 
			
		||||
  selection_box = {
 | 
			
		||||
    type = "fixed",
 | 
			
		||||
    fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7},
 | 
			
		||||
  },
 | 
			
		||||
  on_destruct = function()
 | 
			
		||||
    
 | 
			
		||||
  end,
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
minetest.register_node("vines:rope_end", {
 | 
			
		||||
  description = "Rope",
 | 
			
		||||
  walkable = false,
 | 
			
		||||
  climbable = true,
 | 
			
		||||
  sunlight_propagates = true,
 | 
			
		||||
  paramtype = "light",
 | 
			
		||||
  drop = "",
 | 
			
		||||
  tile_images = { "vines_rope_end.png" },
 | 
			
		||||
  drawtype = "plantlike",
 | 
			
		||||
  groups = {flammable=2, not_in_creative_inventory=1},
 | 
			
		||||
  sounds =  default.node_sound_leaves_defaults(),
 | 
			
		||||
  after_place_node = function(pos)
 | 
			
		||||
    yesh  = {x = pos.x, y= pos.y-1, z=pos.z}
 | 
			
		||||
    minetest.add_node(yesh, {name="vines:rope"})
 | 
			
		||||
  end,
 | 
			
		||||
  selection_box = {
 | 
			
		||||
	  type = "fixed",
 | 
			
		||||
	  fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7},
 | 
			
		||||
  },
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
minetest.register_node("vines:side", {
 | 
			
		||||
  description = "Vine",
 | 
			
		||||
  walkable = false,
 | 
			
		||||
  climbable = true,
 | 
			
		||||
  drop = "",
 | 
			
		||||
  sunlight_propagates = true,
 | 
			
		||||
  paramtype = "light",
 | 
			
		||||
  paramtype2 = "wallmounted",
 | 
			
		||||
  buildable_to = true,
 | 
			
		||||
  tile_images = { "vines_side.png" },
 | 
			
		||||
  drawtype = "signlike",
 | 
			
		||||
  inventory_image = "vines_side.png",
 | 
			
		||||
  groups = vines_group,
 | 
			
		||||
  sounds = default.node_sound_leaves_defaults(),
 | 
			
		||||
  selection_box = {
 | 
			
		||||
    type = "wallmounted",
 | 
			
		||||
  },
 | 
			
		||||
  after_dig_node = function(pos, oldnode, oldmetadata, user)
 | 
			
		||||
    local wielded if user:get_wielded_item() ~= nil then wielded = user:get_wielded_item() else return end
 | 
			
		||||
    if 'vines:shears' == wielded:get_name() then 
 | 
			
		||||
      local inv = user:get_inventory()
 | 
			
		||||
      if inv then
 | 
			
		||||
        inv:add_item("main", ItemStack(oldnode.name))
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
minetest.register_node("vines:side_rotten", {
 | 
			
		||||
  description = "Vine",
 | 
			
		||||
  walkable = false,
 | 
			
		||||
  climbable = false,
 | 
			
		||||
  drop = "",
 | 
			
		||||
  sunlight_propagates = true,
 | 
			
		||||
  paramtype = "light",
 | 
			
		||||
  paramtype2 = "wallmounted",
 | 
			
		||||
  buildable_to = true,
 | 
			
		||||
  tile_images = { "vines_side_rotten.png" },
 | 
			
		||||
  drawtype = "signlike",
 | 
			
		||||
  inventory_image = "vines_side.png",
 | 
			
		||||
  groups = {snappy = 3,flammable=2, hanging_node=1,vines_cleanup=1},
 | 
			
		||||
  sounds = default.node_sound_leaves_defaults(),
 | 
			
		||||
  selection_box = {
 | 
			
		||||
    type = "wallmounted",
 | 
			
		||||
  },
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
minetest.register_node("vines:willow", {
 | 
			
		||||
  description = "Vine",
 | 
			
		||||
  walkable = false,
 | 
			
		||||
  climbable = true,
 | 
			
		||||
  drop = "",
 | 
			
		||||
  sunlight_propagates = true,
 | 
			
		||||
  paramtype = "light",
 | 
			
		||||
  paramtype2 = "wallmounted",
 | 
			
		||||
  buildable_to = true,
 | 
			
		||||
  tile_images = { "vines_willow.png" },
 | 
			
		||||
  drawtype = "signlike",
 | 
			
		||||
  inventory_image = "vines_willow.png",
 | 
			
		||||
  groups = vines_group,
 | 
			
		||||
  sounds = default.node_sound_leaves_defaults(),
 | 
			
		||||
  selection_box = {
 | 
			
		||||
    type = "wallmounted",
 | 
			
		||||
  },
 | 
			
		||||
  after_dig_node = function(pos, oldnode, oldmetadata, user)
 | 
			
		||||
    local wielded if user:get_wielded_item() ~= nil then wielded = user:get_wielded_item() else return end
 | 
			
		||||
    if 'vines:shears' == wielded:get_name() then 
 | 
			
		||||
      local inv = user:get_inventory()
 | 
			
		||||
      if inv then
 | 
			
		||||
        inv:add_item("main", ItemStack(oldnode.name))
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
minetest.register_node("vines:willow_rotten", {
 | 
			
		||||
  description = "Vine",
 | 
			
		||||
  walkable = false,
 | 
			
		||||
  climbable = false,
 | 
			
		||||
  sunlight_propagates = true,
 | 
			
		||||
  paramtype = "light",
 | 
			
		||||
  drop = "",
 | 
			
		||||
  paramtype2 = "wallmounted",
 | 
			
		||||
  buildable_to = true,
 | 
			
		||||
  tile_images = { "vines_willow_rotten.png" },
 | 
			
		||||
  drawtype = "signlike",
 | 
			
		||||
  inventory_image = "vines_willow.png",
 | 
			
		||||
  groups = {snappy = 3,flammable=2, hanging_node=1,vines_cleanup=1},
 | 
			
		||||
  sounds = default.node_sound_leaves_defaults(),
 | 
			
		||||
  selection_box = {
 | 
			
		||||
    type = "wallmounted",
 | 
			
		||||
  },
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
minetest.register_node("vines:root", {
 | 
			
		||||
  description = "Vine",
 | 
			
		||||
  walkable = false,
 | 
			
		||||
  climbable = true,
 | 
			
		||||
  sunlight_propagates = true,
 | 
			
		||||
  paramtype = "light",
 | 
			
		||||
  buildable_to = true,
 | 
			
		||||
  tile_images = { "vines_root.png" },
 | 
			
		||||
  drawtype = "plantlike",
 | 
			
		||||
  inventory_image = "vines_root.png",
 | 
			
		||||
  groups = {vines=1,snappy = 3,flammable=2, hanging_node=1,vines_cleanup=1},
 | 
			
		||||
  sounds = default.node_sound_leaves_defaults(),
 | 
			
		||||
  selection_box = {
 | 
			
		||||
    type = "fixed",
 | 
			
		||||
    fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7},
 | 
			
		||||
  },
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
minetest.register_node("vines:vine", {
 | 
			
		||||
  description = "Vine",
 | 
			
		||||
  walkable = false,
 | 
			
		||||
  climbable = true,
 | 
			
		||||
  sunlight_propagates = true,
 | 
			
		||||
  drop = "",
 | 
			
		||||
  paramtype = "light",
 | 
			
		||||
  buildable_to = true,
 | 
			
		||||
  tile_images = { "vines_vine.png" },
 | 
			
		||||
  drawtype = "plantlike",
 | 
			
		||||
  inventory_image = "vines_vine.png",
 | 
			
		||||
  groups = vines_group,
 | 
			
		||||
  sounds = default.node_sound_leaves_defaults(),
 | 
			
		||||
  selection_box = {
 | 
			
		||||
    type = "fixed",
 | 
			
		||||
    fixed = {-0.3, -1/2, -0.3, 0.3, 1/2, 0.3},
 | 
			
		||||
  },
 | 
			
		||||
  after_dig_node = function(pos, oldnode, oldmetadata, user)
 | 
			
		||||
    local wielded if user:get_wielded_item() ~= nil then wielded = user:get_wielded_item() else return end
 | 
			
		||||
    if 'vines:shears' == wielded:get_name() then 
 | 
			
		||||
      local inv = user:get_inventory()
 | 
			
		||||
      if inv then
 | 
			
		||||
        inv:add_item("main", ItemStack(oldnode.name))
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
minetest.register_node("vines:vine_rotten", {
 | 
			
		||||
  description = "Rotten vine",
 | 
			
		||||
  walkable = false,
 | 
			
		||||
  climbable = true,
 | 
			
		||||
  drop = "",
 | 
			
		||||
  sunlight_propagates = true,
 | 
			
		||||
  paramtype = "light",
 | 
			
		||||
  buildable_to = true,
 | 
			
		||||
  tile_images = { "vines_vine_rotten.png" },
 | 
			
		||||
  drawtype = "plantlike",
 | 
			
		||||
  inventory_image = "vines_vine_rotten.png",
 | 
			
		||||
  groups = {snappy = 3,flammable=2, hanging_node=1,vines_cleanup=1},
 | 
			
		||||
  sounds = default.node_sound_leaves_defaults(),
 | 
			
		||||
  selection_box = {
 | 
			
		||||
    type = "fixed",
 | 
			
		||||
    fixed = {-0.3, -1/2, -0.3, 0.3, 1/2, 0.3},
 | 
			
		||||
  },
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
-- vine rotting
 | 
			
		||||
 | 
			
		||||
minetest.register_abm({
 | 
			
		||||
  nodenames = {"vines:vine", "vines:side", "vines:willow"},
 | 
			
		||||
  interval = vines.rot_interval,
 | 
			
		||||
  chance = vines.rot_chance,
 | 
			
		||||
  action = function(pos, node, active_object_count, active_object_count_wider)
 | 
			
		||||
    if minetest.find_node_near(pos, 5, "group:tree") == nil then
 | 
			
		||||
      local walldir = node.param2
 | 
			
		||||
      minetest.add_node(pos, {name=node.name.."_rotten", param2 = walldir})
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
-- vine growth
 | 
			
		||||
 | 
			
		||||
minetest.register_abm({
 | 
			
		||||
  nodenames = {"vines:vine", "vines:side", "vines:willow"},
 | 
			
		||||
  interval = vines.growth_interval,
 | 
			
		||||
  chance = vines.growth_chance,
 | 
			
		||||
  action = function(pos, node, active_object_count, active_object_count_wider)
 | 
			
		||||
    local p = {x=pos.x, y=pos.y-1, z=pos.z}
 | 
			
		||||
    local n = minetest.get_node(p)
 | 
			
		||||
    if n.name == "air" then
 | 
			
		||||
      local walldir = node.param2
 | 
			
		||||
      minetest.add_node(p, {name=node.name, param2 = walldir})
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
-- cleanup if the initial tree is missing entirely (e.g. has been dug away)
 | 
			
		||||
 | 
			
		||||
minetest.register_abm({
 | 
			
		||||
	nodenames = {"group:vines_cleanup"},
 | 
			
		||||
	interval = 10,
 | 
			
		||||
	chance = 5,
 | 
			
		||||
	action = function(pos, node, active_object_count, active_object_count_wider)
 | 
			
		||||
		if not minetest.find_node_near(pos, 1, jungle_leaves_list) then
 | 
			
		||||
			local p_top = {x=pos.x, y=pos.y+1, z=pos.z}
 | 
			
		||||
			if minetest.get_item_group(minetest.get_node(p_top).name, "vines_cleanup") == 0 then
 | 
			
		||||
				minetest.remove_node(pos)
 | 
			
		||||
			end
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
-- rope extension
 | 
			
		||||
 | 
			
		||||
minetest.register_abm({
 | 
			
		||||
  nodenames = {"vines:rope_end"},
 | 
			
		||||
  interval = 1,
 | 
			
		||||
  chance = 1,
 | 
			
		||||
  drop = "",
 | 
			
		||||
  action = function(pos, node, active_object_count, active_object_count_wider)
 | 
			
		||||
    local p = {x=pos.x, y=pos.y-1, z=pos.z}
 | 
			
		||||
    local n = minetest.get_node(p)
 | 
			
		||||
    --remove if top node is removed
 | 
			
		||||
    if  n.name == "air" then
 | 
			
		||||
      minetest.set_node(pos, {name="vines:rope"})
 | 
			
		||||
      minetest.add_node(p, {name="vines:rope_end"})
 | 
			
		||||
    end 
 | 
			
		||||
  end
 | 
			
		||||
})
 | 
			
		||||
--Craft
 | 
			
		||||
minetest.register_craft({
 | 
			
		||||
  output = 'vines:rope_block',
 | 
			
		||||
  recipe = {
 | 
			
		||||
    {'', 'default:wood', ''},
 | 
			
		||||
    {'', 'vines:side', ''},
 | 
			
		||||
    {'', 'vines:side', ''},
 | 
			
		||||
  }
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
minetest.register_craftitem("vines:vines", {
 | 
			
		||||
  description = "Vines",
 | 
			
		||||
  inventory_image = "vines_item.png",
 | 
			
		||||
})
 | 
			
		||||
--spawning
 | 
			
		||||
plantslib:spawn_on_surfaces({
 | 
			
		||||
  avoid_nodes = {"vines:vine"},
 | 
			
		||||
  avoid_radius = 5,
 | 
			
		||||
  spawn_delay = spawn_interval,
 | 
			
		||||
  spawn_plants = {"vines:vine"},
 | 
			
		||||
  spawn_chance = 10,
 | 
			
		||||
  spawn_surfaces = {"default:dirt_with_grass","default:dirt"},
 | 
			
		||||
  spawn_on_bottom = true,
 | 
			
		||||
  plantlife_limit = -0.9,
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
plantslib:spawn_on_surfaces({
 | 
			
		||||
  avoid_nodes = {"vines:vine", "vines:side"},
 | 
			
		||||
  avoid_radius = 3,
 | 
			
		||||
  spawn_delay = spawn_interval,
 | 
			
		||||
  spawn_plants = {"vines:side"},
 | 
			
		||||
  spawn_chance = 10,
 | 
			
		||||
  spawn_surfaces = jungle_leaves_list,
 | 
			
		||||
  spawn_on_side = true,
 | 
			
		||||
  near_nodes = {"default:jungletree"},
 | 
			
		||||
  near_nodes_size = 5,
 | 
			
		||||
  plantlife_limit = -0.9,
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
plantslib:spawn_on_surfaces({
 | 
			
		||||
  spawn_plants = {"vines:willow"},
 | 
			
		||||
  spawn_delay = spawn_interval,
 | 
			
		||||
  spawn_chance = 3,
 | 
			
		||||
  spawn_surfaces = {"moretrees:willow_leaves"},
 | 
			
		||||
  spawn_on_side = true,
 | 
			
		||||
  near_nodes = {"default:water_source"},
 | 
			
		||||
  near_nodes_size = 2,
 | 
			
		||||
  near_nodes_vertical = 5,
 | 
			
		||||
  near_nodes_count = 1,
 | 
			
		||||
  plantlife_limit = -0.9,
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
--Shears jojoa1997's shears
 | 
			
		||||
minetest.register_tool("vines:shears", {
 | 
			
		||||
	description = "Shears",
 | 
			
		||||
	inventory_image = "shears.png",
 | 
			
		||||
	wield_image = "shears.png",
 | 
			
		||||
	stack_max = 1,
 | 
			
		||||
	max_drop_level=3,
 | 
			
		||||
	tool_capabilities = {
 | 
			
		||||
    full_punch_interval = 1.0,
 | 
			
		||||
    max_drop_level=0,
 | 
			
		||||
    groupcaps={
 | 
			
		||||
      snappy={times={[3]=0.2}, maxwear=0.05, maxlevel=3},
 | 
			
		||||
      wool={times={[3]=0.2}, maxwear=0.05, maxlevel=3}
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
minetest.register_craft({
 | 
			
		||||
	output = 'vines:shears',
 | 
			
		||||
	recipe = {
 | 
			
		||||
		{'', 'default:steel_ingot', ''},
 | 
			
		||||
		{'default:stick', 'default:wood', 'default:steel_ingot'},
 | 
			
		||||
		{'', '', 'default:stick'},
 | 
			
		||||
	}
 | 
			
		||||
})
 | 
			
		||||
dofile( minetest.get_modpath( vines.name ) .. "/functions.lua" )
 | 
			
		||||
dofile( minetest.get_modpath( vines.name ) .. "/aliases.lua" )
 | 
			
		||||
dofile( minetest.get_modpath( vines.name ) .. "/recipes.lua" )
 | 
			
		||||
dofile( minetest.get_modpath( vines.name ) .. "/crafts.lua" )
 | 
			
		||||
dofile( minetest.get_modpath( vines.name ) .. "/nodes.lua" )
 | 
			
		||||
dofile( minetest.get_modpath( vines.name ) .. "/shear.lua" )
 | 
			
		||||
dofile( minetest.get_modpath( vines.name ) .. "/vines.lua" )
 | 
			
		||||
 | 
			
		||||
print("[Vines] Loaded!")
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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
 | 
			
		||||
})
 | 
			
		||||