code:
minetest.register_node("morelights_extras:f_block", {
  description = "Futuristic Light Block",
  tiles = {"morelights_extras_f_block.png"},
  paramtype = "light",
  light_source = LIGHT_MAX,
  groups = {cracky = 2, oddly_breakable_by_hand = 3},
  sounds = default.node_sound_glass_defaults(),
})

minetest.register_node("morelights_extras:dirt_with_grass", {
  description = "Grass Light",
  tiles = {"default_grass.png^morelights_extras_blocklight.png",
    "default_dirt.png", "default_dirt.png^default_grass_side.png"},
  paramtype = "light",
  light_source = 12,
  groups = {cracky = 2, oddly_breakable_by_hand = 3},
  sounds = default.node_sound_glass_defaults()
})

minetest.register_node("morelights_extras:stone_block", {
  description = "Stone Block Light",
  tiles = {"default_stone_block.png^morelights_extras_blocklight.png"},
  paramtype = "light",
  light_source = 12,
  groups = {cracky = 2, oddly_breakable_by_hand = 3},
  sounds = default.node_sound_glass_defaults()
})

minetest.register_node("morelights_extras:sandstone_block", {
  description = "Sandstone Block Light",
  tiles = {"default_sandstone_block.png^morelights_extras_blocklight.png"},
  paramtype = "light",
  light_source = 12,
  groups = {cracky = 2, oddly_breakable_by_hand = 3},
  sounds = default.node_sound_glass_defaults()
})

--
-- Craft recipes
--

minetest.register_craft({
  output = "morelights_extras:f_block",
  recipe = {
    {"default:mese_crystal_fragment", "default:steel_ingot", "default:mese_crystal_fragment"},
    {morelights.glass, "morelights:bulb", morelights.glass},
    {"default:mese_crystal_fragment", "default:steel_ingot", "default:mese_crystal_fragment"}
  }
})

minetest.register_craft({
  output = "morelights_extras:dirt_with_grass",
  recipe = {
    {"", morelights.glass, ""},
    {"", "morelights:bulb", ""},
    {"default:grass_1", "default:dirt", ""}
  }
})

minetest.register_craft({
  output = "morelights_extras:stone_block",
  recipe = {
    {"", morelights.glass, ""},
    {"", "morelights:bulb", ""},
    {"", "default:stone_block", ""}
  }
})

minetest.register_craft({
  output = "morelights_extras:sandstone_block",
  recipe = {
    {"", morelights.glass, ""},
    {"", "morelights:bulb", ""},
    {"", "default:sandstone_block", ""}
  }
})


code:
name = morelights_extras
title = Morelights Extras
description = Morelights extras.
author = random-geek
depends = default, morelights
optional_depends = stairs

repo_name: korkut/MeseCraft

license: mit


code:
-- basic_materials compatibility

local brass_ingot_name

if minetest.get_modpath("basic_materials") then
  -- Use basic materials brass ingot
  brass_ingot_name = "basic_materials:brass_ingot"
else
  -- Register and use morelights brass ingot
  minetest.register_craftitem("morelights_vintage:brass_ingot", {
    description = "Brass Ingot",
    inventory_image = "default_steel_ingot.png^[multiply:#FFCE69"
  })

  minetest.register_craft({
    output = "morelights_vintage:brass_ingot 2",
    type = "shapeless",
    recipe = {
      "default:copper_ingot", "default:tin_ingot"
    }
  })

  brass_ingot_name = "morelights_vintage:brass_ingot"
end

minetest.register_node("morelights_vintage:block", {
  description = "Vintage Light Block",
  tiles = {"morelights_vintage_block.png"},
  paramtype = "light",
  light_source = LIGHT_MAX,
  groups = {cracky = 2, oddly_breakable_by_hand = 3},
  sounds = default.node_sound_glass_defaults(),
})

minetest.register_node("morelights_vintage:lantern_f", {
  description = "Vintage Lantern (floor, wall, or ceiling)",
  drawtype = "mesh",
  mesh = "morelights_vintage_lantern_f.obj",
  tiles = {"morelights_vintage_lantern.png", "morelights_metal_dark_32.png"},
  collision_box = {
    type = "fixed",
    fixed = {-3/16, -1/2, -3/16, 3/16, 1/16, 3/16}
  },
  selection_box = {
    type = "fixed",
    fixed = {-3/16, -1/2, -3/16, 3/16, 1/16, 3/16}
  },
  paramtype = "light",
  light_source = 12,
  groups = {cracky = 2, oddly_breakable_by_hand = 3},
  sounds = default.node_sound_glass_defaults(),

  on_place = function(itemstack, placer, pointed_thing)
		local wdir = minetest.dir_to_wallmounted(
      vector.subtract(pointed_thing.under, pointed_thing.above))
		local fakestack = itemstack

		if wdir == 0 then
			fakestack:set_name("morelights_vintage:lantern_c")
		elseif wdir == 1 then
			fakestack:set_name("morelights_vintage:lantern_f")
		else
			fakestack:set_name("morelights_vintage:lantern_w")
		end

		itemstack = minetest.item_place(fakestack, placer, pointed_thing, wdir)
		itemstack:set_name("morelights_vintage:lantern_f")

		return itemstack
	end,
})

minetest.register_node("morelights_vintage:lantern_c", {
  drawtype = "mesh",
  mesh = "morelights_vintage_lantern_c.obj",
  tiles = {"morelights_vintage_lantern.png", "morelights_metal_dark_32.png"},
  collision_box = {
    type = "fixed",
    fixed = {-3/16, -1/16, -3/16, 3/16, 1/2, 3/16}
  },
  selection_box = {
    type = "fixed",
    fixed = {-3/16, 0, -3/16, 3/16, 1/2, 3/16}
  },
  paramtype = "light",
  light_source = 12,
  groups = {cracky = 2, oddly_breakable_by_hand = 3,
    not_in_creative_inventory = 1},
  sounds = default.node_sound_glass_defaults(),
  drop = "morelights_vintage:lantern_f",
})

minetest.register_node("morelights_vintage:lantern_w", {
  drawtype = "mesh",
  mesh = "morelights_vintage_lantern_w.obj",
  tiles = {"morelights_vintage_lantern.png", "morelights_metal_dark_32.png"},
  collision_box = {
    type = "fixed",
    fixed = {-3/16, -1/4, -5/16, 3/16, 1/8, 3/16}
  },
  selection_box = {
    type = "wallmounted",
    wall_bottom = {-3/16, -1/4, -5/16, 3/16, 1/8, 3/16},
    wall_side = {-1/4, -5/16, -3/16, 1/8, 3/16, 3/16},
    wall_top = {-3/16, -1/8, -5/16, 3/16, 1/4, 3/16}
  },
  paramtype = "light",
  paramtype2 = "wallmounted",
  light_source = 12,
  groups = {cracky = 2, oddly_breakable_by_hand = 3,
    not_in_creative_inventory = 1},
  sounds = default.node_sound_glass_defaults(),
  drop = "morelights_vintage:lantern_f",
})

minetest.register_node("morelights_vintage:oillamp", {
  description = "Vintage Oil Lamp",
  drawtype = "mesh",
  mesh = "morelights_vintage_oillamp.obj",
  tiles = {{name = "morelights_vintage_oil_flame.png",
    animation = {type = "sheet_2d", frames_w = 16, frames_h = 1, frame_length = 0.3}},
    "morelights_vintage_oillamp.png",
    "morelights_vintage_brass_32.png"},
  collision_box = {
    type = "fixed",
    fixed = {-1/8, -1/2, -1/8, 1/8, 1/4, 1/8}
  },
  selection_box = {
    type = "fixed",
    fixed = {-1/8, -1/2, -1/8, 1/8, 1/4, 1/8}
  },
  paramtype = "light",
  light_source = 8,
  groups = {cracky = 2, oddly_breakable_by_hand = 3},
  sounds = default.node_sound_glass_defaults(),
})

--
-- Craft recipes
--

minetest.register_craft({
  output = "morelights_vintage:block",
  recipe = {
    {"", "default:junglewood", ""},
    {morelights.glass, "morelights:bulb", morelights.glass},
    {"", "default:junglewood", ""}
  }
})

minetest.register_craft({
  output = "morelights_vintage:lantern_f",
  recipe = {
    {"", "default:steel_ingot", ""},
    {morelights.glass, "morelights:bulb", morelights.glass},
    {"default:stick", "default:steel_ingot", "default:stick"}
  }
})

minetest.register_craft({
  output = "morelights_vintage:oillamp",
  recipe = {
    {"", "default:glass", ""},
    {"farming:cotton", brass_ingot_name, ""},
    {"", "default:glass", ""}
  }
})


code:
name = morelights_vintage
title = Morelights Vintage
description = Morelights Vintage
author = random-geek
depends = default, farming, morelights
optional_depends = basic_materials


code:
# Minetest Game Plus [`mtg_plus`]
This mods adds various simple decorative blocks, doors, panes and more to extend Minetest Game.
The focus lies on:

* Snow and ice
* Panes
* Doors
* Metals

Current version: 1.0.0
For Minetest 5.0.0 or later

## Special stuff
Most new items are purely decorational and self-explanationary, but a few items are somewhat unique:

* Dirty Glass: Like glass, but sunlight will not go through unlimited
* Aggregated Diamond Block: Not even a diamond pickaxe can break it. But TNT will do
* Ice-themed doors and trapdoors: Solid doors for which (like for ice) light goes through
* Goldwood: Fireproof wood

## Compability
This mod is optionally compatible with:

* `xdecor`: For adding more recipes for compability
* `moreblocks`: For adding recipes involving the sweeper
* `furniture`: For adding furniture for goldwood and the cobblestone variants
* `doc_items`: For providing item descriptions (incomplete)
* `awards`: More achievements

## Credits and licenses
This mod is free software.

### Code
* Author: Wuzzy
* Licensed under: MIT License

