mirror of
				https://github.com/mt-mods/plantlife_modpack.git
				synced 2025-11-04 07:25:30 +01:00 
			
		
		
		
	improve near_nodes support
This commit is contained in:
		@@ -111,18 +111,34 @@ pl_seaweed.grow_seaweed = function(pos)
 | 
				
			|||||||
	minetest.swap_node(right_here, {name=node_name, param2=math.random(1,3)})
 | 
						minetest.swap_node(right_here, {name=node_name, param2=math.random(1,3)})
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
biome_lib.register_on_generate({
 | 
					pl.register_on_generate({
 | 
				
			||||||
		surface = {"default:water_source"},
 | 
					        place_on = {
 | 
				
			||||||
		max_count = seaweed_max_count,
 | 
					            "default:water_source"
 | 
				
			||||||
		rarity = seaweed_rarity,
 | 
					        },
 | 
				
			||||||
		min_elevation = 1,
 | 
							noise_params = {
 | 
				
			||||||
		max_elevation = 40,
 | 
								scale = 0.00234375,
 | 
				
			||||||
		near_nodes = {"default:dirt_with_grass"},
 | 
								offset = 0,
 | 
				
			||||||
		near_nodes_size = 4,
 | 
								seed = 0,
 | 
				
			||||||
		near_nodes_vertical = 1,
 | 
								octaves = 3,
 | 
				
			||||||
		near_nodes_count = 1,
 | 
								lacunarity = 2,
 | 
				
			||||||
		plantlife_limit = -0.9,
 | 
								flags = "absvalue",
 | 
				
			||||||
 | 
								spread = {
 | 
				
			||||||
 | 
									x = 100,
 | 
				
			||||||
 | 
									y = 100,
 | 
				
			||||||
 | 
									z = 100
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								persist = 0.6
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							flags = "all_floors",
 | 
				
			||||||
 | 
							y_min = 1,
 | 
				
			||||||
 | 
							y_max = 40,
 | 
				
			||||||
 | 
							near_nodes = {
 | 
				
			||||||
 | 
					            "default:dirt_with_grass"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        near_nodes_size = 1
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
						"pl_seaweed:water_grass",
 | 
				
			||||||
 | 
						nil,
 | 
				
			||||||
	pl_seaweed.grow_seaweed
 | 
						pl_seaweed.grow_seaweed
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,10 @@
 | 
				
			|||||||
pl = {}
 | 
					pl = {}
 | 
				
			||||||
local deco = {}
 | 
					local deco = {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dofile(minetest.get_modpath("plantlife_lib") .. DIR_DELIM .. "util.lua")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function pl.get_def_from_id(id)
 | 
					function pl.get_def_from_id(id)
 | 
				
			||||||
	for i, _ in pairs(deco) do
 | 
						for i, _ in ipairs(deco) do
 | 
				
			||||||
		if deco[i][1].id and deco[i][1].id == id then
 | 
							if deco[i][1].id and deco[i][1].id == id then
 | 
				
			||||||
			return deco[i]
 | 
								return deco[i]
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
@@ -20,25 +22,33 @@ function pl.register_on_generate(def, plantname, index, func)
 | 
				
			|||||||
		noise_params = def.noise_params,
 | 
							noise_params = def.noise_params,
 | 
				
			||||||
		y_min = def.min_elevation,
 | 
							y_min = def.min_elevation,
 | 
				
			||||||
		y_max = def.max_elevation,
 | 
							y_max = def.max_elevation,
 | 
				
			||||||
		spawn_by = def.near_nodes,
 | 
					 | 
				
			||||||
		num_spawn_by = def.near_nodes_count,
 | 
					 | 
				
			||||||
		flags = def.flags,
 | 
							flags = def.flags,
 | 
				
			||||||
		decoration = "air",
 | 
							decoration = "air",
 | 
				
			||||||
		near_nodes_size = def.near_nodes_size,
 | 
					 | 
				
			||||||
		near_nodes_count = def.near_nodes_count,
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						-- handle near_nodes (we can't use the engine function for that)
 | 
				
			||||||
 | 
						if def.near_nodes then
 | 
				
			||||||
 | 
							deco_def.near_nodes = def.near_nodes
 | 
				
			||||||
 | 
							if def.near_nodes_size then
 | 
				
			||||||
 | 
								deco_def.near_nodes_size = def.near_nodes_size
 | 
				
			||||||
 | 
								if def.near_nodes_vertical then
 | 
				
			||||||
 | 
									deco_def.near_nodes_vertical = def.near_nodes_vertical
 | 
				
			||||||
 | 
								end
 | 
				
			||||||
 | 
							end
 | 
				
			||||||
 | 
							deco_def.near_nodes_count = def.near_nodes_count or 1
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
						-- save def
 | 
				
			||||||
	local next = #deco + 1
 | 
						local next = #deco + 1
 | 
				
			||||||
	deco[next] = {}
 | 
						deco[next] = {}
 | 
				
			||||||
	deco[next][1] = deco_def
 | 
						deco[next][1] = deco_def
 | 
				
			||||||
	deco[next][2] = func or nil
 | 
						deco[next][2] = func or nil
 | 
				
			||||||
	minetest.register_decoration(deco_def)
 | 
						minetest.register_decoration(deco_def)
 | 
				
			||||||
	print(dump(deco))
 | 
						-- print(dump(deco))
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
local ids = {}
 | 
					local ids = {}
 | 
				
			||||||
minetest.register_on_mods_loaded(function()
 | 
					minetest.register_on_mods_loaded(function()
 | 
				
			||||||
    -- print(dump(deco))
 | 
					    -- print(dump(deco))
 | 
				
			||||||
    for k, v in pairs(deco) do
 | 
					    for k, v in ipairs(deco) do
 | 
				
			||||||
		local id = minetest.get_decoration_id(deco[k][1].name)
 | 
							local id = minetest.get_decoration_id(deco[k][1].name)
 | 
				
			||||||
        deco[k][1].id = id
 | 
					        deco[k][1].id = id
 | 
				
			||||||
		table.insert(ids, id)
 | 
							table.insert(ids, id)
 | 
				
			||||||
@@ -51,7 +61,7 @@ end)
 | 
				
			|||||||
local function place_handler(t)
 | 
					local function place_handler(t)
 | 
				
			||||||
	local def = pl.get_def_from_id(t.id)
 | 
						local def = pl.get_def_from_id(t.id)
 | 
				
			||||||
	-- near nodes handler
 | 
						-- near nodes handler
 | 
				
			||||||
	if def.near_nodes_count and -- not tested yet
 | 
						if def.near_nodes and
 | 
				
			||||||
		#minetest.find_nodes_in_area(
 | 
							#minetest.find_nodes_in_area(
 | 
				
			||||||
			{x = t.pos.x-def.near_nodes_size, y = t.pos.y-def.near_nodes_vertical, z = t.pos.z-def.near_nodes_size},
 | 
								{x = t.pos.x-def.near_nodes_size, y = t.pos.y-def.near_nodes_vertical, z = t.pos.z-def.near_nodes_size},
 | 
				
			||||||
			{x = t.pos.x+def.near_nodes_size, y = t.pos.y+def.near_nodes_vertical, z = t.pos.z+def.near_nodes_size},
 | 
								{x = t.pos.x+def.near_nodes_size, y = t.pos.y+def.near_nodes_vertical, z = t.pos.z+def.near_nodes_size},
 | 
				
			||||||
@@ -67,6 +77,7 @@ local function place_handler(t)
 | 
				
			|||||||
	-- some fun
 | 
						-- some fun
 | 
				
			||||||
	local player = minetest.get_player_by_name("Niklp")
 | 
						local player = minetest.get_player_by_name("Niklp")
 | 
				
			||||||
	-- player:set_pos(t.pos)
 | 
						-- player:set_pos(t.pos)
 | 
				
			||||||
 | 
						t.pos.y = t.pos.y + 3
 | 
				
			||||||
	minetest.add_particle({
 | 
						minetest.add_particle({
 | 
				
			||||||
		pos = t.pos,
 | 
							pos = t.pos,
 | 
				
			||||||
		expirationtime = 15,
 | 
							expirationtime = 15,
 | 
				
			||||||
@@ -78,9 +89,10 @@ local function place_handler(t)
 | 
				
			|||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
minetest.register_on_generated(function(minp, maxp, blockseed)
 | 
					minetest.register_on_generated(function(minp, maxp, blockseed)
 | 
				
			||||||
 | 
						local t0 = minetest.get_us_time()
 | 
				
			||||||
    local g = minetest.get_mapgen_object("gennotify")
 | 
					    local g = minetest.get_mapgen_object("gennotify")
 | 
				
			||||||
    local locations = {}
 | 
					    local locations = {}
 | 
				
			||||||
	for _, id in pairs(ids) do
 | 
						for _, id in ipairs(ids) do
 | 
				
			||||||
		local deco_locations = g["decoration#" .. id] or {}
 | 
							local deco_locations = g["decoration#" .. id] or {}
 | 
				
			||||||
		-- print("dl: " .. dump2(deco_locations))
 | 
							-- print("dl: " .. dump2(deco_locations))
 | 
				
			||||||
		for k, pos in pairs(deco_locations) do
 | 
							for k, pos in pairs(deco_locations) do
 | 
				
			||||||
@@ -93,10 +105,12 @@ minetest.register_on_generated(function(minp, maxp, blockseed)
 | 
				
			|||||||
		end
 | 
							end
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
    if #locations == 0 then return end
 | 
					    if #locations == 0 then return end
 | 
				
			||||||
	print("locations: " .. dump2(locations))
 | 
						-- print("locations: " .. dump2(locations))
 | 
				
			||||||
    for _, t in ipairs(locations) do
 | 
					    for _, t in ipairs(locations) do
 | 
				
			||||||
		place_handler(t)
 | 
							place_handler(t)
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
						local t1 = minetest.get_us_time()
 | 
				
			||||||
 | 
						print((t1 - t0) / 1000 .. " ms")
 | 
				
			||||||
end)
 | 
					end)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
--[[ Example plant
 | 
					--[[ Example plant
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										14
									
								
								plantlife_lib/util.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								plantlife_lib/util.lua
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
				
			|||||||
 | 
					-- Biome lib util functions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function pl.get_nodedef_field(nodename, fieldname)
 | 
				
			||||||
 | 
						if not minetest.registered_nodes[nodename] then
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
						return minetest.registered_nodes[nodename][fieldname]
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if minetest.get_modpath("unified_inventory") or not minetest.settings:get_bool("creative_mode") then
 | 
				
			||||||
 | 
						pl.expect_infinite_stacks = false
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
						pl.expect_infinite_stacks = true
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
@@ -169,19 +169,35 @@ biome_lib.register_on_generate({
 | 
				
			|||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if Twigs_on_water == true then
 | 
					if Twigs_on_water == true then
 | 
				
			||||||
biome_lib.register_on_generate({
 | 
					pl.register_on_generate({
 | 
				
			||||||
    surface = {"default:water_source"},
 | 
							place_on = {
 | 
				
			||||||
    max_count = Twigs_on_water_Max_Count,
 | 
								"default:water_source"
 | 
				
			||||||
    rarity = Twigs_on_water_Rarity,
 | 
							},
 | 
				
			||||||
    min_elevation = 1,
 | 
							noise_params = {
 | 
				
			||||||
	max_elevation = 40,
 | 
								flags = "absvalue",
 | 
				
			||||||
	near_nodes = {"group:tree"},
 | 
								offset = 0,
 | 
				
			||||||
	near_nodes_size = 3,
 | 
								scale = 0.05,
 | 
				
			||||||
	near_nodes_vertical = 1,
 | 
								spread = {
 | 
				
			||||||
	near_nodes_count = 1,
 | 
									z = 100,
 | 
				
			||||||
    plantlife_limit = -0.9,
 | 
									x = 100,
 | 
				
			||||||
  },
 | 
									y = 100
 | 
				
			||||||
  abstract_trunks.place_twig
 | 
								},
 | 
				
			||||||
 | 
								seed = 0,
 | 
				
			||||||
 | 
								octaves = 3,
 | 
				
			||||||
 | 
								lacunarity = 2,
 | 
				
			||||||
 | 
								persist = 0.6
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							flags = "all_floors",
 | 
				
			||||||
 | 
							y_min = 1,
 | 
				
			||||||
 | 
							y_max = 40,
 | 
				
			||||||
 | 
							near_nodes = {"group:tree"},
 | 
				
			||||||
 | 
							near_nodes_size = 3,
 | 
				
			||||||
 | 
							near_nodes_vertical = 1,
 | 
				
			||||||
 | 
							near_nodes_count = 1
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						"trunks:on_water",
 | 
				
			||||||
 | 
						nil,
 | 
				
			||||||
 | 
						abstract_trunks.place_twig
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -356,24 +372,43 @@ abstract_trunks.grow_moss_on_ground = function(pos)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
biome_lib.register_on_generate({
 | 
					pl.register_on_generate({
 | 
				
			||||||
    surface = {"default:dirt_with_grass"},
 | 
					        y_max = 40,
 | 
				
			||||||
    max_count = Moss_on_ground_Max_Count,
 | 
					        flags = "all_floors",
 | 
				
			||||||
    rarity = Moss_on_ground_Rarity,
 | 
					        deco_type = "simple",
 | 
				
			||||||
    min_elevation = 1,
 | 
					        place_on = {
 | 
				
			||||||
	max_elevation = 40,
 | 
								"default:dirt_with_grass"
 | 
				
			||||||
	near_nodes = {
 | 
					        },
 | 
				
			||||||
		"group:tree",
 | 
					        noise_params = {
 | 
				
			||||||
		"ferns:fern_03",
 | 
								offset = 0,
 | 
				
			||||||
		"ferns:fern_02",
 | 
								scale = 0.1,
 | 
				
			||||||
		"ferns:fern_01"
 | 
								persist = 0.6,
 | 
				
			||||||
 | 
								seed = 0,
 | 
				
			||||||
 | 
								octaves = 3,
 | 
				
			||||||
 | 
								lacunarity = 2,
 | 
				
			||||||
 | 
								flags = "absvalue",
 | 
				
			||||||
 | 
								spread = {
 | 
				
			||||||
 | 
									x = 100,
 | 
				
			||||||
 | 
									y = 100,
 | 
				
			||||||
 | 
									z = 100
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        flags = "all_floors",
 | 
				
			||||||
 | 
							y_min = 1, 
 | 
				
			||||||
 | 
							y_max = 40,
 | 
				
			||||||
 | 
							near_nodes = {
 | 
				
			||||||
 | 
								"group:tree",
 | 
				
			||||||
 | 
								"ferns:fern_03",
 | 
				
			||||||
 | 
								"ferns:fern_02",
 | 
				
			||||||
 | 
								"ferns:fern_01"
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							near_nodes_size = 2,
 | 
				
			||||||
 | 
							near_nodes_vertical = 1,
 | 
				
			||||||
 | 
							near_nodes_count = 1
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	near_nodes_size = 2,
 | 
						"trunks:on_dirt_with_grass",
 | 
				
			||||||
	near_nodes_vertical = 1,
 | 
						nil,
 | 
				
			||||||
	near_nodes_count = 1,
 | 
						abstract_trunks.grow_moss_on_ground
 | 
				
			||||||
    plantlife_limit = -0.9,
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  abstract_trunks.grow_moss_on_ground
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -73,25 +73,41 @@ abstract_woodsoils.place_soil = function(pos)
 | 
				
			|||||||
	end
 | 
						end
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
biome_lib.register_on_generate({
 | 
					pl.register_on_generate({
 | 
				
			||||||
    surface = {
 | 
							place_on = {
 | 
				
			||||||
		"group:tree",
 | 
								"group:tree",
 | 
				
			||||||
		"ferns:fern_03",
 | 
								"ferns:fern_03",
 | 
				
			||||||
		"ferns:fern_02",
 | 
								"ferns:fern_02",
 | 
				
			||||||
		"ferns:fern_01"
 | 
								"ferns:fern_01"
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
					        noise_params = {
 | 
				
			||||||
 | 
								flags = "absvalue",
 | 
				
			||||||
 | 
								offset = 0,
 | 
				
			||||||
 | 
								scale = 0.15625,
 | 
				
			||||||
 | 
								spread = {
 | 
				
			||||||
 | 
									x = 100,
 | 
				
			||||||
 | 
									y = 100,
 | 
				
			||||||
 | 
									z = 100
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								seed = 0,
 | 
				
			||||||
 | 
								octaves = 3,
 | 
				
			||||||
 | 
								persist = 0.6,
 | 
				
			||||||
 | 
								lacunarity = 2
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
							flags = "all_floors,force_placement",
 | 
				
			||||||
 | 
							y_min = 1,
 | 
				
			||||||
 | 
					        y_max = 40,
 | 
				
			||||||
 | 
							near_nodes = {
 | 
				
			||||||
 | 
								"group:tree",
 | 
				
			||||||
 | 
								"ferns:fern_03",
 | 
				
			||||||
 | 
								"ferns:fern_02",
 | 
				
			||||||
 | 
								"ferns:fern_01"
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
					        near_nodes_count = 4
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
    max_count = 1000,
 | 
						"woodsoils:place_soil",
 | 
				
			||||||
    rarity = 1,
 | 
						nil,
 | 
				
			||||||
    min_elevation = 1,
 | 
						abstract_woodsoils.place_soil
 | 
				
			||||||
	max_elevation = 40,
 | 
					 | 
				
			||||||
	near_nodes = {"group:tree","ferns:fern_03","ferns:fern_02","ferns:fern_01"},
 | 
					 | 
				
			||||||
	near_nodes_size = 5,
 | 
					 | 
				
			||||||
	near_nodes_vertical = 1,
 | 
					 | 
				
			||||||
	near_nodes_count = 4,
 | 
					 | 
				
			||||||
    plantlife_limit = -1,
 | 
					 | 
				
			||||||
    check_air = false,
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  "abstract_woodsoils.place_soil"
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pl.register_on_generate({
 | 
					pl.register_on_generate({
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user