[minetestforfun_game] Update
- Add new tree - Creative mod improved - New schematic files
@@ -1,11 +1,16 @@
 | 
			
		||||
-- minetest/creative/init.lua
 | 
			
		||||
 | 
			
		||||
creative_inventory = {}
 | 
			
		||||
creative_inventory.creative_inventory_size = 0
 | 
			
		||||
 | 
			
		||||
-- Create detached creative inventory after loading all mods
 | 
			
		||||
minetest.after(0, function()
 | 
			
		||||
	local inv = minetest.create_detached_inventory("creative", {
 | 
			
		||||
creative_inventory.init_creative_inventory = function(player)
 | 
			
		||||
	local player_name = player:get_player_name()
 | 
			
		||||
	creative_inventory[player_name] = {}
 | 
			
		||||
	creative_inventory[player_name].size = 0
 | 
			
		||||
	creative_inventory[player_name].filter = nil
 | 
			
		||||
	creative_inventory[player_name].start_i = 1
 | 
			
		||||
 | 
			
		||||
	local inv = minetest.create_detached_inventory("creative_" .. player_name, {
 | 
			
		||||
		allow_move = function(inv, from_list, from_index, to_list, to_index, count, player)
 | 
			
		||||
			if minetest.setting_getbool("creative_mode") then
 | 
			
		||||
				return count
 | 
			
		||||
@@ -35,19 +40,41 @@ minetest.after(0, function()
 | 
			
		||||
			end
 | 
			
		||||
		end,
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	creative_inventory.update(player_name, nil, 2)
 | 
			
		||||
	--print("creative inventory size: "..dump(creative_inventory.creative_inventory_size))
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local function tab_category(tab_id)
 | 
			
		||||
	local id_category = {
 | 
			
		||||
		nil, -- Reserved for crafting tab.
 | 
			
		||||
		minetest.registered_items,
 | 
			
		||||
		minetest.registered_nodes,
 | 
			
		||||
		minetest.registered_tools,
 | 
			
		||||
		minetest.registered_craftitems
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	-- If index out of range, show default ("All") page.
 | 
			
		||||
	return id_category[tab_id] or id_category[2]
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function creative_inventory.update(player_name, filter, tab_id)
 | 
			
		||||
	local creative_list = {}
 | 
			
		||||
	for name,def in pairs(minetest.registered_items) do
 | 
			
		||||
		if (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0)
 | 
			
		||||
				and def.description and def.description ~= "" then
 | 
			
		||||
	local inv = minetest.get_inventory({type = "detached", name = "creative_" .. player_name})
 | 
			
		||||
 | 
			
		||||
	for name, def in pairs(tab_category(tab_id)) do
 | 
			
		||||
		if not (def.groups.not_in_creative_inventory == 1) and
 | 
			
		||||
				def.description and def.description ~= "" and
 | 
			
		||||
				(not filter or def.name:find(filter, 1, true)) then
 | 
			
		||||
			creative_list[#creative_list+1] = name
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	table.sort(creative_list)
 | 
			
		||||
	inv:set_size("main", #creative_list)
 | 
			
		||||
	inv:set_list("main", creative_list)
 | 
			
		||||
	creative_inventory.creative_inventory_size = #creative_list
 | 
			
		||||
	--print("creative inventory size: "..dump(creative_inventory.creative_inventory_size))
 | 
			
		||||
end)
 | 
			
		||||
	creative_inventory[player_name].size = #creative_list
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- Create the trash field
 | 
			
		||||
local trash = minetest.create_detached_inventory("creative_trash", {
 | 
			
		||||
@@ -66,70 +93,114 @@ local trash = minetest.create_detached_inventory("creative_trash", {
 | 
			
		||||
})
 | 
			
		||||
trash:set_size("main", 1)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
creative_inventory.set_creative_formspec = function(player, start_i, pagenum)
 | 
			
		||||
creative_inventory.set_creative_formspec = function(player, start_i, pagenum, tab_id)
 | 
			
		||||
	local player_name = player:get_player_name()
 | 
			
		||||
	local filter = creative_inventory[player_name].filter or ""
 | 
			
		||||
	pagenum = math.floor(pagenum)
 | 
			
		||||
	local pagemax = math.floor((creative_inventory.creative_inventory_size-1) / (6*4) + 1)
 | 
			
		||||
	player:set_inventory_formspec(
 | 
			
		||||
			"size[13,7.5]"..
 | 
			
		||||
			--"image[6,0.6;1,2;player.png]"..
 | 
			
		||||
			default.gui_bg..
 | 
			
		||||
			default.gui_bg_img..
 | 
			
		||||
			default.gui_slots..
 | 
			
		||||
			"list[current_player;main;5,3.5;8,1;]"..
 | 
			
		||||
			"list[current_player;main;5,4.75;8,3;8]"..
 | 
			
		||||
			"list[current_player;craft;8,0;3,3;]"..
 | 
			
		||||
			"list[current_player;craftpreview;12,1;1,1;]"..
 | 
			
		||||
			"image[11,1;1,1;gui_furnace_arrow_bg.png^[transformR270]"..
 | 
			
		||||
			"list[detached:creative;main;0.3,0.5;4,6;"..tostring(start_i).."]"..
 | 
			
		||||
			"label[2.0,6.55;"..tostring(pagenum).."/"..tostring(pagemax).."]"..
 | 
			
		||||
			"button[0.3,6.5;1.6,1;creative_prev;<<]"..
 | 
			
		||||
			"button[2.7,6.5;1.6,1;creative_next;>>]"..
 | 
			
		||||
			"listring[current_player;main]"..
 | 
			
		||||
			"listring[current_player;craft]"..
 | 
			
		||||
			"listring[current_player;main]"..
 | 
			
		||||
			"listring[detached:creative;main]"..
 | 
			
		||||
			"label[5,1.5;Trash:]"..
 | 
			
		||||
			"list[detached:creative_trash;main;5,2;1,1;]"..
 | 
			
		||||
			default.get_hotbar_bg(5,3.5)
 | 
			
		||||
	local pagemax = math.floor((creative_inventory[player_name].size - 1) / (3*8) + 1)
 | 
			
		||||
	tab_id = tab_id or 2
 | 
			
		||||
 | 
			
		||||
	player:set_inventory_formspec([[
 | 
			
		||||
		size[8,8.6]
 | 
			
		||||
		image[4.06,3.4;0.8,0.8;trash_icon.png]
 | 
			
		||||
		list[current_player;main;0,4.7;8,1;]
 | 
			
		||||
		list[current_player;main;0,5.85;8,3;8]
 | 
			
		||||
		list[detached:creative_trash;main;4,3.3;1,1;]
 | 
			
		||||
		tablecolumns[color;text;color;text]
 | 
			
		||||
		tableoptions[background=#00000000;highlight=#00000000;border=false]
 | 
			
		||||
		button[5.4,3.2;0.8,0.9;creative_prev;<]
 | 
			
		||||
		button[7.25,3.2;0.8,0.9;creative_next;>]
 | 
			
		||||
		button[2.1,3.4;0.8,0.5;search;?]
 | 
			
		||||
		button[2.75,3.4;0.8,0.5;clear;X]
 | 
			
		||||
		tooltip[search;Search]
 | 
			
		||||
		tooltip[clear;Reset]
 | 
			
		||||
		listring[current_player;main]
 | 
			
		||||
		]] ..
 | 
			
		||||
		"field[0.3,3.5;2.2,1;filter;;".. filter .."]"..
 | 
			
		||||
		"listring[detached:creative_".. player_name ..";main]"..
 | 
			
		||||
		"tabheader[0,0;tabs;Crafting,All,Nodes,Tools,Items;".. tostring(tab_id) ..";true;false]"..
 | 
			
		||||
		"list[detached:creative_".. player_name ..";main;0,0;8,3;".. tostring(start_i) .."]"..
 | 
			
		||||
		"table[6.05,3.35;1.15,0.5;pagenum;#FFFF00,".. tostring(pagenum) ..",#FFFFFF,/ ".. tostring(pagemax) .."]"..
 | 
			
		||||
		default.get_hotbar_bg(0,4.7)..
 | 
			
		||||
		default.gui_bg .. default.gui_bg_img .. default.gui_slots
 | 
			
		||||
	)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
creative_inventory.set_crafting_formspec = function(player)
 | 
			
		||||
	player:set_inventory_formspec([[
 | 
			
		||||
		size[8,7.5]
 | 
			
		||||
		list[current_player;craft;2,0.25;3,3;]
 | 
			
		||||
 		list[current_player;craftpreview;6,1.25;1,1;]
 | 
			
		||||
		list[current_player;main;0,3.6;8,1;]
 | 
			
		||||
		list[current_player;main;0,4.75;8,3;8]
 | 
			
		||||
		list[detached:creative_trash;main;0,2.25;1,1;]
 | 
			
		||||
		image[0.06,2.35;0.8,0.8;trash_icon.png]
 | 
			
		||||
		image[5,1.25;1,1;gui_furnace_arrow_bg.png^[transformR270]
 | 
			
		||||
		tabheader[0,0;tabs;Crafting,All,Nodes,Tools,Items;1;true;false]
 | 
			
		||||
		listring[current_player;main]
 | 
			
		||||
		listring[current_player;craft]
 | 
			
		||||
		]] ..
 | 
			
		||||
		default.get_hotbar_bg(0,3.6)..
 | 
			
		||||
		default.gui_bg .. default.gui_bg_img .. default.gui_slots
 | 
			
		||||
	)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
minetest.register_on_joinplayer(function(player)
 | 
			
		||||
	-- If in creative mode, modify player's inventory forms
 | 
			
		||||
	if not minetest.setting_getbool("creative_mode") then
 | 
			
		||||
		return
 | 
			
		||||
	end
 | 
			
		||||
	creative_inventory.set_creative_formspec(player, 0, 1)
 | 
			
		||||
	creative_inventory.init_creative_inventory(player)
 | 
			
		||||
	creative_inventory.set_creative_formspec(player, 0, 1, 2)
 | 
			
		||||
end)
 | 
			
		||||
 | 
			
		||||
minetest.register_on_player_receive_fields(function(player, formname, fields)
 | 
			
		||||
	if not minetest.setting_getbool("creative_mode") then
 | 
			
		||||
		return
 | 
			
		||||
	end
 | 
			
		||||
	-- Figure out current page from formspec
 | 
			
		||||
	local current_page = 0
 | 
			
		||||
	local player_name = player:get_player_name()
 | 
			
		||||
	local formspec = player:get_inventory_formspec()
 | 
			
		||||
	local start_i = string.match(formspec, "list%[detached:creative;main;[%d.]+,[%d.]+;[%d.]+,[%d.]+;(%d+)%]")
 | 
			
		||||
	local filter = formspec:match("filter;;([%w_:]+)") or ""
 | 
			
		||||
	local start_i = formspec:match("list%[detached:creative_".. player_name ..";.*;(%d+)%]")
 | 
			
		||||
	local tab_id = tonumber(formspec:match("tabheader%[.*;(%d+)%;.*%]"))
 | 
			
		||||
	local inv_size = creative_inventory[player_name].size
 | 
			
		||||
	start_i = tonumber(start_i) or 0
 | 
			
		||||
 | 
			
		||||
	if fields.quit then
 | 
			
		||||
		if tab_id == 1 then
 | 
			
		||||
			creative_inventory.set_crafting_formspec(player)
 | 
			
		||||
		end
 | 
			
		||||
	elseif fields.tabs then
 | 
			
		||||
		if tonumber(fields.tabs) == 1 then
 | 
			
		||||
			creative_inventory.set_crafting_formspec(player)
 | 
			
		||||
		else
 | 
			
		||||
			creative_inventory.update(player_name, filter, tonumber(fields.tabs))
 | 
			
		||||
			creative_inventory.set_creative_formspec(player, 0, 1, tonumber(fields.tabs))
 | 
			
		||||
		end
 | 
			
		||||
	elseif fields.clear then
 | 
			
		||||
		creative_inventory[player_name].filter = ""
 | 
			
		||||
		creative_inventory.update(player_name, nil, tab_id)
 | 
			
		||||
		creative_inventory.set_creative_formspec(player, 0, 1, tab_id)
 | 
			
		||||
	elseif fields.search then
 | 
			
		||||
		creative_inventory[player_name].filter = fields.filter:lower()
 | 
			
		||||
		creative_inventory.update(player_name, fields.filter:lower(), tab_id)
 | 
			
		||||
		creative_inventory.set_creative_formspec(player, 0, 1, tab_id)
 | 
			
		||||
	else
 | 
			
		||||
		if fields.creative_prev then
 | 
			
		||||
		start_i = start_i - 4*6
 | 
			
		||||
	end
 | 
			
		||||
	if fields.creative_next then
 | 
			
		||||
		start_i = start_i + 4*6
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
			start_i = start_i - 3*8
 | 
			
		||||
			if start_i < 0 then
 | 
			
		||||
		start_i = start_i + 4*6
 | 
			
		||||
				start_i = inv_size - (inv_size % (3*8))
 | 
			
		||||
			end
 | 
			
		||||
	if start_i >= creative_inventory.creative_inventory_size then
 | 
			
		||||
		start_i = start_i - 4*6
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	if start_i < 0 or start_i >= creative_inventory.creative_inventory_size then
 | 
			
		||||
		elseif fields.creative_next then
 | 
			
		||||
			start_i = start_i + 3*8
 | 
			
		||||
			if start_i >= inv_size then
 | 
			
		||||
				start_i = 0
 | 
			
		||||
			end
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
	creative_inventory.set_creative_formspec(player, start_i, start_i / (6*4) + 1)
 | 
			
		||||
		creative_inventory.set_creative_formspec(player, start_i, start_i / (3*8) + 1, tab_id)
 | 
			
		||||
	end
 | 
			
		||||
end)
 | 
			
		||||
 | 
			
		||||
if minetest.setting_getbool("creative_mode") then
 | 
			
		||||
@@ -171,5 +242,4 @@ if minetest.setting_getbool("creative_mode") then
 | 
			
		||||
			end
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
end
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								minetestforfun_game/mods/creative/textures/trash_icon.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 179 B  | 
@@ -148,6 +148,14 @@ BlockMen (CC BY-SA 3.0):
 | 
			
		||||
  heart.png
 | 
			
		||||
  gui_*.png
 | 
			
		||||
 | 
			
		||||
sofar (CC BY-SA 3.0):
 | 
			
		||||
  default_book_written.png, based on default_book.png
 | 
			
		||||
  default_aspen_sapling
 | 
			
		||||
  default_aspen_leaves
 | 
			
		||||
  default_aspen_tree
 | 
			
		||||
  default_aspen_tree_top, derived from default_pine_tree_top (by paramat)
 | 
			
		||||
  default_aspen_wood, derived from default_pine_wood (by paramat)
 | 
			
		||||
 | 
			
		||||
Neuromancer (CC BY-SA 2.0):
 | 
			
		||||
  default_cobble.png, based on texture by Brane praefect
 | 
			
		||||
  default_mossycobble.png, based on texture by Brane praefect
 | 
			
		||||
 
 | 
			
		||||
@@ -35,6 +35,13 @@ minetest.register_craft({
 | 
			
		||||
	}
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
minetest.register_craft({
 | 
			
		||||
	output = 'default:aspen_wood 4',
 | 
			
		||||
	recipe = {
 | 
			
		||||
		{'default:aspen_tree'},
 | 
			
		||||
	}
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
minetest.register_craft({
 | 
			
		||||
	output = 'default:stick 9',
 | 
			
		||||
	recipe = {
 | 
			
		||||
 
 | 
			
		||||
@@ -85,12 +85,42 @@ minetest.register_craftitem("default:book", {
 | 
			
		||||
 | 
			
		||||
minetest.register_craftitem("default:book_written", {
 | 
			
		||||
	description = "Book With Text",
 | 
			
		||||
	inventory_image = "default_book.png",
 | 
			
		||||
	inventory_image = "default_book_written.png",
 | 
			
		||||
	groups = {book=1, not_in_creative_inventory=1},
 | 
			
		||||
	stack_max = 1,
 | 
			
		||||
	on_use = book_on_use,
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
minetest.register_craft({
 | 
			
		||||
	type = "shapeless",
 | 
			
		||||
	output = "default:book_written",
 | 
			
		||||
	recipe = { "default:book", "default:book_written" }
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv)
 | 
			
		||||
	if itemstack:get_name() ~= "default:book_written" then
 | 
			
		||||
		return
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	local copy = ItemStack("default:book_written")
 | 
			
		||||
	local original
 | 
			
		||||
	local index
 | 
			
		||||
	for i = 1, player:get_inventory():get_size("craft") do
 | 
			
		||||
		if old_craft_grid[i]:get_name() == "default:book_written" then
 | 
			
		||||
			original = old_craft_grid[i]
 | 
			
		||||
			index = i
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
	if not original then
 | 
			
		||||
		return
 | 
			
		||||
	end
 | 
			
		||||
	local copymeta = original:get_metadata()
 | 
			
		||||
	-- copy of the book held by player's mouse cursor
 | 
			
		||||
	itemstack:set_metadata(copymeta)
 | 
			
		||||
	-- put the book with metadata back in the craft grid
 | 
			
		||||
	craft_inv:set_stack("craft", index, original)
 | 
			
		||||
end)
 | 
			
		||||
 | 
			
		||||
minetest.register_craftitem("default:coal_lump", {
 | 
			
		||||
	description = "Coal Lump",
 | 
			
		||||
	wield_scale = {x = 1, y = 1, z = 2},
 | 
			
		||||
 
 | 
			
		||||
@@ -2,6 +2,7 @@
 | 
			
		||||
-- Aliases for map generator outputs
 | 
			
		||||
--
 | 
			
		||||
 | 
			
		||||
minetest.register_alias("mapgen_air", "air")
 | 
			
		||||
minetest.register_alias("mapgen_stone", "default:stone")
 | 
			
		||||
minetest.register_alias("mapgen_dirt", "default:dirt")
 | 
			
		||||
minetest.register_alias("mapgen_dirt_with_grass", "default:dirt_with_grass")
 | 
			
		||||
@@ -77,7 +78,8 @@ function default.register_ores()
 | 
			
		||||
	minetest.register_ore({ 
 | 
			
		||||
		ore_type        = "blob",
 | 
			
		||||
		ore             = "default:sand",
 | 
			
		||||
		wherein          = {"default:stone"},
 | 
			
		||||
		wherein         = {"default:stone", "default:sandstone",
 | 
			
		||||
			"default:desert_stone"},
 | 
			
		||||
		clust_scarcity   = 24 * 24 * 24,
 | 
			
		||||
		clust_size       = 7,
 | 
			
		||||
		y_min            = -63,
 | 
			
		||||
@@ -98,7 +100,7 @@ function default.register_ores()
 | 
			
		||||
	minetest.register_ore({
 | 
			
		||||
		ore_type        = "blob",
 | 
			
		||||
		ore             = "default:dirt",
 | 
			
		||||
		wherein          = {"default:stone"},
 | 
			
		||||
		wherein         = {"default:stone", "default:sandstone"},
 | 
			
		||||
		clust_scarcity   = 24 * 24 * 24,
 | 
			
		||||
		clust_size       = 7,
 | 
			
		||||
		y_min            = -63,
 | 
			
		||||
@@ -773,12 +775,30 @@ function default.register_biomes()
 | 
			
		||||
		--depth_water_top = ,
 | 
			
		||||
		--node_water = "",
 | 
			
		||||
		--node_river_water = "",
 | 
			
		||||
		y_min = 5,
 | 
			
		||||
		y_min = 6,
 | 
			
		||||
		y_max = 31000,
 | 
			
		||||
		heat_point = 40,
 | 
			
		||||
		humidity_point = 35,
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	minetest.register_biome({
 | 
			
		||||
		name = "stone_grassland_dunes",
 | 
			
		||||
		--node_dust = "",
 | 
			
		||||
		node_top = "default:sand",
 | 
			
		||||
		depth_top = 1,
 | 
			
		||||
		node_filler = "default:sand",
 | 
			
		||||
		depth_filler = 2,
 | 
			
		||||
		--node_stone = "",
 | 
			
		||||
		--node_water_top = "",
 | 
			
		||||
		--depth_water_top = ,
 | 
			
		||||
		--node_water = "",
 | 
			
		||||
		--node_river_water = "",
 | 
			
		||||
		y_min = 5,
 | 
			
		||||
		y_max = 5,
 | 
			
		||||
		heat_point = 40,
 | 
			
		||||
		humidity_point = 35,
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	minetest.register_biome({
 | 
			
		||||
		name = "stone_grassland_ocean",
 | 
			
		||||
		--node_dust = "",
 | 
			
		||||
@@ -810,12 +830,30 @@ function default.register_biomes()
 | 
			
		||||
		--depth_water_top = ,
 | 
			
		||||
		--node_water = "",
 | 
			
		||||
		--node_river_water = "",
 | 
			
		||||
		y_min = 5,
 | 
			
		||||
		y_min = 6,
 | 
			
		||||
		y_max = 31000,
 | 
			
		||||
		heat_point = 40,
 | 
			
		||||
		humidity_point = 65,
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	minetest.register_biome({
 | 
			
		||||
		name = "coniferous_forest_dunes",
 | 
			
		||||
		--node_dust = "",
 | 
			
		||||
		node_top = "default:sand",
 | 
			
		||||
		depth_top = 1,
 | 
			
		||||
		node_filler = "default:sand",
 | 
			
		||||
		depth_filler = 3,
 | 
			
		||||
		--node_stone = "",
 | 
			
		||||
		--node_water_top = "",
 | 
			
		||||
		--depth_water_top = ,
 | 
			
		||||
		--node_water = "",
 | 
			
		||||
		--node_river_water = "",
 | 
			
		||||
		y_min = 5,
 | 
			
		||||
		y_max = 5,
 | 
			
		||||
		heat_point = 40,
 | 
			
		||||
		humidity_point = 65,
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	minetest.register_biome({
 | 
			
		||||
		name = "coniferous_forest_ocean",
 | 
			
		||||
		--node_dust = "",
 | 
			
		||||
@@ -847,12 +885,30 @@ function default.register_biomes()
 | 
			
		||||
		--depth_water_top = ,
 | 
			
		||||
		--node_water = "",
 | 
			
		||||
		--node_river_water = "",
 | 
			
		||||
		y_min = 5,
 | 
			
		||||
		y_min = 6,
 | 
			
		||||
		y_max = 31000,
 | 
			
		||||
		heat_point = 60,
 | 
			
		||||
		humidity_point = 35,
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	minetest.register_biome({
 | 
			
		||||
		name = "sandstone_grassland_dunes",
 | 
			
		||||
		--node_dust = "",
 | 
			
		||||
		node_top = "default:sand",
 | 
			
		||||
		depth_top = 1,
 | 
			
		||||
		node_filler = "default:sand",
 | 
			
		||||
		depth_filler = 2,
 | 
			
		||||
		node_stone = "default:sandstone",
 | 
			
		||||
		--node_water_top = "",
 | 
			
		||||
		--depth_water_top = ,
 | 
			
		||||
		--node_water = "",
 | 
			
		||||
		--node_river_water = "",
 | 
			
		||||
		y_min = 5,
 | 
			
		||||
		y_max = 5,
 | 
			
		||||
		heat_point = 60,
 | 
			
		||||
		humidity_point = 35,
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	minetest.register_biome({
 | 
			
		||||
		name = "sandstone_grassland_ocean",
 | 
			
		||||
		--node_dust = "",
 | 
			
		||||
@@ -1227,7 +1283,9 @@ local function register_grass_decoration(offset, scale, length)
 | 
			
		||||
			persist = 0.6
 | 
			
		||||
		},
 | 
			
		||||
		biomes = {"stone_grassland", "sandstone_grassland",
 | 
			
		||||
			"deciduous_forest", "coniferous_forest"},
 | 
			
		||||
			"deciduous_forest", "coniferous_forest",
 | 
			
		||||
			"stone_grassland_dunes", "sandstone_grassland_dunes",
 | 
			
		||||
			"coniferous_forest_dunes"},
 | 
			
		||||
		y_min = 1,
 | 
			
		||||
		y_max = 31000,
 | 
			
		||||
		decoration = "default:grass_"..length,
 | 
			
		||||
@@ -1257,7 +1315,7 @@ end
 | 
			
		||||
function default.register_decorations()
 | 
			
		||||
	minetest.clear_registered_decorations()
 | 
			
		||||
 | 
			
		||||
	-- Apple tree
 | 
			
		||||
	-- Apple tree and log
 | 
			
		||||
 | 
			
		||||
	minetest.register_decoration({
 | 
			
		||||
		deco_type = "schematic",
 | 
			
		||||
@@ -1278,7 +1336,40 @@ function default.register_decorations()
 | 
			
		||||
		flags = "place_center_x, place_center_z",
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	-- Jungle tree
 | 
			
		||||
	minetest.register_decoration({
 | 
			
		||||
		deco_type = "schematic",
 | 
			
		||||
		place_on = {"default:dirt_with_grass"},
 | 
			
		||||
		sidelen = 16,
 | 
			
		||||
		noise_params = {
 | 
			
		||||
			offset = 0.002,
 | 
			
		||||
			scale = 0.001,
 | 
			
		||||
			spread = {x = 250, y = 250, z = 250},
 | 
			
		||||
			seed = 2,
 | 
			
		||||
			octaves = 3,
 | 
			
		||||
			persist = 0.66
 | 
			
		||||
		},
 | 
			
		||||
		biomes = {"deciduous_forest"},
 | 
			
		||||
		y_min = 1,
 | 
			
		||||
		y_max = 31000,
 | 
			
		||||
		schematic = {
 | 
			
		||||
			size = { x = 3, y = 3, z = 1},
 | 
			
		||||
			data = {
 | 
			
		||||
				{ name = "air", prob = 0 },
 | 
			
		||||
				{ name = "air", prob = 0 },
 | 
			
		||||
				{ name = "air", prob = 0 },
 | 
			
		||||
				{ name = "default:tree", param2 = 12, prob = 191 },
 | 
			
		||||
				{ name = "default:tree", param2 = 12 },
 | 
			
		||||
				{ name = "default:tree", param2 = 12, prob = 127 },
 | 
			
		||||
				{ name = "air", prob = 0 },
 | 
			
		||||
				{ name = "flowers:mushroom_brown", prob = 63 },
 | 
			
		||||
				{ name = "air", prob = 0 },
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		flags = "place_center_x",
 | 
			
		||||
		rotation = "random",
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	-- Jungle tree and log
 | 
			
		||||
 | 
			
		||||
	minetest.register_decoration({
 | 
			
		||||
		deco_type = "schematic",
 | 
			
		||||
@@ -1293,7 +1384,33 @@ function default.register_decorations()
 | 
			
		||||
		rotation = "random",
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	-- Taiga and temperate coniferous forest pine tree
 | 
			
		||||
	minetest.register_decoration({
 | 
			
		||||
		deco_type = "schematic",
 | 
			
		||||
		place_on = {"default:dirt_with_grass", "default:dirt"},
 | 
			
		||||
		sidelen = 80,
 | 
			
		||||
		fill_ratio = 0.01,
 | 
			
		||||
		biomes = {"rainforest", "rainforest_swamp"},
 | 
			
		||||
		y_min = 1,
 | 
			
		||||
		y_max = 31000,
 | 
			
		||||
		schematic = {
 | 
			
		||||
			size = { x = 3, y = 3, z = 1},
 | 
			
		||||
			data = {
 | 
			
		||||
				{ name = "air", prob = 0 },
 | 
			
		||||
				{ name = "air", prob = 0 },
 | 
			
		||||
				{ name = "air", prob = 0 },
 | 
			
		||||
				{ name = "default:jungletree", param2 = 12, prob = 191 },
 | 
			
		||||
				{ name = "default:jungletree", param2 = 12 },
 | 
			
		||||
				{ name = "default:jungletree", param2 = 12, prob = 127 },
 | 
			
		||||
				{ name = "air", prob = 0 },
 | 
			
		||||
				{ name = "flowers:mushroom_brown", prob = 127 },
 | 
			
		||||
				{ name = "air", prob = 0 },
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		flags = "place_center_x",
 | 
			
		||||
		rotation = "random",
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	-- Taiga and temperate coniferous forest pine tree and log
 | 
			
		||||
 | 
			
		||||
	minetest.register_decoration({
 | 
			
		||||
		deco_type = "schematic",
 | 
			
		||||
@@ -1314,7 +1431,33 @@ function default.register_decorations()
 | 
			
		||||
		flags = "place_center_x, place_center_z",
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	-- Acacia tree
 | 
			
		||||
	minetest.register_decoration({
 | 
			
		||||
		deco_type = "schematic",
 | 
			
		||||
		place_on = {"default:dirt_with_snow", "default:dirt_with_grass"},
 | 
			
		||||
		sidelen = 80,
 | 
			
		||||
		fill_ratio = 0.003,
 | 
			
		||||
		biomes = {"taiga", "coniferous_forest"},
 | 
			
		||||
		y_min = 1,
 | 
			
		||||
		y_max = 31000,
 | 
			
		||||
		schematic = {
 | 
			
		||||
			size = { x = 3, y = 3, z = 1},
 | 
			
		||||
			data = {
 | 
			
		||||
				{ name = "air", prob = 0 },
 | 
			
		||||
				{ name = "air", prob = 0 },
 | 
			
		||||
				{ name = "air", prob = 0 },
 | 
			
		||||
				{ name = "default:pine_tree", param2 = 12, prob = 191 },
 | 
			
		||||
				{ name = "default:pine_tree", param2 = 12 },
 | 
			
		||||
				{ name = "default:pine_tree", param2 = 12, prob = 127 },
 | 
			
		||||
				{ name = "air", prob = 0 },
 | 
			
		||||
				{ name = "flowers:mushroom_red", prob = 63 },
 | 
			
		||||
				{ name = "air", prob = 0 },
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		flags = "place_center_x",
 | 
			
		||||
		rotation = "random",
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	-- Acacia tree and log
 | 
			
		||||
 | 
			
		||||
	minetest.register_decoration({
 | 
			
		||||
		deco_type = "schematic",
 | 
			
		||||
@@ -1336,6 +1479,90 @@ function default.register_decorations()
 | 
			
		||||
		rotation = "random",
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	minetest.register_decoration({
 | 
			
		||||
		deco_type = "schematic",
 | 
			
		||||
		place_on = {"default:dirt_with_dry_grass"},
 | 
			
		||||
		sidelen = 16,
 | 
			
		||||
		noise_params = {
 | 
			
		||||
			offset = 0,
 | 
			
		||||
			scale = 0.001,
 | 
			
		||||
			spread = {x = 250, y = 250, z = 250},
 | 
			
		||||
			seed = 2,
 | 
			
		||||
			octaves = 3,
 | 
			
		||||
			persist = 0.66
 | 
			
		||||
		},
 | 
			
		||||
		biomes = {"savanna"},
 | 
			
		||||
		y_min = 1,
 | 
			
		||||
		y_max = 31000,
 | 
			
		||||
		schematic = {
 | 
			
		||||
			size = { x = 3, y = 2, z = 1},
 | 
			
		||||
			data = {
 | 
			
		||||
				{ name = "air", prob = 0 },
 | 
			
		||||
				{ name = "air", prob = 0 },
 | 
			
		||||
				{ name = "air", prob = 0 },
 | 
			
		||||
				{ name = "default:acacia_tree", param2 = 12, prob = 191 },
 | 
			
		||||
				{ name = "default:acacia_tree", param2 = 12 },
 | 
			
		||||
				{ name = "default:acacia_tree", param2 = 12, prob = 127 },
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		flags = "place_center_x",
 | 
			
		||||
		rotation = "random",
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	-- Aspen tree and log
 | 
			
		||||
 | 
			
		||||
	minetest.register_decoration({
 | 
			
		||||
		deco_type = "schematic",
 | 
			
		||||
		place_on = {"default:dirt_with_grass"},
 | 
			
		||||
		sidelen = 16,
 | 
			
		||||
		noise_params = {
 | 
			
		||||
			offset = 0.01,
 | 
			
		||||
			scale = -0.02,
 | 
			
		||||
			spread = {x = 250, y = 250, z = 250},
 | 
			
		||||
			seed = 2,
 | 
			
		||||
			octaves = 3,
 | 
			
		||||
			persist = 0.66
 | 
			
		||||
		},
 | 
			
		||||
		biomes = {"deciduous_forest"},
 | 
			
		||||
		y_min = 1,
 | 
			
		||||
		y_max = 31000,
 | 
			
		||||
		schematic = minetest.get_modpath("default").."/schematics/aspen_tree.mts",
 | 
			
		||||
		flags = "place_center_x, place_center_z",
 | 
			
		||||
		rotation = "random",
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	minetest.register_decoration({
 | 
			
		||||
		deco_type = "schematic",
 | 
			
		||||
		place_on = {"default:dirt_with_grass"},
 | 
			
		||||
		sidelen = 16,
 | 
			
		||||
		noise_params = {
 | 
			
		||||
			offset = 0.0005,
 | 
			
		||||
			scale = -0.001,
 | 
			
		||||
			spread = {x = 250, y = 250, z = 250},
 | 
			
		||||
			seed = 2,
 | 
			
		||||
			octaves = 3,
 | 
			
		||||
			persist = 0.66
 | 
			
		||||
		},
 | 
			
		||||
		biomes = {"deciduous_forest"},
 | 
			
		||||
		y_min = 1,
 | 
			
		||||
		y_max = 31000,
 | 
			
		||||
		schematic = {
 | 
			
		||||
			size = { x = 3, y = 3, z = 1},
 | 
			
		||||
			data = {
 | 
			
		||||
				{ name = "air", prob = 0 },
 | 
			
		||||
				{ name = "air", prob = 0 },
 | 
			
		||||
				{ name = "air", prob = 0 },
 | 
			
		||||
				{ name = "default:aspen_tree", param2 = 12 },
 | 
			
		||||
				{ name = "default:aspen_tree", param2 = 12 },
 | 
			
		||||
				{ name = "default:aspen_tree", param2 = 12, prob = 127 },
 | 
			
		||||
				{ name = "flowers:mushroom_red", prob = 63 },
 | 
			
		||||
				{ name = "flowers:mushroom_brown", prob = 63 },
 | 
			
		||||
				{ name = "air", prob = 0 },
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		flags = "place_center_x",
 | 
			
		||||
		rotation = "random",
 | 
			
		||||
	})
 | 
			
		||||
	-- Large cactus
 | 
			
		||||
 | 
			
		||||
	minetest.register_decoration({
 | 
			
		||||
 
 | 
			
		||||
@@ -80,6 +80,11 @@ default:acacia_wood
 | 
			
		||||
default:acacia_leaves
 | 
			
		||||
default:acacia_sapling
 | 
			
		||||
 | 
			
		||||
default:aspen_tree
 | 
			
		||||
default:aspen_wood
 | 
			
		||||
default:aspen_leaves
 | 
			
		||||
default:aspen_sapling
 | 
			
		||||
 | 
			
		||||
default:cherry_tree
 | 
			
		||||
default:cherry_log
 | 
			
		||||
default:cherry_plank
 | 
			
		||||
@@ -822,6 +827,58 @@ minetest.register_node("default:acacia_sapling", {
 | 
			
		||||
	sounds = default.node_sound_leaves_defaults(),
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
minetest.register_node("default:aspen_tree", {
 | 
			
		||||
	description = "Aspen Tree",
 | 
			
		||||
	tiles = {"default_aspen_tree_top.png", "default_aspen_tree_top.png",
 | 
			
		||||
		"default_aspen_tree.png"},
 | 
			
		||||
	paramtype2 = "facedir",
 | 
			
		||||
	is_ground_content = false,
 | 
			
		||||
	groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
 | 
			
		||||
	sounds = default.node_sound_wood_defaults(),
 | 
			
		||||
 | 
			
		||||
	on_place = minetest.rotate_node
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
minetest.register_node("default:aspen_wood", {
 | 
			
		||||
	description = "Aspen Wood Planks",
 | 
			
		||||
	tiles = {"default_aspen_wood.png"},
 | 
			
		||||
	is_ground_content = false,
 | 
			
		||||
	groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, wood = 1},
 | 
			
		||||
	sounds = default.node_sound_wood_defaults(),
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
minetest.register_node("default:aspen_leaves", {
 | 
			
		||||
	description = "Aspen Leaves",
 | 
			
		||||
	drawtype = "allfaces_optional",
 | 
			
		||||
	visual_scale = 1.3,
 | 
			
		||||
	tiles = {"default_aspen_leaves.png"},
 | 
			
		||||
	waving = 1,
 | 
			
		||||
	paramtype = "light",
 | 
			
		||||
	is_ground_content = false,
 | 
			
		||||
	groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1},
 | 
			
		||||
	drop = {
 | 
			
		||||
		max_items = 1,
 | 
			
		||||
		items = {
 | 
			
		||||
			{items = {"default:aspen_sapling"}, rarity = 20},
 | 
			
		||||
			{items = {"default:aspen_leaves"}}
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
	sounds = default.node_sound_leaves_defaults(),
 | 
			
		||||
 | 
			
		||||
	after_place_node = default.after_place_leaves,
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
minetest.register_node("default:aspen_sapling", {
 | 
			
		||||
	description = "Aspen Tree Sapling",
 | 
			
		||||
	drawtype = "plantlike",
 | 
			
		||||
	visual_scale = 1.0,
 | 
			
		||||
	tiles = {"default_aspen_sapling.png"},
 | 
			
		||||
	inventory_image = "default_aspen_sapling.png",
 | 
			
		||||
	wield_image = "default_aspen_sapling.png",
 | 
			
		||||
	paramtype = "light",
 | 
			
		||||
	sunlight_propagates = true,
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
-- From BFD, cherry tree
 | 
			
		||||
minetest.register_node("default:cherry_tree", {
 | 
			
		||||
	description = "Cherry Log",
 | 
			
		||||
@@ -906,7 +963,8 @@ minetest.register_node("default:cherry_sapling", {
 | 
			
		||||
		type = "fixed",
 | 
			
		||||
		fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
 | 
			
		||||
	},
 | 
			
		||||
	groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1},
 | 
			
		||||
	groups = {snappy = 2, dig_immediate = 3, flammable = 2,
 | 
			
		||||
		attached_node = 1, sapling = 1},
 | 
			
		||||
	sounds = default.node_sound_leaves_defaults(),
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
@@ -1376,8 +1434,8 @@ minetest.register_node("default:water_source", {
 | 
			
		||||
	liquid_alternative_flowing = "default:water_flowing",
 | 
			
		||||
	liquid_alternative_source = "default:water_source",
 | 
			
		||||
	liquid_viscosity = 1,
 | 
			
		||||
	post_effect_color = {a = 103, r = 30, g = 60, b = 90},
 | 
			
		||||
	liquid_range = 6,
 | 
			
		||||
	post_effect_color = {a = 120, r = 20, g = 60, b = 80},
 | 
			
		||||
	groups = {water = 3, liquid = 3, puts_out_fire = 1},
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
@@ -1422,8 +1480,8 @@ minetest.register_node("default:water_flowing", {
 | 
			
		||||
	liquid_alternative_flowing = "default:water_flowing",
 | 
			
		||||
	liquid_alternative_source = "default:water_source",
 | 
			
		||||
	liquid_viscosity = 1,
 | 
			
		||||
	post_effect_color = {a = 103, r = 30, g = 60, b = 90},
 | 
			
		||||
	liquid_range = 6,
 | 
			
		||||
	post_effect_color = {a = 120, r = 20, g = 60, b = 80},
 | 
			
		||||
	groups = {water = 3, liquid = 3, puts_out_fire = 1,
 | 
			
		||||
		not_in_creative_inventory=1},
 | 
			
		||||
})
 | 
			
		||||
@@ -1470,7 +1528,7 @@ minetest.register_node("default:river_water_source", {
 | 
			
		||||
	liquid_viscosity = 1,
 | 
			
		||||
	liquid_renewable = false,
 | 
			
		||||
	liquid_range = 2,
 | 
			
		||||
	post_effect_color = {a = 64, r = 100, g = 100, b = 200},
 | 
			
		||||
	post_effect_color = {a = 103, r = 30, g = 76, b = 90},
 | 
			
		||||
	groups = {water = 3, liquid = 3, puts_out_fire = 1},
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
@@ -1517,7 +1575,7 @@ minetest.register_node("default:river_water_flowing", {
 | 
			
		||||
	liquid_viscosity = 1,
 | 
			
		||||
	liquid_renewable = false,
 | 
			
		||||
	liquid_range = 2,
 | 
			
		||||
	post_effect_color = {a = 64, r = 100, g = 100, b = 200},
 | 
			
		||||
	post_effect_color = {a = 103, r = 30, g = 76, b = 90},
 | 
			
		||||
	groups = {water = 3, liquid = 3, puts_out_fire = 1,
 | 
			
		||||
		not_in_creative_inventory = 1},
 | 
			
		||||
})
 | 
			
		||||
@@ -1566,7 +1624,7 @@ minetest.register_node("default:lava_source", {
 | 
			
		||||
	liquid_range = 6,
 | 
			
		||||
	liquid_renewable = false,
 | 
			
		||||
	damage_per_second = 4 * 2,
 | 
			
		||||
	post_effect_color = {a = 220, r = 250, g = 70, b = 20},
 | 
			
		||||
	post_effect_color = {a = 191, r = 255, g = 64, b = 0},
 | 
			
		||||
	groups = {lava = 3, liquid = 2, hot = 3, igniter = 1},
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
@@ -1614,7 +1672,7 @@ minetest.register_node("default:lava_flowing", {
 | 
			
		||||
	liquid_range = 6,
 | 
			
		||||
	liquid_renewable = false,
 | 
			
		||||
	damage_per_second = 4 * 2,
 | 
			
		||||
	post_effect_color = {a = 220, r = 250, g = 70, b = 20},
 | 
			
		||||
	post_effect_color = {a = 191, r = 255, g = 64, b = 0},
 | 
			
		||||
	groups = {lava = 3, liquid = 2, hot = 3, igniter = 1,
 | 
			
		||||
		not_in_creative_inventory = 1},
 | 
			
		||||
})
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								minetestforfun_game/mods/default/schematics/aspen_tree.mts
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 761 B  | 
| 
		 After Width: | Height: | Size: 320 B  | 
							
								
								
									
										
											BIN
										
									
								
								minetestforfun_game/mods/default/textures/default_aspen_tree.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 695 B  | 
| 
		 After Width: | Height: | Size: 656 B  | 
							
								
								
									
										
											BIN
										
									
								
								minetestforfun_game/mods/default/textures/default_aspen_wood.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 373 B  | 
| 
		 After Width: | Height: | Size: 228 B  | 
@@ -28,7 +28,8 @@ end
 | 
			
		||||
 | 
			
		||||
minetest.register_abm({
 | 
			
		||||
	nodenames = {"default:sapling", "default:junglesapling",
 | 
			
		||||
		"default:pine_sapling", "default:acacia_sapling"},
 | 
			
		||||
		"default:pine_sapling", "default:acacia_sapling",
 | 
			
		||||
		"default:aspen_sapling"},
 | 
			
		||||
	interval = 10,
 | 
			
		||||
	chance = 50,
 | 
			
		||||
	action = function(pos, node)
 | 
			
		||||
@@ -65,6 +66,10 @@ minetest.register_abm({
 | 
			
		||||
			minetest.log("action", "An acacia sapling grows into a tree at "..
 | 
			
		||||
				minetest.pos_to_string(pos))
 | 
			
		||||
			default.grow_new_acacia_tree(pos)
 | 
			
		||||
		elseif node.name == "default:aspen_sapling" then
 | 
			
		||||
			minetest.log("action", "An aspen sapling grows into a tree at "..
 | 
			
		||||
				minetest.pos_to_string(pos))
 | 
			
		||||
			default.grow_new_aspen_tree(pos)
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
})
 | 
			
		||||
@@ -395,6 +400,14 @@ function default.grow_new_acacia_tree(pos)
 | 
			
		||||
		path, random, nil, false)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- New aspen tree
 | 
			
		||||
 | 
			
		||||
function default.grow_new_aspen_tree(pos)
 | 
			
		||||
	local path = minetest.get_modpath("default") .. "/schematics/aspen_tree_from_sapling.mts"
 | 
			
		||||
	minetest.place_schematic({x = pos.x - 2, y = pos.y - 1, z = pos.z - 2},
 | 
			
		||||
		path, 0, nil, false)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- From BFD:
 | 
			
		||||
 | 
			
		||||
minetest.register_node("default:mg_cherry_sapling", {
 | 
			
		||||
 
 | 
			
		||||
@@ -6,6 +6,7 @@ License of source code:
 | 
			
		||||
-----------------------
 | 
			
		||||
Copyright (C) 2012 PilzAdam
 | 
			
		||||
modified by BlockMen (added sounds, glassdoors[glass, obsidian glass], trapdoor)
 | 
			
		||||
Steel trapdoor added by sofar.
 | 
			
		||||
 | 
			
		||||
This program is free software. It comes without any warranty, to
 | 
			
		||||
the extent permitted by applicable law. You can redistribute it
 | 
			
		||||
@@ -35,6 +36,10 @@ following Textures created by PenguinDad (CC BY-SA 4.0):
 | 
			
		||||
  door_glass.png
 | 
			
		||||
  door_obsidian_glass.png
 | 
			
		||||
 | 
			
		||||
Steel trapdoor textures by sofar (CC-BY-SA-3.0)
 | 
			
		||||
  doors_trapdoor_steel.png
 | 
			
		||||
  doors_trapdoor_steel_side.png
 | 
			
		||||
 | 
			
		||||
All other textures (created by PilzAdam): WTFPL
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -512,7 +512,19 @@ function doors.register_trapdoor(name, def)
 | 
			
		||||
	local name_closed = name
 | 
			
		||||
	local name_opened = name.."_open"
 | 
			
		||||
 | 
			
		||||
	def.on_rightclick = function (pos, node)
 | 
			
		||||
	local function check_player_priv(pos, player)
 | 
			
		||||
		if not def.only_placer_can_open then
 | 
			
		||||
			return true
 | 
			
		||||
		end
 | 
			
		||||
		local meta = minetest.get_meta(pos)
 | 
			
		||||
		local pn = player:get_player_name()
 | 
			
		||||
		return meta:get_string("doors_owner") == pn
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	def.on_rightclick = function (pos, node, clicker, itemstack, pointed_thing)
 | 
			
		||||
		if not check_player_priv(pos, clicker) then
 | 
			
		||||
			return
 | 
			
		||||
		end
 | 
			
		||||
		local newname = node.name == name_closed and name_opened or name_closed
 | 
			
		||||
		local sound = false
 | 
			
		||||
		if node.name == name_closed then sound = def.sound_open end
 | 
			
		||||
@@ -520,7 +532,7 @@ function doors.register_trapdoor(name, def)
 | 
			
		||||
		if sound then
 | 
			
		||||
			minetest.sound_play(sound, {pos = pos, gain = 0.3, max_hear_distance = 10})
 | 
			
		||||
		end
 | 
			
		||||
		minetest.set_node(pos, {name = newname, param1 = node.param1, param2 = node.param2})
 | 
			
		||||
		minetest.swap_node(pos, {name = newname, param1 = node.param1, param2 = node.param2})
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	def.on_rotate = minetest.get_modpath("screwdriver") and screwdriver.rotate_simple
 | 
			
		||||
@@ -530,6 +542,18 @@ function doors.register_trapdoor(name, def)
 | 
			
		||||
	def.paramtype = "light"
 | 
			
		||||
	def.paramtype2 = "facedir"
 | 
			
		||||
	def.is_ground_content = false
 | 
			
		||||
	def.can_dig = check_player_priv
 | 
			
		||||
 | 
			
		||||
	if def.only_placer_can_open then
 | 
			
		||||
		def.after_place_node = function(pos, placer, itemstack, pointed_thing)
 | 
			
		||||
			local pn = placer:get_player_name()
 | 
			
		||||
			local meta = minetest.get_meta(pos)
 | 
			
		||||
			meta:set_string("doors_owner", pn)
 | 
			
		||||
			meta:set_string("infotext", "Owned by "..pn)
 | 
			
		||||
 | 
			
		||||
			return minetest.setting_getbool("creative_mode")
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	local def_opened = table.copy(def)
 | 
			
		||||
	local def_closed = table.copy(def)
 | 
			
		||||
@@ -576,6 +600,19 @@ doors.register_trapdoor("doors:trapdoor", {
 | 
			
		||||
	sound_close = "doors_door_close"
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
doors.register_trapdoor("doors:trapdoor_steel", {
 | 
			
		||||
	description = "Steel Trapdoor",
 | 
			
		||||
	inventory_image = "doors_trapdoor_steel.png",
 | 
			
		||||
	wield_image = "doors_trapdoor_steel.png",
 | 
			
		||||
	tile_front = "doors_trapdoor_steel.png",
 | 
			
		||||
	tile_side = "doors_trapdoor_steel_side.png",
 | 
			
		||||
	only_placer_can_open = true,
 | 
			
		||||
	groups = {snappy=1, bendy=2, cracky=1, melty=2, level=2, door=1},
 | 
			
		||||
	sounds = default.node_sound_wood_defaults(),
 | 
			
		||||
	sound_open = "doors_door_open",
 | 
			
		||||
	sound_close = "doors_door_close"
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
minetest.register_craft({
 | 
			
		||||
	output = 'doors:trapdoor 2',
 | 
			
		||||
	recipe = {
 | 
			
		||||
@@ -585,6 +622,14 @@ minetest.register_craft({
 | 
			
		||||
	}
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
minetest.register_craft({
 | 
			
		||||
	output = 'doors:trapdoor_steel',
 | 
			
		||||
	recipe = {
 | 
			
		||||
		{'default:steel_ingot', 'default:steel_ingot'},
 | 
			
		||||
		{'default:steel_ingot', 'default:steel_ingot'},
 | 
			
		||||
	}
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
doors.register_trapdoor("doors:trapdoor_cherry", {
 | 
			
		||||
	description = "Cherry tree trapdoor",
 | 
			
		||||
	inventory_image = "doors_trapdoor_cherry.png",
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								minetestforfun_game/mods/doors/textures/doors_trapdoor_steel.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 153 B  | 
| 
		 After Width: | Height: | Size: 101 B  | 
@@ -147,61 +147,11 @@ minetest.register_abm({
 | 
			
		||||
-- Mushrooms
 | 
			
		||||
--
 | 
			
		||||
 | 
			
		||||
local mushrooms_datas = {
 | 
			
		||||
	{"brown", 2},
 | 
			
		||||
	{"red", -6}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
for _, m in pairs(mushrooms_datas) do
 | 
			
		||||
	local name, nut = m[1], m[2]
 | 
			
		||||
 | 
			
		||||
	-- Register fertile mushrooms
 | 
			
		||||
 | 
			
		||||
	-- These are placed by mapgen and the growing ABM.
 | 
			
		||||
	-- These drop an infertile mushroom, and 0 to 3 spore
 | 
			
		||||
	-- nodes with an average of 1.25 per mushroom, for
 | 
			
		||||
	-- a slow multiplication of mushrooms when farming.
 | 
			
		||||
 | 
			
		||||
	minetest.register_node("flowers:mushroom_fertile_" .. name, {
 | 
			
		||||
		description = string.sub(string.upper(name), 0, 1) ..
 | 
			
		||||
			string.sub(name, 2) .. " Fertile Mushroom",
 | 
			
		||||
		tiles = {"flowers_mushroom_" .. name .. ".png"},
 | 
			
		||||
		inventory_image = "flowers_mushroom_" .. name .. ".png",
 | 
			
		||||
		wield_image = "flowers_mushroom_" .. name .. ".png",
 | 
			
		||||
		drawtype = "plantlike",
 | 
			
		||||
		paramtype = "light",
 | 
			
		||||
		sunlight_propagates = true,
 | 
			
		||||
		walkable = false,
 | 
			
		||||
		buildable_to = true,
 | 
			
		||||
		groups = {snappy = 3, flammable = 3, attached_node = 1,
 | 
			
		||||
			not_in_creative_inventory = 1},
 | 
			
		||||
		drop = {
 | 
			
		||||
			items = {
 | 
			
		||||
				{items = {"flowers:mushroom_" .. name}},
 | 
			
		||||
				{items = {"flowers:mushroom_spores_" .. name}, rarity = 4},
 | 
			
		||||
				{items = {"flowers:mushroom_spores_" .. name}, rarity = 2},
 | 
			
		||||
				{items = {"flowers:mushroom_spores_" .. name}, rarity = 2}
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
		sounds = default.node_sound_leaves_defaults(),
 | 
			
		||||
		on_use = minetest.item_eat(nut),
 | 
			
		||||
		selection_box = {
 | 
			
		||||
			type = "fixed",
 | 
			
		||||
			fixed = {-0.3, -0.5, -0.3, 0.3, 0, 0.3}
 | 
			
		||||
		}
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	-- Register infertile mushrooms
 | 
			
		||||
 | 
			
		||||
	-- These do not drop spores, to avoid the use of repeated digging
 | 
			
		||||
	-- and placing of a single mushroom to generate unlimited spores.
 | 
			
		||||
 | 
			
		||||
	minetest.register_node("flowers:mushroom_" .. name, {
 | 
			
		||||
		description = string.sub(string.upper(name), 0, 1) ..
 | 
			
		||||
			string.sub(name, 2) .. " Mushroom",
 | 
			
		||||
		tiles = {"flowers_mushroom_" .. name .. ".png"},
 | 
			
		||||
		inventory_image = "flowers_mushroom_" .. name .. ".png",
 | 
			
		||||
		wield_image = "flowers_mushroom_" .. name .. ".png",
 | 
			
		||||
minetest.register_node("flowers:mushroom_red", {
 | 
			
		||||
	description = "Red Mushroom",
 | 
			
		||||
	tiles = {"flowers_mushroom_red.png"},
 | 
			
		||||
	inventory_image = "flowers_mushroom_red.png",
 | 
			
		||||
	wield_image = "flowers_mushroom_red.png",
 | 
			
		||||
	drawtype = "plantlike",
 | 
			
		||||
	paramtype = "light",
 | 
			
		||||
	sunlight_propagates = true,
 | 
			
		||||
@@ -209,58 +159,72 @@ for _, m in pairs(mushrooms_datas) do
 | 
			
		||||
	buildable_to = true,
 | 
			
		||||
	groups = {snappy = 3, flammable = 3, attached_node = 1},
 | 
			
		||||
	sounds = default.node_sound_leaves_defaults(),
 | 
			
		||||
		on_use = minetest.item_eat(nut),
 | 
			
		||||
	on_use = minetest.item_eat(-5),
 | 
			
		||||
	selection_box = {
 | 
			
		||||
		type = "fixed",
 | 
			
		||||
		fixed = {-0.3, -0.5, -0.3, 0.3, 0, 0.3}
 | 
			
		||||
	}
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
	-- Register mushroom spores
 | 
			
		||||
 | 
			
		||||
	minetest.register_node("flowers:mushroom_spores_" .. name, {
 | 
			
		||||
		description = string.sub(string.upper(name), 0, 1) ..
 | 
			
		||||
			string.sub(name, 2) .. " Mushroom Spores",
 | 
			
		||||
		drawtype = "signlike",
 | 
			
		||||
		tiles = {"flowers_mushroom_spores_" .. name .. ".png"},
 | 
			
		||||
		inventory_image = "flowers_mushroom_spores_" .. name .. ".png",
 | 
			
		||||
		wield_image = "flowers_mushroom_spores_" .. name .. ".png",
 | 
			
		||||
minetest.register_node("flowers:mushroom_brown", {
 | 
			
		||||
	description = "Brown Mushroom",
 | 
			
		||||
	tiles = {"flowers_mushroom_brown.png"},
 | 
			
		||||
	inventory_image = "flowers_mushroom_brown.png",
 | 
			
		||||
	wield_image = "flowers_mushroom_brown.png",
 | 
			
		||||
	drawtype = "plantlike",
 | 
			
		||||
	paramtype = "light",
 | 
			
		||||
		paramtype2 = "wallmounted",
 | 
			
		||||
	sunlight_propagates = true,
 | 
			
		||||
	walkable = false,
 | 
			
		||||
	buildable_to = true,
 | 
			
		||||
	groups = {snappy = 3, flammable = 3, attached_node = 1},
 | 
			
		||||
	sounds = default.node_sound_leaves_defaults(),
 | 
			
		||||
	on_use = minetest.item_eat(1),
 | 
			
		||||
	selection_box = {
 | 
			
		||||
			type = "wallmounted",
 | 
			
		||||
		},
 | 
			
		||||
		groups = {dig_immediate = 3, attached_node = 1},
 | 
			
		||||
		type = "fixed",
 | 
			
		||||
		fixed = {-0.3, -0.5, -0.3, 0.3, 0, 0.3}
 | 
			
		||||
	}
 | 
			
		||||
})
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- Register growing ABM
 | 
			
		||||
 | 
			
		||||
-- mushroom spread and death
 | 
			
		||||
minetest.register_abm({
 | 
			
		||||
	nodenames = {"flowers:mushroom_spores_brown", "flowers:mushroom_spores_red"},
 | 
			
		||||
	nodenames = {"flowers:mushroom_brown", "flowers:mushroom_red"},
 | 
			
		||||
	interval = 11,
 | 
			
		||||
	chance = 50,
 | 
			
		||||
	action = function(pos, node)
 | 
			
		||||
		local node_under = minetest.get_node_or_nil({x = pos.x,
 | 
			
		||||
			y = pos.y - 1, z = pos.z})
 | 
			
		||||
		if minetest.get_node_light(pos, nil) == 15 then
 | 
			
		||||
			minetest.remove_node(pos)
 | 
			
		||||
		end
 | 
			
		||||
		local random = {
 | 
			
		||||
			x = pos.x + math.random(-2,2),
 | 
			
		||||
			y = pos.y + math.random(-1,1),
 | 
			
		||||
			z = pos.z + math.random(-2,2)
 | 
			
		||||
		}
 | 
			
		||||
		local random_node = minetest.get_node_or_nil(random)
 | 
			
		||||
		if not random_node then
 | 
			
		||||
			return
 | 
			
		||||
		end
 | 
			
		||||
		if random_node.name ~= "air" then
 | 
			
		||||
			return
 | 
			
		||||
		end
 | 
			
		||||
		local node_under = minetest.get_node_or_nil({x = random.x,
 | 
			
		||||
			y = random.y - 1, z = random.z})
 | 
			
		||||
		if not node_under then
 | 
			
		||||
			return
 | 
			
		||||
		end
 | 
			
		||||
		if minetest.get_item_group(node_under.name, "soil") ~= 0 and
 | 
			
		||||
				minetest.get_node_light(pos, nil) <= 13 then
 | 
			
		||||
			if node.name == "flowers:mushroom_spores_brown" then
 | 
			
		||||
				minetest.set_node(pos, {name = "flowers:mushroom_fertile_brown"})
 | 
			
		||||
			elseif node.name == "flowers:mushroom_spores_red" then
 | 
			
		||||
				minetest.set_node(pos, {name = "flowers:mushroom_fertile_red"})
 | 
			
		||||
			end
 | 
			
		||||
				minetest.get_node_light(pos, nil) <= 9 and
 | 
			
		||||
				minetest.get_node_light(random, nil) <= 9 then
 | 
			
		||||
			minetest.set_node(random, {name = node.name})
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
-- these old mushroom related nodes can be simplified now
 | 
			
		||||
minetest.register_alias("flowers:mushroom_spores_brown", "flowers:mushroom_brown")
 | 
			
		||||
minetest.register_alias("flowers:mushroom_spores_red", "flowers:mushroom_red")
 | 
			
		||||
minetest.register_alias("flowers:mushroom_fertile_brown", "flowers:mushroom_brown")
 | 
			
		||||
minetest.register_alias("flowers:mushroom_fertile_red", "flowers:mushroom_red")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
--
 | 
			
		||||
-- Waterlily
 | 
			
		||||
 
 | 
			
		||||
@@ -70,8 +70,8 @@ function flowers.register_mgv6_decorations()
 | 
			
		||||
	register_mgv6_flower("viola")
 | 
			
		||||
	register_mgv6_flower("dandelion_white")
 | 
			
		||||
 | 
			
		||||
	register_mgv6_mushroom("mushroom_fertile_brown")
 | 
			
		||||
	register_mgv6_mushroom("mushroom_fertile_red")
 | 
			
		||||
	register_mgv6_mushroom("mushroom_brown")
 | 
			
		||||
	register_mgv6_mushroom("mushroom_red")
 | 
			
		||||
 | 
			
		||||
	register_mgv6_waterlily()
 | 
			
		||||
end
 | 
			
		||||
@@ -87,8 +87,8 @@ local function register_flower(seed, name)
 | 
			
		||||
		place_on = {"default:dirt_with_grass"},
 | 
			
		||||
		sidelen = 16,
 | 
			
		||||
		noise_params = {
 | 
			
		||||
			offset = -0.02,
 | 
			
		||||
			scale = 0.03,
 | 
			
		||||
			offset = -0.015,
 | 
			
		||||
			scale = 0.025,
 | 
			
		||||
			spread = {x = 200, y = 200, z = 200},
 | 
			
		||||
			seed = seed,
 | 
			
		||||
			octaves = 3,
 | 
			
		||||
@@ -151,8 +151,8 @@ function flowers.register_decorations()
 | 
			
		||||
	register_flower(1133,    "viola")
 | 
			
		||||
	register_flower(73133,   "dandelion_white")
 | 
			
		||||
 | 
			
		||||
	register_mushroom("mushroom_fertile_brown")
 | 
			
		||||
	register_mushroom("mushroom_fertile_red")
 | 
			
		||||
	register_mushroom("mushroom_brown")
 | 
			
		||||
	register_mushroom("mushroom_red")
 | 
			
		||||
 | 
			
		||||
	register_waterlily()
 | 
			
		||||
end
 | 
			
		||||
 
 | 
			
		||||
@@ -36,6 +36,10 @@ local function screwdriver_handler(itemstack, user, pointed_thing, mode)
 | 
			
		||||
 | 
			
		||||
	local node = minetest.get_node(pos)
 | 
			
		||||
	local ndef = minetest.registered_nodes[node.name]
 | 
			
		||||
	-- verify node is facedir (expected to be rotatable)
 | 
			
		||||
	if ndef.paramtype2 ~= "facedir" then
 | 
			
		||||
		return
 | 
			
		||||
	end
 | 
			
		||||
	-- Compute param2
 | 
			
		||||
	local rotationPart = node.param2 % 32 -- get first 4 bits
 | 
			
		||||
	local preservePart = node.param2 - rotationPart
 | 
			
		||||
 
 | 
			
		||||
@@ -287,6 +287,13 @@ stairs.register_stair_and_slab("acacia_wood", "default:acacia_wood",
 | 
			
		||||
		"Acacia Wood Slab",
 | 
			
		||||
		default.node_sound_wood_defaults())
 | 
			
		||||
 | 
			
		||||
stairs.register_stair_and_slab("aspen_wood", "default:aspen_wood",
 | 
			
		||||
		{snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3},
 | 
			
		||||
		{"default_aspen_wood.png"},
 | 
			
		||||
		"Aspen Wood Stair",
 | 
			
		||||
		"Aspen Wood Slab",
 | 
			
		||||
		default.node_sound_wood_defaults())
 | 
			
		||||
 | 
			
		||||
stairs.register_stair_and_slab("stone", "default:stone",
 | 
			
		||||
		{cracky = 3},
 | 
			
		||||
		{"default_stone.png"},
 | 
			
		||||
 
 | 
			
		||||