### Graphics
All graphics are derivate works of Minetest Game textures.
They are licensed under [CC-BY-SA 3.0](https://creativecommons.org/licenses/by-sa/3.0/).

### Sounds
* `mtg_plus_door_icesteel_close.ogg`: Derivate work of `door_steel_door_close.ogg` by HazMatt from Minetest Game, licensed under [CC-BY 3.0](https://creativecommons.org/licenses/by/3.0/)
* `mtg_plus_door_icesteel_open.ogg`: Derivate work of `door_steel_door_open.ogg` by HazMatt from Minetest Game, licensed under CC-BY 3.0
* Everything else is licensed under the MIT License.


code:
local S = minetest.get_translator("mtg_plus")

local metal_sounds
if default.node_sound_metal_defaults then
	metal_sounds = default.node_sound_metal_defaults()
else
	metal_sounds = default.node_sound_stone_defaults()
end

-- Papyrus Block
minetest.register_node("mtg_plus:papyrus_block", {
	description = S("Papyrus Block"),
	tiles = {"mtg_plus_papyrus_block_y.png","mtg_plus_papyrus_block_y.png","mtg_plus_papyrus_block_side2.png","mtg_plus_papyrus_block_side2.png","mtg_plus_papyrus_block_side.png","mtg_plus_papyrus_block_side.png"},
	groups = {snappy = 2, choppy = 2, flammable = 3},
	is_ground_content = false,
	sounds = default.node_sound_leaves_defaults(),
})

minetest.register_craft({
	output = "mtg_plus:papyrus_block",
	recipe = { { "default:papyrus", "default:papyrus", "default:papyrus", },
	{ "default:papyrus", "default:papyrus", "default:papyrus", },
	{ "default:papyrus", "default:papyrus", "default:papyrus", } }
})

minetest.register_craft({
	output = "default:papyrus 9",
	recipe = { { "mtg_plus:papyrus_block" } }
})

minetest.register_craft({
	type = "fuel",
	recipe = "mtg_plus:papyrus_block",
	burntime = 9,
})


code:
mtg_plus = {}

local path = minetest.get_modpath(minetest.get_current_modname())

-- Trivial blocks (full definition included; almost all nodes are full cubes)
dofile(path.."/brickblocks.lua") -- Bricks and blocks

-- Non-trivial blocks (definition require API)
dofile(path.."/xpanes.lua") -- Panes (xpanes mod)
dofile(path.."/ladders.lua") -- Ladders


code:
local S = minetest.get_translator("mtg_plus")

local metal_sounds, wood_sounds
if default.node_sound_metal_defaults then
	metal_sounds = default.node_sound_metal_defaults()
else
	metal_sounds = default.node_sound_stone_defaults()
end
wood_sounds = default.node_sound_wood_defaults()

-- Ladders
minetest.register_node("mtg_plus:ladder_papyrus", {
	description = S("Papyrus Ladder"),
	_doc_items_longdesc = S("A particulary strong piece of ladder which allows you to move vertically."),
	drawtype = "signlike",
	tiles = {"mtg_plus_ladder_papyrus.png"},
	inventory_image = "mtg_plus_ladder_papyrus.png",
	wield_image = "mtg_plus_ladder_papyrus.png",
	paramtype = "light",
	paramtype2 = "wallmounted",
	sunlight_propagates = true,
	walkable = false,
	climbable = true,
	is_ground_content = false,
	selection_box = { type = "wallmounted", },
	groups = { snappy = 2, choppy = 1, flammable = 2 },
	sounds = default.node_sound_leaves_defaults(),
})

minetest.register_craft({
	output = "mtg_plus:ladder_papyrus 2",
	recipe = { {"default:papyrus", "", "default:papyrus"},
	{"farming:string", "default:papyrus", "farming:string"},
	{"default:papyrus", "", "default:papyrus"}},
})

minetest.register_craft({
	type = "fuel",
	recipe = "mtg_plus:ladder_papyrus",
	burntime = 2,
})

local simple_ladders = {
	{ "gold", "metal", S("Golden Ladder"), "default:gold_ingot", { cracky = 3 }, true },
	{ "bronze", "metal", S("Bronze Ladder"), "default:bronze_ingot", { cracky = 2 } },
	{ "copper", "metal", S("Copper Ladder"), "default:copper_ingot", { cracky = 2 } },
	{ "tin", "metal", S("Tin Ladder"), "default:tin_ingot", { cracky = 2 } },
	{ "aspen_wood", "wood", S("Aspen Wood Ladder"), "default:aspen_wood", { choppy = 3, flammable = 1 }, nil, 5 },
	{ "acacia_wood", "wood", S("Acacia Wood Ladder"), "default:acacia_wood", { choppy = 3, flammable = 1 }, nil, 8 },
	{ "pine_wood", "wood", S("Pine Wood Ladder"), "default:pine_wood", { choppy = 3, flammable = 1 }, nil, 6 },
	{ "junglewood", "wood", S("Jungle Wood Ladder"), "default:junglewood", { choppy = 3, flammable = 1 }, nil, 9 },
}

for m=1, #simple_ladders do
	local ladder = simple_ladders[m]
	local longdesc
	if ladder[6] then
		longdesc = S("A luxurious piece of ladder which allows you to move vertically.")
	else
		longdesc = S("A piece of ladder which allows you to move vertically.")
	end
	if ladder[2] == "metal" then
		sounds = metal_sounds
	else
		sounds = wood_sounds
	end
	minetest.register_node("mtg_plus:ladder_"..ladder[1], {
		description = ladder[3],
		_doc_items_longdesc = longdesc,
		drawtype = "signlike",
		tiles = {"mtg_plus_ladder_"..ladder[1]..".png"},
		selection_box = { type = "wallmounted", },
		inventory_image = "mtg_plus_ladder_"..ladder[1]..".png",
		wield_image = "mtg_plus_ladder_"..ladder[1]..".png",
		paramtype = "light",
		paramtype2 = "wallmounted",
		sunlight_propagates = true,
		walkable = false,
		climbable = true,
		is_ground_content = false,
		groups = ladder[5],
		sounds = sounds,
	})
	if ladder[2] == "metal" then
		minetest.register_craft({
			output = "mtg_plus:ladder_"..ladder[1].." 15",
			recipe = {
				{ladder[4], "", ladder[4]},
				{ladder[4], ladder[4], ladder[4]},
				{ladder[4], "", ladder[4]},
			},
		})
	else
		minetest.register_craft({
			output = "mtg_plus:ladder_"..ladder[1].." 9",
			recipe = {
				{"group:stick", "", "group:stick"},
				{"group:stick", ladder[4], "group:stick"},
				{"group:stick", "", "group:stick"},
			},
		})
		if ladder[7] ~= nil then
			minetest.register_craft({
				type = "fuel",
				recipe = "mtg_plus:ladder_"..ladder[1],
				burntime = ladder[7],
			})
		end
	end
end

-- Tweak the default ladder
minetest.override_item("default:ladder_wood", { description = S("Apple Wood Ladder") })
minetest.register_craft({
	output = "default:ladder_wood 9",
	recipe = {
		{"group:stick", "", "group:stick"},
		{"group:stick", "default:wood", "group:stick"},
		{"group:stick", "", "group:stick"},
	},
})

-- The default stick-only recipe for default ladder will be intentionally kept for
-- convenience.


code:
# textdomain:mtg_plus
Aggregated Diamond Block=Aggregieter Diamantblock
Bronze Brick=Bronzeziegel
Bronze Brick Slab=Bronzeziegelplatte
Bronze Brick Stair=Bronzeziegeltreppe
Copper Brick=Kupferziegel
Copper Brick Slab=Kupferziegelplatte
Copper Brick Stair=Kupferziegeltreppe
Dense Ice Tile=Kompakteiskachel
Desert Stone Brick with Golden Edges=Wüstensteinziegel mit Goldkanten
Diamond Block with Golden Frame=Diamantblock mit Goldrahmen
Dirty Glass=Schmutziges Glas
Soft Dirt Brick=Weicher Erdziegel
Hardened Dirt Brick=Gehärteter Erdziegel
Hardened Dirt Brick Slab=Gehärtete Erdziegelplatte
Hardened Dirt Brick Stair=Gehärtete Erdziegeltreppe
Cobbled Gravel=Kiespflaster
Cobbled Gravel Slab=Kiespflasterplatte
Cobbled Gravel Stair=Kiespflastertreppe
Cobbled Gravel Wall=Kiespflastermauer
Gravel Dirt=Kieserde
Gold Brick=Goldziegel
Gold Brick Slab=Goldziegelplatte
Gold Brick Stair=Goldziegeltreppe
Golden Ladder=Goldleiter
Copper Ladder=Kupferleiter
Bronze Ladder=Bronzeleiter
Tin Ladder=Zinnleiter
Golden Window=Goldfenster
Goldglass=Goldglas
Goldglass Pane=Goldglasscheibe
Goldwood=Goldholz
Goldwood Fence=Goldholzzaun
Goldwood Fence Gate=Goldholzzauntor
Goldwood Fence Rail=Goldholzzaungeländer
Goldwood Slab=Goldholzplatte
Goldwood Stair=Goldholztreppe
Hard Snow Brick=Hartschneeziegel
Hard Snow Brick Slab=Hartschneeziegelplatte
Hard Snow Brick Stair=Hartschneeziegeltreppe
Ice Block=Eisblock
Ice Block Slab=Eisblockplatte
Ice Block Stair=Eisblocktreppe
Ice Brick=Eisziegel
Ice Brick Slab=Eisziegelplatte
Ice Brick Stair=Eisziegeltreppe
Ice Door=Eistür
Ice Trapdoor=Eisfalltür
Ice Tile=Eiskachel
Ice Tile Slab=Eiskachelplatte
Ice Tile Stair=Eiskacheltreppe
Ice Window=Eisfenster
Ice Window Pane=Eisfensterscheibe
Icy Snow Brick=Eisschneeziegel
Icy Snow Brick Slab=Eisschneeziegelplatte
Icy Snow Brick Stair=Eisschneeziegeltreppe
Icy Steel Door=Eisstahltür
Icy Steel Trapdoor=Eisstahlfalltür
Iron Bar Door=Eisengittertür
Jungle Cobblestone=Dschungelkopfsteinpflaster
Jungle Cobblestone Slab=Dschungelkopfsteinpflasterplatte
Jungle Cobblestone Stair=Dschungelkopfsteinpflastertreppe
Obsidian Brick with Golden Edges=Obsidianziegel mit Goldkanten
Paper Barrier=Papierbarriere
Papyrus Block=Papyrusblock
Papyrus Door=Papyrustür
Papyrus Ladder=Papyrusleiter
Papyrus Lattice=Papyrusgitter
Sandstone Brick with Golden Edges=Sandsteinziegel mit Goldkanten
Cobbled Sandstone=Sandsteinpflaster
Cobbled Sandstone Slab=Sandsteinpflasterplatte
Cobbled Sandstone Stair=Sandsteinpflastertreppe
Soft Snow Brick=Weichschneeziegel
Steel Brick=Stahlziegel
Steel Brick Slab=Stahlziegelplatte
Steel Brick Stair=Stahlziegeltreppe
Stone Brick with Golden Edges=Steinziegel mit Goldkanten
Wooden Bar Door=Holzgittertür
Wooden Bars=Holzgitter
Jungle Cobblestone Wall=Dschungelkopfsteinpflastermauer
Dense Ice Tile Wall=Kompakteiskachelmauer
Cobbled Sandstone Wall=Sandsteinpflastermauer
Goldwood Chair=Goldholzstuhl
Goldwood Stool=Goldholzhocker
Goldwood Table=Goldholztisch
Jungle Cobblestone Stool=Dschungelkopfsteinpflasterhocker
Jungle Cobblestone Table=Dschungelkopfsteinpflastertisch
Cobbled Sandstone Stool=Sandsteinpflasterhocker
Cobbled Sandstone Table=Sandsteinpflastertisch
Cobbled Gravel Stool=Kiespflasterhocker
Cobbled Gravel Table=Kiespflastertisch
Flint Block=Feuersteinblock
Flint Block Stair=Feuersteinblocktreppe
Flint Block Slab=Feuersteinblockplatte
Desert Sandstone Brick with Golden Edges=Wüstensandsteinziegel mit Goldkanten
Silver Sandstone Brick with Golden Edges=Silbersandsteinziegel mit Goldkanten
Tin Brick=Zinnziegel
Tin Brick Slab=Zinnziegelplatte
Tin Brick Stair=Zinnziegeltreppe
Cobbled Silver Sandstone=Silbersandsteinpflaster
Cobbled Silver Sandstone Slab=Silbersandsteinpflasterplatte
Cobbled Silver Sandstone Stair=Silbersandsteinpflastertreppe
Cobbled Silver Sandstone Wall=Silbersandsteinpflastermauer
Cobbled Desert Sandstone=Wüstensandsteinpflaster
Cobbled Desert Sandstone Slab=Wüstensandsteinpflasterplatte
Cobbled Desert Sandstone Stair=Wüstensandsteinpflastertreppe
Cobbled Desert Sandstone Wall=Wüstensandsteinpflastermauer
Cobbled Silver Sandstone Stool=Silbersandsteinpflasterhocker
Cobbled Silver Sandstone Table=Silbersandsteinpflastertisch
Cobbled Desert Sandstone Stool=Wüstensandsteinpflasterhocker
Cobbled Desert Sandstone Table=Wüstensandsteinpflastertisch
Soft Snow Brick Slab=Weichschneeziegelplatte
Soft Snow Brick Stair=Weichschneeziegeltreppe
Historic City=Historische Stadt
Place a aggregated diamond block.=Platzieren Sie einen aggregierten Diamantblock.
Ice doors can be opened and closed. They are solid, but some of the light hitting ice doors can still go through, making them an interesting decoration in icy areas.=Eistüren können geöffnet und geschlossen werden. Sie sind solide, aber etwas des Lichts, welches auf Eistüren einfällt, gelangt hindurch, was sie zu einer interessanten Dekoration in eiskalten Gebieten macht.
A luxurious piece of ladder which allows you to move vertically.=Ein luxoriöses Leitersegment, auf dem Sie sich vertikal bewegen können.
A piece of ladder which allows you to move vertically.=Ein Leitersegment, auf dem Sie sich vertikal bewegen können.
Green Jungle=Grüner Dschungel
This is a fence made out of precious goldwood. The fence will neatly connect to its neighbors, making it easy to build nice-looking fence structures. The fence can be jumped over.=Dies ist ein Zaun, angefertigt aus dem wertvollen Goldholz. Der Zaun verbindet sich praktischerweise mit seinen Nachbarn; damit kann man leicht lange Zäune errichten. Man kann über den Zaun springen.
This is a fence rail made out of precious goldwood. It will neatly connect to its neighbors, but without creating fence posts. It can be jumped over.=Dies ist ein Zaungeländer, angefertigt aus dem wertvollen Goldholz. Er verbindet sich praktischerweise mit seinen Nachbarn, aber ohne dabei Zaunpfosten zu erzeugen. Man kann über das Geländer springen.
Goldwood is a precious artificial kind of wood made by enriching wood with gold. Goldwood is fireproof and notable for its bright yellowy appearance.=Goldholz ist eine wertvolle künstliches Art Holz, welches mit Gold angereichert wurde. Goldholz ist feuersicher und fällt durch seine helle gelbliche Farbe auf.
Ice window panes are thinner than the full ice windows and neatly connect to each other as you build them=Eisfensterscheiben sind dünner als die vollen Eisfenster und verbinden sich praktischerweise zu den anderen Fensterscheiben beim Bauen.
Craft 100 goldwood.=Fertigen Sie 100 Goldholz.
Icy steel doors are a combination of ice doors and steel doors which can only be opened and closed by their owners. They are solid, but some of the light hitting icy steel doors can still go through.=Eisstahltüren sind eine Verbindung von Eistüren und Stahltüren, welche nur von ihrem Eigentümer geöffnet werden können. Sie sind solide, aber etwas Licht scheint durch Eisstahltüren hindurch.
A ornamental and mostly transparent block, made by combining glass with gold.=Ein größtenteils durchsichtiger Zierblock, der durch die Kombinierung von Glas mit Gold entstanden ist.
This decorational ice tile has been crafted in a way that it is partially transparent and looks like a real window.=Diese dekorative Eiskachel wurde so gefertigt, dass sie teilweise durchsichtig ist und wie ein echtes Fenster aussieht.
Small Gold-framed Diamond Block=Kleiner mit Gold umrahmter Diamantblock
Luxurious Adornment=Luxuriöse Verzierung
Craft 4 small gold-framed diamond blocks.=Fertigen sie 4 kleine mit Gold umrahmte Diamantblöcke an.
Papyrus Panic=Papyruspanik
An ice trapdoor covers the floor and can be opened and closed by anyone. Ice trapdoors are solid, but some light can pass through nonetheless.=Eine Eisfalltür bedeckt den Boden und kann von jedem geöffnet und geschlossen werden. Eisfalltüren sind solide, aber etwas Licht scheint durch.
Rich Carpenter=Die Luxus-Zimmerei
Let's build an igloo!=Lasst uns ein Iglu bauen!
Yellow Desert=Gelbe Wüste
Cobbled gravel is solidified gravel, carefully arranged in a mosaic-like pattern. It makes a nice building material.=Kiespflaster ist ein verfestigte Form von Kies, welches behutsam in ein eine Art Mosaik angeordnet wurde.
Gravel dirt is a type of dirt consisting of equal parts of gravel and dirt. It combines some of the properties of gravel and dirt.=Kieserde ist eine Art Erde, welche zu gleichen Teilen aus Kies und Erde besteht. Sie kombiniert ein paar der Eigenschaften von Kies und Erde.
Build 100 papyrus blocks.=Fertigen Sie 100 Papyrusblöcke.
This block is even harder than diamond; diamond pickaxes can't break it. TNT is able to destroy this block.=Dieser Block ist sogar härter als Diamant; Diamantspitzhacken können ihn nicht zerbrechen. TNT kann diesen Block zerstören.
Craft 400 cobbled gravel.=Fertigen Sie 400 Kiespflaster.
A particulary strong piece of ladder which allows you to move vertically.=Ein besonders robustes Leitersegment, auf dem Sie sich vertikal bewegen können.
Self-proclaimed Winner=Selbsternannter Sieger
Place 225 hard snow bricks.=Fertigen Sie 225 Hartschneeziegel.
Craft 512 jungle cobblestone.=Fertigen Sie 512 Dschungelkopfsteinpflaster.
Ice Crazy=Verrückt nach Eis
Craft 128 dense ice tiles.=Fertigen Sie 128 Kompakteiskacheln
A fence gate made from precious goldwood. It blocks the path, but it can be opened and easily jumped over. Other fence posts will neatly connect to this fence gate.=Ein Zauntor aus wertvollem Goldholz. Er blockiert den Durchgang, aber er kann geöffnet werden und man kann einfach rüberspringen. Andere Zaunpfosten werden sich automatisch mit diesem Zauntor verbinden.
Can't dig me!=Ich bin unzerbrechlich!
Craft a golden cup.=Fertigen Sie einen Goldpokal.
Craft 512 cobbled sandstone.=Fertigen Sie 512 Sandsteinpflaster.
An icy steel trapdoor is a combination of an ice trapdoor and a steel trapdoor. It covers the floor and can only be opened and closed by its placer. Icy steel trapdoors are solid, but some light can pass through nonetheless.=Eine Eisstahlfalltür ist eine Kombination aus Eisfalltür und Stahlfalltür. Sie bedeckt den Boden und kann nur vom Eigentümer geöffnet oder geschlossen werden. Eisstahlfalltüren sind solide, aber etwas Licht scheint hindurch.
A decorative, semitransparent block. The dirt makes it hard for the sunlight to pass through.=Ein dekorativer halbtransparenter Block. Der Dreck reduziert die Lichtstärke.
Papier barriers are thin solid layers of paper which neatly connect to their neighbors as you build them. They could be useful to separate rooms.=Papierbarrieren sind dünne feste Papierschichten, die sich mit ihren Nachbarblöcken verbinden. Sie könnten nützlich sein, um Räume zu teilen.
Wooden bars are barriers which neatly connect to their neighbors as you build them.=Holzgitter sind Barrieren, die sich mit ihren Nachbarblöcken verbinden.
Goldglass panes are thin layers of goldglass which neatly connect to their neighbors as you build them.=Goldglasscheiben sind dünne Goldglasschichten, die sich mit ihren Nachbarblöcken verbinden.
Golden windows are decorative blocks which can be placed into holes for nice-looking windows. Golden windows automatically connect to their neighbors as you build them.=Goldfenster sind dünne dekorative Blöcke, die in Lücken als gutaussehende Fenster platziert werden können. Goldfenster verbinden sich automatisch mit ihren Nachbarn.
Papyrus lattices are strong barriers which neatly connect to their neighbors as you build them.=Papyrusgitter sind stabile Barrieren, die sich automatisch mit ihren Nachbarn verbinden.
A door covers a vertical area of two blocks to block the way. It can be opened and closed by any player.=Eine Tür belegt einen vertikalen Bereich von zwei Blöcken, um den Weg zu blockieren. Sie kann von jedem Spieler geöffnet und geschlossen werden.
Use the use key on it to open or close it.=Benutzen Sie die „Benutzen“-Taste auf ihr, um sie zu öffnen oder zu schließen.
Point the icy steel trapdoor to see who owns it. Use the use key on it to open or close it (if you own it).=Zeigen Sie auf die Eisstahlfalltür, um zu sehen, wem sie gehört. Benutzen Sie die „Benutzen“-Taste auf ihr, um sie zu öffnen oder zu schließen (wenn sie Ihnen gehört).
Point the door to see who owns it. Use the use key on the door to open or close it (if you own it).=Zeigen Sie auf die Tür, um zu sehen, wem sie gehört. Benutzen Sie die „Benutzen“-Taste auf ihr, um sie zu öffnen oder zu schließen (wenn sie Ihnen gehört).
Apple Wood Ladder=Apfelholzleiter
Acacia Wood Ladder=Akazienholzleiter
Pine Wood Ladder=Pinienholzleiter
Aspen Wood Ladder=Espenholzleiter
Jungle Wood Ladder=Dschungelholzleiter
Goldwood Ladder=Goldholzleiter
A piece of wall creates simple barriers that connect to neighbor blocks. Walls can be jumped over.=Ein Stück Mauer erzeugt einfache Barrieren, welche sich mit den Nachbarblöcken verbinden. Man kann über Mauern springen.


code:
# textdomain:mtg_plus
A decorative, semitransparent block. The dirt makes it hard for the sunlight to pass through.=
A fence gate made from precious goldwood. It blocks the path, but it can be opened and easily jumped over. Other fence posts will neatly connect to this fence gate.=
Aggregated Diamond Block=
A luxurious piece of ladder which allows you to move vertically.=
A piece of ladder which allows you to move vertically.=
An ice trapdoor covers the floor and can be opened and closed by anyone. Ice trapdoors are solid, but some light can pass through nonetheless.=
An icy steel trapdoor is a combination of an ice trapdoor and a steel trapdoor. It covers the floor and can only be opened and closed by its placer. Icy steel trapdoors are solid, but some light can pass through nonetheless.=
A ornamental and mostly transparent block, made by combining glass with gold.=
A particulary strong piece of ladder which allows you to move vertically.=
Bronze Brick=
Bronze Brick Slab=
Bronze Brick Stair=
Build 100 papyrus blocks.=
Can't dig me!=
Cobbled Desert Sandstone=
Cobbled Desert Sandstone Slab=
Cobbled Desert Sandstone Stair=
Cobbled Desert Sandstone Stool=
Cobbled Desert Sandstone Table=
Cobbled Desert Sandstone Wall=
Cobbled Gravel=
Cobbled gravel is solidified gravel, carefully arranged in a mosaic-like pattern. It makes a nice building material.=
Cobbled Gravel Slab=
Cobbled Gravel Stair=
Cobbled Gravel Stool=
Cobbled Gravel Table=
Cobbled Gravel Wall=
Cobbled Sandstone=
Cobbled Sandstone Slab=
Cobbled Sandstone Stair=
Cobbled Sandstone Stool=
Cobbled Sandstone Table=
Cobbled Sandstone Wall=
Cobbled Silver Sandstone=
Cobbled Silver Sandstone Slab=
Cobbled Silver Sandstone Stair=
Cobbled Silver Sandstone Stool=
Cobbled Silver Sandstone Table=
Cobbled Silver Sandstone Wall=
Copper Brick=
Copper Brick Slab=
Copper Brick Stair=
Craft 100 goldwood.=
Craft 128 dense ice tiles.=
Craft 400 cobbled gravel.=
Craft 4 small gold-framed diamond blocks.=
Craft 512 cobbled sandstone.=
Craft 512 jungle cobblestone.=
Craft a golden cup.=
Dense Ice Tile=
Dense Ice Tile Wall=
Desert Sandstone Brick with Golden Edges=
Desert Stone Brick with Golden Edges=
Dirty Glass=
Flint Block=
Flint Block Slab=
Flint Block Stair=
Gold Brick=
Gold Brick Slab=
Gold Brick Stair=
Golden Ladder=
Copper Ladder=
Tin Ladder=
Bronze Ladder=
Golden Window=
Goldglass=
Goldglass Pane=
Goldwood=
Goldwood Chair=
Goldwood Fence=
Goldwood Fence Gate=
Goldwood Fence Rail=
Goldwood is a precious artificial kind of wood made by enriching wood with gold. Goldwood is fireproof and notable for its bright yellowy appearance.=
Goldwood Slab=
Goldwood Stair=
Goldwood Stool=
Goldwood Table=
Gravel Dirt=
Gravel dirt is a type of dirt consisting of equal parts of gravel and dirt. It combines some of the properties of gravel and dirt.=
Green Jungle=
Hardened Dirt Brick=
Hardened Dirt Brick Slab=
Hardened Dirt Brick Stair=
Hard Snow Brick=
Hard Snow Brick Slab=
Hard Snow Brick Stair=
Historic City=
Ice Block=
Ice Block Slab=
Ice Block Stair=
Ice Brick=
Ice Brick Slab=
Ice Brick Stair=
Ice Crazy=
Ice Door=
Ice doors can be opened and closed. They are solid, but some of the light hitting ice doors can still go through, making them an interesting decoration in icy areas.=
Ice Tile=
Ice Tile Slab=
Ice Tile Stair=
Ice Trapdoor=
Ice Window=
Ice Window Pane=
Ice window panes are thinner than the full ice windows and neatly connect to each other as you build them=
Icy Snow Brick=
Icy Snow Brick Slab=
Icy Snow Brick Stair=
Icy Steel Door=
Icy steel doors are a combination of ice doors and steel doors which can only be opened and closed by their owners. They are solid, but some of the light hitting icy steel doors can still go through.=
Icy Steel Trapdoor=
Iron Bar Door=
Jungle Cobblestone=
Jungle Cobblestone Slab=
Jungle Cobblestone Stair=
Jungle Cobblestone Stool=
Jungle Cobblestone Table=
Jungle Cobblestone Wall=
Let's build an igloo!=
Luxurious Adornment=
Obsidian Brick with Golden Edges=
Paper Barrier=
Papyrus Block=
Papyrus Door=
Papyrus Ladder=
Papyrus Lattice=
Papyrus Panic=
Place 225 hard snow bricks.=
Place a aggregated diamond block.=
Rich Carpenter=
Sandstone Brick with Golden Edges=
Self-proclaimed Winner=
Silver Sandstone Brick with Golden Edges=
Small Gold-framed Diamond Block=
Soft Dirt Brick=
Soft Snow Brick=
Soft Snow Brick Slab=
Soft Snow Brick Stair=
Steel Brick=
Steel Brick Slab=
Steel Brick Stair=
Stone Brick with Golden Edges=
This block is even harder than diamond; diamond pickaxes can't break it. TNT is able to destroy this block.=
This decorational ice tile has been crafted in a way that it is partially transparent and looks like a real window.=
This is a fence made out of precious goldwood. The fence will neatly connect to its neighbors, making it easy to build nice-looking fence structures. The fence can be jumped over.=
This is a fence rail made out of precious goldwood. It will neatly connect to its neighbors, but without creating fence posts. It can be jumped over.=
Tin Brick=
Tin Brick Slab=
Tin Brick Stair=
Wooden Bar Door=
Wooden Bars=
Yellow Desert=
Papier barriers are thin solid layers of paper which neatly connect to their neighbors as you build them. They could be useful to separate rooms.=
Wooden bars are barriers which neatly connect to their neighbors as you build them.=
Goldglass panes are thin layers of goldglass which neatly connect to their neighbors as you build them.=
Golden windows are decorative blocks which can be placed into holes for nice-looking windows. Golden windows automatically connect to their neighbors as you build them.=
Papyrus lattices are strong barriers which neatly connect to their neighbors as you build them.=
A door covers a vertical area of two blocks to block the way. It can be opened and closed by any player.=
Use the use key on it to open or close it.=
Point the icy steel trapdoor to see who owns it. Use the use key on it to open or close it (if you own it).=
Point the door to see who owns it. Use the use key on the door to open or close it (if you own it).=
Apple Wood Ladder=
Acacia Wood Ladder=
Pine Wood Ladder=
Aspen Wood Ladder=
Jungle Wood Ladder=
Goldwood Ladder=
A piece of wall creates simple barriers that connect to neighbor blocks. Walls can be jumped over.=


code:
name = mtg_plus
description = Adds various simple decorative blocks, doors, panes and other items to Minetest Game, focusing on snow, ice, luxury, bamboo and more.
depends = default, doors, farming, xpanes, walls, stairs
optional_depends = moreblocks, xdecor, furniture, doc_items, awards


code:
xpanes.register_pane("papyrus", {
	description = "Papyrus Lattice",
	inventory_image = "mtg_plus_papyrus_lattice.png",
	wield_image = "mtg_plus_papyrus_lattice.png",
	textures = {"mtg_plus_papyrus_lattice.png","mtg_plus_papyrus_lattice.png","mtg_plus_papyrus_lattice.png"},
	groups = {snappy=2, choppy=1, flammable=2,pane=1},
	sounds = default.node_sound_leaves_defaults(),
	recipe = {
		{ "default:papyrus", "farming:string", "default:papyrus" },
		{ "default:papyrus", "farming:string", "default:papyrus" },
	}
})

if minetest.registered_items["xpanes:papyrus_flat"] then
	r = "xpanes:papyrus_flat"
else
	r = "xpanes:papyrus"
end
minetest.register_craft({
	type = "fuel",
	recipe = r,
	burntime = 1,
})


code:
repo: 85f5bc3a65891f34b24a3725c0d5bc14604471bd
node: edaae6eeb27ebf22783a62c7b61ca257583534e1
branch: default
latesttag: null
latesttagdistance: 8
changessincelatesttag: 8


code:
Minetest mod "New Fireworks"
======================
Version: 0.0.3

# License of source code:
Copyright (C) 2017 googol <googolgl@gmail.com>

# Notice:
This mod is only useable with Minetest 0.4.15-dev or above!

# Description:
This mod adds to the minetest Fireworks.
Happy Holidays!!!

# Change Log
#### [0.0.1] - 2017-02-12
- Betta
#### [0.0.2] - 2017-02-20
- Pre relise
#### [0.0.3] - 2017-02-21
- Aded multi-explosion

# Links:
Forum Topic:
- <https://forum.minetest.net/>

Bitbucket:
- <https://bitbucket.org/g00g01/new_fireworks>


code: This mod adds to the minetest Fireworks.


code:
-- VARIABLES
new_fireworks = {}

local variant_list = {
	{colour = "default", figure = "", form = "", desc = ""},
	{colour = "red", figure = "default", form = "", desc = "Red"},
	{colour = "green", figure = "default", form = "", desc = "Green"},
	{colour = "blue", figure = "default", form = "", desc = "Blue"},
	{colour = "yellow", figure = "default", form = "", desc = "Yellow"},
	{colour = "white", figure = "default", form = "", desc = "White"},
	{colour = "red", figure = "ball", form = "", desc = "Red"},
	{colour = "green", figure = "ball", form = "", desc = "Green"},
	{colour = "blue", figure = "ball", form = "", desc = "Blue"},
	{colour = "yellow", figure = "ball", form = "", desc = "Yellow"},
	{colour = "white", figure = "ball", form = "", desc = "White"},
	{colour = "red", figure = "custom", form = "love", desc = "Heart"},
}

local rocket = {
	physical = true, -- Collides with things
  wield_image = "rocket__default.png",
	collisionbox = {0,-0.5,0,0,0.5,0},
	visual = "sprite",
	textures = {"rocket__default.png"},
	timer = 0,
	rocket_firetime = 0,
}

local rdt = {} -- rocket data table

-- FUNCTIONS
local function default_figure(r)
	local tab = {}
	local num = 1
	for x=-r,r,0.02 do
		for y=-r,r,0.02 do
			for z=-r,r,0.02 do
				if x*x+y*y+z*z <= r*r then
					local v = math.random(21,35) -- velocity
					if math.random(1,2) > 1 then
						local xrand = math.random(-5, 5)*0.001
						local yrand = math.random(-5, 5)*0.001
						local zrand = math.random(-5, 5)*0.001
						tab[num] = {x=x+xrand,y=y+yrand,z=z+zrand,v=v}
					end
					num = num + 1
				end
			end
		end
	end
	return tab
end

local function ball_figure(r)
	local tab = {}
	local num = 1
	for x=-r,r,0.01 do
		for y=-r,r,0.01 do
			for z=-r,r,0.01 do
				if x*x+y*y+z*z <= r*r and x*x+y*y+z*z >= (r-0.005)*(r-0.005) then
					if math.random(1,4) > 1 then
						local xrand = math.random(-3, 3)*0.001
						local yrand = math.random(-3, 3)*0.001
						local zrand = math.random(-3, 3)*0.001
						tab[num] = {x=x+xrand,y=y+yrand,z=z+zrand,v=43}
					end
					num = num + 1
				end
			end
		end
	end
	return tab
end

local function custom_figure(form)
	local tab = {}
		if form == "love" then
				tab[1] = {x=0,y=0,z=0,v=60}
				tab[2] = {x=0,y=0,z=-0.02,v=60}
				tab[3] = {x=0.01,y=0,z=-0.03,v=60}
				tab[4] = {x=0.02,y=0,z=-0.04,v=60}
				tab[5] = {x=0.03,y=0,z=-0.04,v=60}
				tab[6] = {x=0.04,y=0,z=-0.03,v=60}
				tab[7] = {x=0.05,y=0,z=-0.02,v=60}
				tab[8] = {x=0.05,y=0,z=-0.01,v=60}
				tab[9] = {x=0.04,y=0,z=0,v=60}
				tab[10] = {x=0.04,y=0,z=0.01,v=60}
				tab[11] = {x=0.03,y=0,z=0.02,v=60}
				tab[12] = {x=0.02,y=0,z=0.03,v=60}
				tab[13] = {x=0.01,y=0,z=0.04,v=60}
				tab[14] = {x=0,y=0,z=0.05,v=60}
				tab[15] = {x=-0.01,y=0,z=0.04,v=60}
				tab[16] = {x=-0.02,y=0,z=0.03,v=60}
				tab[17] = {x=-0.03,y=0,z=0.02,v=60}
				tab[18] = {x=-0.04,y=0,z=0.01,v=60}
				tab[19] = {x=-0.04,y=0,z=0,v=60}
				tab[20] = {x=-0.05,y=0,z=-0.01,v=60}
				tab[21] = {x=-0.05,y=0,z=-0.02,v=60}
				tab[22] = {x=-0.04,y=0,z=-0.03,v=60}
				tab[23] = {x=-0.03,y=0,z=-0.04,v=60}
				tab[24] = {x=-0.02,y=0,z=-0.04,v=60}
				tab[25] = {x=-0.01,y=0,z=-0.03,v=60}
--	  elseif form == "newforms" then
--			  tab[1] = {x=0,y=0,z=0,v=0} -- your variants forms
		else
			  tab[1] = {x=0,y=0,z=0,v=0}
		end
	return tab
end

--========== Activate fireworks
local function partcl_gen(pos,tab,size_min,size_max,colour)
	for _,i in pairs(tab) do
			minetest.add_particle({
						pos = {x=pos.x,y=pos.y,z=pos.z},
						velocity = {x=i.x*i.v,y=i.y*i.v,z=i.z*i.v},
						acceleration = {x=0, y=-1.5, z=0},
						expirationtime = 3.5,
						size = math.random(size_min, size_max),
						collisiondetection = true,
						vertical = false,
						animation = {type="vertical_frames", aspect_w=9, aspect_h=9, length = 3.5,},
						glow = 30,
						texture = "anim_"..colour.."_star.png",
			})
	end
end

function rocket:on_activate(staticdata)
	self.rdt = rdt
	rdt = {}
	minetest.sound_play("new_fireworks_rocket", {pos=self.object:getpos(),
											 max_hear_distance = 13,gain = 1,})
	self.rocket_flytime = math.random(13,15)/10
	self.object:setvelocity({x=0, y=9, z=0})
	self.object:setacceleration({x=math.random(-5,5), y=33, z=math.random(-5,5)})
end

-- Called periodically
function rocket:on_step(dtime)
	self.timer = self.timer + dtime
  self.rocket_firetime = self.rocket_firetime + dtime
  if self.rocket_firetime > 0.1 then
    local pos = self.object:getpos()
    self.rocket_firetime = 0
    xrand = math.random(-15,15)/10
    zrand = math.random(-15,15)/10
    minetest.add_particle({
          pos = {x=pos.x,y=pos.y-0.4,z=pos.z},
          velocity = {x=xrand,y=-3,z=xrand},
          acceleration = {x=0, y=0, z=0},
          expirationtime = 1.5,
          size = 3,
          collisiondetection = true,
          vertical = false,
          animation = {type="vertical_frames", aspect_w=9, aspect_h=9, length = 1.6,},
          glow = 10,
          texture = "anim_white_star.png",
    })
  end
	if self.timer > self.rocket_flytime then
		if #self.rdt > 0 then
			minetest.sound_play("new_fireworks_bang", {pos=self.object:getpos(),
													 max_hear_distance = 90,gain = 3,})
			for _,i in pairs(self.rdt) do
				if i.figure == "ball" then partcl_gen(self.object:getpos(),ball_figure(0.1),4,4,i.color) end
				if i.figure == "default" then partcl_gen(self.object:getpos(),default_figure(0.1),2,4,i.color) end
				if i.figure == "custom" then partcl_gen(self.object:getpos(),custom_figure(i.form),7,7,i.color) end
			end
		end
		self.object:remove()
	end
end

-- NODES
for _,i in pairs(variant_list) do
	minetest.register_node("new_fireworks:rocket_"..i.figure.."_"..i.colour, {
		description = i.desc.." "..i.figure.." Rocket",
		drawtype = "airlike",
  	light_source = 5,
		inventory_image = "rocket_"..i.figure.."_"..i.colour..".png",
		wield_image = "rocket__default.png",
		paramtype = "light",
		sunlight_propagates = true,
		walkable = false,
		is_ground_content = false,
		groups = {choppy = 3, explody = 1},

		on_construct = function(pos)
			if i.colour ~= "default" then
				rdt = i.rdt or {{color = i.colour, figure = i.figure, form = i.form},}
			end
			local obj = minetest.add_entity(pos, "new_fireworks:rocket")
			minetest.remove_node(pos)
		end,
	})
end

minetest.register_entity("new_fireworks:rocket", rocket)

-- CRAFTITEM
-- Base Rocket
minetest.register_craft({
        output = "new_fireworks:rocket__default",
        recipe = {
                {"default:paper", "default:paper", "default:paper"},
                {"default:paper", "tnt:gunpowder", "default:paper"},
                {"tnt:gunpowder", "default:stick", "tnt:gunpowder"}
        }
})
-- Ball Rocket
minetest.register_craft({
	output = "new_fireworks:rocket_default_red",
	recipe = {
		{"", "dye:red", ""},
		{"dye:red", "new_fireworks:rocket__default", "dye:red"},
		{"", "dye:red", ""}
	}
})
minetest.register_craft({
        output = "new_fireworks:rocket_default_green",
        recipe = {
                {"", "dye:green", ""},
                {"dye:green", "new_fireworks:rocket__default", "dye:green"},
                {"", "dye:green", ""}
        }
})
minetest.register_craft({
        output = "new_fireworks:rocket_default_blue",
        recipe = {
                {"", "dye:blue", ""},
                {"dye:blue", "new_fireworks:rocket__default", "dye:blue"},
                {"", "dye:blue", ""}
        }
})
minetest.register_craft({
        output = "new_fireworks:rocket_default_yellow",
        recipe = {
                {"", "dye:yellow", ""},
                {"dye:yellow", "new_fireworks:rocket__default", "dye:yellow"},
                {"", "dye:yellow", ""}
        }
})
minetest.register_craft({
        output = "new_fireworks:rocket_default_white",
        recipe = {
                {"", "dye:white", ""},
                {"dye:white", "new_fireworks:rocket__default", "dye:white"},
                {"", "dye:white", ""}
        }
})
-- Standard Ball Rockets
-- red, green, blue, yellow, white
minetest.register_craft({
        output = "new_fireworks:rocket_ball_red",
        recipe = {
                {"dye:red", "dye:red", "dye:red"},
                {"dye:red", "new_fireworks:rocket__default", "dye:red"},
                {"dye:red", "dye:red", "dye:red"}
        }
})
minetest.register_craft({
        output = "new_fireworks:rocket_ball_green",
        recipe = {
                {"dye:green", "dye:green", "dye:green"},
                {"dye:green", "new_fireworks:rocket__default", "dye:green"},
                {"dye:green", "dye:green", "dye:green"}
        }
})
minetest.register_craft({
        output = "new_fireworks:rocket_ball_blue",
        recipe = {
                {"dye:blue", "dye:blue", "dye:blue"},
                {"dye:blue", "new_fireworks:rocket__default", "dye:blue"},
                {"dye:blue", "dye:blue", "dye:blue"}
        }
})
minetest.register_craft({
        output = "new_fireworks:rocket_ball_yellow",
        recipe = {
                {"dye:yellow", "dye:yellow", "dye:yellow"},
                {"dye:yellow", "new_fireworks:rocket__default", "dye:yellow"},
                {"dye:yellow", "dye:yellow", "dye:yellow"}
        }
})
minetest.register_craft({
        output = "new_fireworks:rocket_ball_white",
        recipe = {
                {"dye:white", "dye:white", "dye:white"},
                {"dye:white", "new_fireworks:rocket__default", "dye:white"},
                {"dye:white", "dye:white", "dye:white"}
        }
})
-- Love Custom
minetest.register_craft({
        output = "new_fireworks:rocket_custom_red",
        recipe = {
                {"dye:red", "", "dye:red"},
                {"", "new_fireworks:rocket__default", ""},
                {"dye:red", "", "dye:red"}
        }
})


code:
name = new_fireworks
depends = default
description = This mod adds to the minetest Fireworks.


code:
Sound Licenses
File: fireworks_triangle
Created By:Syna-Max
Licence: Attribution Noncommercial License.
URL: http://www.freesound.org/people/Syna-Max/sounds/56606/

File:RomanCandlesandShells.mp3
CreatedBy: Mr Sensible
License: This work is licensed under the Creative Commons 0 License.
URL:http://www.freesound.org/people/Mr%20Sensible/sounds/15000/

File: MrSensibleFireworks.mp3
CreatedBy: Mr Sensible
License: This work is licensed under the Creative Commons 0 License.
http://www.freesound.org/people/Mr%20Sensible/sounds/27757/


code:
# Auto detect text files and perform LF normalization
* text=auto

# Custom for Visual Studio
*.cs     diff=csharp

# Standard to msysgit
*.doc	 diff=astextplain
*.DOC	 diff=astextplain
*.docx diff=astextplain
*.DOCX diff=astextplain
*.dot  diff=astextplain
*.DOT  diff=astextplain
*.pdf  diff=astextplain
*.PDF	 diff=astextplain
*.rtf	 diff=astextplain
*.RTF	 diff=astextplain


code:
# Windows image file caches
Thumbs.db
ehthumbs.db

# Folder config file
Desktop.ini

# Recycle Bin used on file shares
$RECYCLE.BIN/

# Windows Installer files
*.cab
*.msi
*.msm
*.msp

# Windows shortcuts
*.lnk

# =========================
# Operating System Files
# =========================

# OSX
# =========================

.DS_Store
.AppleDouble
.LSOverride

# Thumbnails
._*

# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns

# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk


code:
=-=-=-=-=-=-=-=-=-=

Orbs of Time
by: Philipbenr And DanDuncombe

=-=-=-=-=-=-=-=-=-=

Licence: MIT

see: LICENSE

=-=-=-=-=-=-=-=-=-=

A mod containing magical orbs a player can use a limited number of times to change the time of day.

Orbs present in this mod are:

Orb of Midday
Orb of Dusk
Orb of Midnight
Orb of Dawn


code:
default?
mcl_core?
intllib?
loot?
doc?


code: A mod containing magical orbs a player can use a limited number of times to change the time of day


code:
-- internationalization boilerplate
local MP = minetest.get_modpath(minetest.get_current_modname())
local S, NS = dofile(MP.."/intllib.lua")

minetest.register_alias("castle:orb_day", "orbs_of_time:orb_day")
minetest.register_alias("castle:orb_night", "orbs_of_time:orb_night")

minetest.register_tool("orbs_of_time:orb_day", {
	description = S("Orb of Midday"),
	_doc_items_longdesc = S("This magical orb grants you the power to bring the Sun to the zenith of the sky."),
	_doc_items_usagehelp = S("When weilded, use this item and the Sun will jump to its highest point. The day will then progress normally from there. This orb can be used eight times - once for each diamond that was used to craft it."),
	tiles = {"orbs_orb_day.png"},
	inventory_image = "orbs_orb_day.png",
	wield_image = "orbs_orb_day_weild.png",
	stack_max=1,
	groups = { tool=1 },
	on_use = function(itemstack, user)
		minetest.sound_play("orbs_ding", {pos=user:getpos(), loop=false})
		minetest.set_timeofday(0.5)
		minetest.sound_play("orbs_birds", {pos=user:getpos(), loop=false})
		if not minetest.settings:get_bool("creative_mode") then
			itemstack:add_wear(65535/8)
		end
		return itemstack
	end,
})

minetest.register_tool("orbs_of_time:orb_night",{
	description = S("Orb of Midnight"),
	_doc_items_longdesc = S("This magical orb grants you the power to banish the Sun to the bottom of the world."),
	_doc_items_usagehelp = S("When weilded, use this item and the Moon will jump to its highest point. The night will then progress normally from there. This orb can be used eight times - once for each diamond that was used to craft it."),
	tiles = {"orbs_orb_night.png"},
	inventory_image = "orbs_orb_night.png",
	wield_image = "orbs_orb_night_weild.png",
	stack_max=1,
	groups = { tool=1 },
	on_use = function(itemstack, user)
		minetest.sound_play("orbs_ding", {pos=user:getpos(), loop=false})
		minetest.set_timeofday(0)
		minetest.sound_play("orbs_owl", {pos=user:getpos(), loop=false})
		if not minetest.settings:get_bool("creative_mode") then
			itemstack:add_wear(65535/8)
		end
		return itemstack
	end,
})

minetest.register_tool("orbs_of_time:orb_dawn", {
	description = S("Orb of Dawn"),
	_doc_items_longdesc = S("This magical orb grants you the power to bring the Sun to eastern horizon."),
	_doc_items_usagehelp = S("When weilded, use this item and day will break. The day will then progress normally from there. This orb can be used eight times - once for each diamond that was used to craft it."),
	tiles = {"orbs_orb_day.png"},
	inventory_image = "orbs_orb_day.png^[lowpart:50:orbs_orb_night.png",
	wield_image = "orbs_orb_day_weild.png^[lowpart:75:orbs_orb_night_weild.png",
	stack_max=1,
	on_use = function(itemstack, user)
		minetest.sound_play("orbs_ding", {pos=user:getpos(), loop=false})
		minetest.set_timeofday(0.2)
		minetest.sound_play("orbs_birds", {pos=user:getpos(), loop=false})
		if not minetest.settings:get_bool("creative_mode") then
			itemstack:add_wear(65535/8)
		end
		return itemstack
	end,
})

minetest.register_tool("orbs_of_time:orb_dusk",{
	description = S("Orb of Dusk"),
	_doc_items_longdesc = S("This magical orb grants you the power to send the Sun to western horizon."),
	_doc_items_usagehelp = S("When weilded, use this item and night will fall. The night will then progress normally from there. This orb can be used eight times - once for each diamond that was used to craft it."),
	tiles = {"orbs_orb_night.png"},
	inventory_image = "orbs_orb_night.png^[lowpart:50:orbs_orb_day.png",
	wield_image = "orbs_orb_night_weild.png^[lowpart:75:orbs_orb_day_weild.png",
	stack_max=1,
	on_use = function(itemstack, user)
		minetest.sound_play("orbs_ding", {pos=user:getpos(), loop=false})
		minetest.set_timeofday(0.8)
		minetest.sound_play("orbs_owl", {pos=user:getpos(), loop=false})
		if not minetest.settings:get_bool("creative_mode") then
			itemstack:add_wear(65535/8)
		end
		return itemstack
	end,
})

-----------
--Crafting
-----------

if minetest.get_modpath("mcl_core") then
	minetest.register_craft({
		output = "orbs_of_time:orb_day",
		recipe = {
			{"mcl_core:diamond", "mcl_core:diamond","mcl_core:diamond"},
			{"mcl_core:diamond", "mesecons:redstone","mcl_core:diamond"},
			{"mcl_core:diamond", "mcl_core:diamond","mcl_core:diamond"}
		 },
	})

	minetest.register_craft({
		output = "orbs_of_time:orb_night",
		recipe = {
			{"mcl_core:diamond", "mcl_core:diamond","mcl_core:diamond"},
			{"mcl_core:diamond", "dye:black","mcl_core:diamond"},
			{"mcl_core:diamond", "mcl_core:diamond","mcl_core:diamond"}
		},
	})
else
	minetest.register_craft({
		output = "orbs_of_time:orb_day",
		recipe = {
			{"magic_materials:light_rune", "magic_materials:light_rune","magic_materials:light_rune"},
			{"magic_materials:light_rune", "magic_materials:earth_rune","magic_materials:light_rune"},
			{"magic_materials:light_rune", "magic_materials:light_rune","magic_materials:light_rune"}
		},
	})

	minetest.register_craft({
		output = "orbs_of_time:orb_night",
		recipe = {
			{"magic_materials:void_rune", "magic_materials:void_rune","magic_materials:void_rune"},
			{"magic_materials:void_rune", "magic_materials:earth_rune","magic_materials:void_rune"},
			{"magic_materials:void_rune", "magic_materials:void_rune","magic_materials:void_rune"}
		},
	})
end

minetest.register_craft({
	output = "orbs_of_time:orb_dawn 2",
	recipe = {
		{"orbs_of_time:orb_day"},
		{"orbs_of_time:orb_night"},
	},
})

minetest.register_craft({
	output = "orbs_of_time:orb_dusk 2",
	recipe = {
		{"orbs_of_time:orb_night"},
		{"orbs_of_time:orb_day"},
	},
})

-----------
--Loot mod support
-----------

if minetest.get_modpath("loot") then
	loot.register_loot({
		weights = { generic = 10, valuable= 10 },
		payload = {
			stack = ItemStack("orbs_of_time:orb_day"),
			min_size = 1,
			max_size = 1,
		},
	})

	loot.register_loot({
		weights = { generic = 10, valuable= 10 },
		payload = {
			stack = ItemStack("orbs_of_time:orb_night"),
			min_size = 1,
			max_size = 1,
		},
	})

	loot.register_loot({
		weights = { generic = 10, valuable= 10 },
		payload = {
			stack = ItemStack("orbs_of_time:orb_dawn"),
			min_size = 1,
			max_size = 1,
		},
	})

	loot.register_loot({
		weights = { generic = 10, valuable= 10 },
		payload = {
			stack = ItemStack("orbs_of_time:orb_dusk"),
			min_size = 1,
			max_size = 1,
		},
	})

end


code:
-- Fallback functions for when `intllib` is not installed.
-- Code released under Unlicense <http://unlicense.org>.

-- Get the latest version of this file at:
--   https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua

local function format(str, ...)
	local args = { ... }
	local function repl(escape, open, num, close)
		if escape == "" then
			local replacement = tostring(args[tonumber(num)])
			if open == "" then
				replacement = replacement..close
			end
			return replacement
		else
			return "@"..open..num..close
		end
	end
	return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl))
