code:
-- flowers/init.lua

-- Minetest 0.4 mod: default
-- See README.txt for licensing and other information.

-- Namespace for functions

flowers = {}

-- Load support for MT game translation.
local S = minetest.get_translator("flowers")

-- Map Generation

dofile(minetest.get_modpath("flowers") .. "/mapgen.lua")

--
-- Flowers
--

-- Aliases for original flowers mod

minetest.register_alias("flowers:flower_rose", "flowers:rose")
minetest.register_alias("flowers:flower_tulip", "flowers:tulip")
minetest.register_alias("flowers:flower_dandelion_yellow", "flowers:dandelion_yellow")
minetest.register_alias("flowers:flower_geranium", "flowers:geranium")
minetest.register_alias("flowers:flower_viola", "flowers:viola")
minetest.register_alias("flowers:flower_dandelion_white", "flowers:dandelion_white")

-- Flower registration

local function add_simple_flower(name, desc, box, f_groups)
	-- Common flowers' groups
	f_groups.snappy = 3
	f_groups.flower = 1
	f_groups.flora = 1
	f_groups.attached_node = 1

	minetest.register_node("flowers:" .. name, {
		description = desc,
		drawtype = "plantlike",
		waving = 1,
		tiles = {"flowers_" .. name .. ".png"},
		inventory_image = "flowers_" .. name .. ".png",
		wield_image = "flowers_" .. name .. ".png",
		sunlight_propagates = true,
		paramtype = "light",
		walkable = false,
		buildable_to = true,
		groups = f_groups,
		sounds = default.node_sound_leaves_defaults(),
		selection_box = {
			type = "fixed",
			fixed = box
		}
	})
end

flowers.datas = {
	{
		"rose",
		S("Red Rose"),
		{-2 / 16, -0.5, -2 / 16, 2 / 16, 5 / 16, 2 / 16},
		{color_red = 1, flammable = 1}
	},
	{
		"tulip",
		S("Orange Tulip"),
		{-2 / 16, -0.5, -2 / 16, 2 / 16, 3 / 16, 2 / 16},
		{color_orange = 1, flammable = 1}
	},
	{
		"dandelion_yellow",
		S("Yellow Dandelion"),
		{-4 / 16, -0.5, -4 / 16, 4 / 16, -2 / 16, 4 / 16},
		{color_yellow = 1, flammable = 1}
	},
	{
		"chrysanthemum_green",
		S("Green Chrysanthemum"),
		{-4 / 16, -0.5, -4 / 16, 4 / 16, -1 / 16, 4 / 16},
		{color_green = 1, flammable = 1}
	},
	{
		"geranium",
		S("Blue Geranium"),
		{-2 / 16, -0.5, -2 / 16, 2 / 16, 2 / 16, 2 / 16},
		{color_blue = 1, flammable = 1}
	},
	{
		"viola",
		S("Viola"),
		{-5 / 16, -0.5, -5 / 16, 5 / 16, -1 / 16, 5 / 16},
		{color_violet = 1, flammable = 1}
	},
	{
		"dandelion_white",
		S("White Dandelion"),
		{-5 / 16, -0.5, -5 / 16, 5 / 16, -2 / 16, 5 / 16},
		{color_white = 1, flammable = 1}
	},
	{
		"tulip_black",
		S("Black Tulip"),
		{-2 / 16, -0.5, -2 / 16, 2 / 16, 3 / 16, 2 / 16},
		{color_black = 1, flammable = 1}
	},
}

for _,item in pairs(flowers.datas) do
	add_simple_flower(unpack(item))
end

-- Flower spread
-- Public function to enable override by mods

function flowers.flower_spread(pos, node)
	pos.y = pos.y - 1
	local under = minetest.get_node(pos)
	pos.y = pos.y + 1
	-- Replace flora with dry shrub in desert sand and silver sand,
	-- as this is the only way to generate them.
	-- However, preserve grasses in sand dune biomes.
	if minetest.get_item_group(under.name, "sand") == 1 and
			under.name ~= "default:sand" then
		minetest.set_node(pos, {name = "default:dry_shrub"})
		return
	end

	if minetest.get_item_group(under.name, "soil") == 0 then
		return
	end

	local light = minetest.get_node_light(pos)
	if not light or light < 13 then
		return
	end

	local pos0 = vector.subtract(pos, 4)
	local pos1 = vector.add(pos, 4)
	-- Testing shows that a threshold of 3 results in an appropriate maximum
	-- density of approximately 7 flora per 9x9 area.
	if #minetest.find_nodes_in_area(pos0, pos1, "group:flora") > 3 then
		return
	end

	local soils = minetest.find_nodes_in_area_under_air(
		pos0, pos1, "group:soil")
	local num_soils = #soils
	if num_soils >= 1 then
		for si = 1, math.min(3, num_soils) do
			local soil = soils[math.random(num_soils)]
			local soil_name = minetest.get_node(soil).name
			local soil_above = {x = soil.x, y = soil.y + 1, z = soil.z}
			light = minetest.get_node_light(soil_above)
			if light and light >= 13 and
					-- Only spread to same surface node
					soil_name == under.name and
					-- Desert sand is in the soil group
					soil_name ~= "default:desert_sand" then
				minetest.set_node(soil_above, {name = node.name})
			end
		end
	end
end

minetest.register_abm({
	label = "Flower spread",
	nodenames = {"group:flora"},
	interval = 13,
	chance = 300,
	action = function(...)
		flowers.flower_spread(...)
	end,
})

--
-- Mushrooms
--

minetest.register_node("flowers:mushroom_red", {
	description = S("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,
	walkable = false,
	buildable_to = true,
	groups = {mushroom = 1, snappy = 3, attached_node = 1, flammable = 1},
	sounds = default.node_sound_leaves_defaults(),
	on_use = minetest.item_eat(-5),
	selection_box = {
		type = "fixed",
		fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, -1 / 16, 4 / 16},
	}
})

minetest.register_node("flowers:mushroom_brown", {
	description = S("Brown Mushroom"),
	tiles = {"flowers_mushroom_brown.png"},
	inventory_image = "flowers_mushroom_brown.png",
	wield_image = "flowers_mushroom_brown.png",
	drawtype = "plantlike",
	paramtype = "light",
	sunlight_propagates = true,
	walkable = false,
	buildable_to = true,
	groups = {mushroom = 1, food_mushroom = 1, snappy = 3, attached_node = 1, flammable = 1},
	sounds = default.node_sound_leaves_defaults(),
	on_use = minetest.item_eat(1),
	selection_box = {
		type = "fixed",
		fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, -2 / 16, 3 / 16},
	}
})

-- Mushroom spread and death

