From 5726202f9c71da6d0ed289af7945c11391de1675 Mon Sep 17 00:00:00 2001 From: Jordan Snelling Date: Sat, 22 Dec 2012 17:16:18 +0000 Subject: [PATCH 1/3] add mito551's textures, license identical to default minetest textures. --- mods/default/textures/Thumbs.db | Bin 0 -> 120832 bytes mods/default/textures/default_mese_block.png | Bin 482 -> 3476 bytes mods/default/textures/default_mese_crystal.png | Bin 417 -> 3322 bytes .../textures/default_mese_crystal_fragment.png | Bin 212 -> 2854 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 mods/default/textures/Thumbs.db diff --git a/mods/default/textures/Thumbs.db b/mods/default/textures/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..f7748e5fcdccc8e587a2454ac075a61c8be08749 GIT binary patch literal 120832 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 delta 370 zcmV-&0ge9p8KDD^IDY^KbV*G`2iyz}5FIr+{^yAR00BTrL_t(I%hi*+N&`U@hQBj2 zxnMxih}c_miE$U=6LO$?j8%(0j?As0ae3l9tfXU_NkbLIm7 zK4deYI#4(U&VVjpfC6|2hCqVI;Vc?b=iKM?|-0rpq5JeD0BX%C5Gq0j}tZmV1 zHLwwk|elq z#!dkvFJi3$9Mh=~$3fucI*}g<09bjG(Fo#LNmCeHCGxAce*bW&fBKm|0U_&&hdCNi QWdHyG07*qoM6N<$f}#zYK>z>% diff --git a/mods/default/textures/default_mese_crystal_fragment.png b/mods/default/textures/default_mese_crystal_fragment.png index 496f4bc24ec56b1c2317a505577121e3aada6253..af288fbf0f914a4d0825011baa510adad86ff83d 100644 GIT binary patch delta 2818 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 UKyjU`QUCw|07*qoM6N<$f?4uXJpcdz delta 159 zcmV;Q0AT;77SsWdBa@H{9)AuH9t}Ft4AcMs0CP!1K~y-)V_+EafRT`bzyBBhhp;X& zFf;aIsAnS1o*o7UhFuKjFERWl$pDD$Jq!#C3=AJWe#EMVfD10cH9vavh`~^gu$NJ6 z|NCF}|KI<*|FJop2m^`-NHfF$iZmDhzxR;;KiMhk?| Date: Mon, 24 Dec 2012 21:12:15 +0000 Subject: [PATCH 2/3] do this from this pastebin: http://pastebin.com/ZPdnCvKg --- mods/default/init.lua | 3493 +++++++++++++++++++++-------------------- 1 file changed, 1748 insertions(+), 1745 deletions(-) diff --git a/mods/default/init.lua b/mods/default/init.lua index 76d7729e..ae04dadf 100644 --- a/mods/default/init.lua +++ b/mods/default/init.lua @@ -1,1745 +1,1748 @@ --- Minetest 0.4 mod: default --- See README.txt for licensing and other information. - --- The API documentation in here was moved into doc/lua_api.txt - -WATER_ALPHA = 160 -WATER_VISC = 1 -LAVA_VISC = 7 -LIGHT_MAX = 14 - --- Definitions made by this mod that other mods can use too -default = {} - --- Load other files -dofile(minetest.get_modpath("default").."/player.lua") -dofile(minetest.get_modpath("default").."/mapgen.lua") -dofile(minetest.get_modpath("default").."/leafdecay.lua") - --- --- Tool definition --- - --- The hand -minetest.register_item(":", { - type = "none", - wield_image = "wieldhand.png", - wield_scale = {x=1,y=1,z=2.5}, - tool_capabilities = { - full_punch_interval = 0.9, - max_drop_level = 0, - groupcaps = { - fleshy = {times={[2]=0.75, [3]=0.6}, uses=0, maxlevel=1}, - crumbly = {times={[2]=3.00, [3]=0.70}, uses=0, maxlevel=1}, - snappy = {times={[3]=0.40}, uses=0, maxlevel=1}, - oddly_breakable_by_hand = {times={[1]=7.00,[2]=4.00,[3]=1.40}, uses=0, maxlevel=3} - } - } -}) - -minetest.register_tool("default:pick_wood", { - description = "Wooden Pickaxe", - inventory_image = "default_tool_woodpick.png", - tool_capabilities = { - full_punch_interval = 1.2, - max_drop_level=0, - groupcaps={ - cracky = {times={[2]=2.00, [3]=1.20}, uses=10, maxlevel=1}, - fleshy = {times={[2]=0.95, [3]=0.6}, uses=15, maxlevel=1} - } - }, -}) -minetest.register_tool("default:pick_stone", { - description = "Stone Pickaxe", - inventory_image = "default_tool_stonepick.png", - tool_capabilities = { - full_punch_interval = 1.3, - max_drop_level=0, - groupcaps={ - cracky = {times={[1]=3.00, [2]=1.20, [3]=0.80}, uses=20, maxlevel=1}, - fleshy = {times={[2]=0.7, [3]=0.5}, uses=25, maxlevel=1} - } - }, -}) -minetest.register_tool("default:pick_steel", { - description = "Steel Pickaxe", - inventory_image = "default_tool_steelpick.png", - tool_capabilities = { - full_punch_interval = 1.0, - max_drop_level=1, - groupcaps={ - cracky = {times={[1]=4.00, [2]=1.60, [3]=1.00}, uses=30, maxlevel=2}, - fleshy = {times={[2]=0.6, [3]=0.35}, uses=35, maxlevel=1} - } - }, -}) -minetest.register_tool("default:pick_mese", { - description = "Mese Pickaxe", - inventory_image = "default_tool_mesepick.png", - tool_capabilities = { - full_punch_interval = 0.65, - max_drop_level=3, - groupcaps={ - cracky = {times={[1]=2.0, [2]=1.0, [3]=0.5}, uses=20, maxlevel=3}, - crumbly = {times={[1]=2.0, [2]=1.0, [3]=0.5}, uses=20, maxlevel=3}, - snappy = {times={[1]=2.0, [2]=1.0, [3]=0.5}, uses=20, maxlevel=3}, - fleshy = {times={[2]=0.6, [3]=0.5}, uses=80, maxlevel=1} - } - }, -}) -minetest.register_tool("default:shovel_wood", { - description = "Wooden Shovel", - inventory_image = "default_tool_woodshovel.png", - wield_image = "default_tool_woodshovel.png^[transformR90", - tool_capabilities = { - full_punch_interval = 1.2, - max_drop_level=0, - groupcaps={ - crumbly = {times={[1]=3.00, [2]=0.80, [3]=0.50}, uses=10, maxlevel=1}, - fleshy = {times={[2]=1.05, [3]=0.70}, uses=25, maxlevel=1} - } - }, -}) -minetest.register_tool("default:shovel_stone", { - description = "Stone Shovel", - inventory_image = "default_tool_stoneshovel.png", - wield_image = "default_tool_stoneshovel.png^[transformR90", - tool_capabilities = { - full_punch_interval = 1.4, - max_drop_level=0, - groupcaps={ - crumbly = {times={[1]=1.50, [2]=0.50, [3]=0.30}, uses=20, maxlevel=1}, - fleshy = {times={[2]=0.75, [3]=0.50}, uses=40, maxlevel=1} - } - }, -}) -minetest.register_tool("default:shovel_steel", { - description = "Steel Shovel", - inventory_image = "default_tool_steelshovel.png", - wield_image = "default_tool_steelshovel.png^[transformR90", - tool_capabilities = { - full_punch_interval = 1.1, - max_drop_level=1, - groupcaps={ - crumbly = {times={[1]=1.50, [2]=0.70, [3]=0.60}, uses=30, maxlevel=2}, - fleshy = {times={[2]=0.45, [3]=0.30}, uses=50, maxlevel=1} - } - }, -}) -minetest.register_tool("default:axe_wood", { - description = "Wooden Axe", - inventory_image = "default_tool_woodaxe.png", - tool_capabilities = { - full_punch_interval = 1.0, - max_drop_level=0, - groupcaps={ - choppy = {times={[2]=1.40, [3]=0.80}, uses=10, maxlevel=1}, - fleshy = {times={[2]=0.70, [3]=0.50}, uses=5, maxlevel=1} - } - }, -}) -minetest.register_tool("default:axe_stone", { - description = "Stone Axe", - inventory_image = "default_tool_stoneaxe.png", - tool_capabilities = { - full_punch_interval = 1.2, - max_drop_level=0, - groupcaps={ - choppy={times={[1]=3.00, [2]=1.00, [3]=0.60}, uses=20, maxlevel=1}, - fleshy={times={[2]=0.60, [3]=0.40}, uses=15, maxlevel=1} - } - }, -}) -minetest.register_tool("default:axe_steel", { - description = "Steel Axe", - inventory_image = "default_tool_steelaxe.png", - tool_capabilities = { - full_punch_interval = 0.9, - max_drop_level=1, - groupcaps={ - choppy={times={[1]=3.00, [2]=1.60, [3]=1.00}, uses=30, maxlevel=2}, - fleshy={times={[2]=0.40, [3]=0.25}, uses=25, maxlevel=1} - } - }, -}) -minetest.register_tool("default:sword_wood", { - description = "Wooden Sword", - inventory_image = "default_tool_woodsword.png", - tool_capabilities = { - full_punch_interval = 0.9, - max_drop_level=0, - groupcaps={ - fleshy={times={[2]=1.10, [3]=0.60}, uses=10, maxlevel=1}, - snappy={times={[2]=0.9, [3]=0.45}, uses=10, maxlevel=1}, - choppy={times={[3]=0.90}, uses=20, maxlevel=0} - } - } -}) -minetest.register_tool("default:sword_stone", { - description = "Stone Sword", - inventory_image = "default_tool_stonesword.png", - tool_capabilities = { - full_punch_interval = 1.1, - max_drop_level=0, - groupcaps={ - fleshy={times={[2]=0.80, [3]=0.40}, uses=20, maxlevel=1}, - snappy={times={[2]=0.75, [3]=0.35}, uses=20, maxlevel=1}, - choppy={times={[3]=0.70}, uses=20, maxlevel=0} - } - } -}) -minetest.register_tool("default:sword_steel", { - description = "Steel Sword", - inventory_image = "default_tool_steelsword.png", - tool_capabilities = { - full_punch_interval = 0.8, - max_drop_level=1, - groupcaps={ - fleshy={times={[1]=2.00, [2]=0.80, [3]=0.40}, uses=10, maxlevel=2}, - snappy={times={[2]=0.70, [3]=0.30}, uses=40, maxlevel=1}, - choppy={times={[3]=0.65}, uses=40, maxlevel=0} - } - } -}) - --- --- Crafting definition --- - -minetest.register_craft({ - output = 'default:wood 4', - recipe = { - {'default:tree'}, - } -}) - -minetest.register_craft({ - output = 'default:stick 4', - recipe = { - {'group:wood'}, - } -}) - -minetest.register_craft({ - output = 'default:fence_wood 2', - recipe = { - {'default:stick', 'default:stick', 'default:stick'}, - {'default:stick', 'default:stick', 'default:stick'}, - } -}) - -minetest.register_craft({ - output = 'default:sign_wall', - recipe = { - {'group:wood', 'group:wood', 'group:wood'}, - {'group:wood', 'group:wood', 'group:wood'}, - {'', 'default:stick', ''}, - } -}) - -minetest.register_craft({ - output = 'default:torch 4', - recipe = { - {'default:coal_lump'}, - {'default:stick'}, - } -}) - -minetest.register_craft({ - output = 'default:pick_wood', - recipe = { - {'group:wood', 'group:wood', 'group:wood'}, - {'', 'default:stick', ''}, - {'', 'default:stick', ''}, - } -}) - -minetest.register_craft({ - output = 'default:pick_stone', - recipe = { - {'group:stone', 'group:stone', 'group:stone'}, - {'', 'default:stick', ''}, - {'', 'default:stick', ''}, - } -}) - -minetest.register_craft({ - output = 'default:pick_steel', - recipe = { - {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, - {'', 'default:stick', ''}, - {'', 'default:stick', ''}, - } -}) - -minetest.register_craft({ - output = 'default:pick_mese', - recipe = { - {'default:mese_crystal', 'default:mese_crystal', 'default:mese_crystal'}, - {'', 'default:stick', ''}, - {'', 'default:stick', ''}, - } -}) - -minetest.register_craft({ - output = 'default:shovel_wood', - recipe = { - {'group:wood'}, - {'default:stick'}, - {'default:stick'}, - } -}) - -minetest.register_craft({ - output = 'default:shovel_stone', - recipe = { - {'group:stone'}, - {'default:stick'}, - {'default:stick'}, - } -}) - -minetest.register_craft({ - output = 'default:shovel_steel', - recipe = { - {'default:steel_ingot'}, - {'default:stick'}, - {'default:stick'}, - } -}) - -minetest.register_craft({ - output = 'default:axe_wood', - recipe = { - {'group:wood', 'group:wood'}, - {'group:wood', 'default:stick'}, - {'', 'default:stick'}, - } -}) - -minetest.register_craft({ - output = 'default:axe_stone', - recipe = { - {'group:stone', 'group:stone'}, - {'group:stone', 'default:stick'}, - {'', 'default:stick'}, - } -}) - -minetest.register_craft({ - output = 'default:axe_steel', - recipe = { - {'default:steel_ingot', 'default:steel_ingot'}, - {'default:steel_ingot', 'default:stick'}, - {'', 'default:stick'}, - } -}) - -minetest.register_craft({ - output = 'default:sword_wood', - recipe = { - {'group:wood'}, - {'group:wood'}, - {'default:stick'}, - } -}) - -minetest.register_craft({ - output = 'default:sword_stone', - recipe = { - {'group:stone'}, - {'group:stone'}, - {'default:stick'}, - } -}) - -minetest.register_craft({ - output = 'default:sword_steel', - recipe = { - {'default:steel_ingot'}, - {'default:steel_ingot'}, - {'default:stick'}, - } -}) - -minetest.register_craft({ - output = 'default:rail 15', - recipe = { - {'default:steel_ingot', '', 'default:steel_ingot'}, - {'default:steel_ingot', 'default:stick', 'default:steel_ingot'}, - {'default:steel_ingot', '', 'default:steel_ingot'}, - } -}) - -minetest.register_craft({ - output = 'default:chest', - recipe = { - {'group:wood', 'group:wood', 'group:wood'}, - {'group:wood', '', 'group:wood'}, - {'group:wood', 'group:wood', 'group:wood'}, - } -}) - -minetest.register_craft({ - output = 'default:chest_locked', - recipe = { - {'group:wood', 'group:wood', 'group:wood'}, - {'group:wood', 'default:steel_ingot', 'group:wood'}, - {'group:wood', 'group:wood', 'group:wood'}, - } -}) - -minetest.register_craft({ - output = 'default:furnace', - recipe = { - {'group:stone', 'group:stone', 'group:stone'}, - {'group:stone', '', 'group:stone'}, - {'group:stone', 'group:stone', 'group:stone'}, - } -}) - -minetest.register_craft({ - output = 'default:steelblock', - recipe = { - {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, - {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, - {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, - } -}) - -minetest.register_craft({ - output = 'default:steel_ingot 9', - recipe = { - {'default:steelblock'}, - } -}) - -minetest.register_craft({ - output = 'default:sandstone', - recipe = { - {'group:sand', 'group:sand'}, - {'group:sand', 'group:sand'}, - } -}) - -minetest.register_craft({ - output = 'default:sand 4', - recipe = { - {'default:sandstone'}, - } -}) - -minetest.register_craft({ - output = 'default:clay', - recipe = { - {'default:clay_lump', 'default:clay_lump'}, - {'default:clay_lump', 'default:clay_lump'}, - } -}) - -minetest.register_craft({ - output = 'default:brick', - recipe = { - {'default:clay_brick', 'default:clay_brick'}, - {'default:clay_brick', 'default:clay_brick'}, - } -}) - -minetest.register_craft({ - output = 'default:clay_brick 4', - recipe = { - {'default:brick'}, - } -}) - -minetest.register_craft({ - output = 'default:paper', - recipe = { - {'default:papyrus', 'default:papyrus', 'default:papyrus'}, - } -}) - -minetest.register_craft({ - output = 'default:book', - recipe = { - {'default:paper'}, - {'default:paper'}, - {'default:paper'}, - } -}) - -minetest.register_craft({ - output = 'default:bookshelf', - recipe = { - {'group:wood', 'group:wood', 'group:wood'}, - {'default:book', 'default:book', 'default:book'}, - {'group:wood', 'group:wood', 'group:wood'}, - } -}) - -minetest.register_craft({ - output = 'default:ladder', - recipe = { - {'default:stick', '', 'default:stick'}, - {'default:stick', 'default:stick', 'default:stick'}, - {'default:stick', '', 'default:stick'}, - } -}) - -minetest.register_craft({ - output = 'default:mese_block', - recipe = { - {'default:mese_crystal', 'default:mese_crystal', 'default:mese_crystal'}, - {'default:mese_crystal', 'default:mese_crystal', 'default:mese_crystal'}, - {'default:mese_crystal', 'default:mese_crystal', 'default:mese_crystal'}, - } -}) - -minetest.register_craft({ - output = 'default:mese_crystal 9', - recipe = { - {'default:mese_block'}, - } -}) - -minetest.register_craft({ - output = 'default:mese_crystal_fragment 9', - recipe = { - {'default:mese_crystal'}, - } -}) - -minetest.register_craft({ - type = "shapeless", - output = 'default:mese', - recipe = { - 'default:mese_crystal', - 'default:stone', - } -}) - - --- --- Crafting (tool repair) --- -minetest.register_craft({ - type = "toolrepair", - additional_wear = -0.02, -}) - --- --- Cooking recipes --- - -minetest.register_craft({ - type = "cooking", - output = "default:glass", - recipe = "group:sand", -}) - -minetest.register_craft({ - type = "cooking", - output = "default:stone", - recipe = "default:cobble", -}) - -minetest.register_craft({ - type = "cooking", - output = "default:steel_ingot", - recipe = "default:iron_lump", -}) - -minetest.register_craft({ - type = "cooking", - output = "default:clay_brick", - recipe = "default:clay_lump", -}) - --- --- Fuels --- - -minetest.register_craft({ - type = "fuel", - recipe = "group:tree", - burntime = 30, -}) - -minetest.register_craft({ - type = "fuel", - recipe = "default:junglegrass", - burntime = 2, -}) - -minetest.register_craft({ - type = "fuel", - recipe = "default:leaves", - burntime = 1, -}) - -minetest.register_craft({ - type = "fuel", - recipe = "default:cactus", - burntime = 15, -}) - -minetest.register_craft({ - type = "fuel", - recipe = "default:papyrus", - burntime = 1, -}) - -minetest.register_craft({ - type = "fuel", - recipe = "default:bookshelf", - burntime = 30, -}) - -minetest.register_craft({ - type = "fuel", - recipe = "default:fence_wood", - burntime = 15, -}) - -minetest.register_craft({ - type = "fuel", - recipe = "default:ladder", - burntime = 5, -}) - -minetest.register_craft({ - type = "fuel", - recipe = "group:wood", - burntime = 7, -}) - -minetest.register_craft({ - type = "fuel", - recipe = "default:mese_crystal", - burntime = 30, -}) - -minetest.register_craft({ - type = "fuel", - recipe = "default:lava_source", - burntime = 60, -}) - -minetest.register_craft({ - type = "fuel", - recipe = "default:torch", - burntime = 4, -}) - -minetest.register_craft({ - type = "fuel", - recipe = "default:sign_wall", - burntime = 10, -}) - -minetest.register_craft({ - type = "fuel", - recipe = "default:chest", - burntime = 30, -}) - -minetest.register_craft({ - type = "fuel", - recipe = "default:chest_locked", - burntime = 30, -}) - -minetest.register_craft({ - type = "fuel", - recipe = "default:nyancat", - burntime = 1, -}) - -minetest.register_craft({ - type = "fuel", - recipe = "default:nyancat_rainbow", - burntime = 1, -}) - -minetest.register_craft({ - type = "fuel", - recipe = "default:sapling", - burntime = 10, -}) - -minetest.register_craft({ - type = "fuel", - recipe = "default:apple", - burntime = 3, -}) - -minetest.register_craft({ - type = "fuel", - recipe = "default:coal_lump", - burntime = 40, -}) - --- --- Node definitions --- - --- Default node sounds - -function default.node_sound_defaults(table) - table = table or {} - table.footstep = table.footstep or - {name="", gain=1.0} - table.dug = table.dug or - {name="default_dug_node", gain=1.0} - return table -end - -function default.node_sound_stone_defaults(table) - table = table or {} - table.footstep = table.footstep or - {name="default_hard_footstep", gain=0.2} - default.node_sound_defaults(table) - return table -end - -function default.node_sound_dirt_defaults(table) - table = table or {} - table.footstep = table.footstep or - {name="", gain=0.5} - --table.dug = table.dug or - -- {name="default_dirt_break", gain=0.5} - default.node_sound_defaults(table) - return table -end - -function default.node_sound_sand_defaults(table) - table = table or {} - table.footstep = table.footstep or - {name="default_grass_footstep", gain=0.25} - --table.dug = table.dug or - -- {name="default_dirt_break", gain=0.25} - table.dug = table.dug or - {name="", gain=0.25} - default.node_sound_defaults(table) - return table -end - -function default.node_sound_wood_defaults(table) - table = table or {} - table.footstep = table.footstep or - {name="default_hard_footstep", gain=0.3} - default.node_sound_defaults(table) - return table -end - -function default.node_sound_leaves_defaults(table) - table = table or {} - table.footstep = table.footstep or - {name="default_grass_footstep", gain=0.25} - table.dig = table.dig or - {name="default_dig_crumbly", gain=0.4} - table.dug = table.dug or - {name="", gain=1.0} - default.node_sound_defaults(table) - return table -end - -function default.node_sound_glass_defaults(table) - table = table or {} - table.footstep = table.footstep or - {name="default_hard_footstep", gain=0.25} - table.dug = table.dug or - {name="default_break_glass", gain=1.0} - default.node_sound_defaults(table) - return table -end - --- - -minetest.register_node("default:stone", { - description = "Stone", - tiles = {"default_stone.png"}, - is_ground_content = true, - groups = {cracky=3, stone=1}, - drop = 'default:cobble', - legacy_mineral = true, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("default:desert_stone", { - description = "Desert Stone", - tiles = {"default_desert_stone.png"}, - is_ground_content = true, - groups = {cracky=3, stone=1}, - drop = 'default:desert_stone', - legacy_mineral = true, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("default:stone_with_coal", { - description = "Coal Ore", - tiles = {"default_stone.png^default_mineral_coal.png"}, - is_ground_content = true, - groups = {cracky=3}, - drop = 'default:coal_lump', - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("default:stone_with_iron", { - description = "Iron Ore", - tiles = {"default_stone.png^default_mineral_iron.png"}, - is_ground_content = true, - groups = {cracky=3}, - drop = 'default:iron_lump', - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("default:mese", { - description = "Mese Crystals in Stone", - tiles = {"default_stone.png^default_mineral_mese.png"}, - is_ground_content = true, - groups = {cracky=1}, - drop = "default:mese_crystal", - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("default:dirt_with_grass", { - description = "Dirt with Grass", - tiles = {"default_grass.png", "default_dirt.png", "default_dirt.png^default_grass_side.png"}, - is_ground_content = true, - groups = {crumbly=3}, - drop = 'default:dirt', - sounds = default.node_sound_dirt_defaults({ - footstep = {name="default_grass_footstep", gain=0.4}, - }), -}) - -minetest.register_node("default:dirt_with_grass_footsteps", { - description = "Dirt with Grass and Footsteps", - tiles = {"default_grass_footsteps.png", "default_dirt.png", "default_dirt.png^default_grass_side.png"}, - is_ground_content = true, - groups = {crumbly=3, not_in_creative_inventory=1}, - drop = 'default:dirt', - sounds = default.node_sound_dirt_defaults({ - footstep = {name="default_grass_footstep", gain=0.4}, - }), -}) - -minetest.register_node("default:dirt", { - description = "Dirt", - tiles = {"default_dirt.png"}, - is_ground_content = true, - groups = {crumbly=3}, - sounds = default.node_sound_dirt_defaults(), -}) - -minetest.register_node("default:sand", { - description = "Sand", - tiles = {"default_sand.png"}, - is_ground_content = true, - groups = {crumbly=3, falling_node=1, sand=1}, - sounds = default.node_sound_sand_defaults(), -}) - -minetest.register_node("default:desert_sand", { - description = "Desert Sand", - tiles = {"default_desert_sand.png"}, - is_ground_content = true, - groups = {sand=1, crumbly=3, falling_node=1, sand=1}, - sounds = default.node_sound_sand_defaults(), -}) - -minetest.register_node("default:gravel", { - description = "Gravel", - tiles = {"default_gravel.png"}, - is_ground_content = true, - groups = {crumbly=2, falling_node=1}, - sounds = default.node_sound_dirt_defaults({ - footstep = {name="default_gravel_footstep", gain=0.45}, - }), -}) - -minetest.register_node("default:sandstone", { - description = "Sandstone", - tiles = {"default_sandstone.png"}, - is_ground_content = true, - groups = {crumbly=2,cracky=2}, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("default:clay", { - description = "Clay", - tiles = {"default_clay.png"}, - is_ground_content = true, - groups = {crumbly=3}, - drop = 'default:clay_lump 4', - sounds = default.node_sound_dirt_defaults({ - footstep = "", - }), -}) - -minetest.register_node("default:brick", { - description = "Brick Block", - tiles = {"default_brick.png"}, - is_ground_content = true, - groups = {cracky=3}, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("default:tree", { - description = "Tree", - tiles = {"default_tree_top.png", "default_tree_top.png", "default_tree.png"}, - is_ground_content = true, - groups = {tree=1,snappy=1,choppy=2,oddly_breakable_by_hand=1,flammable=2}, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_node("default:jungletree", { - description = "Jungle Tree", - tiles = {"default_jungletree_top.png", "default_jungletree_top.png", "default_jungletree.png"}, - is_ground_content = true, - groups = {tree=1,snappy=1,choppy=2,oddly_breakable_by_hand=1,flammable=2}, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_node("default:junglegrass", { - description = "Jungle Grass", - drawtype = "plantlike", - visual_scale = 1.3, - tiles = {"default_junglegrass.png"}, - inventory_image = "default_junglegrass.png", - wield_image = "default_junglegrass.png", - paramtype = "light", - walkable = false, - groups = {snappy=3,flammable=2,attached_node=1}, - sounds = default.node_sound_leaves_defaults(), -}) - -minetest.register_node("default:leaves", { - description = "Leaves", - drawtype = "allfaces_optional", - visual_scale = 1.3, - tiles = {"default_leaves.png"}, - paramtype = "light", - groups = {snappy=3, leafdecay=3, flammable=2}, - drop = { - max_items = 1, - items = { - { - -- player will get sapling with 1/20 chance - items = {'default:sapling'}, - rarity = 20, - }, - { - -- player will get leaves only if he get no saplings, - -- this is because max_items is 1 - items = {'default:leaves'}, - } - } - }, - sounds = default.node_sound_leaves_defaults(), -}) - -minetest.register_node("default:cactus", { - description = "Cactus", - tiles = {"default_cactus_top.png", "default_cactus_top.png", "default_cactus_side.png"}, - is_ground_content = true, - groups = {snappy=2,choppy=3,flammable=2}, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_node("default:papyrus", { - description = "Papyrus", - drawtype = "plantlike", - tiles = {"default_papyrus.png"}, - inventory_image = "default_papyrus.png", - wield_image = "default_papyrus.png", - paramtype = "light", - is_ground_content = true, - walkable = false, - selection_box = { - type = "fixed", - fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3} - }, - groups = {snappy=3,flammable=2}, - sounds = default.node_sound_leaves_defaults(), -}) - -minetest.register_node("default:bookshelf", { - description = "Bookshelf", - tiles = {"default_wood.png", "default_wood.png", "default_bookshelf.png"}, - is_ground_content = true, - groups = {snappy=2,choppy=3,oddly_breakable_by_hand=2,flammable=3}, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_node("default:glass", { - description = "Glass", - drawtype = "glasslike", - tiles = {"default_glass.png"}, - inventory_image = minetest.inventorycube("default_glass.png"), - paramtype = "light", - sunlight_propagates = true, - is_ground_content = true, - groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3}, - sounds = default.node_sound_glass_defaults(), -}) - -minetest.register_node("default:fence_wood", { - description = "Wooden Fence", - drawtype = "fencelike", - tiles = {"default_wood.png"}, - inventory_image = "default_fence.png", - wield_image = "default_fence.png", - paramtype = "light", - is_ground_content = true, - selection_box = { - type = "fixed", - fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7}, - }, - groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=2}, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_node("default:rail", { - description = "Rail", - drawtype = "raillike", - tiles = {"default_rail.png", "default_rail_curved.png", "default_rail_t_junction.png", "default_rail_crossing.png"}, - inventory_image = "default_rail.png", - wield_image = "default_rail.png", - paramtype = "light", - is_ground_content = true, - walkable = false, - selection_box = { - type = "fixed", - -- but how to specify the dimensions for curved and sideways rails? - fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, - }, - groups = {bendy=2,snappy=1,dig_immediate=2,attached_node=1}, -}) - -minetest.register_node("default:ladder", { - description = "Ladder", - drawtype = "signlike", - tiles = {"default_ladder.png"}, - inventory_image = "default_ladder.png", - wield_image = "default_ladder.png", - paramtype = "light", - paramtype2 = "wallmounted", - is_ground_content = true, - walkable = false, - climbable = true, - selection_box = { - type = "wallmounted", - --wall_top = = - --wall_bottom = = - --wall_side = = - }, - groups = {snappy=1,choppy=2,oddly_breakable_by_hand=3,flammable=2}, - legacy_wallmounted = true, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_node("default:wood", { - description = "Wooden Planks", - tiles = {"default_wood.png"}, - is_ground_content = true, - groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_node("default:cloud", { - description = "Cloud", - tiles = {"default_cloud.png"}, - is_ground_content = true, - sounds = default.node_sound_defaults(), - groups = {not_in_creative_inventory=1}, -}) - -minetest.register_node("default:water_flowing", { - description = "Flowing Water", - inventory_image = minetest.inventorycube("default_water.png"), - drawtype = "flowingliquid", - tiles = {"default_water.png"}, - special_tiles = { - { - image="default_water_flowing_animated.png", - backface_culling=false, - animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=0.8} - }, - { - image="default_water_flowing_animated.png", - backface_culling=true, - animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=0.8} - }, - }, - alpha = WATER_ALPHA, - paramtype = "light", - walkable = false, - pointable = false, - diggable = false, - buildable_to = true, - liquidtype = "flowing", - liquid_alternative_flowing = "default:water_flowing", - liquid_alternative_source = "default:water_source", - liquid_viscosity = WATER_VISC, - post_effect_color = {a=64, r=100, g=100, b=200}, - groups = {water=3, liquid=3, puts_out_fire=1, not_in_creative_inventory=1}, -}) - -minetest.register_node("default:water_source", { - description = "Water Source", - inventory_image = minetest.inventorycube("default_water.png"), - drawtype = "liquid", - tiles = { - {name="default_water_source_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=2.0}} - }, - special_tiles = { - -- New-style water source material (mostly unused) - {name="default_water.png", backface_culling=false}, - }, - alpha = WATER_ALPHA, - paramtype = "light", - walkable = false, - pointable = false, - diggable = false, - buildable_to = true, - liquidtype = "source", - liquid_alternative_flowing = "default:water_flowing", - liquid_alternative_source = "default:water_source", - liquid_viscosity = WATER_VISC, - post_effect_color = {a=64, r=100, g=100, b=200}, - groups = {water=3, liquid=3, puts_out_fire=1}, -}) - -minetest.register_node("default:lava_flowing", { - description = "Flowing Lava", - inventory_image = minetest.inventorycube("default_lava.png"), - drawtype = "flowingliquid", - tiles = {"default_lava.png"}, - special_tiles = { - { - image="default_lava_flowing_animated.png", - backface_culling=false, - animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.3} - }, - { - image="default_lava_flowing_animated.png", - backface_culling=true, - animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.3} - }, - }, - paramtype = "light", - light_source = LIGHT_MAX - 1, - walkable = false, - pointable = false, - diggable = false, - buildable_to = true, - liquidtype = "flowing", - liquid_alternative_flowing = "default:lava_flowing", - liquid_alternative_source = "default:lava_source", - liquid_viscosity = LAVA_VISC, - damage_per_second = 4*2, - post_effect_color = {a=192, r=255, g=64, b=0}, - groups = {lava=3, liquid=2, hot=3, igniter=1, not_in_creative_inventory=1}, -}) - -minetest.register_node("default:lava_source", { - description = "Lava Source", - inventory_image = minetest.inventorycube("default_lava.png"), - drawtype = "liquid", - tiles = { - {name="default_lava_source_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}} - }, - special_tiles = { - -- New-style lava source material (mostly unused) - {name="default_lava.png", backface_culling=false}, - }, - paramtype = "light", - light_source = LIGHT_MAX - 1, - walkable = false, - pointable = false, - diggable = false, - buildable_to = true, - liquidtype = "source", - liquid_alternative_flowing = "default:lava_flowing", - liquid_alternative_source = "default:lava_source", - liquid_viscosity = LAVA_VISC, - damage_per_second = 4*2, - post_effect_color = {a=192, r=255, g=64, b=0}, - groups = {lava=3, liquid=2, hot=3, igniter=1}, -}) - -minetest.register_node("default:torch", { - description = "Torch", - drawtype = "torchlike", - --tiles = {"default_torch_on_floor.png", "default_torch_on_ceiling.png", "default_torch.png"}, - tiles = { - {name="default_torch_on_floor_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}}, - {name="default_torch_on_ceiling_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}}, - {name="default_torch_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}} - }, - inventory_image = "default_torch_on_floor.png", - wield_image = "default_torch_on_floor.png", - paramtype = "light", - paramtype2 = "wallmounted", - sunlight_propagates = true, - walkable = false, - light_source = LIGHT_MAX-1, - selection_box = { - type = "wallmounted", - wall_top = {-0.1, 0.5-0.6, -0.1, 0.1, 0.5, 0.1}, - wall_bottom = {-0.1, -0.5, -0.1, 0.1, -0.5+0.6, 0.1}, - wall_side = {-0.5, -0.3, -0.1, -0.5+0.3, 0.3, 0.1}, - }, - groups = {choppy=2,dig_immediate=3,flammable=1,attached_node=1}, - legacy_wallmounted = true, - sounds = default.node_sound_defaults(), -}) - -minetest.register_node("default:sign_wall", { - description = "Sign", - drawtype = "signlike", - tiles = {"default_sign_wall.png"}, - inventory_image = "default_sign_wall.png", - wield_image = "default_sign_wall.png", - paramtype = "light", - paramtype2 = "wallmounted", - sunlight_propagates = true, - walkable = false, - selection_box = { - type = "wallmounted", - --wall_top = - --wall_bottom = - --wall_side = - }, - groups = {choppy=2,dig_immediate=2,attached_node=1}, - legacy_wallmounted = true, - sounds = default.node_sound_defaults(), - on_construct = function(pos) - --local n = minetest.env:get_node(pos) - local meta = minetest.env:get_meta(pos) - meta:set_string("formspec", "field[text;;${text}]") - meta:set_string("infotext", "\"\"") - end, - on_receive_fields = function(pos, formname, fields, sender) - --print("Sign at "..minetest.pos_to_string(pos).." got "..dump(fields)) - local meta = minetest.env:get_meta(pos) - fields.text = fields.text or "" - print((sender:get_player_name() or "").." wrote \""..fields.text.. - "\" to sign at "..minetest.pos_to_string(pos)) - meta:set_string("text", fields.text) - meta:set_string("infotext", '"'..fields.text..'"') - end, -}) - -minetest.register_node("default:chest", { - description = "Chest", - tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png", - "default_chest_side.png", "default_chest_side.png", "default_chest_front.png"}, - paramtype2 = "facedir", - groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, - legacy_facedir_simple = true, - sounds = default.node_sound_wood_defaults(), - on_construct = function(pos) - local meta = minetest.env:get_meta(pos) - meta:set_string("formspec", - "size[8,9]".. - "list[current_name;main;0,0;8,4;]".. - "list[current_player;main;0,5;8,4;]") - meta:set_string("infotext", "Chest") - local inv = meta:get_inventory() - inv:set_size("main", 8*4) - end, - can_dig = function(pos,player) - local meta = minetest.env:get_meta(pos); - local inv = meta:get_inventory() - return inv:is_empty("main") - end, - on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - minetest.log("action", player:get_player_name().. - " moves stuff in chest at "..minetest.pos_to_string(pos)) - end, - on_metadata_inventory_put = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name().. - " moves stuff to chest at "..minetest.pos_to_string(pos)) - end, - on_metadata_inventory_take = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name().. - " takes stuff from chest at "..minetest.pos_to_string(pos)) - end, -}) - -local function has_locked_chest_privilege(meta, player) - if player:get_player_name() ~= meta:get_string("owner") then - return false - end - return true -end - -minetest.register_node("default:chest_locked", { - description = "Locked Chest", - tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png", - "default_chest_side.png", "default_chest_side.png", "default_chest_lock.png"}, - paramtype2 = "facedir", - groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, - legacy_facedir_simple = true, - sounds = default.node_sound_wood_defaults(), - after_place_node = function(pos, placer) - local meta = minetest.env:get_meta(pos) - meta:set_string("owner", placer:get_player_name() or "") - meta:set_string("infotext", "Locked Chest (owned by ".. - meta:get_string("owner")..")") - end, - on_construct = function(pos) - local meta = minetest.env:get_meta(pos) - meta:set_string("formspec", - "size[8,9]".. - "list[current_name;main;0,0;8,4;]".. - "list[current_player;main;0,5;8,4;]") - meta:set_string("infotext", "Locked Chest") - meta:set_string("owner", "") - local inv = meta:get_inventory() - inv:set_size("main", 8*4) - end, - can_dig = function(pos,player) - local meta = minetest.env:get_meta(pos); - local inv = meta:get_inventory() - return inv:is_empty("main") - end, - allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - local meta = minetest.env:get_meta(pos) - if not has_locked_chest_privilege(meta, player) then - minetest.log("action", player:get_player_name().. - " tried to access a locked chest belonging to ".. - meta:get_string("owner").." at ".. - minetest.pos_to_string(pos)) - return 0 - end - return count - end, - allow_metadata_inventory_put = function(pos, listname, index, stack, player) - local meta = minetest.env:get_meta(pos) - if not has_locked_chest_privilege(meta, player) then - minetest.log("action", player:get_player_name().. - " tried to access a locked chest belonging to ".. - meta:get_string("owner").." at ".. - minetest.pos_to_string(pos)) - return 0 - end - return stack:get_count() - end, - allow_metadata_inventory_take = function(pos, listname, index, stack, player) - local meta = minetest.env:get_meta(pos) - if not has_locked_chest_privilege(meta, player) then - minetest.log("action", player:get_player_name().. - " tried to access a locked chest belonging to ".. - meta:get_string("owner").." at ".. - minetest.pos_to_string(pos)) - return 0 - end - return stack:get_count() - end, - on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - minetest.log("action", player:get_player_name().. - " moves stuff in locked chest at "..minetest.pos_to_string(pos)) - end, - on_metadata_inventory_put = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name().. - " moves stuff to locked chest at "..minetest.pos_to_string(pos)) - end, - on_metadata_inventory_take = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name().. - " takes stuff from locked chest at "..minetest.pos_to_string(pos)) - end, -}) - -default.furnace_inactive_formspec = - "size[8,9]".. - "image[2,2;1,1;default_furnace_fire_bg.png]".. - "list[current_name;fuel;2,3;1,1;]".. - "list[current_name;src;2,1;1,1;]".. - "list[current_name;dst;5,1;2,2;]".. - "list[current_player;main;0,5;8,4;]" - -minetest.register_node("default:furnace", { - description = "Furnace", - tiles = {"default_furnace_top.png", "default_furnace_bottom.png", "default_furnace_side.png", - "default_furnace_side.png", "default_furnace_side.png", "default_furnace_front.png"}, - paramtype2 = "facedir", - groups = {cracky=2}, - legacy_facedir_simple = true, - sounds = default.node_sound_stone_defaults(), - on_construct = function(pos) - local meta = minetest.env:get_meta(pos) - meta:set_string("formspec", default.furnace_inactive_formspec) - meta:set_string("infotext", "Furnace") - local inv = meta:get_inventory() - inv:set_size("fuel", 1) - inv:set_size("src", 1) - inv:set_size("dst", 4) - end, - can_dig = function(pos,player) - local meta = minetest.env:get_meta(pos); - local inv = meta:get_inventory() - if not inv:is_empty("fuel") then - return false - elseif not inv:is_empty("dst") then - return false - elseif not inv:is_empty("src") then - return false - end - return true - end, -}) - -minetest.register_node("default:furnace_active", { - description = "Furnace", - tiles = {"default_furnace_top.png", "default_furnace_bottom.png", "default_furnace_side.png", - "default_furnace_side.png", "default_furnace_side.png", "default_furnace_front_active.png"}, - paramtype2 = "facedir", - light_source = 8, - drop = "default:furnace", - groups = {cracky=2, not_in_creative_inventory=1}, - legacy_facedir_simple = true, - sounds = default.node_sound_stone_defaults(), - on_construct = function(pos) - local meta = minetest.env:get_meta(pos) - meta:set_string("formspec", default.furnace_inactive_formspec) - meta:set_string("infotext", "Furnace"); - local inv = meta:get_inventory() - inv:set_size("fuel", 1) - inv:set_size("src", 1) - inv:set_size("dst", 4) - end, - can_dig = function(pos,player) - local meta = minetest.env:get_meta(pos); - local inv = meta:get_inventory() - if not inv:is_empty("fuel") then - return false - elseif not inv:is_empty("dst") then - return false - elseif not inv:is_empty("src") then - return false - end - return true - end, -}) - -function hacky_swap_node(pos,name) - local node = minetest.env:get_node(pos) - local meta = minetest.env:get_meta(pos) - local meta0 = meta:to_table() - if node.name == name then - return - end - node.name = name - local meta0 = meta:to_table() - minetest.env:set_node(pos,node) - meta = minetest.env:get_meta(pos) - meta:from_table(meta0) -end - -minetest.register_abm({ - nodenames = {"default:furnace","default:furnace_active"}, - interval = 1.0, - chance = 1, - action = function(pos, node, active_object_count, active_object_count_wider) - local meta = minetest.env:get_meta(pos) - for i, name in ipairs({ - "fuel_totaltime", - "fuel_time", - "src_totaltime", - "src_time" - }) do - if meta:get_string(name) == "" then - meta:set_float(name, 0.0) - end - end - - local inv = meta:get_inventory() - - local srclist = inv:get_list("src") - local cooked = nil - - if srclist then - cooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) - end - - local was_active = false - - if meta:get_float("fuel_time") < meta:get_float("fuel_totaltime") then - was_active = true - meta:set_float("fuel_time", meta:get_float("fuel_time") + 1) - meta:set_float("src_time", meta:get_float("src_time") + 1) - if cooked and cooked.item and meta:get_float("src_time") >= cooked.time then - -- check if there's room for output in "dst" list - if inv:room_for_item("dst",cooked.item) then - -- Put result in "dst" list - inv:add_item("dst", cooked.item) - -- take stuff from "src" list - srcstack = inv:get_stack("src", 1) - srcstack:take_item() - inv:set_stack("src", 1, srcstack) - else - print("Could not insert '"..cooked.item:to_string().."'") - end - meta:set_string("src_time", 0) - end - end - - if meta:get_float("fuel_time") < meta:get_float("fuel_totaltime") then - local percent = math.floor(meta:get_float("fuel_time") / - meta:get_float("fuel_totaltime") * 100) - meta:set_string("infotext","Furnace active: "..percent.."%") - hacky_swap_node(pos,"default:furnace_active") - meta:set_string("formspec", - "size[8,9]".. - "image[2,2;1,1;default_furnace_fire_bg.png^[lowpart:".. - (100-percent)..":default_furnace_fire_fg.png]".. - "list[current_name;fuel;2,3;1,1;]".. - "list[current_name;src;2,1;1,1;]".. - "list[current_name;dst;5,1;2,2;]".. - "list[current_player;main;0,5;8,4;]") - return - end - - local fuel = nil - local cooked = nil - local fuellist = inv:get_list("fuel") - local srclist = inv:get_list("src") - - if srclist then - cooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) - end - if fuellist then - fuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist}) - end - - if fuel.time <= 0 then - meta:set_string("infotext","Furnace out of fuel") - hacky_swap_node(pos,"default:furnace") - meta:set_string("formspec", default.furnace_inactive_formspec) - return - end - - if cooked.item:is_empty() then - if was_active then - meta:set_string("infotext","Furnace is empty") - hacky_swap_node(pos,"default:furnace") - meta:set_string("formspec", default.furnace_inactive_formspec) - end - return - end - - meta:set_string("fuel_totaltime", fuel.time) - meta:set_string("fuel_time", 0) - - local stack = inv:get_stack("fuel", 1) - stack:take_item() - inv:set_stack("fuel", 1, stack) - end, -}) - -minetest.register_node("default:cobble", { - description = "Cobblestone", - tiles = {"default_cobble.png"}, - is_ground_content = true, - groups = {cracky=3, stone=2}, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("default:mossycobble", { - description = "Mossy Cobblestone", - tiles = {"default_mossycobble.png"}, - is_ground_content = true, - groups = {cracky=3}, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("default:steelblock", { - description = "Steel Block", - tiles = {"default_steel_block.png"}, - is_ground_content = true, - groups = {snappy=1,bendy=2,cracky=1,melty=2,level=2}, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("default:mese_block", { - description = "Mese Block", - tiles = {"default_mese_block.png"}, - is_ground_content = true, - groups = {cracky=1}, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("default:nyancat", { - description = "Nyan Cat", - tiles = {"default_nc_side.png", "default_nc_side.png", "default_nc_side.png", - "default_nc_side.png", "default_nc_back.png", "default_nc_front.png"}, - paramtype2 = "facedir", - groups = {cracky=2}, - legacy_facedir_simple = true, - sounds = default.node_sound_defaults(), -}) - -minetest.register_node("default:nyancat_rainbow", { - description = "Nyan Cat Rainbow", - tiles = {"default_nc_rb.png"}, - groups = {cracky=2}, - sounds = default.node_sound_defaults(), -}) - -minetest.register_node("default:sapling", { - description = "Sapling", - drawtype = "plantlike", - visual_scale = 1.0, - tiles = {"default_sapling.png"}, - inventory_image = "default_sapling.png", - wield_image = "default_sapling.png", - paramtype = "light", - walkable = false, - selection_box = { - type = "fixed", - fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} - }, - groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1}, - sounds = default.node_sound_defaults(), -}) - -minetest.register_node("default:apple", { - description = "Apple", - drawtype = "plantlike", - visual_scale = 1.0, - tiles = {"default_apple.png"}, - inventory_image = "default_apple.png", - paramtype = "light", - sunlight_propagates = true, - walkable = false, - selection_box = { - type = "fixed", - fixed = {-0.2, -0.5, -0.2, 0.2, 0, 0.2} - }, - groups = {fleshy=3,dig_immediate=3,flammable=2}, - on_use = minetest.item_eat(4), - sounds = default.node_sound_defaults(), -}) - -minetest.register_node("default:dry_shrub", { - description = "Dry Shrub", - drawtype = "plantlike", - visual_scale = 1.0, - tiles = {"default_dry_shrub.png"}, - inventory_image = "default_dry_shrub.png", - wield_image = "default_dry_shrub.png", - paramtype = "light", - walkable = false, - groups = {snappy=3,flammable=3,attached_node=1}, - sounds = default.node_sound_leaves_defaults(), - selection_box = { - type = "fixed", - fixed = {-1/3, -1/2, -1/3, 1/3, 1/6, 1/3}, - }, -}) - --- --- Crafting items --- - -minetest.register_craftitem("default:stick", { - description = "Stick", - inventory_image = "default_stick.png", -}) - -minetest.register_craftitem("default:paper", { - description = "Paper", - inventory_image = "default_paper.png", -}) - -minetest.register_craftitem("default:book", { - description = "Book", - inventory_image = "default_book.png", -}) - -minetest.register_craftitem("default:coal_lump", { - description = "Coal Lump", - inventory_image = "default_coal_lump.png", -}) - -minetest.register_craftitem("default:iron_lump", { - description = "Iron Lump", - inventory_image = "default_iron_lump.png", -}) - -minetest.register_craftitem("default:mese_crystal", { - description = "Mese Crystal", - inventory_image = "default_mese_crystal.png", -}) - -minetest.register_craftitem("default:clay_lump", { - description = "Clay Lump", - inventory_image = "default_clay_lump.png", -}) - -minetest.register_craftitem("default:steel_ingot", { - description = "Steel Ingot", - inventory_image = "default_steel_ingot.png", -}) - -minetest.register_craftitem("default:mese_crystal_fragment", { - description = "Mese Crystal Fragment", - inventory_image = "default_mese_crystal_fragment.png", -}) - -minetest.register_craftitem("default:clay_brick", { - description = "Clay Brick", - inventory_image = "default_steel_ingot.png", - inventory_image = "default_clay_brick.png", -}) - -minetest.register_craftitem("default:scorched_stuff", { - description = "Scorched Stuff", - inventory_image = "default_scorched_stuff.png", -}) - --- Support old code -function default.spawn_falling_node(p, nodename) - spawn_falling_node(p, nodename) -end - --- Horrible crap to support old code --- Don't use this and never do what this does, it's completely wrong! --- (More specifically, the client and the C++ code doesn't get the group) -function default.register_falling_node(nodename, texture) - minetest.log("error", debug.traceback()) - minetest.log('error', "WARNING: default.register_falling_node is deprecated") - if minetest.registered_nodes[nodename] then - minetest.registered_nodes[nodename].groups.falling_node = 1 - end -end - --- --- Global callbacks --- - --- Global environment step function -function on_step(dtime) - -- print("on_step") -end -minetest.register_globalstep(on_step) - -function on_placenode(p, node) - --print("on_placenode") -end -minetest.register_on_placenode(on_placenode) - -function on_dignode(p, node) - --print("on_dignode") -end -minetest.register_on_dignode(on_dignode) - -function on_punchnode(p, node) -end -minetest.register_on_punchnode(on_punchnode) - --- END +-- Minetest 0.4 mod: default +-- See README.txt for licensing and other information. + +-- The API documentation in here was moved into doc/lua_api.txt + +WATER_ALPHA = 160 +WATER_VISC = 1 +LAVA_VISC = 7 +LIGHT_MAX = 14 + +-- Definitions made by this mod that other mods can use too +default = {} + +-- Load other files +dofile(minetest.get_modpath("default").."/player.lua") +dofile(minetest.get_modpath("default").."/mapgen.lua") +dofile(minetest.get_modpath("default").."/leafdecay.lua") + +-- +-- Tool definition +-- + +-- The hand +minetest.register_item(":", { + type = "none", + wield_image = "wieldhand.png", + wield_scale = {x=1,y=1,z=2.5}, + tool_capabilities = { + full_punch_interval = 0.9, + max_drop_level = 0, + groupcaps = { + fleshy = {times={[2]=0.75, [3]=0.6}, uses=0, maxlevel=1}, + crumbly = {times={[2]=3.00, [3]=0.70}, uses=0, maxlevel=1}, + snappy = {times={[3]=0.40}, uses=0, maxlevel=1}, + oddly_breakable_by_hand = {times={[1]=7.00,[2]=4.00,[3]=1.40}, uses=0, maxlevel=3} + } + } +}) + +minetest.register_tool("default:pick_wood", { + description = "Wooden Pickaxe", + inventory_image = "default_tool_woodpick.png", + tool_capabilities = { + full_punch_interval = 1.2, + max_drop_level=0, + groupcaps={ + cracky = {times={[2]=2.00, [3]=1.20}, uses=10, maxlevel=1}, + fleshy = {times={[2]=0.95, [3]=0.6}, uses=15, maxlevel=1} + } + }, +}) +minetest.register_tool("default:pick_stone", { + description = "Stone Pickaxe", + inventory_image = "default_tool_stonepick.png", + tool_capabilities = { + full_punch_interval = 1.3, + max_drop_level=0, + groupcaps={ + cracky = {times={[1]=3.00, [2]=1.20, [3]=0.80}, uses=20, maxlevel=1}, + fleshy = {times={[2]=0.7, [3]=0.5}, uses=25, maxlevel=1} + } + }, +}) +minetest.register_tool("default:pick_steel", { + description = "Steel Pickaxe", + inventory_image = "default_tool_steelpick.png", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=1, + groupcaps={ + cracky = {times={[1]=4.00, [2]=1.60, [3]=1.00}, uses=30, maxlevel=2}, + fleshy = {times={[2]=0.6, [3]=0.35}, uses=35, maxlevel=1} + } + }, +}) +minetest.register_tool("default:pick_mese", { + description = "Mese Pickaxe", + inventory_image = "default_tool_mesepick.png", + tool_capabilities = { + full_punch_interval = 0.65, + max_drop_level=3, + groupcaps={ + cracky = {times={[1]=2.0, [2]=1.0, [3]=0.5}, uses=20, maxlevel=3}, + crumbly = {times={[1]=2.0, [2]=1.0, [3]=0.5}, uses=20, maxlevel=3}, + snappy = {times={[1]=2.0, [2]=1.0, [3]=0.5}, uses=20, maxlevel=3}, + fleshy = {times={[2]=0.6, [3]=0.5}, uses=80, maxlevel=1} + } + }, +}) +minetest.register_tool("default:shovel_wood", { + description = "Wooden Shovel", + inventory_image = "default_tool_woodshovel.png", + wield_image = "default_tool_woodshovel.png^[transformR90", + tool_capabilities = { + full_punch_interval = 1.2, + max_drop_level=0, + groupcaps={ + crumbly = {times={[1]=3.00, [2]=0.80, [3]=0.50}, uses=10, maxlevel=1}, + fleshy = {times={[2]=1.05, [3]=0.70}, uses=25, maxlevel=1} + } + }, +}) +minetest.register_tool("default:shovel_stone", { + description = "Stone Shovel", + inventory_image = "default_tool_stoneshovel.png", + wield_image = "default_tool_stoneshovel.png^[transformR90", + tool_capabilities = { + full_punch_interval = 1.4, + max_drop_level=0, + groupcaps={ + crumbly = {times={[1]=1.50, [2]=0.50, [3]=0.30}, uses=20, maxlevel=1}, + fleshy = {times={[2]=0.75, [3]=0.50}, uses=40, maxlevel=1} + } + }, +}) +minetest.register_tool("default:shovel_steel", { + description = "Steel Shovel", + inventory_image = "default_tool_steelshovel.png", + wield_image = "default_tool_steelshovel.png^[transformR90", + tool_capabilities = { + full_punch_interval = 1.1, + max_drop_level=1, + groupcaps={ + crumbly = {times={[1]=1.50, [2]=0.70, [3]=0.60}, uses=30, maxlevel=2}, + fleshy = {times={[2]=0.45, [3]=0.30}, uses=50, maxlevel=1} + } + }, +}) +minetest.register_tool("default:axe_wood", { + description = "Wooden Axe", + inventory_image = "default_tool_woodaxe.png", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=0, + groupcaps={ + choppy = {times={[2]=1.40, [3]=0.80}, uses=10, maxlevel=1}, + fleshy = {times={[2]=0.70, [3]=0.50}, uses=5, maxlevel=1} + } + }, +}) +minetest.register_tool("default:axe_stone", { + description = "Stone Axe", + inventory_image = "default_tool_stoneaxe.png", + tool_capabilities = { + full_punch_interval = 1.2, + max_drop_level=0, + groupcaps={ + choppy={times={[1]=3.00, [2]=1.00, [3]=0.60}, uses=20, maxlevel=1}, + fleshy={times={[2]=0.60, [3]=0.40}, uses=15, maxlevel=1} + } + }, +}) +minetest.register_tool("default:axe_steel", { + description = "Steel Axe", + inventory_image = "default_tool_steelaxe.png", + tool_capabilities = { + full_punch_interval = 0.9, + max_drop_level=1, + groupcaps={ + choppy={times={[1]=3.00, [2]=1.60, [3]=1.00}, uses=30, maxlevel=2}, + fleshy={times={[2]=0.40, [3]=0.25}, uses=25, maxlevel=1} + } + }, +}) +minetest.register_tool("default:sword_wood", { + description = "Wooden Sword", + inventory_image = "default_tool_woodsword.png", + tool_capabilities = { + full_punch_interval = 0.9, + max_drop_level=0, + groupcaps={ + fleshy={times={[2]=1.10, [3]=0.60}, uses=10, maxlevel=1}, + snappy={times={[2]=0.9, [3]=0.45}, uses=10, maxlevel=1}, + choppy={times={[3]=0.90}, uses=20, maxlevel=0} + } + } +}) +minetest.register_tool("default:sword_stone", { + description = "Stone Sword", + inventory_image = "default_tool_stonesword.png", + tool_capabilities = { + full_punch_interval = 1.1, + max_drop_level=0, + groupcaps={ + fleshy={times={[2]=0.80, [3]=0.40}, uses=20, maxlevel=1}, + snappy={times={[2]=0.75, [3]=0.35}, uses=20, maxlevel=1}, + choppy={times={[3]=0.70}, uses=20, maxlevel=0} + } + } +}) +minetest.register_tool("default:sword_steel", { + description = "Steel Sword", + inventory_image = "default_tool_steelsword.png", + tool_capabilities = { + full_punch_interval = 0.8, + max_drop_level=1, + groupcaps={ + fleshy={times={[1]=2.00, [2]=0.80, [3]=0.40}, uses=10, maxlevel=2}, + snappy={times={[2]=0.70, [3]=0.30}, uses=40, maxlevel=1}, + choppy={times={[3]=0.65}, uses=40, maxlevel=0} + } + } +}) + +-- +-- Crafting definition +-- + +minetest.register_craft({ + output = 'default:wood 4', + recipe = { + {'default:tree'}, + } +}) + +minetest.register_craft({ + output = 'default:stick 4', + recipe = { + {'group:wood'}, + } +}) + +minetest.register_craft({ + output = 'default:fence_wood 2', + recipe = { + {'default:stick', 'default:stick', 'default:stick'}, + {'default:stick', 'default:stick', 'default:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:sign_wall', + recipe = { + {'group:wood', 'group:wood', 'group:wood'}, + {'group:wood', 'group:wood', 'group:wood'}, + {'', 'default:stick', ''}, + } +}) + +minetest.register_craft({ + output = 'default:torch 4', + recipe = { + {'default:coal_lump'}, + {'default:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:pick_wood', + recipe = { + {'group:wood', 'group:wood', 'group:wood'}, + {'', 'default:stick', ''}, + {'', 'default:stick', ''}, + } +}) + +minetest.register_craft({ + output = 'default:pick_stone', + recipe = { + {'group:stone', 'group:stone', 'group:stone'}, + {'', 'default:stick', ''}, + {'', 'default:stick', ''}, + } +}) + +minetest.register_craft({ + output = 'default:pick_steel', + recipe = { + {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, + {'', 'default:stick', ''}, + {'', 'default:stick', ''}, + } +}) + +minetest.register_craft({ + output = 'default:pick_mese', + recipe = { + {'default:mese_crystal', 'default:mese_crystal', 'default:mese_crystal'}, + {'', 'default:stick', ''}, + {'', 'default:stick', ''}, + } +}) + +minetest.register_craft({ + output = 'default:shovel_wood', + recipe = { + {'group:wood'}, + {'default:stick'}, + {'default:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:shovel_stone', + recipe = { + {'group:stone'}, + {'default:stick'}, + {'default:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:shovel_steel', + recipe = { + {'default:steel_ingot'}, + {'default:stick'}, + {'default:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:axe_wood', + recipe = { + {'group:wood', 'group:wood'}, + {'group:wood', 'default:stick'}, + {'', 'default:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:axe_stone', + recipe = { + {'group:stone', 'group:stone'}, + {'group:stone', 'default:stick'}, + {'', 'default:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:axe_steel', + recipe = { + {'default:steel_ingot', 'default:steel_ingot'}, + {'default:steel_ingot', 'default:stick'}, + {'', 'default:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:sword_wood', + recipe = { + {'group:wood'}, + {'group:wood'}, + {'default:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:sword_stone', + recipe = { + {'group:stone'}, + {'group:stone'}, + {'default:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:sword_steel', + recipe = { + {'default:steel_ingot'}, + {'default:steel_ingot'}, + {'default:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:rail 15', + recipe = { + {'default:steel_ingot', '', 'default:steel_ingot'}, + {'default:steel_ingot', 'default:stick', 'default:steel_ingot'}, + {'default:steel_ingot', '', 'default:steel_ingot'}, + } +}) + +minetest.register_craft({ + output = 'default:chest', + recipe = { + {'group:wood', 'group:wood', 'group:wood'}, + {'group:wood', '', 'group:wood'}, + {'group:wood', 'group:wood', 'group:wood'}, + } +}) + +minetest.register_craft({ + output = 'default:chest_locked', + recipe = { + {'group:wood', 'group:wood', 'group:wood'}, + {'group:wood', 'default:steel_ingot', 'group:wood'}, + {'group:wood', 'group:wood', 'group:wood'}, + } +}) + +minetest.register_craft({ + output = 'default:furnace', + recipe = { + {'group:stone', 'group:stone', 'group:stone'}, + {'group:stone', '', 'group:stone'}, + {'group:stone', 'group:stone', 'group:stone'}, + } +}) + +minetest.register_craft({ + output = 'default:steelblock', + recipe = { + {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, + {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, + {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, + } +}) + +minetest.register_craft({ + output = 'default:steel_ingot 9', + recipe = { + {'default:steelblock'}, + } +}) + +minetest.register_craft({ + output = 'default:sandstone', + recipe = { + {'group:sand', 'group:sand'}, + {'group:sand', 'group:sand'}, + } +}) + +minetest.register_craft({ + output = 'default:sand 4', + recipe = { + {'default:sandstone'}, + } +}) + +minetest.register_craft({ + output = 'default:clay', + recipe = { + {'default:clay_lump', 'default:clay_lump'}, + {'default:clay_lump', 'default:clay_lump'}, + } +}) + +minetest.register_craft({ + output = 'default:brick', + recipe = { + {'default:clay_brick', 'default:clay_brick'}, + {'default:clay_brick', 'default:clay_brick'}, + } +}) + +minetest.register_craft({ + output = 'default:clay_brick 4', + recipe = { + {'default:brick'}, + } +}) + +minetest.register_craft({ + output = 'default:paper', + recipe = { + {'default:papyrus', 'default:papyrus', 'default:papyrus'}, + } +}) + +minetest.register_craft({ + output = 'default:book', + recipe = { + {'default:paper'}, + {'default:paper'}, + {'default:paper'}, + } +}) + +minetest.register_craft({ + output = 'default:bookshelf', + recipe = { + {'group:wood', 'group:wood', 'group:wood'}, + {'default:book', 'default:book', 'default:book'}, + {'group:wood', 'group:wood', 'group:wood'}, + } +}) + +minetest.register_craft({ + output = 'default:ladder', + recipe = { + {'default:stick', '', 'default:stick'}, + {'default:stick', 'default:stick', 'default:stick'}, + {'default:stick', '', 'default:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:mese', + recipe = { + {'default:mese_crystal', 'default:mese_crystal', 'default:mese_crystal'}, + {'default:mese_crystal', 'default:mese_crystal', 'default:mese_crystal'}, + {'default:mese_crystal', 'default:mese_crystal', 'default:mese_crystal'}, + } +}) + +minetest.register_craft({ + output = 'default:mese_crystal 9', + recipe = { + {'default:mese'}, + } +}) + +minetest.register_craft({ + type = "shapeless", + output = 'default:mese', + recipe = { + 'default:mese_crystal', + 'default:stone', + } +}) + + +-- +-- Crafting (tool repair) +-- +minetest.register_craft({ + type = "toolrepair", + additional_wear = -0.02, +}) + +-- +-- Cooking recipes +-- + +minetest.register_craft({ + type = "cooking", + output = "default:glass", + recipe = "group:sand", +}) + +minetest.register_craft({ + type = "cooking", + output = "default:stone", + recipe = "default:cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "default:steel_ingot", + recipe = "default:iron_lump", +}) + +minetest.register_craft({ + type = "cooking", + output = "default:clay_brick", + recipe = "default:clay_lump", +}) + +-- +-- Fuels +-- + +minetest.register_craft({ + type = "fuel", + recipe = "group:tree", + burntime = 30, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:junglegrass", + burntime = 2, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:leaves", + burntime = 1, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:cactus", + burntime = 15, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:papyrus", + burntime = 1, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:bookshelf", + burntime = 30, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:fence_wood", + burntime = 15, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:ladder", + burntime = 5, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "group:wood", + burntime = 7, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:mese_crystal", + burntime = 30, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:lava_source", + burntime = 60, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:torch", + burntime = 4, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:sign_wall", + burntime = 10, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:chest", + burntime = 30, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:chest_locked", + burntime = 30, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:nyancat", + burntime = 1, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:nyancat_rainbow", + burntime = 1, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:sapling", + burntime = 10, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:apple", + burntime = 3, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:coal_lump", + burntime = 40, +}) + +-- +-- Node definitions +-- + +-- Default node sounds + +function default.node_sound_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name="", gain=1.0} + table.dug = table.dug or + {name="default_dug_node", gain=1.0} + return table +end + +function default.node_sound_stone_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name="default_hard_footstep", gain=0.2} + default.node_sound_defaults(table) + return table +end + +function default.node_sound_dirt_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name="", gain=0.5} + --table.dug = table.dug or + -- {name="default_dirt_break", gain=0.5} + default.node_sound_defaults(table) + return table +end + +function default.node_sound_sand_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name="default_grass_footstep", gain=0.25} + --table.dug = table.dug or + -- {name="default_dirt_break", gain=0.25} + table.dug = table.dug or + {name="", gain=0.25} + default.node_sound_defaults(table) + return table +end + +function default.node_sound_wood_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name="default_hard_footstep", gain=0.3} + default.node_sound_defaults(table) + return table +end + +function default.node_sound_leaves_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name="default_grass_footstep", gain=0.25} + table.dig = table.dig or + {name="default_dig_crumbly", gain=0.4} + table.dug = table.dug or + {name="", gain=1.0} + default.node_sound_defaults(table) + return table +end + +function default.node_sound_glass_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name="default_hard_footstep", gain=0.25} + table.dug = table.dug or + {name="default_break_glass", gain=1.0} + default.node_sound_defaults(table) + return table +end + +-- + +minetest.register_node("default:stone", { + description = "Stone", + tiles = {"default_stone.png"}, + is_ground_content = true, + groups = {cracky=3, stone=1}, + drop = 'default:cobble', + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:desert_stone", { + description = "Desert Stone", + tiles = {"default_desert_stone.png"}, + is_ground_content = true, + groups = {cracky=3, stone=1}, + drop = 'default:desert_stone', + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:stone_with_coal", { + description = "Coal Ore", + tiles = {"default_stone.png^default_mineral_coal.png"}, + is_ground_content = true, + groups = {cracky=3}, + drop = 'default:coal_lump', + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:stone_with_iron", { + description = "Iron Ore", + tiles = {"default_stone.png^default_mineral_iron.png"}, + is_ground_content = true, + groups = {cracky=3}, + drop = 'default:iron_lump', + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:stone_with_mese", { + description = "Mese Ore", + tiles = {"default_stone.png^default_mineral_mese.png"}, + is_ground_content = true, + groups = {cracky = 3}, + drop = "default:mese_crystal", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:mese", { + description = "Mese Block", + tiles = {"default_mese_block.png"}, + is_ground_content = true, + groups = {cracky=1}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:dirt_with_grass", { + description = "Dirt with Grass", + tiles = {"default_grass.png", "default_dirt.png", "default_dirt.png^default_grass_side.png"}, + is_ground_content = true, + groups = {crumbly=3}, + drop = 'default:dirt', + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_grass_footstep", gain=0.4}, + }), +}) + +minetest.register_node("default:dirt_with_grass_footsteps", { + description = "Dirt with Grass and Footsteps", + tiles = {"default_grass_footsteps.png", "default_dirt.png", "default_dirt.png^default_grass_side.png"}, + is_ground_content = true, + groups = {crumbly=3, not_in_creative_inventory=1}, + drop = 'default:dirt', + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_grass_footstep", gain=0.4}, + }), +}) + +minetest.register_node("default:dirt", { + description = "Dirt", + tiles = {"default_dirt.png"}, + is_ground_content = true, + groups = {crumbly=3}, + sounds = default.node_sound_dirt_defaults(), +}) + +minetest.register_node("default:sand", { + description = "Sand", + tiles = {"default_sand.png"}, + is_ground_content = true, + groups = {crumbly=3, falling_node=1, sand=1}, + sounds = default.node_sound_sand_defaults(), +}) + +minetest.register_node("default:desert_sand", { + description = "Desert Sand", + tiles = {"default_desert_sand.png"}, + is_ground_content = true, + groups = {sand=1, crumbly=3, falling_node=1, sand=1}, + sounds = default.node_sound_sand_defaults(), +}) + +minetest.register_node("default:gravel", { + description = "Gravel", + tiles = {"default_gravel.png"}, + is_ground_content = true, + groups = {crumbly=2, falling_node=1}, + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_gravel_footstep", gain=0.45}, + }), +}) + +minetest.register_node("default:sandstone", { + description = "Sandstone", + tiles = {"default_sandstone.png"}, + is_ground_content = true, + groups = {crumbly=2,cracky=2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:clay", { + description = "Clay", + tiles = {"default_clay.png"}, + is_ground_content = true, + groups = {crumbly=3}, + drop = 'default:clay_lump 4', + sounds = default.node_sound_dirt_defaults({ + footstep = "", + }), +}) + +minetest.register_node("default:brick", { + description = "Brick Block", + tiles = {"default_brick.png"}, + is_ground_content = true, + groups = {cracky=3}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:tree", { + description = "Tree", + tiles = {"default_tree_top.png", "default_tree_top.png", "default_tree.png"}, + is_ground_content = true, + groups = {tree=1,snappy=1,choppy=2,oddly_breakable_by_hand=1,flammable=2}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:jungletree", { + description = "Jungle Tree", + tiles = {"default_jungletree_top.png", "default_jungletree_top.png", "default_jungletree.png"}, + is_ground_content = true, + groups = {tree=1,snappy=1,choppy=2,oddly_breakable_by_hand=1,flammable=2}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:junglegrass", { + description = "Jungle Grass", + drawtype = "plantlike", + visual_scale = 1.3, + tiles = {"default_junglegrass.png"}, + inventory_image = "default_junglegrass.png", + wield_image = "default_junglegrass.png", + paramtype = "light", + walkable = false, + groups = {snappy=3,flammable=2,attached_node=1}, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("default:leaves", { + description = "Leaves", + drawtype = "allfaces_optional", + visual_scale = 1.3, + tiles = {"default_leaves.png"}, + paramtype = "light", + groups = {snappy=3, leafdecay=3, flammable=2}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = {'default:sapling'}, + rarity = 20, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'default:leaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("default:cactus", { + description = "Cactus", + tiles = {"default_cactus_top.png", "default_cactus_top.png", "default_cactus_side.png"}, + is_ground_content = true, + groups = {snappy=2,choppy=3,flammable=2}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:papyrus", { + description = "Papyrus", + drawtype = "plantlike", + tiles = {"default_papyrus.png"}, + inventory_image = "default_papyrus.png", + wield_image = "default_papyrus.png", + paramtype = "light", + is_ground_content = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3} + }, + groups = {snappy=3,flammable=2}, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("default:bookshelf", { + description = "Bookshelf", + tiles = {"default_wood.png", "default_wood.png", "default_bookshelf.png"}, + is_ground_content = true, + groups = {snappy=2,choppy=3,oddly_breakable_by_hand=2,flammable=3}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:glass", { + description = "Glass", + drawtype = "glasslike", + tiles = {"default_glass.png"}, + inventory_image = minetest.inventorycube("default_glass.png"), + paramtype = "light", + sunlight_propagates = true, + is_ground_content = true, + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3}, + sounds = default.node_sound_glass_defaults(), +}) + +minetest.register_node("default:fence_wood", { + description = "Wooden Fence", + drawtype = "fencelike", + tiles = {"default_wood.png"}, + inventory_image = "default_fence.png", + wield_image = "default_fence.png", + paramtype = "light", + is_ground_content = true, + selection_box = { + type = "fixed", + fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7}, + }, + groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=2}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:rail", { + description = "Rail", + drawtype = "raillike", + tiles = {"default_rail.png", "default_rail_curved.png", "default_rail_t_junction.png", "default_rail_crossing.png"}, + inventory_image = "default_rail.png", + wield_image = "default_rail.png", + paramtype = "light", + is_ground_content = true, + walkable = false, + selection_box = { + type = "fixed", + -- but how to specify the dimensions for curved and sideways rails? + fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, + }, + groups = {bendy=2,snappy=1,dig_immediate=2,attached_node=1}, +}) + +minetest.register_node("default:ladder", { + description = "Ladder", + drawtype = "signlike", + tiles = {"default_ladder.png"}, + inventory_image = "default_ladder.png", + wield_image = "default_ladder.png", + paramtype = "light", + paramtype2 = "wallmounted", + is_ground_content = true, + walkable = false, + climbable = true, + selection_box = { + type = "wallmounted", + --wall_top = = + --wall_bottom = = + --wall_side = = + }, + groups = {snappy=1,choppy=2,oddly_breakable_by_hand=3,flammable=2}, + legacy_wallmounted = true, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:wood", { + description = "Wooden Planks", + tiles = {"default_wood.png"}, + is_ground_content = true, + groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:cloud", { + description = "Cloud", + tiles = {"default_cloud.png"}, + is_ground_content = true, + sounds = default.node_sound_defaults(), + groups = {not_in_creative_inventory=1}, +}) + +minetest.register_node("default:water_flowing", { + description = "Flowing Water", + inventory_image = minetest.inventorycube("default_water.png"), + drawtype = "flowingliquid", + tiles = {"default_water.png"}, + special_tiles = { + { + image="default_water_flowing_animated.png", + backface_culling=false, + animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=0.8} + }, + { + image="default_water_flowing_animated.png", + backface_culling=true, + animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=0.8} + }, + }, + alpha = WATER_ALPHA, + paramtype = "light", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + liquidtype = "flowing", + liquid_alternative_flowing = "default:water_flowing", + liquid_alternative_source = "default:water_source", + liquid_viscosity = WATER_VISC, + post_effect_color = {a=64, r=100, g=100, b=200}, + groups = {water=3, liquid=3, puts_out_fire=1, not_in_creative_inventory=1}, +}) + +minetest.register_node("default:water_source", { + description = "Water Source", + inventory_image = minetest.inventorycube("default_water.png"), + drawtype = "liquid", + tiles = { + {name="default_water_source_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=2.0}} + }, + special_tiles = { + -- New-style water source material (mostly unused) + {name="default_water.png", backface_culling=false}, + }, + alpha = WATER_ALPHA, + paramtype = "light", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + liquidtype = "source", + liquid_alternative_flowing = "default:water_flowing", + liquid_alternative_source = "default:water_source", + liquid_viscosity = WATER_VISC, + post_effect_color = {a=64, r=100, g=100, b=200}, + groups = {water=3, liquid=3, puts_out_fire=1}, +}) + +minetest.register_node("default:lava_flowing", { + description = "Flowing Lava", + inventory_image = minetest.inventorycube("default_lava.png"), + drawtype = "flowingliquid", + tiles = {"default_lava.png"}, + special_tiles = { + { + image="default_lava_flowing_animated.png", + backface_culling=false, + animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.3} + }, + { + image="default_lava_flowing_animated.png", + backface_culling=true, + animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.3} + }, + }, + paramtype = "light", + light_source = LIGHT_MAX - 1, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + liquidtype = "flowing", + liquid_alternative_flowing = "default:lava_flowing", + liquid_alternative_source = "default:lava_source", + liquid_viscosity = LAVA_VISC, + damage_per_second = 4*2, + post_effect_color = {a=192, r=255, g=64, b=0}, + groups = {lava=3, liquid=2, hot=3, igniter=1, not_in_creative_inventory=1}, +}) + +minetest.register_node("default:lava_source", { + description = "Lava Source", + inventory_image = minetest.inventorycube("default_lava.png"), + drawtype = "liquid", + tiles = { + {name="default_lava_source_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}} + }, + special_tiles = { + -- New-style lava source material (mostly unused) + {name="default_lava.png", backface_culling=false}, + }, + paramtype = "light", + light_source = LIGHT_MAX - 1, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + liquidtype = "source", + liquid_alternative_flowing = "default:lava_flowing", + liquid_alternative_source = "default:lava_source", + liquid_viscosity = LAVA_VISC, + damage_per_second = 4*2, + post_effect_color = {a=192, r=255, g=64, b=0}, + groups = {lava=3, liquid=2, hot=3, igniter=1}, +}) + +minetest.register_node("default:torch", { + description = "Torch", + drawtype = "torchlike", + --tiles = {"default_torch_on_floor.png", "default_torch_on_ceiling.png", "default_torch.png"}, + tiles = { + {name="default_torch_on_floor_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}}, + {name="default_torch_on_ceiling_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}}, + {name="default_torch_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}} + }, + inventory_image = "default_torch_on_floor.png", + wield_image = "default_torch_on_floor.png", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = false, + light_source = LIGHT_MAX-1, + selection_box = { + type = "wallmounted", + wall_top = {-0.1, 0.5-0.6, -0.1, 0.1, 0.5, 0.1}, + wall_bottom = {-0.1, -0.5, -0.1, 0.1, -0.5+0.6, 0.1}, + wall_side = {-0.5, -0.3, -0.1, -0.5+0.3, 0.3, 0.1}, + }, + groups = {choppy=2,dig_immediate=3,flammable=1,attached_node=1}, + legacy_wallmounted = true, + sounds = default.node_sound_defaults(), +}) + +minetest.register_node("default:sign_wall", { + description = "Sign", + drawtype = "signlike", + tiles = {"default_sign_wall.png"}, + inventory_image = "default_sign_wall.png", + wield_image = "default_sign_wall.png", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "wallmounted", + --wall_top = + --wall_bottom = + --wall_side = + }, + groups = {choppy=2,dig_immediate=2,attached_node=1}, + legacy_wallmounted = true, + sounds = default.node_sound_defaults(), + on_construct = function(pos) + --local n = minetest.env:get_node(pos) + local meta = minetest.env:get_meta(pos) + meta:set_string("formspec", "field[text;;${text}]") + meta:set_string("infotext", "\"\"") + end, + on_receive_fields = function(pos, formname, fields, sender) + --print("Sign at "..minetest.pos_to_string(pos).." got "..dump(fields)) + local meta = minetest.env:get_meta(pos) + fields.text = fields.text or "" + print((sender:get_player_name() or "").." wrote \""..fields.text.. + "\" to sign at "..minetest.pos_to_string(pos)) + meta:set_string("text", fields.text) + meta:set_string("infotext", '"'..fields.text..'"') + end, +}) + +minetest.register_node("default:chest", { + description = "Chest", + tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png", + "default_chest_side.png", "default_chest_side.png", "default_chest_front.png"}, + paramtype2 = "facedir", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + legacy_facedir_simple = true, + sounds = default.node_sound_wood_defaults(), + on_construct = function(pos) + local meta = minetest.env:get_meta(pos) + meta:set_string("formspec", + "size[8,9]".. + "list[current_name;main;0,0;8,4;]".. + "list[current_player;main;0,5;8,4;]") + meta:set_string("infotext", "Chest") + local inv = meta:get_inventory() + inv:set_size("main", 8*4) + end, + can_dig = function(pos,player) + local meta = minetest.env:get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("main") + end, + on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + minetest.log("action", player:get_player_name().. + " moves stuff in chest at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_put = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " moves stuff to chest at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_take = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " takes stuff from chest at "..minetest.pos_to_string(pos)) + end, +}) + +local function has_locked_chest_privilege(meta, player) + if player:get_player_name() ~= meta:get_string("owner") then + return false + end + return true +end + +minetest.register_node("default:chest_locked", { + description = "Locked Chest", + tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png", + "default_chest_side.png", "default_chest_side.png", "default_chest_lock.png"}, + paramtype2 = "facedir", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + legacy_facedir_simple = true, + sounds = default.node_sound_wood_defaults(), + after_place_node = function(pos, placer) + local meta = minetest.env:get_meta(pos) + meta:set_string("owner", placer:get_player_name() or "") + meta:set_string("infotext", "Locked Chest (owned by ".. + meta:get_string("owner")..")") + end, + on_construct = function(pos) + local meta = minetest.env:get_meta(pos) + meta:set_string("formspec", + "size[8,9]".. + "list[current_name;main;0,0;8,4;]".. + "list[current_player;main;0,5;8,4;]") + meta:set_string("infotext", "Locked Chest") + meta:set_string("owner", "") + local inv = meta:get_inventory() + inv:set_size("main", 8*4) + end, + can_dig = function(pos,player) + local meta = minetest.env:get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("main") + end, + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.env:get_meta(pos) + if not has_locked_chest_privilege(meta, player) then + minetest.log("action", player:get_player_name().. + " tried to access a locked chest belonging to ".. + meta:get_string("owner").." at ".. + minetest.pos_to_string(pos)) + return 0 + end + return count + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local meta = minetest.env:get_meta(pos) + if not has_locked_chest_privilege(meta, player) then + minetest.log("action", player:get_player_name().. + " tried to access a locked chest belonging to ".. + meta:get_string("owner").." at ".. + minetest.pos_to_string(pos)) + return 0 + end + return stack:get_count() + end, + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + local meta = minetest.env:get_meta(pos) + if not has_locked_chest_privilege(meta, player) then + minetest.log("action", player:get_player_name().. + " tried to access a locked chest belonging to ".. + meta:get_string("owner").." at ".. + minetest.pos_to_string(pos)) + return 0 + end + return stack:get_count() + end, + on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + minetest.log("action", player:get_player_name().. + " moves stuff in locked chest at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_put = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " moves stuff to locked chest at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_take = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " takes stuff from locked chest at "..minetest.pos_to_string(pos)) + end, +}) + +default.furnace_inactive_formspec = + "size[8,9]".. + "image[2,2;1,1;default_furnace_fire_bg.png]".. + "list[current_name;fuel;2,3;1,1;]".. + "list[current_name;src;2,1;1,1;]".. + "list[current_name;dst;5,1;2,2;]".. + "list[current_player;main;0,5;8,4;]" + +minetest.register_node("default:furnace", { + description = "Furnace", + tiles = {"default_furnace_top.png", "default_furnace_bottom.png", "default_furnace_side.png", + "default_furnace_side.png", "default_furnace_side.png", "default_furnace_front.png"}, + paramtype2 = "facedir", + groups = {cracky=2}, + legacy_facedir_simple = true, + sounds = default.node_sound_stone_defaults(), + on_construct = function(pos) + local meta = minetest.env:get_meta(pos) + meta:set_string("formspec", default.furnace_inactive_formspec) + meta:set_string("infotext", "Furnace") + local inv = meta:get_inventory() + inv:set_size("fuel", 1) + inv:set_size("src", 1) + inv:set_size("dst", 4) + end, + can_dig = function(pos,player) + local meta = minetest.env:get_meta(pos); + local inv = meta:get_inventory() + if not inv:is_empty("fuel") then + return false + elseif not inv:is_empty("dst") then + return false + elseif not inv:is_empty("src") then + return false + end + return true + end, +}) + +minetest.register_node("default:furnace_active", { + description = "Furnace", + tiles = {"default_furnace_top.png", "default_furnace_bottom.png", "default_furnace_side.png", + "default_furnace_side.png", "default_furnace_side.png", "default_furnace_front_active.png"}, + paramtype2 = "facedir", + light_source = 8, + drop = "default:furnace", + groups = {cracky=2, not_in_creative_inventory=1}, + legacy_facedir_simple = true, + sounds = default.node_sound_stone_defaults(), + on_construct = function(pos) + local meta = minetest.env:get_meta(pos) + meta:set_string("formspec", default.furnace_inactive_formspec) + meta:set_string("infotext", "Furnace"); + local inv = meta:get_inventory() + inv:set_size("fuel", 1) + inv:set_size("src", 1) + inv:set_size("dst", 4) + end, + can_dig = function(pos,player) + local meta = minetest.env:get_meta(pos); + local inv = meta:get_inventory() + if not inv:is_empty("fuel") then + return false + elseif not inv:is_empty("dst") then + return false + elseif not inv:is_empty("src") then + return false + end + return true + end, +}) + +function hacky_swap_node(pos,name) + local node = minetest.env:get_node(pos) + local meta = minetest.env:get_meta(pos) + local meta0 = meta:to_table() + if node.name == name then + return + end + node.name = name + local meta0 = meta:to_table() + minetest.env:set_node(pos,node) + meta = minetest.env:get_meta(pos) + meta:from_table(meta0) +end + +minetest.register_abm({ + nodenames = {"default:furnace","default:furnace_active"}, + interval = 1.0, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + local meta = minetest.env:get_meta(pos) + for i, name in ipairs({ + "fuel_totaltime", + "fuel_time", + "src_totaltime", + "src_time" + }) do + if meta:get_string(name) == "" then + meta:set_float(name, 0.0) + end + end + + local inv = meta:get_inventory() + + local srclist = inv:get_list("src") + local cooked = nil + + if srclist then + cooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) + end + + local was_active = false + + if meta:get_float("fuel_time") < meta:get_float("fuel_totaltime") then + was_active = true + meta:set_float("fuel_time", meta:get_float("fuel_time") + 1) + meta:set_float("src_time", meta:get_float("src_time") + 1) + if cooked and cooked.item and meta:get_float("src_time") >= cooked.time then + -- check if there's room for output in "dst" list + if inv:room_for_item("dst",cooked.item) then + -- Put result in "dst" list + inv:add_item("dst", cooked.item) + -- take stuff from "src" list + srcstack = inv:get_stack("src", 1) + srcstack:take_item() + inv:set_stack("src", 1, srcstack) + else + print("Could not insert '"..cooked.item:to_string().."'") + end + meta:set_string("src_time", 0) + end + end + + if meta:get_float("fuel_time") < meta:get_float("fuel_totaltime") then + local percent = math.floor(meta:get_float("fuel_time") / + meta:get_float("fuel_totaltime") * 100) + meta:set_string("infotext","Furnace active: "..percent.."%") + hacky_swap_node(pos,"default:furnace_active") + meta:set_string("formspec", + "size[8,9]".. + "image[2,2;1,1;default_furnace_fire_bg.png^[lowpart:".. + (100-percent)..":default_furnace_fire_fg.png]".. + "list[current_name;fuel;2,3;1,1;]".. + "list[current_name;src;2,1;1,1;]".. + "list[current_name;dst;5,1;2,2;]".. + "list[current_player;main;0,5;8,4;]") + return + end + + local fuel = nil + local cooked = nil + local fuellist = inv:get_list("fuel") + local srclist = inv:get_list("src") + + if srclist then + cooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) + end + if fuellist then + fuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist}) + end + + if fuel.time <= 0 then + meta:set_string("infotext","Furnace out of fuel") + hacky_swap_node(pos,"default:furnace") + meta:set_string("formspec", default.furnace_inactive_formspec) + return + end + + if cooked.item:is_empty() then + if was_active then + meta:set_string("infotext","Furnace is empty") + hacky_swap_node(pos,"default:furnace") + meta:set_string("formspec", default.furnace_inactive_formspec) + end + return + end + + meta:set_string("fuel_totaltime", fuel.time) + meta:set_string("fuel_time", 0) + + local stack = inv:get_stack("fuel", 1) + stack:take_item() + inv:set_stack("fuel", 1, stack) + end, +}) + +minetest.register_node("default:cobble", { + description = "Cobblestone", + tiles = {"default_cobble.png"}, + is_ground_content = true, + groups = {cracky=3, stone=2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:mossycobble", { + description = "Mossy Cobblestone", + tiles = {"default_mossycobble.png"}, + is_ground_content = true, + groups = {cracky=3}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:steelblock", { + description = "Steel Block", + tiles = {"default_steel_block.png"}, + is_ground_content = true, + groups = {snappy=1,bendy=2,cracky=1,melty=2,level=2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:mese_block", { -- Here to ensure it does not go wrong, feel free to remove this at anytime. + description = "Mese Block", + tiles = {"default_mese_block.png"}, + is_ground_content = true, + groups = {cracky=1}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:nyancat", { + description = "Nyan Cat", + tiles = {"default_nc_side.png", "default_nc_side.png", "default_nc_side.png", + "default_nc_side.png", "default_nc_back.png", "default_nc_front.png"}, + paramtype2 = "facedir", + groups = {cracky=2}, + legacy_facedir_simple = true, + sounds = default.node_sound_defaults(), +}) + +minetest.register_node("default:nyancat_rainbow", { + description = "Nyan Cat Rainbow", + tiles = {"default_nc_rb.png"}, + groups = {cracky=2}, + sounds = default.node_sound_defaults(), +}) + +minetest.register_node("default:sapling", { + description = "Sapling", + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"default_sapling.png"}, + inventory_image = "default_sapling.png", + wield_image = "default_sapling.png", + paramtype = "light", + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} + }, + groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1}, + sounds = default.node_sound_defaults(), +}) + +minetest.register_node("default:apple", { + description = "Apple", + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"default_apple.png"}, + inventory_image = "default_apple.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.2, -0.5, -0.2, 0.2, 0, 0.2} + }, + groups = {fleshy=3,dig_immediate=3,flammable=2}, + on_use = minetest.item_eat(4), + sounds = default.node_sound_defaults(), +}) + +minetest.register_node("default:dry_shrub", { + description = "Dry Shrub", + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"default_dry_shrub.png"}, + inventory_image = "default_dry_shrub.png", + wield_image = "default_dry_shrub.png", + paramtype = "light", + walkable = false, + groups = {snappy=3,flammable=3,attached_node=1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-1/3, -1/2, -1/3, 1/3, 1/6, 1/3}, + }, +}) + +-- +-- Crafting items +-- + +minetest.register_craftitem("default:stick", { + description = "Stick", + inventory_image = "default_stick.png", +}) + +minetest.register_craftitem("default:paper", { + description = "Paper", + inventory_image = "default_paper.png", +}) + +minetest.register_craftitem("default:book", { + description = "Book", + inventory_image = "default_book.png", +}) + +minetest.register_craftitem("default:coal_lump", { + description = "Coal Lump", + inventory_image = "default_coal_lump.png", +}) + +minetest.register_craftitem("default:iron_lump", { + description = "Iron Lump", + inventory_image = "default_iron_lump.png", +}) + +minetest.register_craftitem("default:mese_crystal", { + description = "Mese Crystal", + inventory_image = "default_mese_crystal.png", +}) + +minetest.register_craftitem("default:clay_lump", { + description = "Clay Lump", + inventory_image = "default_clay_lump.png", +}) + +minetest.register_craftitem("default:steel_ingot", { + description = "Steel Ingot", + inventory_image = "default_steel_ingot.png", +}) + +minetest.register_craftitem("default:mese_crystal_fragment", { + description = "Mese Crystal Fragment", + inventory_image = "default_mese_crystal_fragment.png", +}) + +minetest.register_craftitem("default:clay_brick", { + description = "Clay Brick", + inventory_image = "default_steel_ingot.png", + inventory_image = "default_clay_brick.png", +}) + +minetest.register_craftitem("default:scorched_stuff", { + description = "Scorched Stuff", + inventory_image = "default_scorched_stuff.png", +}) + +minetest.register_alias("default:mese_block", "default:mese") --Convert default:mese_blocks from the older stuff to the newer way + +-- Support old code +function default.spawn_falling_node(p, nodename) + spawn_falling_node(p, nodename) +end + +-- Horrible crap to support old code +-- Don't use this and never do what this does, it's completely wrong! +-- (More specifically, the client and the C++ code doesn't get the group) +function default.register_falling_node(nodename, texture) + minetest.log("error", debug.traceback()) + minetest.log('error', "WARNING: default.register_falling_node is deprecated") + if minetest.registered_nodes[nodename] then + minetest.registered_nodes[nodename].groups.falling_node = 1 + end +end + +-- +-- Global callbacks +-- + +-- Global environment step function +function on_step(dtime) + -- print("on_step") +end +minetest.register_globalstep(on_step) + +function on_placenode(p, node) + --print("on_placenode") +end +minetest.register_on_placenode(on_placenode) + +function on_dignode(p, node) + --print("on_dignode") +end +minetest.register_on_dignode(on_dignode) + +function on_punchnode(p, node) +end +minetest.register_on_punchnode(on_punchnode) + +-- END From 1426a5bf7579db2069234c8e372632efdf88ebb9 Mon Sep 17 00:00:00 2001 From: Jordan Snelling Date: Mon, 24 Dec 2012 21:13:13 +0000 Subject: [PATCH 3/3] git went wrong again add the mapgen.lua fix --- mods/default/mapgen.lua | 584 ++++++++++++++++++++-------------------- 1 file changed, 292 insertions(+), 292 deletions(-) diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index 419861c3..7fc334a4 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -1,292 +1,292 @@ --- minetest/default/mapgen.lua - --- --- Aliases for map generator outputs --- - -minetest.register_alias("mapgen_air", "air") -minetest.register_alias("mapgen_stone", "default:stone") -minetest.register_alias("mapgen_tree", "default:tree") -minetest.register_alias("mapgen_leaves", "default:leaves") -minetest.register_alias("mapgen_apple", "default:apple") -minetest.register_alias("mapgen_water_source", "default:water_source") -minetest.register_alias("mapgen_dirt", "default:dirt") -minetest.register_alias("mapgen_sand", "default:sand") -minetest.register_alias("mapgen_gravel", "default:gravel") -minetest.register_alias("mapgen_clay", "default:clay") -minetest.register_alias("mapgen_lava_source", "default:lava_source") -minetest.register_alias("mapgen_cobble", "default:cobble") -minetest.register_alias("mapgen_mossycobble", "default:mossycobble") -minetest.register_alias("mapgen_dirt_with_grass", "default:dirt_with_grass") -minetest.register_alias("mapgen_junglegrass", "default:junglegrass") -minetest.register_alias("mapgen_stone_with_coal", "default:stone_with_coal") -minetest.register_alias("mapgen_stone_with_iron", "default:stone_with_iron") -minetest.register_alias("mapgen_mese", "default:mese") -minetest.register_alias("mapgen_desert_sand", "default:desert_sand") -minetest.register_alias("mapgen_desert_stone", "default:desert_stone") - --- --- Ore generation --- - -local function generate_ore(name, wherein, minp, maxp, seed, chunks_per_volume, chunk_size, ore_per_chunk, height_min, height_max) - if maxp.y < height_min or minp.y > height_max then - return - end - local y_min = math.max(minp.y, height_min) - local y_max = math.min(maxp.y, height_max) - local volume = (maxp.x-minp.x+1)*(y_max-y_min+1)*(maxp.z-minp.z+1) - local pr = PseudoRandom(seed) - local num_chunks = math.floor(chunks_per_volume * volume) - local inverse_chance = math.floor(chunk_size*chunk_size*chunk_size / ore_per_chunk) - --print("generate_ore num_chunks: "..dump(num_chunks)) - for i=1,num_chunks do - local y0 = pr:next(y_min, y_max-chunk_size+1) - if y0 >= height_min and y0 <= height_max then - local x0 = pr:next(minp.x, maxp.x-chunk_size+1) - local z0 = pr:next(minp.z, maxp.z-chunk_size+1) - local p0 = {x=x0, y=y0, z=z0} - for x1=0,chunk_size-1 do - for y1=0,chunk_size-1 do - for z1=0,chunk_size-1 do - if pr:next(1,inverse_chance) == 1 then - local x2 = x0+x1 - local y2 = y0+y1 - local z2 = z0+z1 - local p2 = {x=x2, y=y2, z=z2} - if minetest.env:get_node(p2).name == wherein then - minetest.env:set_node(p2, {name=name}) - end - end - end - end - end - end - end - --print("generate_ore done") -end - -function default.make_papyrus(pos, size) - for y=0,size-1 do - local p = {x=pos.x, y=pos.y+y, z=pos.z} - local nn = minetest.env:get_node(p).name - if minetest.registered_nodes[nn] and - minetest.registered_nodes[nn].buildable_to then - minetest.env:set_node(p, {name="default:papyrus"}) - else - return - end - end -end - -function default.make_cactus(pos, size) - for y=0,size-1 do - local p = {x=pos.x, y=pos.y+y, z=pos.z} - local nn = minetest.env:get_node(p).name - if minetest.registered_nodes[nn] and - minetest.registered_nodes[nn].buildable_to then - minetest.env:set_node(p, {name="default:cactus"}) - else - return - end - end -end - --- facedir: 0/1/2/3 (head node facedir value) --- length: length of rainbow tail -function default.make_nyancat(pos, facedir, length) - local tailvec = {x=0, y=0, z=0} - if facedir == 0 then - tailvec.z = 1 - elseif facedir == 1 then - tailvec.x = 1 - elseif facedir == 2 then - tailvec.z = -1 - elseif facedir == 3 then - tailvec.x = -1 - else - print("default.make_nyancat(): Invalid facedir: "+dump(facedir)) - facedir = 0 - tailvec.z = 1 - end - local p = {x=pos.x, y=pos.y, z=pos.z} - minetest.env:set_node(p, {name="default:nyancat", param2=facedir}) - for i=1,length do - p.x = p.x + tailvec.x - p.z = p.z + tailvec.z - minetest.env:set_node(p, {name="default:nyancat_rainbow"}) - end -end - -function generate_nyancats(seed, minp, maxp) - local height_min = -31000 - local height_max = -32 - if maxp.y < height_min or minp.y > height_max then - return - end - local y_min = math.max(minp.y, height_min) - local y_max = math.min(maxp.y, height_max) - local volume = (maxp.x-minp.x+1)*(y_max-y_min+1)*(maxp.z-minp.z+1) - local pr = PseudoRandom(seed + 9324342) - local max_num_nyancats = math.floor(volume / (16*16*16)) - for i=1,max_num_nyancats do - if pr:next(0, 1000) == 0 then - local x0 = pr:next(minp.x, maxp.x) - local y0 = pr:next(minp.y, maxp.y) - local z0 = pr:next(minp.z, maxp.z) - local p0 = {x=x0, y=y0, z=z0} - default.make_nyancat(p0, pr:next(0,3), pr:next(3,15)) - end - end -end - -minetest.register_on_generated(function(minp, maxp, seed) - -- Generate regular ores - generate_ore("default:stone_with_coal", "default:stone", minp, maxp, seed+0, 1/8/8/8, 3, 8, -31000, 64) - generate_ore("default:stone_with_iron", "default:stone", minp, maxp, seed+1, 1/12/12/12, 2, 3, -15, 2) - generate_ore("default:stone_with_iron", "default:stone", minp, maxp, seed+2, 1/9/9/9, 3, 5, -63, -16) - generate_ore("default:stone_with_iron", "default:stone", minp, maxp, seed+3, 1/7/7/7, 3, 5, -31000, -64) - generate_ore("default:mese", "default:stone", minp, maxp, seed+4, 1/16/16/16, 2, 3, -127, -64) - generate_ore("default:mese", "default:stone", minp, maxp, seed+5, 1/9/9/9, 3, 5, -31000,-128) - - generate_ore("default:stone_with_coal", "default:stone", minp, maxp, seed+7, 1/24/24/24, 6,27, -31000, 0) - generate_ore("default:stone_with_iron", "default:stone", minp, maxp, seed+6, 1/24/24/24, 6,27, -31000, -64) - - if maxp.y >= 2 and minp.y <= 0 then - -- Generate clay - -- Assume X and Z lengths are equal - local divlen = 4 - local divs = (maxp.x-minp.x)/divlen+1; - for divx=0+1,divs-1-1 do - for divz=0+1,divs-1-1 do - local cx = minp.x + math.floor((divx+0.5)*divlen) - local cz = minp.z + math.floor((divz+0.5)*divlen) - if minetest.env:get_node({x=cx,y=1,z=cz}).name == "default:water_source" and - minetest.env:get_node({x=cx,y=0,z=cz}).name == "default:sand" then - local is_shallow = true - local num_water_around = 0 - if minetest.env:get_node({x=cx-divlen*2,y=1,z=cz+0}).name == "default:water_source" then - num_water_around = num_water_around + 1 end - if minetest.env:get_node({x=cx+divlen*2,y=1,z=cz+0}).name == "default:water_source" then - num_water_around = num_water_around + 1 end - if minetest.env:get_node({x=cx+0,y=1,z=cz-divlen*2}).name == "default:water_source" then - num_water_around = num_water_around + 1 end - if minetest.env:get_node({x=cx+0,y=1,z=cz+divlen*2}).name == "default:water_source" then - num_water_around = num_water_around + 1 end - if num_water_around >= 2 then - is_shallow = false - end - if is_shallow then - for x1=-divlen,divlen do - for z1=-divlen,divlen do - if minetest.env:get_node({x=cx+x1,y=0,z=cz+z1}).name == "default:sand" then - minetest.env:set_node({x=cx+x1,y=0,z=cz+z1}, {name="default:clay"}) - end - end - end - end - end - end - end - -- Generate papyrus - local perlin1 = minetest.env:get_perlin(354, 3, 0.7, 100) - -- Assume X and Z lengths are equal - local divlen = 8 - local divs = (maxp.x-minp.x)/divlen+1; - for divx=0,divs-1 do - for divz=0,divs-1 do - local x0 = minp.x + math.floor((divx+0)*divlen) - local z0 = minp.z + math.floor((divz+0)*divlen) - local x1 = minp.x + math.floor((divx+1)*divlen) - local z1 = minp.z + math.floor((divz+1)*divlen) - -- Determine papyrus amount from perlin noise - local papyrus_amount = math.floor(perlin1:get2d({x=x0, y=z0}) * 45 - 20) - -- Find random positions for papyrus based on this random - local pr = PseudoRandom(seed+1) - for i=0,papyrus_amount do - local x = pr:next(x0, x1) - local z = pr:next(z0, z1) - if minetest.env:get_node({x=x,y=1,z=z}).name == "default:dirt_with_grass" and - minetest.env:find_node_near({x=x,y=1,z=z}, 1, "default:water_source") then - default.make_papyrus({x=x,y=2,z=z}, pr:next(2, 4)) - end - end - end - end - -- Generate cactuses - local perlin1 = minetest.env:get_perlin(230, 3, 0.6, 100) - -- Assume X and Z lengths are equal - local divlen = 16 - local divs = (maxp.x-minp.x)/divlen+1; - for divx=0,divs-1 do - for divz=0,divs-1 do - local x0 = minp.x + math.floor((divx+0)*divlen) - local z0 = minp.z + math.floor((divz+0)*divlen) - local x1 = minp.x + math.floor((divx+1)*divlen) - local z1 = minp.z + math.floor((divz+1)*divlen) - -- Determine cactus amount from perlin noise - local cactus_amount = math.floor(perlin1:get2d({x=x0, y=z0}) * 6 - 3) - -- Find random positions for cactus based on this random - local pr = PseudoRandom(seed+1) - for i=0,cactus_amount do - local x = pr:next(x0, x1) - local z = pr:next(z0, z1) - -- Find ground level (0...15) - local ground_y = nil - for y=30,0,-1 do - if minetest.env:get_node({x=x,y=y,z=z}).name ~= "air" then - ground_y = y - break - end - end - -- If desert sand, make cactus - if ground_y and minetest.env:get_node({x=x,y=ground_y,z=z}).name == "default:desert_sand" then - default.make_cactus({x=x,y=ground_y+1,z=z}, pr:next(3, 4)) - end - end - end - end - -- Generate dry shrubs - local perlin1 = minetest.env:get_perlin(329, 3, 0.6, 100) - -- Assume X and Z lengths are equal - local divlen = 16 - local divs = (maxp.x-minp.x)/divlen+1; - for divx=0,divs-1 do - for divz=0,divs-1 do - local x0 = minp.x + math.floor((divx+0)*divlen) - local z0 = minp.z + math.floor((divz+0)*divlen) - local x1 = minp.x + math.floor((divx+1)*divlen) - local z1 = minp.z + math.floor((divz+1)*divlen) - -- Determine dry shrubs amount from perlin noise - local shrub_amount = math.floor(perlin1:get2d({x=x0, y=z0}) * 5 + 0) - -- Find random positions for dry shrubs based on this random - local pr = PseudoRandom(seed+1) - for i=0,shrub_amount do - local x = pr:next(x0, x1) - local z = pr:next(z0, z1) - -- Find ground level (0...15) - local ground_y = nil - for y=30,0,-1 do - if minetest.env:get_node({x=x,y=y,z=z}).name ~= "air" then - ground_y = y - break - end - end - -- If desert sand, make dry shrub - if ground_y and minetest.env:get_node({x=x,y=ground_y,z=z}).name == "default:desert_sand" then - local p = {x=x,y=ground_y+1,z=z} - local nn = minetest.env:get_node(p).name - if minetest.registered_nodes[nn] and - minetest.registered_nodes[nn].buildable_to then - minetest.env:set_node(p, {name="default:dry_shrub"}) - end - end - end - end - end - end - - -- Generate nyan cats - generate_nyancats(seed, minp, maxp) -end) - +-- minetest/default/mapgen.lua + +-- +-- Aliases for map generator outputs +-- + +minetest.register_alias("mapgen_air", "air") +minetest.register_alias("mapgen_stone", "default:stone") +minetest.register_alias("mapgen_tree", "default:tree") +minetest.register_alias("mapgen_leaves", "default:leaves") +minetest.register_alias("mapgen_apple", "default:apple") +minetest.register_alias("mapgen_water_source", "default:water_source") +minetest.register_alias("mapgen_dirt", "default:dirt") +minetest.register_alias("mapgen_sand", "default:sand") +minetest.register_alias("mapgen_gravel", "default:gravel") +minetest.register_alias("mapgen_clay", "default:clay") +minetest.register_alias("mapgen_lava_source", "default:lava_source") +minetest.register_alias("mapgen_cobble", "default:cobble") +minetest.register_alias("mapgen_mossycobble", "default:mossycobble") +minetest.register_alias("mapgen_dirt_with_grass", "default:dirt_with_grass") +minetest.register_alias("mapgen_junglegrass", "default:junglegrass") +minetest.register_alias("mapgen_stone_with_coal", "default:stone_with_coal") +minetest.register_alias("mapgen_stone_with_iron", "default:stone_with_iron") +minetest.register_alias("mapgen_mese", "default:stone_with_mese") +minetest.register_alias("mapgen_desert_sand", "default:desert_sand") +minetest.register_alias("mapgen_desert_stone", "default:desert_stone") + +-- +-- Ore generation +-- + +local function generate_ore(name, wherein, minp, maxp, seed, chunks_per_volume, chunk_size, ore_per_chunk, height_min, height_max) + if maxp.y < height_min or minp.y > height_max then + return + end + local y_min = math.max(minp.y, height_min) + local y_max = math.min(maxp.y, height_max) + local volume = (maxp.x-minp.x+1)*(y_max-y_min+1)*(maxp.z-minp.z+1) + local pr = PseudoRandom(seed) + local num_chunks = math.floor(chunks_per_volume * volume) + local inverse_chance = math.floor(chunk_size*chunk_size*chunk_size / ore_per_chunk) + --print("generate_ore num_chunks: "..dump(num_chunks)) + for i=1,num_chunks do + local y0 = pr:next(y_min, y_max-chunk_size+1) + if y0 >= height_min and y0 <= height_max then + local x0 = pr:next(minp.x, maxp.x-chunk_size+1) + local z0 = pr:next(minp.z, maxp.z-chunk_size+1) + local p0 = {x=x0, y=y0, z=z0} + for x1=0,chunk_size-1 do + for y1=0,chunk_size-1 do + for z1=0,chunk_size-1 do + if pr:next(1,inverse_chance) == 1 then + local x2 = x0+x1 + local y2 = y0+y1 + local z2 = z0+z1 + local p2 = {x=x2, y=y2, z=z2} + if minetest.env:get_node(p2).name == wherein then + minetest.env:set_node(p2, {name=name}) + end + end + end + end + end + end + end + --print("generate_ore done") +end + +function default.make_papyrus(pos, size) + for y=0,size-1 do + local p = {x=pos.x, y=pos.y+y, z=pos.z} + local nn = minetest.env:get_node(p).name + if minetest.registered_nodes[nn] and + minetest.registered_nodes[nn].buildable_to then + minetest.env:set_node(p, {name="default:papyrus"}) + else + return + end + end +end + +function default.make_cactus(pos, size) + for y=0,size-1 do + local p = {x=pos.x, y=pos.y+y, z=pos.z} + local nn = minetest.env:get_node(p).name + if minetest.registered_nodes[nn] and + minetest.registered_nodes[nn].buildable_to then + minetest.env:set_node(p, {name="default:cactus"}) + else + return + end + end +end + +-- facedir: 0/1/2/3 (head node facedir value) +-- length: length of rainbow tail +function default.make_nyancat(pos, facedir, length) + local tailvec = {x=0, y=0, z=0} + if facedir == 0 then + tailvec.z = 1 + elseif facedir == 1 then + tailvec.x = 1 + elseif facedir == 2 then + tailvec.z = -1 + elseif facedir == 3 then + tailvec.x = -1 + else + print("default.make_nyancat(): Invalid facedir: "+dump(facedir)) + facedir = 0 + tailvec.z = 1 + end + local p = {x=pos.x, y=pos.y, z=pos.z} + minetest.env:set_node(p, {name="default:nyancat", param2=facedir}) + for i=1,length do + p.x = p.x + tailvec.x + p.z = p.z + tailvec.z + minetest.env:set_node(p, {name="default:nyancat_rainbow"}) + end +end + +function generate_nyancats(seed, minp, maxp) + local height_min = -31000 + local height_max = -32 + if maxp.y < height_min or minp.y > height_max then + return + end + local y_min = math.max(minp.y, height_min) + local y_max = math.min(maxp.y, height_max) + local volume = (maxp.x-minp.x+1)*(y_max-y_min+1)*(maxp.z-minp.z+1) + local pr = PseudoRandom(seed + 9324342) + local max_num_nyancats = math.floor(volume / (16*16*16)) + for i=1,max_num_nyancats do + if pr:next(0, 1000) == 0 then + local x0 = pr:next(minp.x, maxp.x) + local y0 = pr:next(minp.y, maxp.y) + local z0 = pr:next(minp.z, maxp.z) + local p0 = {x=x0, y=y0, z=z0} + default.make_nyancat(p0, pr:next(0,3), pr:next(3,15)) + end + end +end + +minetest.register_on_generated(function(minp, maxp, seed) + -- Generate regular ores + generate_ore("default:stone_with_coal", "default:stone", minp, maxp, seed+0, 1/8/8/8, 3, 8, -31000, 64) + generate_ore("default:stone_with_iron", "default:stone", minp, maxp, seed+1, 1/12/12/12, 2, 3, -15, 2) + generate_ore("default:stone_with_iron", "default:stone", minp, maxp, seed+2, 1/9/9/9, 3, 5, -63, -16) + generate_ore("default:stone_with_iron", "default:stone", minp, maxp, seed+3, 1/7/7/7, 3, 5, -31000, -64) + generate_ore("default:stone_with_mese", "default:stone", minp, maxp, seed+4, 1/16/16/16, 2, 3, -127, -64) + generate_ore("default:stone_with_mese", "default:stone", minp, maxp, seed+5, 1/9/9/9, 3, 5, -31000,-128) + + generate_ore("default:stone_with_coal", "default:stone", minp, maxp, seed+7, 1/24/24/24, 6,27, -31000, 0) + generate_ore("default:stone_with_iron", "default:stone", minp, maxp, seed+6, 1/24/24/24, 6,27, -31000, -64) + + if maxp.y >= 2 and minp.y <= 0 then + -- Generate clay + -- Assume X and Z lengths are equal + local divlen = 4 + local divs = (maxp.x-minp.x)/divlen+1; + for divx=0+1,divs-1-1 do + for divz=0+1,divs-1-1 do + local cx = minp.x + math.floor((divx+0.5)*divlen) + local cz = minp.z + math.floor((divz+0.5)*divlen) + if minetest.env:get_node({x=cx,y=1,z=cz}).name == "default:water_source" and + minetest.env:get_node({x=cx,y=0,z=cz}).name == "default:sand" then + local is_shallow = true + local num_water_around = 0 + if minetest.env:get_node({x=cx-divlen*2,y=1,z=cz+0}).name == "default:water_source" then + num_water_around = num_water_around + 1 end + if minetest.env:get_node({x=cx+divlen*2,y=1,z=cz+0}).name == "default:water_source" then + num_water_around = num_water_around + 1 end + if minetest.env:get_node({x=cx+0,y=1,z=cz-divlen*2}).name == "default:water_source" then + num_water_around = num_water_around + 1 end + if minetest.env:get_node({x=cx+0,y=1,z=cz+divlen*2}).name == "default:water_source" then + num_water_around = num_water_around + 1 end + if num_water_around >= 2 then + is_shallow = false + end + if is_shallow then + for x1=-divlen,divlen do + for z1=-divlen,divlen do + if minetest.env:get_node({x=cx+x1,y=0,z=cz+z1}).name == "default:sand" then + minetest.env:set_node({x=cx+x1,y=0,z=cz+z1}, {name="default:clay"}) + end + end + end + end + end + end + end + -- Generate papyrus + local perlin1 = minetest.env:get_perlin(354, 3, 0.7, 100) + -- Assume X and Z lengths are equal + local divlen = 8 + local divs = (maxp.x-minp.x)/divlen+1; + for divx=0,divs-1 do + for divz=0,divs-1 do + local x0 = minp.x + math.floor((divx+0)*divlen) + local z0 = minp.z + math.floor((divz+0)*divlen) + local x1 = minp.x + math.floor((divx+1)*divlen) + local z1 = minp.z + math.floor((divz+1)*divlen) + -- Determine papyrus amount from perlin noise + local papyrus_amount = math.floor(perlin1:get2d({x=x0, y=z0}) * 45 - 20) + -- Find random positions for papyrus based on this random + local pr = PseudoRandom(seed+1) + for i=0,papyrus_amount do + local x = pr:next(x0, x1) + local z = pr:next(z0, z1) + if minetest.env:get_node({x=x,y=1,z=z}).name == "default:dirt_with_grass" and + minetest.env:find_node_near({x=x,y=1,z=z}, 1, "default:water_source") then + default.make_papyrus({x=x,y=2,z=z}, pr:next(2, 4)) + end + end + end + end + -- Generate cactuses + local perlin1 = minetest.env:get_perlin(230, 3, 0.6, 100) + -- Assume X and Z lengths are equal + local divlen = 16 + local divs = (maxp.x-minp.x)/divlen+1; + for divx=0,divs-1 do + for divz=0,divs-1 do + local x0 = minp.x + math.floor((divx+0)*divlen) + local z0 = minp.z + math.floor((divz+0)*divlen) + local x1 = minp.x + math.floor((divx+1)*divlen) + local z1 = minp.z + math.floor((divz+1)*divlen) + -- Determine cactus amount from perlin noise + local cactus_amount = math.floor(perlin1:get2d({x=x0, y=z0}) * 6 - 3) + -- Find random positions for cactus based on this random + local pr = PseudoRandom(seed+1) + for i=0,cactus_amount do + local x = pr:next(x0, x1) + local z = pr:next(z0, z1) + -- Find ground level (0...15) + local ground_y = nil + for y=30,0,-1 do + if minetest.env:get_node({x=x,y=y,z=z}).name ~= "air" then + ground_y = y + break + end + end + -- If desert sand, make cactus + if ground_y and minetest.env:get_node({x=x,y=ground_y,z=z}).name == "default:desert_sand" then + default.make_cactus({x=x,y=ground_y+1,z=z}, pr:next(3, 4)) + end + end + end + end + -- Generate dry shrubs + local perlin1 = minetest.env:get_perlin(329, 3, 0.6, 100) + -- Assume X and Z lengths are equal + local divlen = 16 + local divs = (maxp.x-minp.x)/divlen+1; + for divx=0,divs-1 do + for divz=0,divs-1 do + local x0 = minp.x + math.floor((divx+0)*divlen) + local z0 = minp.z + math.floor((divz+0)*divlen) + local x1 = minp.x + math.floor((divx+1)*divlen) + local z1 = minp.z + math.floor((divz+1)*divlen) + -- Determine dry shrubs amount from perlin noise + local shrub_amount = math.floor(perlin1:get2d({x=x0, y=z0}) * 5 + 0) + -- Find random positions for dry shrubs based on this random + local pr = PseudoRandom(seed+1) + for i=0,shrub_amount do + local x = pr:next(x0, x1) + local z = pr:next(z0, z1) + -- Find ground level (0...15) + local ground_y = nil + for y=30,0,-1 do + if minetest.env:get_node({x=x,y=y,z=z}).name ~= "air" then + ground_y = y + break + end + end + -- If desert sand, make dry shrub + if ground_y and minetest.env:get_node({x=x,y=ground_y,z=z}).name == "default:desert_sand" then + local p = {x=x,y=ground_y+1,z=z} + local nn = minetest.env:get_node(p).name + if minetest.registered_nodes[nn] and + minetest.registered_nodes[nn].buildable_to then + minetest.env:set_node(p, {name="default:dry_shrub"}) + end + end + end + end + end + end + + -- Generate nyan cats + generate_nyancats(seed, minp, maxp) +end) +