end

local gettext, ngettext
if minetest.get_modpath("intllib") then
	if intllib.make_gettext_pair then
		-- New method using gettext.
		gettext, ngettext = intllib.make_gettext_pair()
	else
		-- Old method using text files.
		gettext = intllib.Getter()
	end
end

-- Fill in missing functions.

gettext = gettext or function(msgid, ...)
	return format(msgid, ...)
end

ngettext = ngettext or function(msgid, msgid_plural, n, ...)
	return format(n==1 and msgid or msgid_plural, ...)
end

return gettext, ngettext


code:
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-02-25 21:08-0700\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"

#: init.lua:9
msgid "Orb of Midday"
msgstr ""

#: init.lua:10
msgid ""
"This magical orb grants you the power to bring the Sun to the zenith of the "
"sky."
msgstr ""

#: init.lua:11
msgid ""
"When weilded, use this item and the Sun will jump to its highest point. The "
"day will then progress normally from there. This orb can be used eight times "
"- once for each diamond that was used to craft it."
msgstr ""

#: init.lua:28
msgid "Orb of Midnight"
msgstr ""

#: init.lua:29
msgid ""
"This magical orb grants you the power to banish the Sun to the bottom of the "
"world."
msgstr ""

#: init.lua:30
msgid ""
"When weilded, use this item and the Moon will jump to its highest point. The "
"night will then progress normally from there. This orb can be used eight "
"times - once for each diamond that was used to craft it."
msgstr ""