function flowers.mushroom_spread(pos, node)
	if minetest.get_node_light(pos, 0.5) > 3 then
		if minetest.get_node_light(pos, nil) == 15 then
			minetest.remove_node(pos)
		end
		return
	end
	local positions = minetest.find_nodes_in_area_under_air(
		{x = pos.x - 1, y = pos.y - 2, z = pos.z - 1},
		{x = pos.x + 1, y = pos.y + 1, z = pos.z + 1},
		{"group:soil", "group:tree"})
	if #positions == 0 then
		return
	end
	local pos2 = positions[math.random(#positions)]
	pos2.y = pos2.y + 1
	if minetest.get_node_light(pos2, 0.5) <= 3 then
		minetest.set_node(pos2, {name = node.name})
	end
end

minetest.register_abm({
	label = "Mushroom spread",
	nodenames = {"flowers:mushroom_brown", "flowers:mushroom_red"},
	interval = 11,
	chance = 150,
	action = function(...)
		flowers.mushroom_spread(...)
	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")
minetest.register_alias("mushroom:brown_natural", "flowers:mushroom_brown")
minetest.register_alias("mushroom:red_natural", "flowers:mushroom_red")

--
-- Waterlily
--

local waterlily_def = {
	description = S("Waterlily"),
	drawtype = "nodebox",
	paramtype = "light",
	paramtype2 = "facedir",
	tiles = {"flowers_waterlily.png", "flowers_waterlily_bottom.png"},
	inventory_image = "flowers_waterlily.png",
	wield_image = "flowers_waterlily.png",
	liquids_pointable = true,
	walkable = false,
	buildable_to = true,
	floodable = true,
	groups = {snappy = 3, flower = 1, flammable = 1},
	sounds = default.node_sound_leaves_defaults(),
	node_placement_prediction = "",
	node_box = {
		type = "fixed",
		fixed = {-0.5, -31 / 64, -0.5, 0.5, -15 / 32, 0.5}
	},
	selection_box = {
		type = "fixed",
		fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, -15 / 32, 7 / 16}
	},

	on_place = function(itemstack, placer, pointed_thing)
		local pos = pointed_thing.above
		local node = minetest.get_node(pointed_thing.under)
		local def = minetest.registered_nodes[node.name]

		if def and def.on_rightclick then
			return def.on_rightclick(pointed_thing.under, node, placer, itemstack,
					pointed_thing)
		end

		if def and def.liquidtype == "source" and
				minetest.get_item_group(node.name, "water") > 0 then
			local player_name = placer and placer:get_player_name() or ""
			if not minetest.is_protected(pos, player_name) then
				minetest.set_node(pos, {name = "flowers:waterlily" ..
					(def.waving == 3 and "_waving" or ""),
					param2 = math.random(0, 3)})
				if not (creative and creative.is_enabled_for
						and creative.is_enabled_for(player_name)) then
					itemstack:take_item()
				end
			else
				minetest.chat_send_player(player_name, "Node is protected")
				minetest.record_protection_violation(pos, player_name)
			end
		end

		return itemstack
	end
}

local waterlily_waving_def = table.copy(waterlily_def)
waterlily_waving_def.waving = 3
waterlily_waving_def.drop = "flowers:waterlily"
waterlily_waving_def.groups.not_in_creative_inventory = 1

minetest.register_node("flowers:waterlily", waterlily_def)
minetest.register_node("flowers:waterlily_waving", waterlily_waving_def)


code:
# textdomain: flowers
Red Rose=Rote Rose
Orange Tulip=Orange Tulpe
Yellow Dandelion=Gelber Löwenzahn
Green Chrysanthemum=Grüne Chrysantheme
Blue Geranium=Blaue Geranie
Viola=Veilchen
White Dandelion=Weißer Löwenzahn
Black Tulip=Schwarze Tulpe
Red Mushroom=Roter Pilz
Brown Mushroom=Brauner Pilz
Waterlily=Wasserlilie

repo_name: korkut/MeseCraft

license: mit


code:
# textdomain: flowers
Red Rose=Rosa roja
Orange Tulip=Tulipán naranja
Yellow Dandelion=Diente de León amarillo
Green Chrysanthemum=Crisantemo verde
Blue Geranium=Geranio azul
Viola=Violeta
White Dandelion=Diente de León blanco
Black Tulip=Tulipán negro
Red Mushroom=Champiñón rojo
Brown Mushroom=Champiñón café
Waterlily=Nenúfar


code:
# textdomain: flowers
Red Rose=Rose rouge
Orange Tulip=Tulipe orange
Yellow Dandelion=Pissenlit jaune
Green Chrysanthemum=Chrysanthème vert
Blue Geranium=Géranium bleu
Viola=Violette
White Dandelion=Pissenlit blanc
Black Tulip=Tulipe noire
Red Mushroom=Champignon rouge
Brown Mushroom=Champignon brun
Waterlily=Nénuphar


code:
# textdomain: flowers
Red Rose=Mawar Merah
Orange Tulip=Tulip Oranye
Yellow Dandelion=Dandelion Kuning
Green Chrysanthemum=Krisan Hijau
Blue Geranium=Geranium Biru
Viola=Viola
White Dandelion=Dandelion Putih
Black Tulip=Tulip Hitam
Red Mushroom=Jamur Merah
Brown Mushroom=Jamur Cokelat
Waterlily=Teratai


code:
# textdomain: flowers
Red Rose=Rosa rossa
Orange Tulip=Tulipano arancione
Yellow Dandelion=Dente di leone giallo
Green Chrysanthemum=Crisantemo verde
Blue Geranium=Geranio blu
Viola=Viola
White Dandelion=Dente di leone bianco
Black Tulip=Tulipano nero
Red Mushroom=Fungo rosso
Brown Mushroom=Fungo marrone
Waterlily=Ninfea


code:
# textdomain: flowers
Red Rose=Ros Merah
Orange Tulip=Tulip Jingga
Yellow Dandelion=Dandelion Kuning
Green Chrysanthemum=Kekwa Hijau
Blue Geranium=Geranium Biru
Viola=Violet
White Dandelion=Dandelion Putih
Black Tulip=Tulip Hitam
Red Mushroom=Cendawan Merah
Brown Mushroom=Cendawan Perang
Waterlily=Teratai


code:
# textdomain: flowers
Red Rose=Красная Роза
Orange Tulip=Оранжевый Тюльпан
Yellow Dandelion=Желтый Одуванчик
Green Chrysanthemum=Зелёная Хризантема
Blue Geranium=Синяя Герань
Viola=Фиалка
White Dandelion=Белый Одуванчик
Black Tulip=Черный Тюльпан
Red Mushroom=Мухомор
Brown Mushroom=Коричневый Гриб
Waterlily=Кувшинка


code:
# textdomain: flowers
Red Rose=Röd ros
Orange Tulip=Orange Tulpan
Yellow Dandelion=Gul Maskros
Green Chrysanthemum=Grön Krysantemum
Blue Geranium=Blå Geranium
Viola=Violett Viola
White Dandelion=Vit Maskros
Black Tulip=Svart Tulpan
Red Mushroom=Röd Svamp
Brown Mushroom=Brun Svamp
Waterlily=Näckros


code:
# textdomain: flowers
Red Rose=红玫瑰
Orange Tulip=橙郁金香
Yellow Dandelion=黄蒲公英
Green Chrysanthemum=绿菊花
Blue Geranium=蓝天竺葵
Viola=三色堇
White Dandelion=白蒲公英
Black Tulip=黑郁金香
Red Mushroom=红蘑菇
Brown Mushroom=棕蘑菇
Waterlily=睡莲


code:
# textdomain: flowers
Red Rose=紅玫瑰
Orange Tulip=橙鬱金香
Yellow Dandelion=黃蒲公英
Green Chrysanthemum=綠菊花
Blue Geranium=藍天竺葵
Viola=三色堇
White Dandelion=白蒲公英
Black Tulip=黑鬱金香
Red Mushroom=紅蘑菇
Brown Mushroom=棕蘑菇
Waterlily=睡蓮


code:
# textdomain: flowers
Red Rose=
Orange Tulip=
Yellow Dandelion=
Green Chrysanthemum=
Blue Geranium=
Viola=
White Dandelion=
Black Tulip=
Red Mushroom=
Brown Mushroom=
Waterlily=


code:
--
-- Mgv6
--

local function register_mgv6_flower(flower_name)
	minetest.register_decoration({
		name = "flowers:"..flower_name,
		deco_type = "simple",
		place_on = {"default:dirt_with_grass"},
		sidelen = 16,
		noise_params = {
			offset = 0,
			scale = 0.006,
			spread = {x = 100, y = 100, z = 100},
			seed = 436,
			octaves = 3,
			persist = 0.6
		},
		y_max = 30,
		y_min = 1,
		decoration = "flowers:"..flower_name,
	})
end

local function register_mgv6_mushroom(mushroom_name)
	minetest.register_decoration({
		name = "flowers:"..mushroom_name,
		deco_type = "simple",
		place_on = {"default:dirt_with_grass"},
		sidelen = 16,
		noise_params = {
			offset = 0,
			scale = 0.04,
			spread = {x = 100, y = 100, z = 100},
			seed = 7133,
			octaves = 3,
			persist = 0.6
		},
		y_max = 30,
		y_min = 1,
		decoration = "flowers:"..mushroom_name,
		spawn_by = "default:tree",
		num_spawn_by = 1,
	})
end

local function register_mgv6_waterlily()
	minetest.register_decoration({
		name = "flowers:waterlily",
		deco_type = "simple",
		place_on = {"default:dirt"},
		sidelen = 16,
		noise_params = {
			offset = -0.12,
			scale = 0.3,
			spread = {x = 100, y = 100, z = 100},
			seed = 33,
			octaves = 3,
			persist = 0.7
		},
		y_max = 0,
		y_min = 0,
		decoration = "flowers:waterlily_waving",
		param2 = 0,
		param2_max = 3,
		place_offset_y = 1,
	})
end

function flowers.register_mgv6_decorations()
	register_mgv6_flower("rose")
	register_mgv6_flower("tulip")
	register_mgv6_flower("dandelion_yellow")
	register_mgv6_flower("geranium")
	register_mgv6_flower("viola")
	register_mgv6_flower("dandelion_white")

	register_mgv6_mushroom("mushroom_brown")
	register_mgv6_mushroom("mushroom_red")

	register_mgv6_waterlily()
end

--
-- All other biome API mapgens
--

local function register_flower(seed, flower_name)
	minetest.register_decoration({
		name = "flowers:"..flower_name,
		deco_type = "simple",
		place_on = {"default:dirt_with_grass"},
		sidelen = 16,
		noise_params = {
			offset = -0.02,
			scale = 0.04,
			spread = {x = 200, y = 200, z = 200},
			seed = seed,
			octaves = 3,
			persist = 0.6
		},
		biomes = {"grassland", "deciduous_forest"},
		y_max = 31000,
		y_min = 1,
		decoration = "flowers:"..flower_name,
	})
end

local function register_mushroom(mushroom_name)
	minetest.register_decoration({
		name = "flowers:"..mushroom_name,
		deco_type = "simple",
		place_on = {"default:dirt_with_grass", "default:dirt_with_coniferous_litter"},
		sidelen = 16,
		noise_params = {
			offset = 0,
			scale = 0.006,
			spread = {x = 250, y = 250, z = 250},
			seed = 2,
			octaves = 3,
			persist = 0.66
		},
		biomes = {"deciduous_forest", "coniferous_forest"},
		y_max = 31000,
		y_min = 1,
		decoration = "flowers:"..mushroom_name,
	})
end

local function register_waterlily()
	minetest.register_decoration({
		name = "default:waterlily",
		deco_type = "simple",
		place_on = {"default:dirt"},
		sidelen = 16,
		noise_params = {
			offset = -0.12,
			scale = 0.3,
			spread = {x = 200, y = 200, z = 200},
			seed = 33,
			octaves = 3,
			persist = 0.7
		},
		biomes = {"rainforest_swamp", "savanna_shore", "deciduous_forest_shore"},
		y_max = 0,
		y_min = 0,
		decoration = "flowers:waterlily_waving",
		param2 = 0,
		param2_max = 3,
		place_offset_y = 1,
	})
end

function flowers.register_decorations()
	register_flower(436,     "rose")
	register_flower(19822,   "tulip")
	register_flower(1220999, "dandelion_yellow")
	register_flower(800081,  "chrysanthemum_green")
	register_flower(36662,   "geranium")
	register_flower(1133,    "viola")
	register_flower(73133,   "dandelion_white")
	register_flower(42,      "tulip_black")

	register_mushroom("mushroom_brown")
	register_mushroom("mushroom_red")

	register_waterlily()
end

--
-- Detect mapgen to select functions
--

local mg_name = minetest.get_mapgen_setting("mg_name")
if mg_name == "v6" then
	flowers.register_mgv6_decorations()
else
	flowers.register_decorations()
end


code:
name = flowers
description = Minetest Game mod: flowers
depends = default


code:
Minetest Game mod: game_commands
================================
See license.txt for license information.

Authors of source code
----------------------
rubenwardy (MIT)


code:
-- game_commands/init.lua

-- Load support for MT game translation.
local S = minetest.get_translator("game_commands")

minetest.register_chatcommand("killme", {
	description = S("Kill yourself to respawn"),
	func = function(name)
		local player = minetest.get_player_by_name(name)
		if player then
			if minetest.settings:get_bool("enable_damage") then
				player:set_hp(0)
				return true
			else
				for _, callback in pairs(minetest.registered_on_respawnplayers) do
					if callback(player) then
						return true
					end
				end

				-- There doesn't seem to be a way to get a default spawn pos
				-- from the lua API
				return false, S("No static_spawnpoint defined")
			end
		else
			-- Show error message if used when not logged in, eg: from IRC mod
			return false, S("You need to be online to be killed!")
		end
	end
})


code:
# textdomain: game_commands
Kill yourself to respawn=Selbstmord begehen, um zu Respawnen
No static_spawnpoint defined=Kein static_spawnpoint definiert
You need to be online to be killed!=Sie müssen online sein, um getötet zu werden!


code:
# textdomain: game_commands
Kill yourself to respawn=Suicídate para reaparecer
No static_spawnpoint defined=No se ha definido un punto de aparición
You need to be online to be killed!=¡Necesitas estar en línea para que te maten!


code:
# textdomain: game_commands
Kill yourself to respawn=Se suicider pour réapparaître
No static_spawnpoint defined=Pas de point d'apparition défini
You need to be online to be killed!=Vous devez être en ligne pour être tué !


code:
# textdomain: game_commands
Kill yourself to respawn=Bunuh diri untuk bangkit kembali
No static_spawnpoint defined=Tiada static_spawnpoint (titik bangkit statis) yang diatur
You need to be online to be killed!=Anda harus daring untuk dibunuh!


code:
# textdomain: game_commands
Kill yourself to respawn=Ucciditi per ricomparire
No static_spawnpoint defined=Nessuno static_spawnpoint definito
You need to be online to be killed!=Devi essere in linea per essere ucciso!


code:
# textdomain: game_commands
Kill yourself to respawn=Bunuh diri anda untuk lahir semula
No static_spawnpoint defined=Tiada titik permulaan statik (tetapan static_spawnpoint) ditakrifkan
You need to be online to be killed!=Anda mesti berada dalam talian untuk dibunuh!


code:
# textdomain: game_commands
Kill yourself to respawn=Убейте себя, чтобы возродиться
No static_spawnpoint defined=static_spawnpoint не определён
You need to be online to be killed!=Вы должны быть онлайн, чтобы убить себя!


code:
# textdomain: game_commands
Kill yourself to respawn=Döda dig själv för att respawna
No static_spawnpoint defined=Ingen static_spawnpoint definierat
You need to be online to be killed!=Du måsta vara online för att bli dödad!


code:
# textdomain: game_commands
Kill yourself to respawn=杀死自己并重生
No static_spawnpoint defined=static_spawnpoint 未定义
You need to be online to be killed!=您需要在线才能被杀死！


code:
# textdomain: game_commands
Kill yourself to respawn=殺死自己並重生
No static_spawnpoint defined=static_spawnpoint 未定義
You need to be online to be killed!=您需要在線才能被殺死！


code:
# textdomain: game_commands
Kill yourself to respawn=
No static_spawnpoint defined=
You need to be online to be killed!=


code:
name = game_commands
description = Minetest Game mod: game_commands


code:
Minetest Game mod: give_initial_stuff
=====================================
See license.txt for license information.

Authors of source code
----------------------
Perttu Ahola (celeron55) <celeron55@gmail.com> (MIT)
Various Minetest developers and contributors (MIT)


code:
-- gave_initial_stuff/init.lua

local stuff_string = minetest.settings:get("initial_stuff") or
		"default:pick_steel,default:axe_steel,default:shovel_steel," ..
		"default:torch 99,default:cobble 99"

give_initial_stuff = {
	items = {}
}

function give_initial_stuff.give(player)
	minetest.log("action",
			"Giving initial stuff to player " .. player:get_player_name())
	local inv = player:get_inventory()
	for _, stack in ipairs(give_initial_stuff.items) do
		inv:add_item("main", stack)
	end
end

function give_initial_stuff.add(stack)
	give_initial_stuff.items[#give_initial_stuff.items + 1] = ItemStack(stack)
end

function give_initial_stuff.clear()
	give_initial_stuff.items = {}
end

function give_initial_stuff.add_from_csv(str)
	local items = str:split(",")
	for _, itemname in ipairs(items) do
		give_initial_stuff.add(itemname)
	end
end

function give_initial_stuff.set_list(list)
	give_initial_stuff.items = list
end

function give_initial_stuff.get_list()
	return give_initial_stuff.items
end

give_initial_stuff.add_from_csv(stuff_string)
if minetest.settings:get_bool("give_initial_stuff") then
	minetest.register_on_newplayer(give_initial_stuff.give)
end


code:
name = give_initial_stuff
description = Minetest Game mod: give_initial_stuff
depends = default


code:
Minetest Game mod: map
======================
See license.txt for license information.

Authors of source code
----------------------
paramat (MIT)

Authors of media (textures)
---------------------------
TumeniNodes (CC BY-SA 3.0):
  map_mapping_kit.png (map)

paramat (CC BY-SA 3.0):
  map_mapping_kit.png (compass and pen)

Crafting
--------
map:mapping_kit

default:glass G
default:paper P
group:stick S
default:steel_ingot I
group:wood W
dye:black D

GPS
IPI
WPD

Usage
-----
In survival mode, use of the minimap requires the mapping kit item in your
inventory. It can take up to 5 seconds for adding to or removal from inventory
to have an effect, however to instantly allow the use of the minimap 'use'
(leftclick) the item.
Minimap radar mode is always disallowed in survival mode.

Minimap and minimap radar mode are automatically allowed in creative mode and
for any player with the 'creative' privilege.

The 'map.update_hud_flags()' function is global so can be redefined by a mod for
alternative behaviour.


code:
-- map/init.lua

-- Mod global namespace

map = {}

-- Load support for MT game translation.
local S = minetest.get_translator("map")

-- Cache creative mode setting

local creative_mode_cache = minetest.settings:get_bool("creative_mode")

-- Update HUD flags
-- Global to allow overriding

function map.update_hud_flags(player)
	local creative_enabled =
		(creative and creative.is_enabled_for(player:get_player_name())) or
		creative_mode_cache

	local minimap_enabled = creative_enabled or
		player:get_inventory():contains_item("main", "map:mapping_kit")
	local radar_enabled = creative_enabled

	player:hud_set_flags({
		minimap = minimap_enabled,
		minimap_radar = radar_enabled
	})
end

-- Set HUD flags 'on joinplayer'

minetest.register_on_joinplayer(function(player)
	map.update_hud_flags(player)
end)

-- Cyclic update of HUD flags

local function cyclic_update()
	for _, player in ipairs(minetest.get_connected_players()) do
		map.update_hud_flags(player)
	end
	minetest.after(5.3, cyclic_update)
end

minetest.after(5.3, cyclic_update)

-- Mapping kit item

minetest.register_craftitem("map:mapping_kit", {
	description = S("Mapping Kit") .. "\n" .. S("Use with 'Minimap' key"),
	inventory_image = "map_mapping_kit.png",
	stack_max = 1,
	groups = {flammable = 3},

	on_use = function(itemstack, user, pointed_thing)
		map.update_hud_flags(user)
	end,
})

-- Crafting

minetest.register_craft({
	output = "map:mapping_kit",
	recipe = {
		{"default:glass", "default:paper", "group:stick"},
		{"default:steel_ingot", "default:paper", "default:steel_ingot"},
		{"group:wood", "default:paper", "dye:black"},
	}
})

-- Fuel

minetest.register_craft({
	type = "fuel",
	recipe = "map:mapping_kit",
	burntime = 5,
})


code:
# textdomain: map
Mapping Kit=Kartenset
Use with 'Minimap' key=Mit „Karte an/aus“-Taste benutzen


code:
# textdomain: map
Mapping Kit=Kit de cartografía
Use with 'Minimap' key=Usar con la tecla 'Minimapa'


code:
# textdomain: map
Mapping Kit=Kit de carthographie
Use with 'Minimap' key=Utiliser avec le bouton « Minimap »


code:
# textdomain: map
Mapping Kit=Alat Pemetaan
Use with 'Minimap' key=Pakai dengan tombol 'Peta Mini'


code:
# textdomain: map
Mapping Kit=Kit di mappatura
Use with 'Minimap' key=Usalo col tasto 'Minimappa'


code:
# textdomain: map
Mapping Kit=Alat Pemetaan
Use with 'Minimap' key=Guna dengan kekunci 'Peta Mini'


code:
# textdomain: map
Mapping Kit=Картографический комплект
Use with 'Minimap' key=Используйте с ключом 'Minimap'


code:
# textdomain: map
Mapping Kit=Kartläggningssats
Use with 'Minimap' key=Använd med 'Minimap' tangent


code:
# textdomain: map
Mapping Kit=地图绘制工具包
Use with 'Minimap' key=与“迷你地图”键一起使用


code:
# textdomain: map
Mapping Kit=地圖繪製工具包
Use with 'Minimap' key=與“迷你地圖”鍵一起使用


code:
# textdomain: map
Mapping Kit=
Use with 'Minimap' key=


code:
name = map
description = Minetest Game mod: map
depends = default, dye
optional_depends = creative


code:
Minetest Game mod: player_api
=============================
See license.txt for license information.

Provides an API to allow multiple mods to set player models and textures.
Also sets the default model, texture, and player flags.
This mod is only for content related to the Player API and the player object.

Authors of source code
----------------------
Originally by celeron55, Perttu Ahola <celeron55@gmail.com> (LGPLv2.1+)
Various Minetest developers and contributors (LGPLv2.1+)

Authors of media (textures, models and sounds)
----------------------------------------------
stujones11 (CC BY-SA 3.0):
  character.b3d
  character.blend -- Both derived from a model by MirceaKitsune (CC BY-SA 3.0)

An0n3m0us (CC BY-SA 3.0):
  character.b3d
  character.blend -- Player animation improvement

Jordach (CC BY-SA 3.0):
  character.png

celeron55, Perttu Ahola <celeron55@gmail.com> (CC BY-SA 3.0):
  player.png
  player_back.png


code:
-- Minetest 0.4 mod: player
-- See README.txt for licensing and other information.

player_api = {}

-- Player animation blending
-- Note: This is currently broken due to a bug in Irrlicht, leave at 0
local animation_blend = 0

player_api.registered_models = { }

-- Local for speed.
local models = player_api.registered_models

function player_api.register_model(name, def)
	models[name] = def
end

-- Player stats and animations
local player_model = {}
local player_textures = {}
local player_anim = {}
local player_sneak = {}
player_api.player_attached = {}

function player_api.get_animation(player)
	local name = player:get_player_name()
	return {
		model = player_model[name],
		textures = player_textures[name],
		animation = player_anim[name],
	}
end

-- Called when a player's appearance needs to be updated
function player_api.set_model(player, model_name)
	local name = player:get_player_name()
	local model = models[model_name]
	if model then
		if player_model[name] == model_name then
			return
		end
		player:set_properties({
			mesh = model_name,
			textures = player_textures[name] or model.textures,
			visual = "mesh",
			visual_size = model.visual_size or {x = 1, y = 1},
			collisionbox = model.collisionbox or {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3},
			stepheight = model.stepheight or 0.6,
			eye_height = model.eye_height or 1.47,
		})
		player_api.set_animation(player, "stand")
	else
		player:set_properties({
			textures = {"player.png", "player_back.png"},
			visual = "upright_sprite",
			visual_size = {x = 1, y = 2},
			collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.75, 0.3},
			stepheight = 0.6,
			eye_height = 1.625,
		})
	end
	player_model[name] = model_name
end

function player_api.set_textures(player, textures)
	local name = player:get_player_name()
	local model = models[player_model[name]]
	local model_textures = model and model.textures or nil
	player_textures[name] = textures or model_textures
	player:set_properties({textures = textures or model_textures,})
end

function player_api.set_animation(player, anim_name, speed)
	local name = player:get_player_name()
	if player_anim[name] == anim_name then
		return
	end
	local model = player_model[name] and models[player_model[name]]
	if not (model and model.animations[anim_name]) then
		return
	end
	local anim = model.animations[anim_name]
	player_anim[name] = anim_name
	player:set_animation(anim, speed or model.animation_speed, animation_blend)
end

minetest.register_on_leaveplayer(function(player)
	local name = player:get_player_name()
	player_model[name] = nil
	player_anim[name] = nil
	player_textures[name] = nil
end)

-- Localize for better performance.
local player_set_animation = player_api.set_animation
local player_attached = player_api.player_attached

-- Prevent knockback for attached players
local old_calculate_knockback = minetest.calculate_knockback
function minetest.calculate_knockback(player, ...)
	if player_attached[player:get_player_name()] then
		return 0
	end
	return old_calculate_knockback(player, ...)
end

-- Check each player and apply animations
minetest.register_globalstep(function()
	for _, player in pairs(minetest.get_connected_players()) do
		local name = player:get_player_name()
		local model_name = player_model[name]
		local model = model_name and models[model_name]
		if model and not player_attached[name] then
			local controls = player:get_player_control()
			local animation_speed_mod = model.animation_speed or 30

			-- Determine if the player is sneaking, and reduce animation speed if so
			if controls.sneak then
				animation_speed_mod = animation_speed_mod / 2
			end

			-- Apply animations based on what the player is doing
			if player:get_hp() == 0 then
				player_set_animation(player, "lay")
			-- Determine if the player is walking
			elseif controls.up or controls.down or controls.left or controls.right then
				if player_sneak[name] ~= controls.sneak then
					player_anim[name] = nil
					player_sneak[name] = controls.sneak
				end
				if controls.LMB or controls.RMB then
					player_set_animation(player, "walk_mine", animation_speed_mod)
				else
					player_set_animation(player, "walk", animation_speed_mod)
				end
			elseif controls.LMB or controls.RMB then
				player_set_animation(player, "mine", animation_speed_mod)
			else
				player_set_animation(player, "stand", animation_speed_mod)
			end
		end
	end
end)


code:
-- player/init.lua

dofile(minetest.get_modpath("player_api") .. "/api.lua")

-- Default player appearance
player_api.register_model("character.b3d", {
	animation_speed = 30,
	textures = {"character.png", },
	animations = {
		-- Standard animations.
		stand     = {x = 0,   y = 79},
		lay       = {x = 162, y = 166},
		walk      = {x = 168, y = 187},
		mine      = {x = 189, y = 198},
		walk_mine = {x = 200, y = 219},
		sit       = {x = 81,  y = 160},
	},
	collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3},
	stepheight = 0.6,
	eye_height = 1.47,
})

-- Update appearance when the player joins
minetest.register_on_joinplayer(function(player)
	player_api.player_attached[player:get_player_name()] = false
	player_api.set_model(player, "character.b3d")
	player:set_local_animation(
		{x = 0,   y = 79},
		{x = 168, y = 187},
		{x = 189, y = 198},
		{x = 200, y = 219},
		30
	)
end)


code:
name = player_api
description = Minetest Game mod: player_api


code:
Minetest Game mod: screwdriver
==============================
See license.txt for license information.

License of source code
----------------------
Originally by RealBadAngel, Maciej Kasatkin (LGPLv2.1+)
Various Minetest developers and contributors (LGPLv2.1+)

License of media (textures)
---------------------------
Created by Gambit (CC BY-SA 3.0):
  screwdriver.png


code:
-- screwdriver/init.lua

screwdriver = {}

-- Load support for MT game translation.
local S = minetest.get_translator("screwdriver")

screwdriver.ROTATE_FACE = 1
screwdriver.ROTATE_AXIS = 2
screwdriver.disallow = function(pos, node, user, mode, new_param2)
	return false
end
screwdriver.rotate_simple = function(pos, node, user, mode, new_param2)
	if mode ~= screwdriver.ROTATE_FACE then
		return false
	end
end

-- For attached wallmounted nodes: returns true if rotation is valid
-- simplified version of minetest:builtin/game/falling.lua#L148.
local function check_attached_node(pos, rotation)
	local d = minetest.wallmounted_to_dir(rotation)
	local p2 = vector.add(pos, d)
	local n = minetest.get_node(p2).name
	local def2 = minetest.registered_nodes[n]
	if def2 and not def2.walkable then
		return false
	end
	return true
end

screwdriver.rotate = {}

local facedir_tbl = {
	[screwdriver.ROTATE_FACE] = {
		[0] = 1, [1] = 2, [2] = 3, [3] = 0,
		[4] = 5, [5] = 6, [6] = 7, [7] = 4,
		[8] = 9, [9] = 10, [10] = 11, [11] = 8,
		[12] = 13, [13] = 14, [14] = 15, [15] = 12,
		[16] = 17, [17] = 18, [18] = 19, [19] = 16,
		[20] = 21, [21] = 22, [22] = 23, [23] = 20,
	},
	[screwdriver.ROTATE_AXIS] = {
		[0] = 4, [1] = 4, [2] = 4, [3] = 4,
		[4] = 8, [5] = 8, [6] = 8, [7] = 8,
		[8] = 12, [9] = 12, [10] = 12, [11] = 12,
		[12] = 16, [13] = 16, [14] = 16, [15] = 16,
		[16] = 20, [17] = 20, [18] = 20, [19] = 20,
		[20] = 0, [21] = 0, [22] = 0, [23] = 0,
	},
}

screwdriver.rotate.facedir = function(pos, node, mode)
	local rotation = node.param2 % 32 -- get first 5 bits
	local other = node.param2 - rotation
	rotation = facedir_tbl[mode][rotation] or 0
	return rotation + other
end

screwdriver.rotate.colorfacedir = screwdriver.rotate.facedir

local wallmounted_tbl = {
	[screwdriver.ROTATE_FACE] = {[2] = 5, [3] = 4, [4] = 2, [5] = 3, [1] = 0, [0] = 1},
	[screwdriver.ROTATE_AXIS] = {[2] = 5, [3] = 4, [4] = 2, [5] = 1, [1] = 0, [0] = 3}
}

screwdriver.rotate.wallmounted = function(pos, node, mode)
	local rotation = node.param2 % 8 -- get first 3 bits
	local other = node.param2 - rotation
	rotation = wallmounted_tbl[mode][rotation] or 0
	if minetest.get_item_group(node.name, "attached_node") ~= 0 then
		-- find an acceptable orientation
		for i = 1, 5 do
			if not check_attached_node(pos, rotation) then
				rotation = wallmounted_tbl[mode][rotation] or 0
			else
				break
			end
		end
	end
	return rotation + other
end

screwdriver.rotate.colorwallmounted = screwdriver.rotate.wallmounted

-- Handles rotation
screwdriver.handler = function(itemstack, user, pointed_thing, mode, uses)
	if pointed_thing.type ~= "node" then
		return
	end

	local pos = pointed_thing.under
	local player_name = user and user:get_player_name() or ""

	if minetest.is_protected(pos, player_name) then
		minetest.record_protection_violation(pos, player_name)
		return
	end

	local node = minetest.get_node(pos)
	local ndef = minetest.registered_nodes[node.name]
	if not ndef then
		return itemstack
	end
	-- can we rotate this paramtype2?
	local fn = screwdriver.rotate[ndef.paramtype2]
	if not fn and not ndef.on_rotate then
		return itemstack
	end

	local should_rotate = true
	local new_param2
	if fn then
		new_param2 = fn(pos, node, mode)
	else
		new_param2 = node.param2
	end

	-- Node provides a handler, so let the handler decide instead if the node can be rotated
	if ndef.on_rotate then
		-- Copy pos and node because callback can modify it
		local result = ndef.on_rotate(vector.new(pos),
				{name = node.name, param1 = node.param1, param2 = node.param2},
				user, mode, new_param2)
		if result == false then -- Disallow rotation
			return itemstack
		elseif result == true then
			should_rotate = false
		end
	elseif ndef.on_rotate == false then
		return itemstack
	elseif ndef.can_dig and not ndef.can_dig(pos, user) then
		return itemstack
	end

	if should_rotate and new_param2 ~= node.param2 then
		node.param2 = new_param2
		minetest.swap_node(pos, node)
		minetest.check_for_falling(pos)
	end

	if not (creative and creative.is_enabled_for and
			creative.is_enabled_for(player_name)) then
		itemstack:add_wear(65535 / ((uses or 200) - 1))
	end

	return itemstack
end

-- Screwdriver
minetest.register_tool("screwdriver:screwdriver", {
	description = S("Screwdriver") .. "\n" .. S("(left-click rotates face, right-click rotates axis)"),
	inventory_image = "screwdriver.png",
	groups = {tool = 1},
	on_use = function(itemstack, user, pointed_thing)
		screwdriver.handler(itemstack, user, pointed_thing, screwdriver.ROTATE_FACE, 200)
		return itemstack
	end,
	on_place = function(itemstack, user, pointed_thing)
		screwdriver.handler(itemstack, user, pointed_thing, screwdriver.ROTATE_AXIS, 200)
		return itemstack
	end,
})

minetest.register_craft({
	output = "screwdriver:screwdriver",
	recipe = {
		{"default:steel_ingot"},
		{"group:stick"}
	}
})

minetest.register_alias("screwdriver:screwdriver1", "screwdriver:screwdriver")
minetest.register_alias("screwdriver:screwdriver2", "screwdriver:screwdriver")
minetest.register_alias("screwdriver:screwdriver3", "screwdriver:screwdriver")
minetest.register_alias("screwdriver:screwdriver4", "screwdriver:screwdriver")


code:
# textdomain: screwdriver
Screwdriver=Schraubendreher
(left-click rotates face, right-click rotates axis)=(Linksklick dreht Seite, Rechtsklick dreht Achse)


code:
# textdomain: screwdriver
Screwdriver=Destornillador
(left-click rotates face, right-click rotates axis)=(clic-izquierdo gira la cara, clic-derecho rota el eje)


code:
# textdomain: screwdriver
Screwdriver=Tournevis
(left-click rotates face, right-click rotates axis)=(clic gauche pour changer de face, clic droit pour changer d'axe)


code:
# textdomain: screwdriver
Screwdriver=Obeng
(left-click rotates face, right-click rotates axis)=(klik kiri putar sisi, klik kanan putar sumbu)


code:
# textdomain: screwdriver
Screwdriver=Cacciavite
(left-click rotates face, right-click rotates axis)=(click sinistro ruota la faccia, click destro ruota l'asse)


code:
# textdomain: screwdriver
Screwdriver=Pemutar Skru
(left-click rotates face, right-click rotates axis)=(klik-kiri putar muka, klik-kanan putar paksi)


code:
# textdomain: screwdriver
Screwdriver=Отвёртка
(left-click rotates face, right-click rotates axis)=(клик левой кнопкой мыши вращает грань, клик правой кнопкой мыши вращает ось)


code:
# textdomain: screwdriver
Screwdriver=Skruvmejsel
(left-click rotates face, right-click rotates axis)=(vänster-klick roterar ansikte, höger-klick roterar axeln)


code:
# textdomain: screwdriver
Screwdriver=螺丝刀
(left-click rotates face, right-click rotates axis)=（左键单击旋转面，右键单击旋转轴）


code:
# textdomain: screwdriver
Screwdriver=螺絲刀
(left-click rotates face, right-click rotates axis)=（左鍵單擊旋轉面，右鍵單擊旋轉軸）


code:
# textdomain: screwdriver
Screwdriver=
(left-click rotates face, right-click rotates axis)=


code:
name = screwdriver
description = Minetest Game mod: screwdriver


code:
Minetest Game mod: sethome
==========================
See license.txt for license information.

Authors of source code
----------------------
sfan5 (MIT)


code:
-- sethome/init.lua

sethome = {}

-- Load support for MT game translation.
local S = minetest.get_translator("sethome")

local homes_file = minetest.get_worldpath() .. "/homes"
local homepos = {}

local function loadhomes()
	local input = io.open(homes_file, "r")
	if not input then
		return -- no longer an error
	end

	-- Iterate over all stored positions in the format "x y z player" for each line
	for pos, name in input:read("*a"):gmatch("(%S+ %S+ %S+)%s([%w_-]+)[\r\n]") do
		homepos[name] = minetest.string_to_pos(pos)
	end
	input:close()
end

loadhomes()

sethome.set = function(name, pos)
	local player = minetest.get_player_by_name(name)
	if not player or not pos then
		return false
	end
	player:set_attribute("sethome:home", minetest.pos_to_string(pos))

	-- remove `name` from the old storage file
	if not homepos[name] then
		return true
	end
	local data = {}
	local output = io.open(homes_file, "w")
	if output then
		homepos[name] = nil
		for i, v in pairs(homepos) do
			table.insert(data, string.format("%.1f %.1f %.1f %s\n", v.x, v.y, v.z, i))
		end
		output:write(table.concat(data))
		io.close(output)
		return true
	end
	return true -- if the file doesn't exist - don't return an error.
end

sethome.get = function(name)
	local player = minetest.get_player_by_name(name)
	local pos = minetest.string_to_pos(player:get_attribute("sethome:home"))
	if pos then
		return pos
	end

	-- fetch old entry from storage table
	pos = homepos[name]
	if pos then
		return vector.new(pos)
	else
		return nil
	end
end

sethome.go = function(name)
	local pos = sethome.get(name)
	local player = minetest.get_player_by_name(name)
	if player and pos then
		player:set_pos(pos)
		return true
	end
	return false
end

minetest.register_privilege("home", {
	description = S("Can use /sethome and /home"),
	give_to_singleplayer = false
})

minetest.register_chatcommand("home", {
	description = S("Teleport you to your home point"),
	privs = {home = true},
	func = function(name)
		if sethome.go(name) then
			return true, S("Teleported to home!")
		end
		return false, S("Set a home using /sethome")
	end,
})

minetest.register_chatcommand("sethome", {
	description = S("Set your home point"),
	privs = {home = true},
	func = function(name)
		name = name or "" -- fallback to blank name if nil
		local player = minetest.get_player_by_name(name)
		if player and sethome.set(name, player:get_pos()) then
			return true, S("Home set!")
		end
		return false, S("Player not found!")
	end,
})


code:
# textdomain: sethome
Can use /sethome and /home=Kann /sethome und /home benutzen
Teleport you to your home point=Teleportieren Sie sich zu Ihrem Zuhause-Punkt
Teleported to home!=Nach Hause teleportiert!
Set a home using /sethome=Ein Zuhause mit /sethome setzen
Set your home point=Ihren Zuhause-Punkt setzen
Home set!=Zuhause gesetzt!
Player not found!=Spieler nicht gefunden!


code:
# textdomain: sethome
Can use /sethome and /home=Puedes usar /sethome y /home
Teleport you to your home point=Teletranspórtate a tu hogar
Teleported to home!=¡Teletransportado a tu hogar!
Set a home using /sethome=Establece tu hogar usando /sethome
Set your home point=Establece el sitio de tu hogar
Home set!=¡Hogar establecido!
Player not found!=¡Jugador no encontrado!


code:
# textdomain: sethome
Can use /sethome and /home=Peut utiliser /sethome et /home
Teleport you to your home point=Vous téléporter à votre domicile
Teleported to home!=Téléporté à votre domicile !
Set a home using /sethome=Définir un domicile en utilisant /sethome
Set your home point=Définir votre domicile
Home set!=Domicile défini !
Player not found!=Joueur non trouvé !


code:
# textdomain: sethome
Can use /sethome and /home=Boleh pakai /sethome dan /home
Teleport you to your home point=Teleportasi ke rumah Anda
Teleported to home!=Teleportasi ke rumah!
Set a home using /sethome=Atur letak rumah dengan /sethome
Set your home point=Atur letak rumah
Home set!=Letak rumah diatur!
Player not found!=Pemain tidak ditemukan!


code:
# textdomain: sethome
Can use /sethome and /home=Può usare /sethome e /home
Teleport you to your home point=Ti teletrasporta al tuo punto di domicilio
Teleported to home!=Teletrasportato a casa!
Set a home using /sethome=Imposta un domicilio usando /sethome
Set your home point=Imposta il tuo punto di domicilio
Home set!=Domicilio impostato!
Player not found!=Giocatore non trovato!


code:
# textdomain: sethome
Can use /sethome and /home=Boleh guna /sethome dan /home
Teleport you to your home point=Teleportasikan anda ke titik rumah anda
Teleported to home!=Diteleportasikan ke rumah!
Set a home using /sethome=Tetapkan rumah menggunakan /sethome
Set your home point=Tetapkan titik rumah anda
Home set!=Rumah ditetapkan!
Player not found!=Pemain tidak dijumpai!


code:
# textdomain: sethome
Can use /sethome and /home=Возможность использовать /sethome и /home
Teleport you to your home point=Вы телепортируетесь в свою домашнюю точку
Teleported to home!=Вы телепортировались домой!
Set a home using /sethome=Установите домашнюю точку, используя /sethome
Set your home point=Установите вашу домашнюю точку
Home set!=Домашняя точка установлена!
Player not found!=Игрок не обнаружен!


code:
# textdomain: sethome
Can use /sethome and /home=Kan används /sethome och /home
Teleport you to your home point=Teleportera dig till din hempunkt
Teleported to home!=Teleporterad hem!
Set a home using /sethome=Ställ in ett hem med /sethome
Set your home point=Ställ in din hempunkt
Home set!=Hem inställt!
Player not found!=Spelare inte hittad!


code:
# textdomain: sethome
Can use /sethome and /home=可以使用/sethome和/home
Teleport you to your home point=传送您到您家的地点
Teleported to home!=已传送到家！
Set a home using /sethome=使用/sethome设定家
Set your home point=设定您家的地点
Home set!=已设定家！
Player not found!=未找到玩家！


code:
# textdomain: sethome
Can use /sethome and /home=可以使用/sethome和/home
Teleport you to your home point=傳送您到您家的地點
Teleported to home!=已傳送到家！
Set a home using /sethome=使用/sethome設定家
Set your home point=設定您家的地點
Home set!=已設定家！
Player not found!=未找到玩家！


code:
# textdomain: sethome
Can use /sethome and /home=
Teleport you to your home point=
Teleported to home!=
Set a home using /sethome=
Set your home point=
Home set!=
Player not found!=


code:
name = sethome
description = Minetest Game mod: sethome


code:
Minetest Game mod: spawn
========================
See license.txt for license information.

Authors of source code
----------------------
paramat (MIT)


code:
-- spawn/init.lua

-- Disable by mapgen, setting or if 'static_spawnpoint' is set
--------------------------------------------------------------

local mg_name = minetest.get_mapgen_setting("mg_name")
if mg_name == "v6" or mg_name == "singlenode" or
		minetest.settings:get("static_spawnpoint") or
		minetest.settings:get_bool("engine_spawn") then
	return
end

-- Parameters
-------------

-- Resolution of search grid in nodes.
local res = 64
-- Number of points checked in the square search grid (edge * edge).
local checks = 128 * 128
-- Starting point for biome checks. This also sets the y co-ordinate for all
-- points checked, so the suitable biomes must be active at this y.
local pos = {x = 0, y = 8, z = 0}

-- Table of suitable biomes

local biome_ids = {
	minetest.get_biome_id("taiga"),
	minetest.get_biome_id("coniferous_forest"),
	minetest.get_biome_id("deciduous_forest"),
	minetest.get_biome_id("grassland"),
	minetest.get_biome_id("savanna"),
}

-- End of parameters
--------------------

-- Direction table

local dirs = {
	{x = 0, y = 0, z = 1},
	{x = -1, y = 0, z = 0},
	{x = 0, y = 0, z = -1},
	{x = 1, y = 0, z = 0},
}

-- Initial variables

local edge_len = 1
local edge_dist = 0
local dir_step = 0
local dir_ind = 1
local searched = false
local success = false
local spawn_pos = {}

-- Get world 'mapgen_limit' and 'chunksize' to calculate 'spawn_limit'.
-- This accounts for how mapchunks are not generated if they or their shell exceed
-- 'mapgen_limit'.

local mapgen_limit = tonumber(minetest.get_mapgen_setting("mapgen_limit"))
local chunksize = tonumber(minetest.get_mapgen_setting("chunksize"))
local spawn_limit = math.max(mapgen_limit - (chunksize + 1) * 16, 0)

--Functions
-----------

-- Get next position on square search spiral

local function next_pos()
	if edge_dist == edge_len then
		edge_dist = 0
		dir_ind = dir_ind + 1
		if dir_ind == 5 then
			dir_ind = 1
		end
		dir_step = dir_step + 1
		edge_len = math.floor(dir_step / 2) + 1
	end

	local dir = dirs[dir_ind]
	local move = vector.multiply(dir, res)

	edge_dist = edge_dist + 1

	return vector.add(pos, move)
end

-- Spawn position search

local function search()
	for iter = 1, checks do
		local biome_data = minetest.get_biome_data(pos)
		-- Sometimes biome_data is nil
		local biome = biome_data and biome_data.biome
		for id_ind = 1, #biome_ids do
			local biome_id = biome_ids[id_ind]
			if biome == biome_id then
				local spawn_y = minetest.get_spawn_level(pos.x, pos.z)
				if spawn_y then
					spawn_pos = {x = pos.x, y = spawn_y, z = pos.z}
					return true
				end
			end
		end

		pos = next_pos()
		-- Check for position being outside world edge
		if math.abs(pos.x) > spawn_limit or math.abs(pos.z) > spawn_limit then
			return false
		end
	end

	return false
end

-- On new player spawn and player respawn

-- Search for spawn position once per server session. If successful, store
-- position and reposition players, otherwise leave them at engine spawn
-- position.

local function on_spawn(player)
	if not searched then
		success = search()
		searched = true
	end
	if success then
		player:set_pos(spawn_pos)
	end
	return success
end

minetest.register_on_newplayer(function(player)
	on_spawn(player)
end)

local enable_bed_respawn = minetest.settings:get_bool("enable_bed_respawn")
if enable_bed_respawn == nil then
	enable_bed_respawn = true
end

minetest.register_on_respawnplayer(function(player)
	-- Avoid respawn conflict with beds mod
	if beds and enable_bed_respawn and
			beds.spawn[player:get_player_name()] then
		return
	end

	return on_spawn(player)
end)


code:
name = spawn
description = Minetest Game mod: spawn
depends = default
optional_depends = beds


code:
Minetest Game mod: stairs
=========================
See license.txt for license information.

Authors of source code
----------------------
Originally by Kahrl <kahrl@gmx.net> (LGPLv2.1+) and
celeron55, Perttu Ahola <celeron55@gmail.com> (LGPLv2.1+)
Various Minetest developers and contributors (LGPLv2.1+)

Authors of media (textures)
---------------------------

Textures
--------
Copyright (c) 2018 Shara RedCat (CC BY-SA 3.0):
  Derived from a texture by PilzAdam (CC BY-SA 3.0):
    stairs_obsidian_glass_outer_stairside.png
    stairs_obsidian_glass_stairside.png

Copyright (c) 2018 TumeniNodes (CC BY-SA 3.0):
  Derived from a texture by celeron55 (CC BY-SA 3.0) and
      converted to bright white by Krock (CC BY-SA 3.0):
    stairs_glass_stairside.png
    stairs_glass_split.png
  Derived from a texture by PilzAdam (CC BY-SA 3.0):
    stairs_obsidian_glass_split.png


code:
-- stairs/init.lua

-- Minetest 0.4 mod: stairs
-- See README.txt for licensing and other information.

-- Global namespace for functions

stairs = {}

-- Load support for MT game translation.
local S = minetest.get_translator("stairs")

-- Register aliases for new pine node names

minetest.register_alias("stairs:stair_pinewood", "stairs:stair_pine_wood")
minetest.register_alias("stairs:slab_pinewood", "stairs:slab_pine_wood")

-- Get setting for replace ABM

local replace = minetest.settings:get_bool("enable_stairs_replace_abm")

local function rotate_and_place(itemstack, placer, pointed_thing)
	local p0 = pointed_thing.under
	local p1 = pointed_thing.above
	local param2 = 0

	if placer then
		local placer_pos = placer:get_pos()
		if placer_pos then
			param2 = minetest.dir_to_facedir(vector.subtract(p1, placer_pos))
		end

		local finepos = minetest.pointed_thing_to_face_pos(placer, pointed_thing)
		local fpos = finepos.y % 1

		if p0.y - 1 == p1.y or (fpos > 0 and fpos < 0.5)
				or (fpos < -0.5 and fpos > -0.999999999) then
			param2 = param2 + 20
			if param2 == 21 then
				param2 = 23
			elseif param2 == 23 then
				param2 = 21
			end
		end
	end
	return minetest.item_place(itemstack, placer, pointed_thing, param2)
end

local function warn_if_exists(nodename)
	if minetest.registered_nodes[nodename] then
		minetest.log("warning", "Overwriting stairs node: " .. nodename)
	end
end

-- Register stair
-- Node will be called stairs:stair_<subname>

function stairs.register_stair(subname, recipeitem, groups, images, description,
		sounds, worldaligntex)
	-- Set backface culling and world-aligned textures
	local stair_images = {}
	for i, image in ipairs(images) do
		if type(image) == "string" then
			stair_images[i] = {
				name = image,
				backface_culling = true,
			}
			if worldaligntex then
				stair_images[i].align_style = "world"
			end
		else
			stair_images[i] = table.copy(image)
			if stair_images[i].backface_culling == nil then
				stair_images[i].backface_culling = true
			end
			if worldaligntex and stair_images[i].align_style == nil then
				stair_images[i].align_style = "world"
			end
		end
	end
	local new_groups = table.copy(groups)
	new_groups.stair = 1
	warn_if_exists("stairs:stair_" .. subname)
	minetest.register_node(":stairs:stair_" .. subname, {
		description = description,
		drawtype = "nodebox",
		tiles = stair_images,
		paramtype = "light",
		paramtype2 = "facedir",
		is_ground_content = false,
		groups = new_groups,
		sounds = sounds,
		node_box = {
			type = "fixed",
			fixed = {
				{-0.5, -0.5, -0.5, 0.5, 0.0, 0.5},
				{-0.5, 0.0, 0.0, 0.5, 0.5, 0.5},
			},
		},
		on_place = function(itemstack, placer, pointed_thing)
			if pointed_thing.type ~= "node" then
				return itemstack
			end

			return rotate_and_place(itemstack, placer, pointed_thing)
		end,
	})

	-- for replace ABM
	if replace then
		minetest.register_node(":stairs:stair_" .. subname .. "upside_down", {
			replace_name = "stairs:stair_" .. subname,
			groups = {slabs_replace = 1},
		})
	end

	if recipeitem then
		-- Recipe matches appearence in inventory
		minetest.register_craft({
			output = "stairs:stair_" .. subname .. " 8",
			recipe = {
				{"", "", recipeitem},
				{"", recipeitem, recipeitem},
				{recipeitem, recipeitem, recipeitem},
			},
		})

		-- Use stairs to craft full blocks again (1:1)
		minetest.register_craft({
			output = recipeitem .. " 3",
			recipe = {
				{"stairs:stair_" .. subname, "stairs:stair_" .. subname},
				{"stairs:stair_" .. subname, "stairs:stair_" .. subname},
			},
		})

		-- Fuel
		local baseburntime = minetest.get_craft_result({
			method = "fuel",
			width = 1,
			items = {recipeitem}
		}).time
		if baseburntime > 0 then
			minetest.register_craft({
				type = "fuel",
				recipe = "stairs:stair_" .. subname,
				burntime = math.floor(baseburntime * 0.75),
			})
		end
	end
end

-- Register slab
-- Node will be called stairs:slab_<subname>

function stairs.register_slab(subname, recipeitem, groups, images, description,
		sounds, worldaligntex)
	-- Set world-aligned textures
	local slab_images = {}
	for i, image in ipairs(images) do
		if type(image) == "string" then
			slab_images[i] = {
				name = image,
			}
			if worldaligntex then
				slab_images[i].align_style = "world"
			end
		else
			slab_images[i] = table.copy(image)
			if worldaligntex and image.align_style == nil then
				slab_images[i].align_style = "world"
			end
		end
	end
	local new_groups = table.copy(groups)
	new_groups.slab = 1
	warn_if_exists("stairs:slab_" .. subname)
	minetest.register_node(":stairs:slab_" .. subname, {
		description = description,
		drawtype = "nodebox",
		tiles = slab_images,
		paramtype = "light",
		paramtype2 = "facedir",
		is_ground_content = false,
		groups = new_groups,
		sounds = sounds,
		node_box = {
			type = "fixed",
			fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5},
		},
		on_place = function(itemstack, placer, pointed_thing)
			local under = minetest.get_node(pointed_thing.under)
			local wield_item = itemstack:get_name()
			local player_name = placer and placer:get_player_name() or ""
			local creative_enabled = (creative and creative.is_enabled_for
					and creative.is_enabled_for(player_name))

			if under and under.name:find("^stairs:slab_") then
				-- place slab using under node orientation
				local dir = minetest.dir_to_facedir(vector.subtract(
					pointed_thing.above, pointed_thing.under), true)

				local p2 = under.param2

				-- Placing a slab on an upside down slab should make it right-side up.
				if p2 >= 20 and dir == 8 then
					p2 = p2 - 20
				-- same for the opposite case: slab below normal slab
				elseif p2 <= 3 and dir == 4 then
					p2 = p2 + 20
				end

				-- else attempt to place node with proper param2
				minetest.item_place_node(ItemStack(wield_item), placer, pointed_thing, p2)
				if not creative_enabled then
					itemstack:take_item()
				end
				return itemstack
			else
				return rotate_and_place(itemstack, placer, pointed_thing)
			end
		end,
	})

	-- for replace ABM
	if replace then
		minetest.register_node(":stairs:slab_" .. subname .. "upside_down", {
			replace_name = "stairs:slab_".. subname,
			groups = {slabs_replace = 1},
		})
	end

	if recipeitem then
		minetest.register_craft({
			output = "stairs:slab_" .. subname .. " 6",
			recipe = {
				{recipeitem, recipeitem, recipeitem},
			},
		})

		-- Use 2 slabs to craft a full block again (1:1)
		minetest.register_craft({
			output = recipeitem,
			recipe = {
				{"stairs:slab_" .. subname},
				{"stairs:slab_" .. subname},
			},
		})

		-- Fuel
		local baseburntime = minetest.get_craft_result({
			method = "fuel",
			width = 1,
			items = {recipeitem}
		}).time
		if baseburntime > 0 then
			minetest.register_craft({
				type = "fuel",
				recipe = "stairs:slab_" .. subname,
				burntime = math.floor(baseburntime * 0.5),
			})
		end
	end
end

-- Optionally replace old "upside_down" nodes with new param2 versions.
-- Disabled by default.

if replace then
	minetest.register_abm({
		label = "Slab replace",
		nodenames = {"group:slabs_replace"},
		interval = 16,
		chance = 1,
		action = function(pos, node)
			node.name = minetest.registered_nodes[node.name].replace_name
			node.param2 = node.param2 + 20
			if node.param2 == 21 then
				node.param2 = 23
			elseif node.param2 == 23 then
				node.param2 = 21
			end
			minetest.set_node(pos, node)
		end,
	})
end

-- Register inner stair
-- Node will be called stairs:stair_inner_<subname>

function stairs.register_stair_inner(subname, recipeitem, groups, images,
		description, sounds, worldaligntex, full_description)
	-- Set backface culling and world-aligned textures
	local stair_images = {}
	for i, image in ipairs(images) do
		if type(image) == "string" then
			stair_images[i] = {
				name = image,
				backface_culling = true,
			}
			if worldaligntex then
				stair_images[i].align_style = "world"
			end
		else
			stair_images[i] = table.copy(image)
			if stair_images[i].backface_culling == nil then
				stair_images[i].backface_culling = true
			end
			if worldaligntex and stair_images[i].align_style == nil then
				stair_images[i].align_style = "world"
			end
		end
	end
	local new_groups = table.copy(groups)
	new_groups.stair = 1
	if full_description then
		description = full_description
	else
		description = "Inner " .. description
	end
	warn_if_exists("stairs:stair_inner_" .. subname)
	minetest.register_node(":stairs:stair_inner_" .. subname, {
		description = description,
		drawtype = "nodebox",
		tiles = stair_images,
		paramtype = "light",
		paramtype2 = "facedir",
		is_ground_content = false,
		groups = new_groups,
		sounds = sounds,
		node_box = {
			type = "fixed",
			fixed = {
				{-0.5, -0.5, -0.5, 0.5, 0.0, 0.5},
				{-0.5, 0.0, 0.0, 0.5, 0.5, 0.5},
				{-0.5, 0.0, -0.5, 0.0, 0.5, 0.0},
			},
		},
		on_place = function(itemstack, placer, pointed_thing)
			if pointed_thing.type ~= "node" then
				return itemstack
			end

			return rotate_and_place(itemstack, placer, pointed_thing)
		end,
	})

	if recipeitem then
		minetest.register_craft({
			output = "stairs:stair_inner_" .. subname .. " 7",
			recipe = {
				{"", recipeitem, ""},
				{recipeitem, "", recipeitem},
				{recipeitem, recipeitem, recipeitem},
			},
		})

		-- Fuel
		local baseburntime = minetest.get_craft_result({
			method = "fuel",
			width = 1,
			items = {recipeitem}
		}).time
		if baseburntime > 0 then
			minetest.register_craft({
				type = "fuel",
				recipe = "stairs:stair_inner_" .. subname,
				burntime = math.floor(baseburntime * 0.875),
			})
		end
	end
end

-- Register outer stair
-- Node will be called stairs:stair_outer_<subname>

function stairs.register_stair_outer(subname, recipeitem, groups, images,
		description, sounds, worldaligntex, full_description)
	-- Set backface culling and world-aligned textures
	local stair_images = {}
	for i, image in ipairs(images) do
		if type(image) == "string" then
			stair_images[i] = {
				name = image,
				backface_culling = true,
			}
			if worldaligntex then
				stair_images[i].align_style = "world"
			end
		else
			stair_images[i] = table.copy(image)
			if stair_images[i].backface_culling == nil then
				stair_images[i].backface_culling = true
			end
			if worldaligntex and stair_images[i].align_style == nil then
				stair_images[i].align_style = "world"
			end
		end
	end
	local new_groups = table.copy(groups)
	new_groups.stair = 1
	if full_description then
		description = full_description
	else
		description = "Outer " .. description
	end
	warn_if_exists("stairs:stair_outer_" .. subname)
	minetest.register_node(":stairs:stair_outer_" .. subname, {
		description = description,
		drawtype = "nodebox",
		tiles = stair_images,
		paramtype = "light",
		paramtype2 = "facedir",
		is_ground_content = false,
		groups = new_groups,
		sounds = sounds,
		node_box = {
			type = "fixed",
			fixed = {
				{-0.5, -0.5, -0.5, 0.5, 0.0, 0.5},
				{-0.5, 0.0, 0.0, 0.0, 0.5, 0.5},
			},
		},
		on_place = function(itemstack, placer, pointed_thing)
			if pointed_thing.type ~= "node" then
				return itemstack
			end

			return rotate_and_place(itemstack, placer, pointed_thing)
		end,
	})

	if recipeitem then
		minetest.register_craft({
			output = "stairs:stair_outer_" .. subname .. " 6",
			recipe = {
				{"", recipeitem, ""},
				{recipeitem, recipeitem, recipeitem},
			},
		})

		-- Fuel
		local baseburntime = minetest.get_craft_result({
			method = "fuel",
			width = 1,
			items = {recipeitem}
		}).time
		if baseburntime > 0 then
			minetest.register_craft({
				type = "fuel",
				recipe = "stairs:stair_outer_" .. subname,
				burntime = math.floor(baseburntime * 0.625),
			})
		end
	end
end

-- Stair/slab registration function.
-- Nodes will be called stairs:{stair,slab}_<subname>

function stairs.register_stair_and_slab(subname, recipeitem, groups, images,
		desc_stair, desc_slab, sounds, worldaligntex)
	stairs.register_stair(subname, recipeitem, groups, images, desc_stair,
		sounds, worldaligntex)
	stairs.register_stair_inner(subname, recipeitem, groups, images, desc_stair,
		sounds, worldaligntex)
	stairs.register_stair_outer(subname, recipeitem, groups, images, desc_stair,
		sounds, worldaligntex)
	stairs.register_slab(subname, recipeitem, groups, images, desc_slab,
		sounds, worldaligntex)
end

-- Local function so we can apply translations
local function my_register_stair_and_slab(subname, recipeitem, groups, images,
		desc_stair, desc_slab, sounds, worldaligntex)
	stairs.register_stair(subname, recipeitem, groups, images, S(desc_stair),
		sounds, worldaligntex)
	stairs.register_stair_inner(subname, recipeitem, groups, images, "",
		sounds, worldaligntex, S("Inner " .. desc_stair))
	stairs.register_stair_outer(subname, recipeitem, groups, images, "",
		sounds, worldaligntex, S("Outer " .. desc_stair))
	stairs.register_slab(subname, recipeitem, groups, images, S(desc_slab),
		sounds, worldaligntex)
end

-- Register default stairs and slabs

my_register_stair_and_slab(
	"wood",
	"default:wood",
	{choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
	{"default_wood.png"},
	"Wooden Stair",
	"Wooden Slab",
	default.node_sound_wood_defaults(),
	false
)

my_register_stair_and_slab(
	"junglewood",
	"default:junglewood",
	{choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
	{"default_junglewood.png"},
	"Jungle Wood Stair",
	"Jungle Wood Slab",
	default.node_sound_wood_defaults(),
	false
)

my_register_stair_and_slab(
	"pine_wood",
	"default:pine_wood",
	{choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
	{"default_pine_wood.png"},
	"Pine Wood Stair",
	"Pine Wood Slab",
	default.node_sound_wood_defaults(),
	false
)

my_register_stair_and_slab(
	"acacia_wood",
	"default:acacia_wood",
	{choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
	{"default_acacia_wood.png"},
	"Acacia Wood Stair",
	"Acacia Wood Slab",
	default.node_sound_wood_defaults(),
	false
)

my_register_stair_and_slab(
	"aspen_wood",
	"default:aspen_wood",
	{choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
	{"default_aspen_wood.png"},
	"Aspen Wood Stair",
	"Aspen Wood Slab",
	default.node_sound_wood_defaults(),
	false
)

my_register_stair_and_slab(
	"stone",
	"default:stone",
	{cracky = 3},
	{"default_stone.png"},
	"Stone Stair",
	"Stone Slab",
	default.node_sound_stone_defaults(),
	true
)

my_register_stair_and_slab(
	"cobble",
	"default:cobble",
	{cracky = 3},
	{"default_cobble.png"},
	"Cobblestone Stair",
	"Cobblestone Slab",
	default.node_sound_stone_defaults(),
	true
)

my_register_stair_and_slab(
	"mossycobble",
	"default:mossycobble",
	{cracky = 3},
	{"default_mossycobble.png"},
	"Mossy Cobblestone Stair",
	"Mossy Cobblestone Slab",
	default.node_sound_stone_defaults(),
	true
)

my_register_stair_and_slab(
	"stonebrick",
	"default:stonebrick",
	{cracky = 2},
	{"default_stone_brick.png"},
	"Stone Brick Stair",
	"Stone Brick Slab",
	default.node_sound_stone_defaults(),
	false
)

my_register_stair_and_slab(
	"stone_block",
	"default:stone_block",
	{cracky = 2},
	{"default_stone_block.png"},
	"Stone Block Stair",
	"Stone Block Slab",
	default.node_sound_stone_defaults(),
	true
)

my_register_stair_and_slab(
	"desert_stone",
	"default:desert_stone",
	{cracky = 3},
	{"default_desert_stone.png"},
	"Desert Stone Stair",
	"Desert Stone Slab",
	default.node_sound_stone_defaults(),
	true
)

my_register_stair_and_slab(
	"desert_cobble",
	"default:desert_cobble",
	{cracky = 3},
	{"default_desert_cobble.png"},
	"Desert Cobblestone Stair",
	"Desert Cobblestone Slab",
	default.node_sound_stone_defaults(),
	true
)

my_register_stair_and_slab(
	"desert_stonebrick",
	"default:desert_stonebrick",
	{cracky = 2},
	{"default_desert_stone_brick.png"},
	"Desert Stone Brick Stair",
	"Desert Stone Brick Slab",
	default.node_sound_stone_defaults(),
	false
)

my_register_stair_and_slab(
	"desert_stone_block",
	"default:desert_stone_block",
	{cracky = 2},
	{"default_desert_stone_block.png"},
	"Desert Stone Block Stair",
	"Desert Stone Block Slab",
	default.node_sound_stone_defaults(),
	true
)

my_register_stair_and_slab(
	"sandstone",
	"default:sandstone",
	{crumbly = 1, cracky = 3},
	{"default_sandstone.png"},
	"Sandstone Stair",
	"Sandstone Slab",
	default.node_sound_stone_defaults(),
	true
)

my_register_stair_and_slab(
	"sandstonebrick",
	"default:sandstonebrick",
	{cracky = 2},
	{"default_sandstone_brick.png"},
	"Sandstone Brick Stair",
	"Sandstone Brick Slab",
	default.node_sound_stone_defaults(),
	false
)

my_register_stair_and_slab(
	"sandstone_block",
	"default:sandstone_block",
	{cracky = 2},
	{"default_sandstone_block.png"},
	"Sandstone Block Stair",
	"Sandstone Block Slab",
	default.node_sound_stone_defaults(),
	true
)

my_register_stair_and_slab(
	"desert_sandstone",
	"default:desert_sandstone",
	{crumbly = 1, cracky = 3},
	{"default_desert_sandstone.png"},
	"Desert Sandstone Stair",
	"Desert Sandstone Slab",
	default.node_sound_stone_defaults(),
	true
)

my_register_stair_and_slab(
	"desert_sandstone_brick",
	"default:desert_sandstone_brick",
	{cracky = 2},
	{"default_desert_sandstone_brick.png"},
	"Desert Sandstone Brick Stair",
	"Desert Sandstone Brick Slab",
	default.node_sound_stone_defaults(),
	false
)

my_register_stair_and_slab(
	"desert_sandstone_block",
	"default:desert_sandstone_block",
	{cracky = 2},
	{"default_desert_sandstone_block.png"},
	"Desert Sandstone Block Stair",
	"Desert Sandstone Block Slab",
	default.node_sound_stone_defaults(),
	true
)

my_register_stair_and_slab(
	"silver_sandstone",
	"default:silver_sandstone",
	{crumbly = 1, cracky = 3},
	{"default_silver_sandstone.png"},
	"Silver Sandstone Stair",
	"Silver Sandstone Slab",
	default.node_sound_stone_defaults(),
	true
)

my_register_stair_and_slab(
	"silver_sandstone_brick",
	"default:silver_sandstone_brick",
	{cracky = 2},
	{"default_silver_sandstone_brick.png"},
	"Silver Sandstone Brick Stair",
	"Silver Sandstone Brick Slab",
	default.node_sound_stone_defaults(),
	false
)

my_register_stair_and_slab(
	"silver_sandstone_block",
	"default:silver_sandstone_block",
	{cracky = 2},
	{"default_silver_sandstone_block.png"},
	"Silver Sandstone Block Stair",
	"Silver Sandstone Block Slab",
	default.node_sound_stone_defaults(),
	true
)

my_register_stair_and_slab(
	"obsidian",
	"default:obsidian",
	{cracky = 1, level = 2},
	{"default_obsidian.png"},
	"Obsidian Stair",
	"Obsidian Slab",
	default.node_sound_stone_defaults(),
	true
)

my_register_stair_and_slab(
	"obsidianbrick",
	"default:obsidianbrick",
	{cracky = 1, level = 2},
	{"default_obsidian_brick.png"},
	"Obsidian Brick Stair",
	"Obsidian Brick Slab",
	default.node_sound_stone_defaults(),
	false
)

my_register_stair_and_slab(
	"obsidian_block",
	"default:obsidian_block",
	{cracky = 1, level = 2},
	{"default_obsidian_block.png"},
	"Obsidian Block Stair",
	"Obsidian Block Slab",
	default.node_sound_stone_defaults(),
	true
)

my_register_stair_and_slab(
	"brick",
	"default:brick",
	{cracky = 3},
	{"default_brick.png"},
	"Brick Stair",
	"Brick Slab",
	default.node_sound_stone_defaults(),
	false
)

my_register_stair_and_slab(
	"steelblock",
	"default:steelblock",
	{cracky = 1, level = 2},
	{"default_steel_block.png"},
	"Steel Block Stair",
	"Steel Block Slab",
	default.node_sound_metal_defaults(),
	true
)

my_register_stair_and_slab(
	"tinblock",
	"default:tinblock",
	{cracky = 1, level = 2},
	{"default_tin_block.png"},
	"Tin Block Stair",
	"Tin Block Slab",
	default.node_sound_metal_defaults(),
	true
)

my_register_stair_and_slab(
	"copperblock",
	"default:copperblock",
	{cracky = 1, level = 2},
	{"default_copper_block.png"},
	"Copper Block Stair",
	"Copper Block Slab",
	default.node_sound_metal_defaults(),
	true
)

my_register_stair_and_slab(
	"bronzeblock",
	"default:bronzeblock",
	{cracky = 1, level = 2},
	{"default_bronze_block.png"},
	"Bronze Block Stair",
	"Bronze Block Slab",
	default.node_sound_metal_defaults(),
	true
)

my_register_stair_and_slab(
	"goldblock",
	"default:goldblock",
	{cracky = 1},
	{"default_gold_block.png"},
	"Gold Block Stair",
	"Gold Block Slab",
	default.node_sound_metal_defaults(),
	true
)

my_register_stair_and_slab(
	"ice",
	"default:ice",
	{cracky = 3, cools_lava = 1, slippery = 3},
	{"default_ice.png"},
	"Ice Stair",
	"Ice Slab",
	default.node_sound_glass_defaults(),
	true
)

my_register_stair_and_slab(
	"snowblock",
	"default:snowblock",
	{crumbly = 3, cools_lava = 1, snowy = 1},
	{"default_snow.png"},
	"Snow Block Stair",
	"Snow Block Slab",
	default.node_sound_snow_defaults(),
	true
)

-- Glass stair nodes need to be registered individually to utilize specialized textures.

stairs.register_stair(
	"glass",
	"default:glass",
	{cracky = 3, oddly_breakable_by_hand = 3},
	{"stairs_glass_split.png", "default_glass.png",
	"stairs_glass_stairside.png^[transformFX", "stairs_glass_stairside.png",
	"default_glass.png", "stairs_glass_split.png"},
	S("Glass Stair"),
	default.node_sound_glass_defaults(),
	false
)

stairs.register_slab(
	"glass",
	"default:glass",
	{cracky = 3, oddly_breakable_by_hand = 3},
	{"default_glass.png", "default_glass.png", "stairs_glass_split.png"},
	S("Glass Slab"),
	default.node_sound_glass_defaults(),
	false
)

stairs.register_stair_inner(
	"glass",
	"default:glass",
	{cracky = 3, oddly_breakable_by_hand = 3},
	{"stairs_glass_stairside.png^[transformR270", "default_glass.png",
	"stairs_glass_stairside.png^[transformFX", "default_glass.png",
	"default_glass.png", "stairs_glass_stairside.png"},
	"",
	default.node_sound_glass_defaults(),
	false,
	S("Inner Glass Stair")
)

stairs.register_stair_outer(
	"glass",
	"default:glass",
	{cracky = 3, oddly_breakable_by_hand = 3},
	{"stairs_glass_stairside.png^[transformR90", "default_glass.png",
	"stairs_glass_outer_stairside.png", "stairs_glass_stairside.png",
	"stairs_glass_stairside.png^[transformR90","stairs_glass_outer_stairside.png"},
	"",
	default.node_sound_glass_defaults(),
	false,
	S("Outer Glass Stair")
)

stairs.register_stair(
	"obsidian_glass",
	"default:obsidian_glass",
	{cracky = 3},
	{"stairs_obsidian_glass_split.png", "default_obsidian_glass.png",
	"stairs_obsidian_glass_stairside.png^[transformFX", "stairs_obsidian_glass_stairside.png",
	"default_obsidian_glass.png", "stairs_obsidian_glass_split.png"},
	S("Obsidian Glass Stair"),
	default.node_sound_glass_defaults(),
	false
)

stairs.register_slab(
	"obsidian_glass",
	"default:obsidian_glass",
	{cracky = 3},
	{"default_obsidian_glass.png", "default_obsidian_glass.png", "stairs_obsidian_glass_split.png"},
	S("Obsidian Glass Slab"),
	default.node_sound_glass_defaults(),
	false
)

stairs.register_stair_inner(
	"obsidian_glass",
	"default:obsidian_glass",
	{cracky = 3},
	{"stairs_obsidian_glass_stairside.png^[transformR270", "default_obsidian_glass.png",
	"stairs_obsidian_glass_stairside.png^[transformFX", "default_obsidian_glass.png",
	"default_obsidian_glass.png", "stairs_obsidian_glass_stairside.png"},
	"",
	default.node_sound_glass_defaults(),
	false,
	S("Inner Obsidian Glass Stair")
)

stairs.register_stair_outer(
	"obsidian_glass",
	"default:obsidian_glass",
	{cracky = 3},
	{"stairs_obsidian_glass_stairside.png^[transformR90", "default_obsidian_glass.png",
	"stairs_obsidian_glass_outer_stairside.png", "stairs_obsidian_glass_stairside.png",
	"stairs_obsidian_glass_stairside.png^[transformR90","stairs_obsidian_glass_outer_stairside.png"},
	"",
	default.node_sound_glass_defaults(),
	false,
	S("Outer Obsidian Glass Stair")
)

-- Dummy calls to S() to allow translation scripts to detect the strings.
-- To update this add this code to my_register_stair_and_slab:
-- for _,x in ipairs({"","Inner ","Outer "}) do print(("S(%q)"):format(x..desc_stair)) end
-- print(("S(%q)"):format(desc_slab))

--[[
S("Wooden Stair")
S("Inner Wooden Stair")
S("Outer Wooden Stair")
S("Wooden Slab")
S("Jungle Wood Stair")
S("Inner Jungle Wood Stair")
S("Outer Jungle Wood Stair")
S("Jungle Wood Slab")
S("Pine Wood Stair")
S("Inner Pine Wood Stair")
S("Outer Pine Wood Stair")
S("Pine Wood Slab")
S("Acacia Wood Stair")
S("Inner Acacia Wood Stair")
S("Outer Acacia Wood Stair")
S("Acacia Wood Slab")
S("Aspen Wood Stair")
S("Inner Aspen Wood Stair")
S("Outer Aspen Wood Stair")
S("Aspen Wood Slab")
S("Stone Stair")
S("Inner Stone Stair")
S("Outer Stone Stair")
S("Stone Slab")
S("Cobblestone Stair")
S("Inner Cobblestone Stair")
S("Outer Cobblestone Stair")
S("Cobblestone Slab")
S("Mossy Cobblestone Stair")
S("Inner Mossy Cobblestone Stair")
S("Outer Mossy Cobblestone Stair")
S("Mossy Cobblestone Slab")
S("Stone Brick Stair")
S("Inner Stone Brick Stair")
S("Outer Stone Brick Stair")
S("Stone Brick Slab")
S("Stone Block Stair")
S("Inner Stone Block Stair")
S("Outer Stone Block Stair")
S("Stone Block Slab")
S("Desert Stone Stair")
S("Inner Desert Stone Stair")
S("Outer Desert Stone Stair")
S("Desert Stone Slab")
S("Desert Cobblestone Stair")
S("Inner Desert Cobblestone Stair")
S("Outer Desert Cobblestone Stair")
S("Desert Cobblestone Slab")
S("Desert Stone Brick Stair")
S("Inner Desert Stone Brick Stair")
S("Outer Desert Stone Brick Stair")
S("Desert Stone Brick Slab")
S("Desert Stone Block Stair")
S("Inner Desert Stone Block Stair")
S("Outer Desert Stone Block Stair")
S("Desert Stone Block Slab")
S("Sandstone Stair")
S("Inner Sandstone Stair")
S("Outer Sandstone Stair")
S("Sandstone Slab")
S("Sandstone Brick Stair")
S("Inner Sandstone Brick Stair")
S("Outer Sandstone Brick Stair")
S("Sandstone Brick Slab")
S("Sandstone Block Stair")
S("Inner Sandstone Block Stair")
S("Outer Sandstone Block Stair")
S("Sandstone Block Slab")
S("Desert Sandstone Stair")
S("Inner Desert Sandstone Stair")
S("Outer Desert Sandstone Stair")
S("Desert Sandstone Slab")
S("Desert Sandstone Brick Stair")
S("Inner Desert Sandstone Brick Stair")
S("Outer Desert Sandstone Brick Stair")
S("Desert Sandstone Brick Slab")
S("Desert Sandstone Block Stair")
S("Inner Desert Sandstone Block Stair")
S("Outer Desert Sandstone Block Stair")
S("Desert Sandstone Block Slab")
S("Silver Sandstone Stair")
S("Inner Silver Sandstone Stair")
S("Outer Silver Sandstone Stair")
S("Silver Sandstone Slab")
S("Silver Sandstone Brick Stair")
S("Inner Silver Sandstone Brick Stair")
S("Outer Silver Sandstone Brick Stair")
S("Silver Sandstone Brick Slab")
S("Silver Sandstone Block Stair")
S("Inner Silver Sandstone Block Stair")
S("Outer Silver Sandstone Block Stair")
S("Silver Sandstone Block Slab")
S("Obsidian Stair")
S("Inner Obsidian Stair")
S("Outer Obsidian Stair")
S("Obsidian Slab")
S("Obsidian Brick Stair")
S("Inner Obsidian Brick Stair")
S("Outer Obsidian Brick Stair")
S("Obsidian Brick Slab")
S("Obsidian Block Stair")
S("Inner Obsidian Block Stair")
S("Outer Obsidian Block Stair")
S("Obsidian Block Slab")
S("Brick Stair")
S("Inner Brick Stair")
S("Outer Brick Stair")
S("Brick Slab")
S("Steel Block Stair")
S("Inner Steel Block Stair")
S("Outer Steel Block Stair")
S("Steel Block Slab")
S("Tin Block Stair")
S("Inner Tin Block Stair")
S("Outer Tin Block Stair")
S("Tin Block Slab")
S("Copper Block Stair")
S("Inner Copper Block Stair")
S("Outer Copper Block Stair")
S("Copper Block Slab")
S("Bronze Block Stair")
S("Inner Bronze Block Stair")
S("Outer Bronze Block Stair")
S("Bronze Block Slab")
S("Gold Block Stair")
S("Inner Gold Block Stair")
S("Outer Gold Block Stair")
S("Gold Block Slab")
S("Ice Stair")
S("Inner Ice Stair")
S("Outer Ice Stair")
S("Ice Slab")
S("Snow Block Stair")
S("Inner Snow Block Stair")
S("Outer Snow Block Stair")
S("Snow Block Slab")
--]]


code:
# textdomain: stairs
Glass Stair=Glastreppe
Glass Slab=Glasplatte
Inner Glass Stair=Innere Glastreppe
Outer Glass Stair=Äußere Glastreppe
Obsidian Glass Stair=Obsidianglastreppe
Obsidian Glass Slab=Obsidianglasplatte
Inner Obsidian Glass Stair=Innere Obsidianglastreppe
Outer Obsidian Glass Stair=Äußere Obsidianglastreppe
Wooden Stair=Holztreppe
Inner Wooden Stair=Innere Holztreppe
Outer Wooden Stair=Äußere Holztreppe
Wooden Slab=Holzplatte
Jungle Wood Stair=Dschungelholztreppe
Inner Jungle Wood Stair=Innere Dschungelholztreppe
Outer Jungle Wood Stair=Äußere Dschungelholztreppe
Jungle Wood Slab=Dschungelholzplatte
Pine Wood Stair=Kiefernholztreppe
Inner Pine Wood Stair=Innere Kiefernholztreppe
Outer Pine Wood Stair=Äußere Kiefernholztreppe
Pine Wood Slab=Kiefernholzplatte
Acacia Wood Stair=Akazienholztreppe
Inner Acacia Wood Stair=Innere Akazienholztreppe
Outer Acacia Wood Stair=Äußere Akazienholztreppe
Acacia Wood Slab=Akazienholzplatte
Aspen Wood Stair=Espenholztreppe
Inner Aspen Wood Stair=Innere Espenholztreppe
Outer Aspen Wood Stair=Äußere Espenholztreppe
Aspen Wood Slab=Espenholzplatte
Stone Stair=Steintreppe
Inner Stone Stair=Innere Steintreppe
Outer Stone Stair=Äußere Steintreppe
Stone Slab=Steinplatte
Cobblestone Stair=Kopfsteinpflastertreppe
Inner Cobblestone Stair=Innere Kopfsteinpflastertreppe
Outer Cobblestone Stair=Äußere Kopfsteinpflastertreppe
Cobblestone Slab=Kopfsteinpflasterplatte
Mossy Cobblestone Stair=Mosige Kopfsteinpflastertreppe
Inner Mossy Cobblestone Stair=Innere mosige Kopfsteinpflastertreppe
Outer Mossy Cobblestone Stair=Äußere mosige Kopfsteinpflastertreppe
Mossy Cobblestone Slab=Mosige Kopfsteinpflasterplatte
Stone Brick Stair=Steinziegeltreppe
Inner Stone Brick Stair=Innere Steinziegeltreppe
Outer Stone Brick Stair=Äußere Steinziegeltreppe
Stone Brick Slab=Steinziegelplatte
Stone Block Stair=Steinblocktreppe
Inner Stone Block Stair=Innere Steinblocktreppe
Outer Stone Block Stair=Äußere Steinblocktreppe
Stone Block Slab=Steinblockplatte
Desert Stone Stair=Wüstensteintreppe
Inner Desert Stone Stair=Innere Wüstensteintreppe
Outer Desert Stone Stair=Äußere Wüstensteintreppe
Desert Stone Slab=Wüstensteinplatte
Desert Cobblestone Stair=Wüstenkopfsteinpflastertreppe
Inner Desert Cobblestone Stair=Innere Wüstenkopfsteinpflastertreppe
Outer Desert Cobblestone Stair=Äußere Wüstenkopfsteinpflastertreppe
Desert Cobblestone Slab=Wüstenkopfsteinpflasterplatte
Desert Stone Brick Stair=Wüstensteinziegeltreppe
Inner Desert Stone Brick Stair=Innere Wüstensteinziegeltreppe
Outer Desert Stone Brick Stair=Äußere Wüstensteinziegeltreppe
Desert Stone Brick Slab=Wüstensteinziegelplatte
Desert Stone Block Stair=Wüstensteinblocktreppe
Inner Desert Stone Block Stair=Innere Wüstensteinblocktreppe
Outer Desert Stone Block Stair=Äußere Wüstensteinblocktreppe
Desert Stone Block Slab=Wüstensteinblockplatte
Sandstone Stair=Sandsteintreppe
Inner Sandstone Stair=Innere Sandsteintreppe
Outer Sandstone Stair=Äußere Sandsteintreppe
Sandstone Slab=Sandsteinplatte
Sandstone Brick Stair=Sandsteinziegeltreppe
Inner Sandstone Brick Stair=Innere Sandsteinziegeltreppe
Outer Sandstone Brick Stair=Äußere Sandsteinziegeltreppe
Sandstone Brick Slab=Sandsteinziegelplatte
Sandstone Block Stair=Sandsteinblocktreppe
Inner Sandstone Block Stair=Innere Sandsteinblocktreppe
Outer Sandstone Block Stair=Äußere Sandsteinblocktreppe
Sandstone Block Slab=Sandsteinblockplatte
Desert Sandstone Stair=Wüstensandsteintreppe
Inner Desert Sandstone Stair=Innere Wüstensandsteintreppe
Outer Desert Sandstone Stair=Äußere Wüstensandsteintreppe
Desert Sandstone Slab=Wüstensandsteinplatte
Desert Sandstone Brick Stair=Wüstensandsteinziegeltreppe
Inner Desert Sandstone Brick Stair=Innere Wüstensandsteinziegeltreppe
Outer Desert Sandstone Brick Stair=Äußere Wüstensandsteinziegeltreppe
Desert Sandstone Brick Slab=Wüstensandsteinziegelplatte
Desert Sandstone Block Stair=Wüstensandsteinblocktreppe
Inner Desert Sandstone Block Stair=Innere Wüstensandsteinblocktreppe
Outer Desert Sandstone Block Stair=Äußere Wüstensandsteinblocktreppe
Desert Sandstone Block Slab=Wüstensandsteinblockplatte
Silver Sandstone Stair=Silbersandsteintreppe
Inner Silver Sandstone Stair=Innere Silbersandsteintreppe
Outer Silver Sandstone Stair=Äußere Silbersandsteintreppe
Silver Sandstone Slab=Silbersandsteinplatte
Silver Sandstone Brick Stair=Silbersandsteinziegeltreppe
Inner Silver Sandstone Brick Stair=Innere Silbersandsteinziegeltreppe
Outer Silver Sandstone Brick Stair=Äußere Silbersandsteinziegeltreppe
Silver Sandstone Brick Slab=Silbersandsteinziegelplatte
Silver Sandstone Block Stair=Silbersandsteinblocktreppe
Inner Silver Sandstone Block Stair=Innere Silbersandsteinblocktreppe
Outer Silver Sandstone Block Stair=Äußere Silbersandsteinblocktreppe
Silver Sandstone Block Slab=Silbersandsteinblockplatte
Obsidian Stair=Obsidiantreppe
Inner Obsidian Stair=Innere Obsidiantreppe
Outer Obsidian Stair=Äußere Obsidiantreppe
Obsidian Slab=Obsidianplatte
Obsidian Brick Stair=Obsidianziegeltreppe
Inner Obsidian Brick Stair=Innere Obsidianziegeltreppe
Outer Obsidian Brick Stair=Äußere Obsidianziegeltreppe
Obsidian Brick Slab=Obsidianziegelplatte
Obsidian Block Stair=Obsidianblocktreppe
Inner Obsidian Block Stair=Innere Obsidianblocktreppe
Outer Obsidian Block Stair=Äußere Obsidianblocktreppe
Obsidian Block Slab=Obsidianblockplatte
Brick Stair=Ziegeltreppe
Inner Brick Stair=Innere Ziegeltreppe
Outer Brick Stair=Äußere Ziegeltreppe
Brick Slab=Ziegelplatte
Steel Block Stair=Stahlblocktreppe
Inner Steel Block Stair=Innere Stahlblocktreppe
Outer Steel Block Stair=Äußere Stahlblocktreppe
Steel Block Slab=Stahlblockplatte
Tin Block Stair=Zinnblocktreppe
Inner Tin Block Stair=Innere Zinnblocktreppe
Outer Tin Block Stair=Äußere Zinnblocktreppe
Tin Block Slab=Zinnblockplatte
Copper Block Stair=Kupferblocktreppe
Inner Copper Block Stair=Innere Kupferblocktreppe
Outer Copper Block Stair=Äußere Kupferblocktreppe
Copper Block Slab=Kupferblockplatte
Bronze Block Stair=Bronzeblocktreppe
Inner Bronze Block Stair=Innere Bronzeblocktreppe
Outer Bronze Block Stair=Äußere Bronzeblocktreppe
Bronze Block Slab=Bronzeblockplatte
Gold Block Stair=Goldblocktreppe
Inner Gold Block Stair=Innere Goldblocktreppe
Outer Gold Block Stair=Äußere Goldblocktreppe
Gold Block Slab=Goldblockplatte
Ice Stair=Eistreppe
Inner Ice Stair=Innere Eistreppe
Outer Ice Stair=Äußere Eistreppe
Ice Slab=Eisplatte
Snow Block Stair=Schneeblocktreppe
Inner Snow Block Stair=Innere Schneeblocktreppe
Outer Snow Block Stair=Äußere Schneeblocktreppe
Snow Block Slab=Schneeblockplatte


code:
# textdomain: stairs
Glass Stair=Escalera de vidrio
Glass Slab=Losa de vidrio
Inner Glass Stair=Escalera interior de vidrio
Outer Glass Stair=Escalera exterior de vidrio
Obsidian Glass Stair=Escalera de vidrio de obsidiana
Obsidian Glass Slab=Losa de vidrio de obsidiana
Inner Obsidian Glass Stair=Escalera interior de vidrio de obsidiana
Outer Obsidian Glass Stair=Escalera exterior de vidrio de obsidiana
Wooden Stair=Escalera de madera
Inner Wooden Stair=Escalera interior de madera
Outer Wooden Stair=Escalera exterior de madera
Wooden Slab=Losa de madera
Jungle Wood Stair=Escalera de madera tropical
Inner Jungle Wood Stair=Escalera interior de madera tropical
Outer Jungle Wood Stair=Escalera exterior de madera tropical
Jungle Wood Slab=Losa de madera tropical
Pine Wood Stair=Escalera de pino
Inner Pine Wood Stair=Escalera interior de pino
Outer Pine Wood Stair=Escalera exterior de pino
Pine Wood Slab=Losa de pino
Acacia Wood Stair=Escalera de acacia
Inner Acacia Wood Stair=Escalera interior de acacia
Outer Acacia Wood Stair=Escalera exterior de acacia
Acacia Wood Slab=Losa de acacia
Aspen Wood Stair=Escalera de álamo
Inner Aspen Wood Stair=Escalera interior de álamo
Outer Aspen Wood Stair=Escalera exterior de álamo
Aspen Wood Slab=Losa de álamo
Stone Stair=Escalera de piedra
Inner Stone Stair=Escalera interior de piedra
Outer Stone Stair=Escalera exterior de piedra
Stone Slab=Losa de piedra
Cobblestone Stair=Escalera de adoquines
Inner Cobblestone Stair=Escalera interior de adoquines
Outer Cobblestone Stair=Escalera exterior de adoquines
Cobblestone Slab=Losa de adoquines
Mossy Cobblestone Stair=Escalera de adoquines musgosos
Inner Mossy Cobblestone Stair=Escalera interior de adoquines musgosos
Outer Mossy Cobblestone Stair=Escalera exterior de adoquines musgosos
Mossy Cobblestone Slab=Losa de adoquines musgosos
Stone Brick Stair=Escalera de ladrillos de piedra
Inner Stone Brick Stair=Escalera interior de ladrillos de piedra
Outer Stone Brick Stair=Escalera exterior de ladrillos de piedra
Stone Brick Slab=Losa de ladrillos de piedra
Stone Block Stair=Escalera de bloques de piedra
Inner Stone Block Stair=Escalera interior de bloques de piedra
Outer Stone Block Stair=Escalera exterior de bloques de piedra
Stone Block Slab=Losa de bloques de piedra
Desert Stone Stair=Escalera de piedra desértica
Inner Desert Stone Stair=Escalera interior de piedra desértica
Outer Desert Stone Stair=Escalera exterior de piedra desértica
Desert Stone Slab=Losa de piedra desértica
Desert Cobblestone Stair=Escalera de adoquines desérticos
Inner Desert Cobblestone Stair=Escalera interior de adoquines desérticos
Outer Desert Cobblestone Stair=Escalera exterior de adoquines desérticos
Desert Cobblestone Slab=Losa de adoquines desérticos
Desert Stone Brick Stair=Escalera de ladrillos desérticos
Inner Desert Stone Brick Stair=Escalera interior de ladrillos desérticos
Outer Desert Stone Brick Stair=Escalera exterior de ladrillos desérticos
Desert Stone Brick Slab=Losa de ladrillos desérticos
Desert Stone Block Stair=Escalera de bloques de piedra desértica
Inner Desert Stone Block Stair=Escalera interior de bloques de piedra desértica
Outer Desert Stone Block Stair=Escalera exterior de bloques de piedra desértica
Desert Stone Block Slab=Losa de bloques de piedra desértica
Sandstone Stair=Escalera de arenisca
Inner Sandstone Stair=Escalera interior de arenisca
Outer Sandstone Stair=Escalera exterior de arenisca
Sandstone Slab=Losa de arenisca
Sandstone Brick Stair=Escalera de ladrillos de arenisca
Inner Sandstone Brick Stair=Escalera interior de ladrillos de arenisca
Outer Sandstone Brick Stair=Escalera exterior de ladrillos de arenisca
Sandstone Brick Slab=Losa de ladrillos de arenisca
Sandstone Block Stair=Escalera de bloques de arenisca
Inner Sandstone Block Stair=Escalera interior de bloques de arenisca
Outer Sandstone Block Stair=Escalera exterior de bloques de arenisca
Sandstone Block Slab=Losa de bloques de arenisca
Desert Sandstone Stair=Escalera de arenisca desértica
Inner Desert Sandstone Stair=Escalera interior de arenisca desértica
Outer Desert Sandstone Stair=Escalera exterior de arenisca desértica
Desert Sandstone Slab=Losa de arenisca desértica
Desert Sandstone Brick Stair=Escalera de ladrillos de arenisca desértica
Inner Desert Sandstone Brick Stair=Escalera interior de ladrillos de arenisca desértica
Outer Desert Sandstone Brick Stair=Escalera exterior de ladrillos de arenisca desértica
Desert Sandstone Brick Slab=Losa de ladrillos de arenisca desértica
Desert Sandstone Block Stair=Escalera de bloques de arenisca desértica
Inner Desert Sandstone Block Stair=Escalera interior de bloques de arenisca desértica
Outer Desert Sandstone Block Stair=Escalera exterior de bloques de arenisca desértica
Desert Sandstone Block Slab=Losa de bloques de arenisca desértica
Silver Sandstone Stair=Escalera de arenisca plateada
Inner Silver Sandstone Stair=Escalera interior de arenisca plateada
Outer Silver Sandstone Stair=Escalera exterior de arenisca plateada
Silver Sandstone Slab=Losa de arenisca plateada
Silver Sandstone Brick Stair=Escalera de ladrillos de arenisca plateada
Inner Silver Sandstone Brick Stair=Escalera interior de ladrillos de arenisca plateada
Outer Silver Sandstone Brick Stair=Escalera exterior de ladrillos de arenisca plateada
Silver Sandstone Brick Slab=Losa de ladrillos de arenisca plateada
Silver Sandstone Block Stair=Escalera de bloques de arenisca plateada
Inner Silver Sandstone Block Stair=Escalera interior de bloques de arenisca plateada
Outer Silver Sandstone Block Stair=Escalera exterior de bloques de arenisca plateada
Silver Sandstone Block Slab=Losa de bloques de arenisca plateada
Obsidian Stair=Escalera de obsidiana
Inner Obsidian Stair=Escalera interior de obsidiana
Outer Obsidian Stair=Escalera exterior de obsidiana
Obsidian Slab=Losa de obsidiana
Obsidian Brick Stair=Escalera de ladrillos de obsidiana
Inner Obsidian Brick Stair=Escalera interior de ladrillos de obsidiana
Outer Obsidian Brick Stair=Escalera exterior de ladrillos de obsidiana
Obsidian Brick Slab=Losa de ladrillos de obsidiana
Obsidian Block Stair=Escalera de bloques de obsidiana
Inner Obsidian Block Stair=Escalera interior de bloques de obsidiana
Outer Obsidian Block Stair=Escalera exterior de bloques de obsidiana
Obsidian Block Slab=Losa de bloques de obsidiana
Brick Stair=Escalera de ladrillos
Inner Brick Stair=Escalera interior de ladrillos
Outer Brick Stair=Escalera exterior de ladrillos
Brick Slab=Losa de ladrillos
Steel Block Stair=Escalera de acero
Inner Steel Block Stair=Escalera interior de acero
Outer Steel Block Stair=Escalera exterior de acero
Steel Block Slab=Losa de acero
Tin Block Stair=Escalera de estaño
Inner Tin Block Stair=Escalera interior de estaño
Outer Tin Block Stair=Escalera exterior de estaño
Tin Block Slab=Losa de estaño
Copper Block Stair=Escalera de cobre
Inner Copper Block Stair=Escalera interior de cobre
Outer Copper Block Stair=Escalera exterior de cobre
Copper Block Slab=Losa de cobre
Bronze Block Stair=Escalera de bronce
Inner Bronze Block Stair=Escalera interior de bronce
Outer Bronze Block Stair=Escalera exterior de bronce
Bronze Block Slab=Losa de bronce
Gold Block Stair=Escalera de oro
Inner Gold Block Stair=Escalera interior de oro
Outer Gold Block Stair=Escalera exterior de oro
Gold Block Slab=Losa de oro
Ice Stair=Escalera de hielo
Inner Ice Stair=Escalera interior de hielo
Outer Ice Stair=Escalera exterior de hielo
Ice Slab=Losa de hielo
Snow Block Stair=Escalera de nieve
Inner Snow Block Stair=Escalera interior de nieve
Outer Snow Block Stair=Escalera exterior de nieve
Snow Block Slab=Losa de nieve


code:
# textdomain: stairs
Glass Stair=Escalier de verre
Glass Slab=Dalle de verre
Inner Glass Stair=Escalier intérieur de verre
Outer Glass Stair=Escalier extérieur de verre
Obsidian Glass Stair=Escalier de verre d'obsidienne
Obsidian Glass Slab=Dalle de verre d'obsidienne
Inner Obsidian Glass Stair=Escalier intérieur de verre d'obsidienne
Outer Obsidian Glass Stair=Escalier extérieur de verre d'obsidienne
Wooden Stair=Escalier en bois
Inner Wooden Stair=Escalier intérieur en bois
Outer Wooden Stair=Escalier extérieur en bois
Wooden Slab=Dalle de bois
Jungle Wood Stair=Escalier en bois de la jungle
Inner Jungle Wood Stair=Escalier intérieur en bois de la jungle
Outer Jungle Wood Stair=Escalier extérieur en bois de la jungle
Jungle Wood Slab=Dalle en bois de la jungle
Pine Wood Stair=Escalier en pin
Inner Pine Wood Stair=Escalier intérieur en pin
Outer Pine Wood Stair=Escalier extérieur en pin
Pine Wood Slab=Dalle en pin
Acacia Wood Stair=Escalier en acacia
Inner Acacia Wood Stair=Escalier intérieur en acacia
Outer Acacia Wood Stair=Escalier extérieur en acacia
Acacia Wood Slab=Dalle en acacia
Aspen Wood Stair=Escalier en tremble
Inner Aspen Wood Stair=Escalier intérieur en tremble
Outer Aspen Wood Stair=Escalier extérieur en tremble
Aspen Wood Slab=Dalle en tremble
Stone Stair=Escalier de pierre
Inner Stone Stair=Escalier intérieur de pierre
Outer Stone Stair=Escalier extérieur de pierre
Stone Slab=Dalle de pierre
Cobblestone Stair=Escalier en pavé
Inner Cobblestone Stair=Escalier intérieur en pavé
Outer Cobblestone Stair=Escalier extérieur en pavé
Cobblestone Slab=Dalle en pavé
Mossy Cobblestone Stair=Escalier en pavé moussu
Inner Mossy Cobblestone Stair=Escalier intérieur en pavé moussu
Outer Mossy Cobblestone Stair=Escalier extérieur en pavé moussu
Mossy Cobblestone Slab=Dalle en pavé moussu
Stone Brick Stair=Escalier en brique de pierre
Inner Stone Brick Stair=Escalier intérieur en brique de pierre
Outer Stone Brick Stair=Escalier extérieur en brique de pierre
Stone Brick Slab=Dalle en brique de pierre
Stone Block Stair=Escalier en bloc de pierre
Inner Stone Block Stair=Escalier intérieur en bloc de pierre
Outer Stone Block Stair=Escalier extérieur en bloc de pierre
Stone Block Slab=Dalle en bloc de pierre
Desert Stone Stair=Escalier en pierre du désert
Inner Desert Stone Stair=Escalier intérieur en pierre du désert
Outer Desert Stone Stair=Escalier extérieur en pierre du désert
Desert Stone Slab=Dalle en pierre du désert
Desert Cobblestone Stair=Escalier en pavé du désert
Inner Desert Cobblestone Stair=Escalier intérieur en pavé du désert
Outer Desert Cobblestone Stair=Escalier extérieur en pavé du désert
Desert Cobblestone Slab=Dalle en pavé du désert
Desert Stone Brick Stair=Escalier en brique de pierre du désert
Inner Desert Stone Brick Stair=Escalier intérieur en brique de pierre du désert
Outer Desert Stone Brick Stair=Escalier extérieur en brique de pierre du désert
Desert Stone Brick Slab=Dalle en brique de pierre du désert
Desert Stone Block Stair=Escalier en bloc de pierre du désert
Inner Desert Stone Block Stair=Escalier intérieur en bloc de pierre du désert
Outer Desert Stone Block Stair=Escalier extérieur en bloc de pierre du désert
Desert Stone Block Slab=Dalle en bloc de pierre du désert
Sandstone Stair=Escalier en grès
Inner Sandstone Stair=Escalier intérieur en grès
Outer Sandstone Stair=Escalier extérieur en grès
Sandstone Slab=Dalle en grès
Sandstone Brick Stair=Escalier en brique de grès
Inner Sandstone Brick Stair=Escalier intérieur en brique de grès
Outer Sandstone Brick Stair=Escalier extérieur en brique de grès
Sandstone Brick Slab=Dalle en brique de grès
Sandstone Block Stair=Escalier en bloc de grès
Inner Sandstone Block Stair=Escalier intérieur en bloc de grès
Outer Sandstone Block Stair=Escalier extérieur en bloc de grès
Sandstone Block Slab=Dalle en bloc de grès
Desert Sandstone Stair=Escalier en grès du désert
Inner Desert Sandstone Stair=Escalier intérieur en grès du désert
Outer Desert Sandstone Stair=Escalier extérieur en grès du désert
Desert Sandstone Slab=Dalle en grès du désert
Desert Sandstone Brick Stair=Escalier en brique de grès du désert
Inner Desert Sandstone Brick Stair=Escalier intérieur en brique de grès du désert
Outer Desert Sandstone Brick Stair=Escalier extérieur en brique de grès du désert
Desert Sandstone Brick Slab=Dalle en brique de grès du désert
Desert Sandstone Block Stair=Escalier en bloc de grès du désert
Inner Desert Sandstone Block Stair=Escalier intérieur en bloc de grès du désert
Outer Desert Sandstone Block Stair=Escalier extérieur en bloc de grès du désert
Desert Sandstone Block Slab=Dalle en bloc de grès du désert
Silver Sandstone Stair=Escalier en grès argenté
Inner Silver Sandstone Stair=Escalier intérieur en grès argenté
Outer Silver Sandstone Stair=Escalier extérieur en grès argenté
Silver Sandstone Slab=Dalle en grès argenté
Silver Sandstone Brick Stair=Escalier en brique de grès argenté
Inner Silver Sandstone Brick Stair=Escalier intérieur en brique de grès argenté
Outer Silver Sandstone Brick Stair=Escalier extérieur en brique de grès argenté
Silver Sandstone Brick Slab=Dalle en brique de grès argenté
Silver Sandstone Block Stair=Escalier en bloc de grès argenté
Inner Silver Sandstone Block Stair=Escalier intérieur en bloc de grès argenté
Outer Silver Sandstone Block Stair=Escalier extérieur en bloc de grès argenté
Silver Sandstone Block Slab=Dalle en bloc de grès argenté
Obsidian Stair=Escalier en obsidienne
Inner Obsidian Stair=Escalier intérieur en obsidienne
Outer Obsidian Stair=Escalier extérieur en obsidienne
Obsidian Slab=Dalle en obsidienne
Obsidian Brick Stair=Escalier en brique d'obsidienne
Inner Obsidian Brick Stair=Escalier intérieur en brique d'obsidienne
Outer Obsidian Brick Stair=Escalier extérieur en brique d'obsidienne
Obsidian Brick Slab=Dalle en brique d'obsidienne
Obsidian Block Stair=Escalier en bloc d'obsidienne
Inner Obsidian Block Stair=Escalier intérieur en bloc d'obsidienne
Outer Obsidian Block Stair=Escalier extérieur en bloc d'obsidienne
Obsidian Block Slab=Dalle en bloc d'obsidienne
Brick Stair=Escalier en brique
Inner Brick Stair=Escalier intérieur en brique
Outer Brick Stair=Escalier extérieur en brique
Brick Slab=Dalle en brique
Steel Block Stair=Escalier en acier
Inner Steel Block Stair=Escalier intérieur en acier
Outer Steel Block Stair=Escalier extérieur en acier
Steel Block Slab=Dalle en acier
Tin Block Stair=Escalier en bloc d'étain
Inner Tin Block Stair=Escalier intérieur en bloc d'étain
Outer Tin Block Stair=Escalier extérieur en bloc d'étain
Tin Block Slab=Dalle en bloc d'étain
Copper Block Stair=Escalier en bloc de cuivre
Inner Copper Block Stair=Escalier intérieur en bloc de cuivre
Outer Copper Block Stair=Escalier extérieur en bloc de cuivre
Copper Block Slab=Dalle en bloc de cuivre
Bronze Block Stair=Escalier en bronze
Inner Bronze Block Stair=Escalier intérieur en bronze
Outer Bronze Block Stair=Escalier extérieur en bronze
Bronze Block Slab=Dalle en bronze
Gold Block Stair=Escalier en bloc d'or
Inner Gold Block Stair=Escalier intérieur en bloc d'or
Outer Gold Block Stair=Escalier extérieur en bloc d'or
Gold Block Slab=Dalle en bloc d'or
Ice Stair=Escalier de glace
Inner Ice Stair=Escalier intérieur de glace
Outer Ice Stair=Escalier extérieur de glace
Ice Slab=Dalle de glace
Snow Block Stair=Escalier en bloc de neige
Inner Snow Block Stair=Escalier intérieur en bloc de neige
Outer Snow Block Stair=Escalier extérieur en bloc de neige
Snow Block Slab=Dalle en bloc de neige