#: init.lua:48
msgid "Orb of Dawn"
msgstr ""

#: init.lua:49
msgid ""
"This magical orb grants you the power to bring the Sun to eastern horizon."
msgstr ""

#: init.lua:50
msgid ""
"When weilded, use this item and day will break. The day will then progress "
"normally from there. This orb can be used eight times - once for each "
"diamond that was used to craft it."
msgstr ""

#: init.lua:67
msgid "Orb of Dusk"
msgstr ""

#: init.lua:68
msgid ""
"This magical orb grants you the power to send the Sun to western horizon."
msgstr ""

#: init.lua:69
msgid ""
"When weilded, use this item and night will fall. The night will then "
"progress normally from there. This orb can be used eight times - once for "
"each diamond that was used to craft it."
msgstr ""


code:
name = orbs_of_time
optional_depends = default, mcl_core, intllib, loot, doc
description = A mod containing magical orbs a player can use a limited number of times to change the time of day


code:
-- Licensed under CC0.
-- Painting textures from Stunt Rally <https://code.google.com/p/vdrift-ogre/>, licensed under CC0.

local paintings = {}
paintings.dyes = {
	{"white",      "White"},
	{"grey",       "Grey"},
	{"black",      "Black"},
	{"red",        "Red"},
	{"yellow",     "Yellow"},
	{"green",      "Green"},
	{"cyan",       "Cyan"},
	{"blue",       "Blue"},
	{"magenta",    "Magenta"},
	{"orange",     "Orange",},
	{"violet",     "Violet"},
	{"brown",      "Brown"},
	{"pink",       "Pink"},
	{"dark_grey",  "Dark Grey"},
	{"dark_green", "Dark Green"},
}

for _, row in ipairs(paintings.dyes) do
	local name = row[1]
	local desc = row[2]
	minetest.register_node("paintings:" .. name, {
		description = desc .. " Painting",
		drawtype = "nodebox",
		tiles = {"paintings_" .. name .. ".png"},
		inventory_image = "paintings_" .. name .. ".png",
		wield_image = "paintings_" .. name .. ".png",
		paramtype = "light",
		paramtype2 = "wallmounted",
		sunlight_propagates = true,
		walkable = false,
		node_box = {
			type = "wallmounted",
			wall_top    = {-0.5, 0.4375, -0.5, 0.5, 0.5, 0.5},
			wall_bottom = {-0.5, -0.5, -0.5, 0.5, -0.4375, 0.5},
			wall_side   = {-0.5, -0.5, -0.5, -0.4375, 0.5, 0.5},
		},
		groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 3, flammable = 3},
		sounds = default.node_sound_wood_defaults(),
	})
	minetest.register_craft({
		output = "paintings:" .. name,
		recipe = {
			{"group:stick", "group:stick", "group:stick"},
			{"group:stick", "wool:" .. name, "group:stick"},
			{"group:stick", "group:stick", "group:stick"},
		}
	})
end


code:
name = paintings
description = Adds paintings.
author = Calinou
depends = default, wool


code:
Pie mod [pie]

Pie mod for minetest adds six cakes to the game which can be crafted using items
from farming redo, mobs redo and Ethereal foods and then placed as a block or
punched to eat a slice (or three).

Adds normal cake, chocolate cake, coffee cake, red velvet cake,
strawberry cheesecake, meat cake and banana cake.

Support for hud/hunger, hbhunger and stamina has been added.

https://forum.minetest.net/viewtopic.php?f=9&t=13285

Change log:

- 0.1 - Initial release
- 0.2 - Added meat pie
- 0.3 - Fix cake inside - Added banana cake
- 0.4 - Added support for stamina mod
- 0.5 - Added Orange and Bread cake (thanks to CalebDavis)
- 0.6 - Now uses food_ groups to craft cakes easier
- 0.7 - Added aliases for older pie mod by Mitroman

Lucky Blocks: 12


code:
-- check for available hunger mods
local hmod = minetest.global_exists("hunger")
local hbmod = minetest.global_exists("hbhunger")
local stmod = minetest.global_exists("stamina")

-- eat pie slice function
local replace_pie = function(node, puncher, pos)

	-- which size of pie did we hit?
	local pie = node.name:split("_")[1]
	local num = tonumber(node.name:split("_")[2])

	-- eat slice or remove whole pie
	if num == 3 then
		node.name = "air"
	elseif num < 3 then
		node.name = pie .. "_" .. (num + 1)
	end

	minetest.swap_node(pos, {name = node.name})

	-- Wuzzy's hbhunger mod
	if hbmod then

		local h = tonumber(hbhunger.hunger[puncher:get_player_name()])
--		print ("hbhunger is "..h)

		h = math.min(h + 4, 30)

		hbhunger.hunger[puncher:get_player_name()] = h

		minetest.sound_play("hbhunger_eat_generic", {
			pos = pos, gain = 0.7, max_hear_distance = 5})

	-- none of the above found? add to health instead
	else

		local h = puncher:get_hp()
--		print ("health is "..h)

		h = math.min(h + 4, 20)

		puncher:set_hp(h)
	end
end

-- register pie bits
local register_pie = function(pie, desc)

	-- full pie
	minetest.register_node("pie:" .. pie .. "_0", {
		description = desc,
		paramtype = "light",
		sunlight_propagates = false,
		tiles = {
			pie .. "_top.png", pie .. "_bottom.png", pie .. "_side.png",
			pie .. "_side.png", pie .. "_side.png", pie .. "_side.png"
		},
		inventory_image = pie .. "_inv.png",
		wield_image = pie .. "_inv.png",
		drawtype = "nodebox",
		node_box = {
			type = "fixed",
			fixed = {{-0.45, -0.5, -0.45, 0.45, 0, 0.45}},
		},

		on_punch = function(pos, node, puncher, pointed_thing)
			replace_pie(node, puncher, pos)
		end,
	})

	-- 3/4 pie
	minetest.register_node("pie:" .. pie .. "_1", {
		description = "3/4" .. desc,
		paramtype = "light",
		sunlight_propagates = true,
		tiles = {
			pie .. "_top.png", pie .. "_bottom.png", pie .. "_side.png",
			pie .. "_side.png", pie .. "_side.png", pie .. "_inside.png"
		},
		groups = {not_in_creative_inventory = 1},
		drop = {},
		drawtype = "nodebox",
		node_box = {
			type = "fixed",
			fixed = {{-0.45, -0.5, -0.25, 0.45, 0, 0.45}},
		},

		on_punch = function(pos, node, puncher, pointed_thing)
			replace_pie(node, puncher, pos)
		end,
	})

	-- 1/2 pie
	minetest.register_node("pie:" .. pie .. "_2", {
		description = "Half " .. desc,
		paramtype = "light",
		sunlight_propagates = true,
		tiles = {
			pie .. "_top.png", pie .. "_bottom.png", pie .. "_side.png",
			pie .. "_side.png", pie .. "_side.png", pie .. "_inside.png"
		},
		groups = {not_in_creative_inventory = 1},
		drop = {},
		drawtype = "nodebox",
		node_box = {
			type = "fixed",
			fixed = {{-0.45, -0.5, 0.0, 0.45, 0, 0.45}},
		},

		on_punch = function(pos, node, puncher, pointed_thing)
			replace_pie(node, puncher, pos)
		end,
	})

	-- 1/4 pie
	minetest.register_node("pie:" .. pie .. "_3", {
		description = "Piece of " .. desc,
		paramtype = "light",
		sunlight_propagates = true,
		tiles = {
			pie .. "_top.png", pie .. "_bottom.png", pie .. "_side.png",
			pie .. "_side.png", pie .. "_side.png", pie .. "_inside.png"
		},
		groups = {not_in_creative_inventory = 1},
		drop = {},
		drawtype = "nodebox",
		node_box = {
			type = "fixed",
			fixed = {{-0.45, -0.5, 0.25, 0.45, 0, 0.45}},
		},

		on_punch = function(pos, node, puncher, pointed_thing)
			replace_pie(node, puncher, pos)
		end,
	})

end

-- normal cake
register_pie("pie", "Cake")

minetest.register_craft({
	output = "pie:pie_0",
	recipe = {
		{"group:food_sugar", "group:food_milk", "group:food_sugar"},
		{"group:food_sugar", "group:food_egg", "group:food_sugar"},
		{"group:food_wheat", "group:food_flour", "group:food_wheat"},
	},
	replacements = {{ "mobs:bucket_milk", "mesecraft_bucket:bucket_empty"}}
})

-- chocolate cake
register_pie("choc", "Chocolate Cake")

minetest.register_craft({
	output = "pie:choc_pie_0",
	recipe = {
		{"group:food_sugar", "group:food_milk", "group:food_sugar"},
		{"group:food_chocolate", "group:food_egg", "group:food_chocolate"},
		{"group:food_wheat", "group:food_flour", "group:food_wheat"},
	},
	replacements = {{ "mobs:bucket_milk", "mesecraft_bucket:bucket_empty"}}
})


code:
name = pie
description = Add a selection of tasty Pie/Cakes to eat.
author = TenPlus1
depends = default
optional_depends = hunger, hbhunger, stamina


code:
# Pig Iron Mod

### by TenPlus1

https://forum.minetest.net/viewtopic.php?f=9&t=20568

This mod exists to add a little progression to the game so that steel isn't so easy to come by :)

 - Iron Ingots can be made by smelting Iron Ore in a furnace
 - Charcoal can be made by cooking Tree's in a furnace
 - 1x Iron Ingot and 3x Charcoal create a mix that is smelted into 1x Steel Ingot
 - Iron Ingots can be made into blocks which can be used to make stairs
 - Iron blocks and stairs can rust when near water, cook in furnace to remove rust
 - A bucket of water surrounded by Iron Blocks returns 8x Rusted Iron Blocks
 - Added Iron tools which is better than stone but worse than steel/bronze
 - Switched Bronze and Steel tool strength since steel is stronger in real life

Lucky Blocks: 8

Changelog:

 - 0.1 - Initial Upload
 - 0.2 - Added Iron Pickaxe
 - 0.3 - Add Iron Axe, Shovel, Sword, Hoe and more lucky blocks
 - 0.4 - Switch Bronze and Steel tool capabilities (Steel is stronger irl)
 - 0.5 - Add Toolranks support for iron tools, add tool groups


code:
-- Pig Iron Ingot

minetest.register_craftitem("pigiron:iron_ingot", {
	description = "Iron Ingot",
	inventory_image = "pigiron_iron_ingot.png",
})

-- Remove Iron Lump -> Steel Ingot Recipe

minetest.clear_craft({
	type = "cooking",
	recipe = "default:iron_lump"
})

-- Iron Lump -> Iron Ingot

minetest.register_craft({
	type = "cooking",
	output = "pigiron:iron_ingot",
	recipe = "default:iron_lump",
})

-- Pig Iron Block

minetest.register_node("pigiron:iron_block", {
	description = "Iron Block",
	tiles = {"pigiron_iron_block.png"},
	is_ground_content = false,
	groups = {cracky = 1},
	sounds = default.node_sound_metal_defaults(),
})

minetest.register_craft({
	output = "pigiron:iron_block",
	recipe = {
		{"pigiron:iron_ingot", "pigiron:iron_ingot", "pigiron:iron_ingot"},
		{"pigiron:iron_ingot", "pigiron:iron_ingot", "pigiron:iron_ingot"},
		{"pigiron:iron_ingot", "pigiron:iron_ingot", "pigiron:iron_ingot"},
	}
})

minetest.register_craft({
	output = "pigiron:iron_ingot 9",
	type = "shapeless",
	recipe = {"pigiron:iron_block"}
})

-- Rusted Pig Iron Block

minetest.register_node("pigiron:rusted_iron_block", {
	description = "Rusted Iron Block",
	tiles = {"pigiron_rusted_iron_block.png"},
	is_ground_content = false,
	groups = {cracky = 1},
	sounds = default.node_sound_metal_defaults(),
})

minetest.register_craft({
	output = "pigiron:rusted_iron_block 8",
	recipe = {
		{"pigiron:iron_block", "pigiron:iron_block", "pigiron:iron_block"},
		{"pigiron:iron_block", "mesecraft_bucket:bucket_water", "pigiron:iron_block"},
		{"pigiron:iron_block", "pigiron:iron_block", "pigiron:iron_block"},
	},
	replacements = {
		{"mesecraft_bucket:bucket_water", "mesecraft_bucket:bucket_empty"}
	}
})

-- Cook Rusted Block Into Normal Block

minetest.register_craft({
	output = "pigiron:iron_block",
	type = "cooking",
	recipe = "pigiron:rusted_iron_block",
	cooktime = 5
})

-- Do not register these items and recipes if Ethereal mod active
if not minetest.get_modpath("ethereal") then

	-- Charcoal

	minetest.register_craftitem("pigiron:charcoal_lump", {
		description = "Lump of Charcoal",
		inventory_image = "pigiron_charcoal_lump.png",
	})

	-- Tree -> Charcoal Recipe

	minetest.register_craft({
		output = "pigiron:charcoal_lump 2",
		type = "cooking",
		recipe = "group:tree",
		cooktime = 4
	})

	-- Charcoal Fuel

	minetest.register_craft({
		type = "fuel",
		recipe = "pigiron:charcoal_lump",
		burntime = 10,
	})

	-- Charcoal Torch Recipe

	minetest.register_craft({
		output = "default:torch 4",
		recipe = {
			{"pigiron:charcoal_lump"},
			{"group:stick"},
		}
	})

else

	-- Alias charcoal lump to the one used in Ethereal mod
	minetest.register_alias("pigiron:charcoal_lump", "ethereal:charcoal_lump")

end -- END If Ethereal

-- Iron/Charcoal Mix

minetest.register_craftitem("pigiron:iron_charcoal_mix", {
	description = "Iron and Charcoal Mix",
	inventory_image = "pigiron_iron_ingot.png^pigiron_charcoal_lump.png",
})

minetest.register_craft({
	output = "pigiron:iron_charcoal_mix",
	type = "shapeless",
	recipe = {
		"pigiron:iron_ingot", "pigiron:charcoal_lump",
		"pigiron:charcoal_lump", "pigiron:charcoal_lump"
	}
})

-- Cook Iron/Charcoal Mix into Steel Ingot

minetest.register_craft({
	output = "default:steel_ingot",
	type = "cooking",
	recipe = "pigiron:iron_charcoal_mix",
	cooktime = 10
})

-- Abm to turn Iron Block into Rusted Iron Block

minetest.register_abm({
	label = "Rust Iron Block",
	nodenames = {
		"pigiron:iron_block", "stairs:slab_iron_block",
		"stairs:stair_iron_block"
	},
	neighbors = {"group:water"},
	interval = 20,
	chance = 300,
	catch_up = false,
	action = function(pos, node)

		if node.name == "pigiron:iron_block" then
			minetest.set_node(pos, {name = "pigiron:rusted_iron_block"})

		elseif node.name == "stairs:slab_iron_block" then
			minetest.set_node(pos, {name = "stairs:slab_rusted_iron_block",
					param2 = node.param2})

		elseif node.name == "stairs:stair_iron_block" then
			minetest.set_node(pos, {name = "stairs:stair_rusted_iron_block",
					param2 = node.param2})
		end
	end
})

-- Add Tools and Lucky Blocks

local path = minetest.get_modpath("pigiron")

dofile(path .. "/tools.lua")
dofile(path .. "/lucky_block.lua")

-- Change Xpanes Iron Bar Recipe to use Iron Ingots

if minetest.get_modpath("xpanes")
and minetest.registered_nodes["xpanes:bar_flat"]
and not minetest.registered_nodes["default:permafrost"] then

	minetest.clear_craft({
		output = "xpanes:bar_flat"
	})

	minetest.register_craft({
		output = "xpanes:bar_flat",
		recipe = {
			{"pigiron:iron_ingot", "pigiron:iron_ingot", "pigiron:iron_ingot"},
			{"pigiron:iron_ingot", "pigiron:iron_ingot", "pigiron:iron_ingot"}
		}
	})
end

-- Register Stairs

if minetest.get_modpath("stairs") then

	stairs.register_stair_and_slab("iron_block", "pigiron:iron_block",
		{cracky = 1},
		{"pigiron_iron_block.png"},
		"Iron Block Stair",
		"Iron Block Slab",
		default.node_sound_metal_defaults())

	stairs.register_stair_and_slab("rusted_iron_block", "pigiron:rusted_iron_block",
		{cracky = 1},
		{"pigiron_rusted_iron_block.png"},
		"Rusted Iron Block Stair",
		"Rusted Iron Block Slab",
		default.node_sound_metal_defaults())

	-- Cook Rusted Iron Stairs and Slabs Back Into Normal Iron Stairs
	minetest.register_craft({
		output = "stairs:stair_iron_block",
		type = "cooking",
		recipe = "stairs:stair_rusted_iron_block",
		cooktime = 5
	})

	minetest.register_craft({
		output = "stairs:slab_iron_block",
		type = "cooking",
		recipe = "stairs:slab_rusted_iron_block",
		cooktime = 5
	})
end

print("[MOD] Pig Iron loaded")


code:
-- Add Lucky Blocks if mod found

if minetest.get_modpath("lucky_block") then

	lucky_block:add_blocks({
		{"dro", {"pigiron:iron_ingots"}, 10},
		{"nod", "pigiron:iron_block", 0},
		{"nod", "pigiron:rusted_iron_block", 0},
		{"tro", "pigiron:iron_block", nil, true},
		{"dro", {"pigiron:charcoal_lump"}, 10},
		{"dro", {"pigiron:sword_iron", "pigiron:axe_iron",
			"pigiron:pickaxe_iron", "pigiron:shovel_iron"}, 1},
		{"fal", {"pigiron:iron_block", "pigiron:rusted_iron_block",
			"pigiron:iron_block", "pigiron:rusted_iron_block",
			"pigiron:iron_block", "pigiron:rusted_iron_block"}},
	})

	if minetest.get_modpath("farming") then

		lucky_block:add_blocks({
			{"dro", {"pigiron:hoe_iron"}, 1},
		})
	end
end


code:
name = pigiron
description = Adds pig iron ingots which need to be crafted to make steel, also blocks and stairs.
depends = default
optional_depends =stairs, farming, lucky_block, toolranks
title = Pig Iron
author = TenPlus1


code:
-- Iron Pickaxe

minetest.register_tool("pigiron:pick_iron", {
	description = "Iron Pickaxe",
	inventory_image = "pigiron_iron_pick.png",
	tool_capabilities = {
		full_punch_interval = 1.2,
		max_drop_level = 1,
		groupcaps = {
			cracky = {
				times = {[1] = 2.5, [2] = 1.40, [3] = 0.95},
				uses = 20, maxlevel = 2
			},
		},
		damage_groups = {fleshy = 3},
	},
	groups = {pickaxe = 1},
	sound = {breaks = "default_tool_breaks"},
})

minetest.register_craft({
	output = "pigiron:pick_iron",
	recipe = {
		{"pigiron:iron_ingot", "pigiron:iron_ingot", "pigiron:iron_ingot"},
		{"", "group:stick", ""},
		{"", "group:stick", ""},
	}
})

-- Iron Shovel

minetest.register_tool("pigiron:shovel_iron", {
	description = "Iron Shovel",
	inventory_image = "pigiron_iron_shovel.png",
	wield_image = "pigiron_iron_shovel.png^[transformR90",
	tool_capabilities = {
		full_punch_interval = 1.3,
		max_drop_level = 1,
		groupcaps = {
			crumbly = {
				times = {[1] = 1.70, [2] = 1.0, [3] = 0.45},
				uses = 25, maxlevel = 1
			},
		},
		damage_groups = {fleshy = 2},
	},
	groups = {shovel = 1},
	sound = {breaks = "default_tool_breaks"},
})

minetest.register_craft({
	output = "pigiron:shovel_iron",
	recipe = {
		{"pigiron:iron_ingot"},
		{"group:stick"},
		{"group:stick"},
	}
})

-- Iron Axe

minetest.register_tool("pigiron:axe_iron", {
	description = "Iron Axe",
	inventory_image = "pigiron_iron_axe.png",
	tool_capabilities = {
		full_punch_interval = 1.1,
		max_drop_level = 1,
		groupcaps = {
			choppy = {
				times = {[1] = 2.70, [2] = 1.70, [3] = 1.15},
				uses = 20, maxlevel = 1
			},
		},
		damage_groups = {fleshy = 3},
	},
	groups = {axe = 1},
	sound = {breaks = "default_tool_breaks"},
})

minetest.register_craft({
	output = "pigiron:axe_iron",
	recipe = {
		{"pigiron:iron_ingot", "pigiron:iron_ingot"},
		{"pigiron:iron_ingot", "group:stick"},
		{"", "group:stick"},
	}
})

-- Iron Sword

minetest.register_tool("pigiron:sword_iron", {
	description = "Iron Sword",
	inventory_image = "pigiron_iron_sword.png",
	tool_capabilities = {
		full_punch_interval = 1.0,
		max_drop_level = 1,
		groupcaps = {
			snappy = {
				times = {[1] = 2.0, [2] = 1.30, [3] = 0.38},
				uses = 25, maxlevel = 1
			},
		},
		damage_groups = {fleshy = 5},
	},
	groups = {sword = 1},
	sound = {breaks = "default_tool_breaks"},
})

minetest.register_craft({
	output = "pigiron:sword_iron",
	recipe = {
		{"pigiron:iron_ingot"},
		{"pigiron:iron_ingot"},
		{"group:stick"},
	}
})

-- Iron Hoe

if minetest.get_modpath("farming") then

	farming.register_hoe(":farming:hoe_iron", {
		description = "Iron Hoe",
		inventory_image = "pigiron_iron_hoe.png",
		max_uses = 150,
		material = "pigiron:iron_ingot"
	})

	-- Toolranks support if farming redo active
	if farming and farming.mod
	and minetest.get_modpath("toolranks") then
		minetest.override_item("farming:hoe_iron", {
			original_description = "Iron Hoe",
			description = toolranks.create_description("Iron Hoe")})
	end
end

-- Switch Tool Capabilities between Steel and Bronze Tools
-- Note: Steel is much stronger than Bronze in real life.

minetest.override_item("default:pick_steel", {
	tool_capabilities = {
		full_punch_interval = 1.0,
		max_drop_level = 1,
		groupcaps = {
			cracky = {
				times = {[1] = 4.50, [2] = 1.80, [3] = 0.90},
				uses = 20, maxlevel = 2
			},
		},
		damage_groups = {fleshy = 4},
	},
})

minetest.override_item("default:pick_bronze", {
	tool_capabilities = {
		full_punch_interval = 1.0,
		max_drop_level = 1,
		groupcaps = {
			cracky = {
				times = {[1] = 4.00, [2] = 1.60, [3] = 0.80},
				uses = 20, maxlevel = 2
			},
		},
		damage_groups = {fleshy = 4},
	},
})

minetest.override_item("default:shovel_steel", {
	tool_capabilities = {
		full_punch_interval = 1.1,
		max_drop_level = 1,
		groupcaps = {
			crumbly = {
				times = {[1] = 1.65, [2] = 1.05, [3] = 0.45},
				uses = 25, maxlevel = 2
			},
		},
		damage_groups = {fleshy = 3},
	},
})

minetest.override_item("default:shovel_bronze", {
	tool_capabilities = {
		full_punch_interval = 1.1,
		max_drop_level = 1,
		groupcaps = {
			crumbly = {
				times = {[1] = 1.50, [2] = 0.90, [3] = 0.40},
				uses = 30, maxlevel = 2
			},
		},
		damage_groups = {fleshy = 3},
	},
})

minetest.override_item("default:axe_steel", {
	tool_capabilities = {
		full_punch_interval = 1.0,
		max_drop_level = 1,
		groupcaps = {
			choppy = {
				times = {[1] = 2.75, [2] = 1.70, [3] = 1.15},
				uses = 20, maxlevel = 2
			},
		},
		damage_groups = {fleshy = 4},
	},
})

minetest.override_item("default:axe_bronze", {
	tool_capabilities = {
		full_punch_interval = 1.0,
		max_drop_level = 1,
		groupcaps = {
			choppy = {
				times = {[1] = 2.50, [2] = 1.40, [3] = 1.00},
				uses = 20, maxlevel = 2
			},
		},
		damage_groups = {fleshy = 4},
	},
})

minetest.override_item("default:sword_steel", {
	tool_capabilities = {
		full_punch_interval = 0.8,
		max_drop_level = 1,
		groupcaps = {
			snappy = {
				times = {[1] = 2.75, [2] = 1.30, [3] = 0.375},
				uses = 25, maxlevel = 2
			},
		},
		damage_groups = {fleshy = 6},
	},
})

minetest.override_item("default:sword_bronze", {
	tool_capabilities = {
		full_punch_interval = 0.8,
		max_drop_level = 1,
		groupcaps = {
			snappy = {
				times = {[1] = 2.5, [2] = 1.20, [3] = 0.35},
				uses = 30, maxlevel = 2
			},
		},
		damage_groups = {fleshy = 6},
	},
})

-- Add [toolranks] mod support if found
if minetest.get_modpath("toolranks") then

	-- Helper function
	local function add_tool(name, desc, afteruse)

		minetest.override_item(name, {
			original_description = desc,
			description = toolranks.create_description(desc, 0, 1),
			after_use = afteruse and toolranks.new_afteruse
		})
	end

	add_tool("pigiron:pick_iron", "Iron Pickaxe", true)
	add_tool("pigiron:axe_iron", "Iron Axe", true)
	add_tool("pigiron:shovel_iron", "Iron Shovel", true)
	add_tool("pigiron:sword_iron", "Iron Sword", true)
end


code:
# Auto detect text files and perform LF normalization
* text=auto

# Custom for Visual Studio
*.cs     diff=csharp

# Standard to msysgit
*.doc	 diff=astextplain
*.DOC	 diff=astextplain
*.docx diff=astextplain
*.DOCX diff=astextplain
*.dot  diff=astextplain
*.DOT  diff=astextplain
*.pdf  diff=astextplain
*.PDF	 diff=astextplain
*.rtf	 diff=astextplain
*.RTF	 diff=astextplain


code:
# Windows image file caches
Thumbs.db
ehthumbs.db

# Folder config file
Desktop.ini

# Recycle Bin used on file shares
$RECYCLE.BIN/

# Windows Installer files
*.cab
*.msi
*.msm
*.msp

# Windows shortcuts
*.lnk

# =========================
# Operating System Files
# =========================

# OSX
# =========================

.DS_Store
.AppleDouble
.LSOverride

# Thumbnails
._*

# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns

# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk


code:
## Pontoons

This mod adds some simple building blocks that can be placed on top of liquid, making it easier to construct things on a body of water without needing to first build a piling from the ground underneath.

Wood pontoons are for building on the surface of water and steel pontoons can be placed on either water or lava.

There is also an option to add this property to wood and tree blocks to allow them to be used this way directly.


code:
default?
mcl_core?
mcl_sounds?
airtanks?
moretrees?
intllib?
doc?


code: A "floating" block that can be placed at the surface of a body of water without needing to build pilings first.


code:
-- internationalization boilerplate
local MP = minetest.get_modpath(minetest.get_current_modname())
local S, NS = dofile(MP.."/intllib.lua")

-- MCL2 compatibility
local moditems = {}

if core.get_modpath("mcl_core") and mcl_core then -- means MineClone 2 is loaded, this is its core mod
	moditems.IRON_ITEM = "mcl_core:iron_ingot"  -- MCL iron
else         -- fallback, assume default (MineTest Game) is loaded, otherwise it will error anyway here.
	moditems.IRON_ITEM = "default:steel_ingot"  -- MCL iron
end

local pontoons_override_logs = minetest.settings:get_bool("pontoons_override_logs") -- default false

local pontoons_override_wood = minetest.settings:get_bool("pontoons_override_wood") -- default false

local pontoons_wood_pontoons = minetest.settings:get_bool("pontoons_wood_pontoons")
if pontoons_wood_pontoons == nil then pontoons_wood_pontoons = true end -- default true

local pontoons_steel_pontoons = minetest.settings:get_bool("pontoons_steel_pontoons")
if pontoons_steel_pontoons == nil then pontoons_steel_pontoons = true end -- default true

local default_modpath = minetest.get_modpath("default")

if pontoons_override_logs or pontoons_override_wood then
	local override_def = {liquids_pointable = true}

	for node_name, node_def in pairs(minetest.registered_nodes) do
		if pontoons_override_logs and minetest.get_item_group(node_name, "tree") > 0 then
			minetest.override_item(node_name, override_def)
		end
		if pontoons_override_wood and minetest.get_item_group(node_name, "wood") > 0 then
			minetest.override_item(node_name, override_def)
		end
	end
end

if pontoons_wood_pontoons then
	local default_sound
	local wood_burn_time
	if default_modpath then
		default_sound = default.node_sound_wood_defaults()
		wood_burn_time = minetest.get_craft_result({method="fuel", width=1, items={ItemStack("group:wood")}}).time
	end
	if not wood_burn_time then wood_burn_time = 7 end

	minetest.register_node("pontoons:wood_pontoon", {
		description = S("Wood Pontoon"),
		_doc_items_longdesc = S("A hollow wooden block designed to be built on the surface of liquids."),
		tiles = {"pontoon_wood.png"},
		paramtype2 = "facedir",
		place_param2 = 0,
		is_ground_content = false,
		liquids_pointable = true,
		groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1},
		sounds = default_sound,
	})

-- modify recipe, if "airtank" mod is loaded as it has similar recipe and conflicts with pontoons.

if core.get_modpath("airtanks") and airtanks then
	minetest.register_craft({
		output = 'pontoons:wood_pontoon 4',
		recipe = {
			{"group:wood","group:wood","group:wood"},
			{"","",""},
			{"","","group:wood"},
		}
	})
else
	minetest.register_craft({
		output = 'pontoons:wood_pontoon 4',
		recipe = {
			{"","group:wood",""},
			{"group:wood","","group:wood"},
			{"","group:wood",""},
		}
	})
end

	minetest.register_craft({
		type = "fuel",
		recipe = "pontoons:wood_pontoon",
		burntime = wood_burn_time,
	})

end

if pontoons_steel_pontoons then
	local default_sound
	if default_modpath then
			if default.node_sound_metal_defaults then
				default_sound = default.node_sound_metal_defaults()
			else
				default_sound = default.node_sound_wood_defaults()
			end
	end

	minetest.register_node("pontoons:steel_pontoon", {
		description = S("Steel Pontoon"),
		_doc_items_longdesc = S("A hollow steel block designed to be built on the surface of liquids. Magma-safe."),
		is_ground_content = false,
		tiles = {"pontoon_steel.png"},
		liquids_pointable = true,
		is_ground_content = false,
		groups = {cracky = 1, level = 2},
		sounds = default_sound,
	})

	if default_modpath then
		if core.get_modpath("airtanks") and airtanks then
			minetest.register_craft({
				output = 'pontoons:steel_pontoon',
				recipe = {
					{"",moditems.IRON_ITEM,""},
					{moditems.IRON_ITEM,"",moditems.IRON_ITEM},
					{"","",moditems.IRON_ITEM},
				}
			})
	  else
			minetest.register_craft({
				output = 'pontoons:steel_pontoon',
				recipe = {
					{"",moditems.IRON_ITEM,""},
					{moditems.IRON_ITEM,"",moditems.IRON_ITEM},
					{"",moditems.IRON_ITEM,""},
				}
			})
		end
	end
end


code:
-- Fallback functions for when `intllib` is not installed.
-- Code released under Unlicense <http://unlicense.org>.

-- Get the latest version of this file at:
--   https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua

local function format(str, ...)
	local args = { ... }
	local function repl(escape, open, num, close)
		if escape == "" then
			local replacement = tostring(args[tonumber(num)])
			if open == "" then
				replacement = replacement..close
			end
			return replacement
		else
			return "@"..open..num..close
		end
	end
	return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl))
end

local gettext, ngettext
if minetest.get_modpath("intllib") then
	if intllib.make_gettext_pair then
		-- New method using gettext.
		gettext, ngettext = intllib.make_gettext_pair()
	else
		-- Old method using text files.
		gettext = intllib.Getter()
	end
end

-- Fill in missing functions.

gettext = gettext or function(msgid, ...)
	return format(msgid, ...)
end

ngettext = ngettext or function(msgid, msgid_plural, n, ...)
	return format(n==1 and msgid or msgid_plural, ...)
end

return gettext, ngettext


code:
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-02-12 12:54-0700\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"

#: init.lua:57
msgid "Wood Pontoon"
msgstr ""

#: init.lua:58
msgid "A hollow wooden block designed to be built on the surface of liquids."
msgstr ""

#: init.lua:96
msgid "Steel Pontoon"
msgstr ""

#: init.lua:97
msgid ""
"A hollow steel block designed to be built on the surface of liquids. Magma-"
"safe."
msgstr ""


code:
name = pontoons
optional_depends = default, mcl_core, mcl_sounds, airtanks, moretrees, intllib, doc
description = A "floating" block that can be placed at the surface of a body of water without needing to build pilings first.


code:
#When enabled, all logs can now be built "floating" in liquids. Note that
#a log placed in lava will not last for long.
pontoons_override_logs (Logs float) bool false

#When enabled, all wood blocks can now be built "floating" in liquids.
#Note that wood blocks placed in lava will not last for long.
pontoons_override_wood (Wood floats) bool false

#Adds craftable wooden pontoon blocks that can be built on the
#surface of liquids. This is only really useful if wood floating
#is not enabled.
pontoons_wood_pontoons (Wooden pontoons) bool true

#Adds craftable steel pontoon blocks that can be built on the
#surface of liquids. These are are lava-resistant, and so are
#useful even when logs and wood are able to be built on liquids.
pontoons_steel_pontoons (Steel pontoons) bool true


code:
Protector Redo mod [protect]

Protector redo for minetest is a mod that protects a players builds by placing
a block that stops other players from digging or placing blocks in that area.

based on glomie's mod, remade by Zeg9 and rewritten by TenPlus1.

https://forum.minetest.net/viewtopic.php?f=11&t=9376

Change log:

- 0.1 - Initial release
- 0.2 - Texture update
- 0.3 - Added Protection Logo to blend in with player builds
- 0.4 - Code tweak for 0.4.10+
- 0.5 - Added protector.radius variable in init.lua (default: 5)
- 0.6 - Added Protected Doors (wood and steel) and Protected Chest
- 0.7 - Protected Chests now have "To Chest" and "To Inventory" buttons to copy
      contents across, also chests can be named
- 0.8 - Updated to work with Minetest 0.4.12, simplified textures
- 0.9 - Tweaked code
- 1.0 - Only owner can remove protector
- 1.1 - Set 'protector_pvp = true' in minetest.conf to disable pvp in protected
      areas except your own, also setting protector_pvp_spawn higher than 0 will
      disable pvp around spawn area with the radius you entered
- 1.2 - Shift and click support added with Minetest 0.4.13 to quickly copy stacks
      to and from protected chest
- 1.3 - Moved protector on_place into node itself, protector zone display changed
      from 10 to 5 seconds, general code tidy
- 1.4 - Changed protector recipes to give single item instead of 4, added + button
      to interface, tweaked and tidied code, added admin command /delprot to remove
      protectors in bulk from banned/old players
- 1.5 - Added much requested protected trapdoor
- 1.6 - Added protector_drop (true or false) and protector_hurt (hurt by this num)
      variables to minetest.conf settings to stop players breaking protected
      areas by dropping tools and hurting player.
- 1.7 - Included an edited version of WTFPL doors mod since protected doors didn't
      work with the doors mod in the latest daily build... Now it's fine :)
      added support for "protection_bypass" privelage.
- 1.8 - Added 'protector_flip' setting to stop players using lag to grief into
      another players house, it flips them around to stop them digging.
- 1.9 - Renamed 'protector_pvp_spawn' setting to 'protector_spawn' which protects
      an area around static spawnpoint and disables pvp if active.
      (note: previous name can still be used)
- 2.0 - Added protector placement tool (thanks to Shara) so that players can easily
      stand on a protector, face in a direction and it places a new one at a set
      distance to cover protection radius.  Added /protector_show command (thanks agaran)
      Protectors and chest cannot be moved by mesecon pistons or machines.
- 2.1 - Added 'protector_night_pvp' setting so night-time becomes a free for all and
      players can hurt one another even inside protected areas (not spawn protected)
- 2.2 - Updated protector tool so that player only needs to stand nearby (2 block radius)
      It can also place vertically (up and down) as well.  New protector recipe added.
- 2.3 - Localise many of the protector functions and tidy code.
- 2.4 - Update to newer functions, Minetest 0.4.16 needed to run now.
- 2.5 - Added HUD text to show when player is inside a protected area (updates every 5 seconds)
- 2.6 - Add protection against CSM tampering, updated Intllib support (thanks codexp), tweaked block textures
- 2.7 - Remove protection field entity when protector has been dug
- 2.8 - Added 'protector_show_interval' setting to minetest.conf [default is 5], make protection field glow in dark.
- 2.9 - Added MineClone2 recipes for protection block but no official support as yet
- 3.0 - Added PlayerFactions support, 'protector_hud_interval' setting and listing in advanced settings for mod values.
- 3.1 - Ability to hide protection blocks using /protector_hide and /protector_show , italian local added (thanks Hamlet)
- 3.2 - Defaults to Minetest translation if found, otherwise intllib fallback if loaded, locale files updated for both.  Added 'protector_msg' setting for player text.
- 3.3 - Added support for playerfactions new api (thanks louisroyer), added limiter to protection radius of 22.

Lucky Blocks: 10

Usage: (requires server privelage)

list names to remove

	/protector_remove

remove specific user names

	/protector_remove name1 name2

remove all names from list

	/protector_remove -

Whenever a player is near any protectors with name1 or name2 then it will be
replaced by an air block.

show owner name to replace

	/protector_replace

replace owner with new name

	/protector_replace owner new_owner

reset name list

	/protector_replace -

show protected areas of your nearby protectors (max of 5)
	/protector_show_area

A players own protection blocks can be hidden and shown using the following:
	/protector_hide
	/protector_show

The following lines can be added to your minetest.conf file to configure specific features of the mod:

protector_radius = 5
- Sets the area around each protection node so that other players cannot dig, place or enter through protected doors or chests.

protector_pvp = true
- true or false this setting disabled pvp inside of protected areas for all players apart from those listed on the protector node.

protector_night_pvp = false
- when true this setting enables pvp at night time only, even inside protected areas, requires protector_pvp to be active to work.

protector_spawn = 10
- Sets an area 10 nodes around static spawnpoint that is protected.

protector_hurt = 2
- When set to above 0, players digging in protected areas will be hurt by 2 health points (or whichever number it's set to)

protector_flip = true
- When true players who dig inside a protected area will flipped around to stop them using lag to grief into someone else's build

protector_show_interval
- Number of seconds the protection field is visible, defaults to 5 seconds.

protector_recipe = true
- When true allows players to craft protection blocks

protector_msg = true
- When true shows protection messages in players chat when trying to interact in someone else's area

Protector Tool

Can be crafted with a protector surrounded by steel ingots and is used to place new protectors at a set distance of protector.radius in all directions including up and down simply by looking in a direction.

Use by standing near an existing protector, looking in a direction and using as a tool, hold sneak/shift to place new protector containing member list from inside nearest one.


code:
local S = protector.intllib
local removal_names = ""
local replace_names = ""

minetest.register_chatcommand("protector_remove", {
	params = S("<names list>"),
	description = S("Remove Protectors around players (separate names with spaces)"),
	privs = {server = true},
	func = function(name, param)

		if not param or param == "" then

			minetest.chat_send_player(name,
				S("Protector Names to remove: @1",
					removal_names))

			return
		end

		if param == "-" then

			minetest.chat_send_player(name,
				S("Name List Reset"))

			removal_names = ""

			return
		end

		removal_names = param
	end,
})

minetest.register_chatcommand("protector_replace", {
	params = S("<owner name> <name to replace with>"),
	description = S("Replace Protector Owner with name provided"),
	privs = {server = true},
	func = function(name, param)

		-- reset list to empty
		if param == "-" then

			minetest.chat_send_player(name, S("Name List Reset"))

			replace_names = ""

			return
		end

		-- show name info
		if param == ""
		and replace_names ~= "" then

			local names = replace_names:split(" ")

			minetest.chat_send_player(name,
				S("Replacing Protector name @1 with @2",
					names[1] or "", names[2] or ""))

			return
		end

		replace_names = param
	end,
})

minetest.register_abm({
	nodenames = {"protector:protect", "protector:protect2", "protector:protect_hidden"},
	interval = 8,
	chance = 1,
	catch_up = false,
	action = function(pos, node)

		if removal_names == ""
		and replace_names == "" then
			return
		end

		local meta = minetest.get_meta(pos)

		if not meta then return end

		local owner = meta:get_string("owner")

		if removal_names ~= "" then

			local names = removal_names:split(" ")

			for _, n in pairs(names) do
				if n == owner then
					minetest.set_node(pos, {name = "air"})
				end
			end
		end

		if replace_names ~= "" then

			local names = replace_names:split(" ")

			if names[1] and names[2] and owner == names[1] then
				meta:set_string("owner", names[2])
				meta:set_string("infotext", S("Protection (owned by @1)", names[2]))
			end
		end
	end
})

-- get protection radius
local r = tonumber(minetest.settings:get("protector_radius")) or 5

-- show protection areas of nearby protectors owned by you (thanks agaran)
minetest.register_chatcommand("protector_show_area", {
	params = "",
	description = S("Show protected areas of your nearby protectors"),
	privs = {},
	func = function(name, param)

		local player = minetest.get_player_by_name(name)
		local pos = player:get_pos()

		-- find the protector nodes
		local pos = minetest.find_nodes_in_area(
			{x = pos.x - r, y = pos.y - r, z = pos.z - r},
			{x = pos.x + r, y = pos.y + r, z = pos.z + r},
			{"protector:protect", "protector:protect2", "protector:protect_hidden"})

		local meta, owner

		-- show a maximum of 5 protected areas only
		for n = 1, math.min(#pos, 5) do

			meta = minetest.get_meta(pos[n])
			owner = meta:get_string("owner") or ""

			if owner == name
			or minetest.check_player_privs(name, {protection_bypass = true}) then
				minetest.add_entity(pos[n], "protector:display")
			end
		end
	end
})

-- ability to hide protection blocks (borrowed from doors mod :)
minetest.register_node("protector:protect_hidden", {
	description = "Hidden Protector",
	drawtype = "airlike",
	paramtype = "light",
	paramtype2 = "facedir",
	sunlight_propagates = true,
	-- has to be walkable for falling nodes to stop falling
	walkable = true,
	pointable = false,
	diggable = false,
	buildable_to = false,
	floodable = false,
	drop = "",
	groups = {not_in_creative_inventory = 1, unbreakable = 1},
	on_blast = function() end,
	-- 1px block inside door hinge near node top
	collision_box = {
		type = "fixed",
		fixed = {-15/32, 13/32, -15/32, -13/32, 1/2, -13/32},
	},
})

minetest.register_chatcommand("protector_show", {
	params = "",
	description = S("Show your nearby protection blocks"),
	privs = {interact = true},

	func = function(name, param)

		local player = minetest.get_player_by_name(name)

		if not player then
			return false, "Player not found"
		end

		local pos = player:get_pos()

		local a = minetest.find_nodes_in_area(
			{x = pos.x - r, y = pos.y - r, z = pos.z - r},
			{x = pos.x + r, y = pos.y + r, z = pos.z + r},
			{"protector:protect_hidden"})

		local meta, owner

		for _, row in pairs(a) do

			meta = minetest.get_meta(row)
			owner = meta:get_string("owner") or ""

			if owner == name
			or minetest.check_player_privs(name, {protection_bypass = true}) then
				minetest.swap_node(row, {name = "protector:protect"})
			end
		end
	end
})

minetest.register_chatcommand("protector_hide", {
	params = "",
	description = S("Hide your nearby protection blocks"),
	privs = {interact = true},

	func = function(name, param)

		local player = minetest.get_player_by_name(name)

		if not player then
			return false, "Player not found"
		end

		local pos = player:get_pos()

		local a = minetest.find_nodes_in_area(
			{x = pos.x - r, y = pos.y - r, z = pos.z - r},
			{x = pos.x + r, y = pos.y + r, z = pos.z + r},
			{"protector:protect", "protector:protect2"})

		local meta, owner

		for _, row in pairs(a) do

			meta = minetest.get_meta(row)
			owner = meta:get_string("owner") or ""

			if owner == name
			or minetest.check_player_privs(name, {protection_bypass = true}) then
				minetest.swap_node(row, {name = "protector:protect_hidden"})
			end
		end
	end
})


code:
default?
intllib?
lucky_block?
mesecons_mvps?
playerfactions?


code: Lets players craft special blocks to protect their builds or disable PVP in areas.