-- mods/default/nodes.lua --[[ Node name convention: Although many node names are in combined-word form, the required form for new node names is words separated by underscores. If both forms are used in written language (for example pinewood and pine wood) the underscore form should be used. --]] --[[ Index: Stone ----- (1. Material 2. Cobble variant 3. Brick variant [4. Modified forms]) default:stone default:cobble default:stonebrick default:mossycobble default:desert_stone default:desert_cobble default:desert_stonebrick default:sandstone default:sandstonebrick default:obsidian default:obsidianbrick Soft / Non-Stone ---------------- (1. Material [2. Modified forms]) default:dirt default:dirt_with_grass default:dirt_with_grass_footsteps default:dirt_with_dry_grass default:dirt_with_snow default:sand default:desert_sand default:gravel default:clay default:snow default:snowblock default:ice Trees ----- (1. Trunk 2. Fabricated trunk 3. Leaves 4. Sapling [5. Fruits]) default:tree default:wood default:leaves default:sapling default:apple default:jungletree default:junglewood default:jungleleaves default:junglesapling default:pine_tree default:pine_wood default:pine_needles default:pine_sapling default:acacia_tree default:acacia_wood default:acacia_leaves default:acacia_sapling Ores ---- (1. In stone 2. Block) default:stone_with_coal default:coalblock default:stone_with_iron default:steelblock default:stone_with_copper default:copperblock default:bronzeblock default:stone_with_gold default:goldblock default:stone_with_mese default:mese default:stone_with_diamond default:diamondblock Plantlife (non-cubic) --------------------- default:cactus default:papyrus default:dry_shrub default:junglegrass default:grass_1 default:grass_2 default:grass_3 default:grass_4 default:grass_5 default:dry_grass_1 default:dry_grass_2 default:dry_grass_3 default:dry_grass_4 default:dry_grass_5 Liquids ------- (1. Source 2. Flowing) default:water_source default:water_flowing default:river_water_source default:river_water_flowing default:lava_source default:lava_flowing Tools / "Advanced" crafting / Non-"natural" ------------------------------------------- default:torch default:chest default:chest_locked default:bookshelf default:sign_wall default:ladder default:fence_wood default:glass default:obsidian_glass default:rail default:brick default:meselamp Misc ---- default:cloud default:nyancat default:nyancat_rainbow --]] -- -- Stone -- minetest.register_node("default:stone", { description = "Stone", tiles = {"default_stone.png"}, groups = {cracky = 1,soil = 0, level = 2}, drop = 'default:cobble', legacy_mineral = true, sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:cobble", { description = "Cobblestone", tiles = {"default_cobble.png"}, is_ground_content = false, groups = {cracky = 2, stone = 2}, sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:stonebrick", { description = "Stone Brick", tiles = {"default_stone_brick.png"}, is_ground_content = false, groups = {cracky = 1, stone = 1}, sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:mossycobble", { description = "Mossy Cobblestone", tiles = {"default_mossycobble.png"}, is_ground_content = false, groups = {cracky =2, stone = 1}, sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:desert_stone", { description = "Desert Stone", tiles = {"default_desert_stone.png"}, groups = {cracky = 1, stone = 1}, drop = 'default:desert_cobble', legacy_mineral = true, sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:desert_cobble", { description = "Desert Cobblestone", tiles = {"default_desert_cobble.png"}, is_ground_content = false, groups = {cracky = 2, stone = 2}, sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:desert_stonebrick", { description = "Desert Stone Brick", tiles = {"default_desert_stone_brick.png"}, is_ground_content = false, groups = {cracky = 1, stone = 1}, sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:sandstone", { description = "Sandstone", tiles = {"default_sandstone.png"}, groups = {crumbly = 2, cracky = 2}, sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:sandstonebrick", { description = "Sandstone Brick", tiles = {"default_sandstone_brick.png"}, is_ground_content = false, groups = {cracky = 2}, sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:obsidian", { description = "Obsidian", tiles = {"default_obsidian.png"}, sounds = default.node_sound_stone_defaults(), groups = {cracky = 1, level = 2}, }) minetest.register_node("default:obsidianbrick", { description = "Obsidian Brick", tiles = {"default_obsidian_brick.png"}, is_ground_content = false, sounds = default.node_sound_stone_defaults(), groups = {cracky = 1, level = 2}, }) -- -- Soft / Non-Stone -- minetest.register_node("default:dirt", { description = "Dirt", tiles = {"default_dirt.png"}, groups = {crumbly = 1, soil = 1}, sounds = default.node_sound_dirt_defaults(), }) --From Blockmen's wasteland 5.0 minetest.register_node("default:dry_dirt", { description = "Dirt", tiles = {"default_dry_dirt.png"}, is_ground_content = true, groups = {crumbly= 1}, sounds = default.node_sound_dirt_defaults(), --stack_max = 40, }) minetest.register_node("default:dirt_with_grass", { description = "Dirt with Grass", tiles = {"default_grass.png", "default_dirt.png", {name = "default_dirt.png^default_grass_side.png", tileable_vertical = false}}, groups = {crumbly = 1, soil = 1}, drop = 'default:dirt', sounds = default.node_sound_dirt_defaults({ footstep = {name = "default_grass_footstep", gain = 0.25}, }), }) minetest.register_node("default:dirt_with_grass_footsteps", { description = "Dirt with Grass and Footsteps", tiles = {"default_grass.png^default_footprint.png", "default_dirt.png", {name = "default_dirt.png^default_grass_side.png", tileable_vertical = false}}, groups = {crumbly = 1, soil = 1, not_in_creative_inventory = 1}, drop = 'default:dirt', sounds = default.node_sound_dirt_defaults({ footstep = {name = "default_grass_footstep", gain = 0.25}, }), }) minetest.register_node("default:dirt_with_dry_grass", { description = "Dirt with Dry Grass", tiles = {"default_dry_grass.png", "default_dirt.png", {name = "default_dirt.png^default_dry_grass_side.png", tileable_vertical = false}}, groups = {crumbly = 1, soil = 0}, drop = 'default:dirt', sounds = default.node_sound_dirt_defaults({ footstep = {name = "default_grass_footstep", gain = 0.4}, }), }) minetest.register_node("default:dirt_with_snow", { description = "Dirt with Snow", tiles = {"default_snow.png", "default_dirt.png", {name = "default_dirt.png^default_snow_side.png", tileable_vertical = false}}, groups = {crumbly = 1, soil = 0}, drop = 'default:dirt', sounds = default.node_sound_dirt_defaults({ footstep = {name = "default_snow_footstep", gain = 0.25}, }), }) minetest.register_node("default:sand", { description = "Sand", tiles = {"default_sand.png"}, groups = {crumbly = 2, 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"}, groups = {crumbly = 2, falling_node = 1, sand = 1}, sounds = default.node_sound_sand_defaults(), }) minetest.register_node("default:gravel", { description = "Gravel", tiles = {"default_gravel.png"}, groups = {crumbly = 2, falling_node = 1}, sounds = default.node_sound_dirt_defaults({ footstep = {name = "default_gravel_footstep", gain = 0.5}, dug = {name = "default_gravel_footstep", gain = 1.0}, }), }) minetest.register_node("default:clay", { description = "Clay", tiles = {"default_clay.png"}, groups = {crumbly = 1}, drop = 'default:clay_lump 4', sounds = default.node_sound_dirt_defaults(), }) minetest.register_node("default:snow", { description = "Snow", tiles = {"default_snow.png"}, inventory_image = "default_snowball.png", wield_image = "default_snowball.png", paramtype = "light", buildable_to = true, drawtype = "nodebox", node_box = { type = "fixed", fixed = { {-0.5, -0.5, -0.5, 0.5, -0.25, 0.5}, }, }, groups = {crumbly = 2, falling_node = 1, puts_out_fire = 1}, sounds = default.node_sound_dirt_defaults({ footstep = {name = "default_snow_footstep", gain = 0.25}, dug = {name = "default_snow_footstep", gain = 0.75}, }), --[[ on_construct = function(pos) pos.y = pos.y - 1 if minetest.get_node(pos).name == "default:dirt_with_grass" then minetest.set_node(pos, {name = "default:dirt_with_snow"}) end end,]] }) minetest.register_node("default:snowblock", { description = "Snow Block", tiles = {"default_snow.png"}, groups = {crumbly = 2, puts_out_fire = 1}, sounds = default.node_sound_dirt_defaults({ footstep = {name = "default_snow_footstep", gain = 0.25}, dug = {name = "default_snow_footstep", gain = 0.75}, }), }) minetest.register_node("default:ice", { description = "Ice", tiles = {"default_ice.png"}, is_ground_content = false, paramtype = "light", groups = {cracky = 1, puts_out_fire = 1}, sounds = default.node_sound_glass_defaults(), }) -- -- Trees -- --DEAD TREE minetest.register_node("default:dead_tree", { description = "Dead Tree", tiles = {"default_dead_tree_top.png", "default_dead_tree_top.png", "default_dead_tree.png"}, is_ground_content = false, groups = {tree=1,choppy=2 ,flammable=1}, sounds = default.node_sound_wood_defaults(), drop = 'default:dead_tree', stack_max = 20, }) minetest.register_node("default:tree", { description = "Tree", tiles = {"default_tree_top.png", "default_tree_top.png", "default_dead_tree.png"}, paramtype2 = "facedir", is_ground_content = false, groups = {tree = 1, choppy = 2, flammable = 2}, sounds = default.node_sound_wood_defaults(), on_place = minetest.rotate_node }) minetest.register_node("default:wood", { description = "Wooden Planks", tiles = {"default_wood.png"}, is_ground_content = false, groups = {choppy = 2, flammable = 3, wood = 1}, sounds = default.node_sound_wood_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", sunlight_propagates = true, 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, sapling = 1}, sounds = default.node_sound_leaves_defaults(), }) --minetest.register_alias("default:leaves", "default:inv") minetest.register_node("default:leaves", { description = "Leaves", drawtype = "allfaces_optional", waving = 1, visual_scale = 1.3, tiles = {"default_dead_leaves.png"}, special_tiles = {"default_leaves_simple.png"}, paramtype = "light", is_ground_content = false, groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, 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:stick'}, } } }, sounds = default.node_sound_leaves_defaults(), after_place_node = default.after_place_leaves, }) 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, is_ground_content = 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, leafdecay = 3, leafdecay_drop = 1}, on_use = minetest.item_eat(2), sounds = default.node_sound_leaves_defaults(), after_place_node = function(pos, placer, itemstack) if placer:is_player() then minetest.set_node(pos, {name = "default:apple", param2 = 1}) end end, }) minetest.register_node("default:jungletree", { description = "Jungle Tree", tiles = {"default_jungletree_top.png", "default_jungletree_top.png", "default_dead_tree.png"}, paramtype2 = "facedir", is_ground_content = false, groups = {tree = 1, choppy = 2, flammable = 2}, sounds = default.node_sound_wood_defaults(), on_place = minetest.rotate_node }) minetest.register_node("default:junglewood", { description = "Junglewood Planks", tiles = {"default_junglewood.png"}, is_ground_content = false, groups = {choppy = 2, flammable = 3, wood = 1}, sounds = default.node_sound_wood_defaults(), }) --minetest.register_alias("default:jungleleaves", "default:inv") minetest.register_node("default:jungleleaves", { description = "Jungle Leaves", drawtype = "allfaces_optional", waving = 1, visual_scale = 1.3, tiles = {"default_dead_leaves.png"}, --special_tiles = {"default_jungleleaves_simple.png"}, paramtype = "light", is_ground_content = false, groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, drop = { max_items = 1, items = { {items = {'default:junglesapling'}, rarity = 20}, {items = {'default:stick'}} } }, sounds = default.node_sound_leaves_defaults(), after_place_node = default.after_place_leaves, }) minetest.register_node("default:junglesapling", { description = "Jungle Sapling", drawtype = "plantlike", visual_scale = 1.0, tiles = {"default_junglesapling.png"}, inventory_image = "default_junglesapling.png", wield_image = "default_junglesapling.png", paramtype = "light", sunlight_propagates = true, 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, sapling = 1}, sounds = default.node_sound_leaves_defaults(), }) minetest.register_node("default:pine_tree", { description = "Pine Tree", tiles = {"default_pine_tree_top.png", "default_pine_tree_top.png", "default_dead_tree.png"}, paramtype2 = "facedir", is_ground_content = false, groups = {tree = 1, choppy = 2, flammable = 2}, sounds = default.node_sound_wood_defaults(), on_place = minetest.rotate_node }) minetest.register_node("default:pine_wood", { description = "Pine Wood Planks", tiles = {"default_pine_wood.png"}, is_ground_content = false, groups = {choppy = 2, flammable = 3, wood = 1}, sounds = default.node_sound_wood_defaults(), }) --minetest.register_alias("default:pine_needles", "default:inv") minetest.register_node("default:pine_needles",{ description = "Pine Needles", drawtype = "allfaces_optional", visual_scale = 1.3, tiles = {"default_dead_needles.png"}, waving = 1, paramtype = "light", is_ground_content = false, groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, drop = { max_items = 1, items = { {items = {"default:pine_sapling"}, rarity = 20}, {items = {"default:stick"}} } }, sounds = default.node_sound_leaves_defaults(), after_place_node = default.after_place_leaves, }) minetest.register_node("default:pine_sapling", { description = "Pine Sapling", drawtype = "plantlike", visual_scale = 1.0, tiles = {"default_pine_sapling.png"}, inventory_image = "default_pine_sapling.png", wield_image = "default_pine_sapling.png", paramtype = "light", sunlight_propagates = true, 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, sapling = 1}, sounds = default.node_sound_leaves_defaults(), }) minetest.register_node("default:acacia_tree", { description = "Acacia Tree", tiles = {"default_acacia_tree_top.png", "default_acacia_tree_top.png", "default_dead_tree.png"}, paramtype2 = "facedir", is_ground_content = false, groups = {tree = 1, choppy = 2, flammable = 2}, sounds = default.node_sound_wood_defaults(), on_place = minetest.rotate_node }) minetest.register_node("default:acacia_wood", { description = "Acacia Wood Planks", tiles = {"default_acacia_wood.png"}, is_ground_content = false, groups = {choppy = 2, flammable = 3, wood = 1}, sounds = default.node_sound_wood_defaults(), }) --minetest.register_alias("default:acacia_leaves", "default:inv") minetest.register_node("default:acacia_leaves", { description = "Acacia Leaves", drawtype = "allfaces_optional", visual_scale = 1.3, tiles = {"default_dead_leaves.png"}, waving = 1, paramtype = "light", is_ground_content = false, groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, drop = { max_items = 1, items = { {items = {"default:acacia_sapling"}, rarity = 20}, {items = {"default:stick"}} } }, sounds = default.node_sound_leaves_defaults(), after_place_node = default.after_place_leaves, }) minetest.register_node("default:acacia_sapling", { description = "Acacia Tree Sapling", drawtype = "plantlike", visual_scale = 1.0, tiles = {"default_acacia_sapling.png"}, inventory_image = "default_acacia_sapling.png", wield_image = "default_acacia_sapling.png", paramtype = "light", sunlight_propagates = true, 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, sapling = 1}, sounds = default.node_sound_leaves_defaults(), }) -- -- Ores -- minetest.register_node("default:stone_with_coal", { description = "Coal Ore", tiles = {"default_stone.png^default_mineral_coal.png"}, groups = {cracky = 3}, drop = 'default:coal_lump', sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:desert_stone_with_coal", { description = "Coal Ore", tiles = {"default_desert_stone.png^default_mineral_coal.png"}, groups = {cracky = 3}, drop = 'default:coal_lump', sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:coalblock", { description = "Coal Block", tiles = {"default_coal_block.png"}, is_ground_content = false, groups = {cracky = 3}, sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:stone_with_iron", { description = "Iron Ore", tiles = {"default_stone.png^default_mineral_iron.png"}, groups = {cracky = 2}, drop = 'default:iron_lump', sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:desert_stone_with_iron", { description = "Iron Ore", tiles = {"default_desert_stone.png^default_mineral_iron.png"}, groups = {cracky = 2}, drop = 'default:iron_lump', sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:steelblock", { description = "Steel Block", tiles = {"default_steel_block.png"}, is_ground_content = false, groups = {cracky = 1, level = 2}, sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:stone_with_copper", { description = "Copper Ore", tiles = {"default_stone.png^default_mineral_copper.png"}, groups = {cracky = 2}, drop = 'default:copper_lump', sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:copperblock", { description = "Copper Block", tiles = {"default_copper_block.png"}, is_ground_content = false, groups = {cracky = 1, level = 2}, sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:bronzeblock", { description = "Bronze Block", tiles = {"default_bronze_block.png"}, is_ground_content = false, groups = {cracky = 1, level = 2}, sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:stone_with_gold", { description = "Gold Ore", tiles = {"default_stone.png^default_mineral_gold.png"}, groups = {cracky = 2}, drop = "default:gold_lump", sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:desert_stone_with_gold", { description = "Gold Ore", tiles = {"default_desert_stone.png^default_mineral_gold.png"}, groups = {cracky = 2}, drop = "default:gold_lump", sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:goldblock", { description = "Gold Block", tiles = {"default_gold_block.png"}, is_ground_content = false, groups = {cracky = 1}, sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:stone_with_diamond", { description = "Diamond Ore", tiles = {"default_stone.png^default_mineral_diamond.png"}, groups = {cracky = 1}, drop = "default:diamond", sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:diamondblock", { description = "Diamond Block", tiles = {"default_diamond_block.png"}, is_ground_content = false, groups = {cracky = 1, level = 3}, sounds = default.node_sound_stone_defaults(), }) ----NEW CRAFT FOR MESE minetest.register_node("default:mese_crystal_fragment_stasis", { description = "Mese Fragment Stasis Cube --Cook to release", tiles = {"default_ice.png^default_obsidian_glass.png^default_mese_crystal_fragment.png"}, is_ground_content = false, groups = {cracky = 1, level = 3}, sounds = default.node_sound_glass_defaults(), }) -- -- Plantlife (non-cubic) -- minetest.register_node("default:cactus", { description = "Cactus", tiles = {"default_cactus_top.png", "default_cactus_top.png", "default_cactus_side.png"}, paramtype2 = "facedir", groups = {snappy = 1, choppy = 3, flammable = 2}, sounds = default.node_sound_wood_defaults(), on_place = minetest.rotate_node, after_dig_node = function(pos, node, metadata, digger) default.dig_up(pos, node, digger) end, }) 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", sunlight_propagates = 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(), after_dig_node = function(pos, node, metadata, digger) default.dig_up(pos, node, digger) end, }) minetest.register_node("default:dry_shrub", { description = "Dry Shrub", drawtype = "plantlike", waving = 1, visual_scale = 1.0, tiles = {"default_dry_shrub.png"}, inventory_image = "default_dry_shrub.png", wield_image = "default_dry_shrub.png", paramtype = "light", sunlight_propagates = true, walkable = false, buildable_to = true, groups = {snappy = 3, flammable = 3, attached_node = 1}, sounds = default.node_sound_leaves_defaults(), selection_box = { type = "fixed", fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, }, }) minetest.register_node("default:junglegrass", { description = "Jungle Grass", drawtype = "plantlike", waving = 1, visual_scale = 1.3, tiles = {"default_junglegrass.png"}, inventory_image = "default_junglegrass.png", wield_image = "default_junglegrass.png", paramtype = "light", sunlight_propagates = true, walkable = false, buildable_to = true, groups = {snappy = 3, flammable = 2, flora = 1, attached_node = 1}, sounds = default.node_sound_leaves_defaults(), selection_box = { type = "fixed", fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, }, }) minetest.register_node("default:grass_1", { description = "Grass", drawtype = "plantlike", waving = 1, tiles = {"default_grass_1.png"}, -- Use texture of a taller grass stage in inventory inventory_image = "default_grass_3.png", wield_image = "default_grass_3.png", paramtype = "light", sunlight_propagates = true, walkable = false, buildable_to = true, groups = {snappy = 3, flammable = 3, flora = 1, attached_node = 1}, sounds = default.node_sound_leaves_defaults(), selection_box = { type = "fixed", fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, }, on_place = function(itemstack, placer, pointed_thing) -- place a random grass node local stack = ItemStack("default:grass_" .. math.random(1,5)) local ret = minetest.item_place(stack, placer, pointed_thing) return ItemStack("default:grass_1 " .. itemstack:get_count() - (1 - ret:get_count())) end, }) for i = 2, 5 do minetest.register_node("default:grass_" .. i, { description = "Grass", drawtype = "plantlike", waving = 1, tiles = {"default_grass_" .. i .. ".png"}, inventory_image = "default_grass_" .. i .. ".png", wield_image = "default_grass_" .. i .. ".png", paramtype = "light", sunlight_propagates = true, walkable = false, buildable_to = true, drop = "default:grass_1", groups = {snappy = 3, flammable = 3, flora = 1, attached_node = 1, not_in_creative_inventory = 1}, sounds = default.node_sound_leaves_defaults(), selection_box = { type = "fixed", fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, }, }) end minetest.register_node("default:dry_grass_1", { description = "Dry Grass", drawtype = "plantlike", waving = 1, tiles = {"default_dry_grass_1.png"}, inventory_image = "default_dry_grass_3.png", wield_image = "default_dry_grass_3.png", paramtype = "light", sunlight_propagates = true, walkable = false, buildable_to = true, groups = {snappy = 3, flammable = 3, flora = 1, attached_node = 1}, sounds = default.node_sound_leaves_defaults(), selection_box = { type = "fixed", fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, }, on_place = function(itemstack, placer, pointed_thing) -- place a random dry grass node local stack = ItemStack("default:dry_grass_" .. math.random(1, 5)) local ret = minetest.item_place(stack, placer, pointed_thing) return ItemStack("default:dry_grass_1 " .. itemstack:get_count() - (1 - ret:get_count())) end, }) for i = 2, 5 do minetest.register_node("default:dry_grass_" .. i, { description = "Dry Grass", drawtype = "plantlike", waving = 1, tiles = {"default_dry_grass_" .. i .. ".png"}, inventory_image = "default_dry_grass_" .. i .. ".png", wield_image = "default_dry_grass_" .. i .. ".png", paramtype = "light", sunlight_propagates = true, walkable = false, buildable_to = true, groups = {snappy = 3, flammable = 3, flora = 1, attached_node = 1, not_in_creative_inventory=1}, drop = "default:dry_grass_1", sounds = default.node_sound_leaves_defaults(), selection_box = { type = "fixed", fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, }, }) end -- -- Liquids -- --BUT FIRST WE ADD SOME RADIOACTIVITY FROM THE TECHNIC MOD ---------------------------------------- if not vector.length_square then vector.length_square = function (v) return v.x*v.x + v.y*v.y + v.z*v.z end end -- radioactivity -- Radiation resistance represents the extent to which a material -- attenuates radiation passing through it; i.e., how good a radiation -- shield it is. This is identified per node type. For materials that -- exist in real life, the radiation resistance value that this system -- uses for a node type consisting of a solid cube of that material is the -- (approximate) number of halvings of ionising radiation that is achieved -- by a metre of the material in real life. This is approximately -- proportional to density, which provides a good way to estimate it. -- Homogeneous mixtures of materials have radiation resistance computed -- by a simple weighted mean. Note that the amount of attenuation that -- a material achieves in-game is not required to be (and is not) the -- same as the attenuation achieved in real life. -- -- Radiation resistance for a node type may be specified in the node -- definition, under the key "radiation_resistance". As an interim -- measure, until node definitions widely include this, this code -- knows a bunch of values for particular node types in several mods, -- and values for groups of node types. The node definition takes -- precedence if it specifies a value. Nodes for which no value at -- all is known are taken to provide no radiation resistance at all; -- this is appropriate for the majority of node types. Only node types -- consisting of a fairly homogeneous mass of material should report -- non-zero radiation resistance; anything with non-uniform geometry -- or complex internal structure should show no radiation resistance. -- Fractional resistance values are permitted; two significant figures -- is the recommended precision. local default_radiation_resistance_per_node = { ["default:brick"] = 13, ["default:bronzeblock"] = 45, ["default:clay"] = 15, ["default:coalblock"] = 9.6, ["default:cobble"] = 15, ["default:copperblock"] = 46, ["default:desert_cobble"] = 15, ["default:desert_sand"] = 10, ["default:desert_stone"] = 17, ["default:desert_stonebrick"] = 17, ["default:diamondblock"] = 24, ["default:dirt"] = 8.2, ["default:dirt_with_grass"] = 8.2, ["default:dry_dirt"] = 8.2, ["default:dirt_with_dry_grass"] = 8.2, ["default:dirt_with_grass_footsteps"] = 8.2, ["default:dirt_with_snow"] = 8.2, ["default:glass"] = 17, ["default:goldblock"] = 170, ["default:gravel"] = 10, ["default:ice"] = 5.6, ["default:lava_flowing"] = 8.5, ["default:lava_source"] = 17, ["default:mese"] = 21, ["default:mossycobble"] = 15, ["default:nyancat"] = 1000, ["default:nyancat_rainbow"] = 1000, ["default:obsidian"] = 18, ["default:obsidian_glass"] = 18, ["default:sand"] = 10, ["default:sandstone"] = 15, ["default:sandstonebrick"] = 15, ["default:snowblock"] = 1.7, ["default:steelblock"] = 40, ["default:stone"] = 17, ["default:stone_with_coal"] = 16, ["default:stone_with_copper"] = 20, ["default:stone_with_diamond"] = 18, ["default:stone_with_gold"] = 34, ["default:stone_with_iron"] = 20, ["default:stone_with_mese"] = 17, ["default:stonebrick"] = 17, ["default:water_flowing"] = 2.8, ["default:water_source"] = 5.6, ["farming:desert_sand_soil"] = 10, ["farming:desert_sand_soil_wet"] = 10, ["farming:soil"] = 8.2, ["farming:soil_wet"] = 8.2, ["glooptest:akalin_crystal_glass"] = 21, ["glooptest:akalinblock"] = 40, ["glooptest:alatro_crystal_glass"] = 21, ["glooptest:alatroblock"] = 40, ["glooptest:amethystblock"] = 18, ["glooptest:arol_crystal_glass"] = 21, ["glooptest:crystal_glass"] = 21, ["glooptest:emeraldblock"] = 19, ["glooptest:heavy_crystal_glass"] = 21, ["glooptest:mineral_akalin"] = 20, ["glooptest:mineral_alatro"] = 20, ["glooptest:mineral_amethyst"] = 17, ["glooptest:mineral_arol"] = 20, ["glooptest:mineral_desert_coal"] = 16, ["glooptest:mineral_desert_iron"] = 20, ["glooptest:mineral_emerald"] = 17, ["glooptest:mineral_kalite"] = 20, ["glooptest:mineral_ruby"] = 18, ["glooptest:mineral_sapphire"] = 18, ["glooptest:mineral_talinite"] = 20, ["glooptest:mineral_topaz"] = 18, ["glooptest:reinforced_crystal_glass"] = 21, ["glooptest:rubyblock"] = 27, ["glooptest:sapphireblock"] = 27, ["glooptest:talinite_crystal_glass"] = 21, ["glooptest:taliniteblock"] = 40, ["glooptest:topazblock"] = 24, ["mesecons_extrawires:mese_powered"] = 21, ["moreblocks:cactus_brick"] = 13, ["moreblocks:cactus_checker"] = 8.5, ["moreblocks:circle_stone_bricks"] = 17, ["moreblocks:clean_glass"] = 17, ["moreblocks:coal_checker"] = 9.0, ["moreblocks:coal_glass"] = 17, ["moreblocks:coal_stone"] = 17, ["moreblocks:coal_stone_bricks"] = 17, ["moreblocks:glow_glass"] = 17, ["moreblocks:grey_bricks"] = 15, ["moreblocks:iron_checker"] = 11, ["moreblocks:iron_glass"] = 17, ["moreblocks:iron_stone"] = 17, ["moreblocks:iron_stone_bricks"] = 17, ["moreblocks:plankstone"] = 9.3, ["moreblocks:split_stone_tile"] = 15, ["moreblocks:split_stone_tile_alt"] = 15, ["moreblocks:stone_tile"] = 15, ["moreblocks:super_glow_glass"] = 17, ["moreblocks:tar"] = 7.0, ["moreblocks:wood_tile"] = 1.7, ["moreblocks:wood_tile_center"] = 1.7, ["moreblocks:wood_tile_down"] = 1.7, ["moreblocks:wood_tile_flipped"] = 1.7, ["moreblocks:wood_tile_full"] = 1.7, ["moreblocks:wood_tile_left"] = 1.7, ["moreblocks:wood_tile_right"] = 1.7, ["moreblocks:wood_tile_up"] = 1.7, ["moreores:mineral_mithril"] = 18, ["moreores:mineral_silver"] = 21, ["moreores:mineral_tin"] = 19, ["moreores:mithril_block"] = 26, ["moreores:silver_block"] = 53, ["moreores:tin_block"] = 37, ["snow:snow_brick"] = 2.8, ["technic:brass_block"] = 43, ["technic:carbon_steel_block"] = 40, ["technic:cast_iron_block"] = 40, ["technic:chernobylite_block"] = 40, ["technic:chromium_block"] = 37, ["technic:corium_flowing"] = 40, ["technic:corium_source"] = 80, ["technic:granite"] = 18, ["technic:marble"] = 18, ["technic:marble_bricks"] = 18, ["technic:mineral_chromium"] = 19, ["technic:mineral_uranium"] = 71, ["technic:mineral_zinc"] = 19, ["technic:stainless_steel_block"] = 40, ["technic:uranium_block"] = 500, ["technic:zinc_block"] = 36, ["tnt:tnt"] = 11, ["tnt:tnt_burning"] = 11, } local default_radiation_resistance_per_group = { concrete = 16, tree = 3.4, wood = 1.7, } local cache_radiation_resistance = {} local function node_radiation_resistance(nodename) local eff = cache_radiation_resistance[nodename] if eff then return eff end local def = minetest.registered_nodes[nodename] or {groups={}} eff = def.radiation_resistance or default_radiation_resistance_per_node[nodename] if not eff then for g, v in pairs(def.groups) do if v > 0 and default_radiation_resistance_per_group[g] then eff = default_radiation_resistance_per_group[g] break end end end if not eff then eff = 0 end cache_radiation_resistance[nodename] = eff return eff end -- Radioactive nodes cause damage to nearby players. The damage -- effect depends on the intrinsic strength of the radiation source, -- the distance between the source and the player, and the shielding -- effect of the intervening material. These determine a rate of damage; -- total damage caused is the integral of this over time. -- -- In the absence of effective shielding, for a specific source the -- damage rate varies realistically in inverse proportion to the square -- of the distance. (Distance is measured to the player's abdomen, -- not to the nominal player position which corresponds to the foot.) -- However, if the player is inside a non-walkable (liquid or gaseous) -- radioactive node, the nominal distance could go to zero, yielding -- infinite damage. In that case, the player's body is displacing the -- radioactive material, so the effective distance should remain non-zero. -- We therefore apply a lower distance bound of sqrt(0.75) m, which is -- the maximum distance one can get from the node centre within the node. -- -- A radioactive node is identified by being in the "radioactive" group, -- and the group value signifies the strength of the radiation source. -- The group value is the distance in metres from a node at which an -- unshielded player will be damaged by 0.25 HP/s. Or, equivalently, it -- is half the square root of the damage rate in HP/s that an unshielded -- player 1 m away will take. -- -- Shielding is assessed by sampling every 0.25 m along the path -- from the source to the player, ignoring the source node itself. -- The summed radiation resistance values from the sampled nodes yield -- a measure of the total amount of radiation resistance on the path. -- As in reality, shielding causes exponential attenuation of radiation. -- However, the effect is scaled down relative to real life: each -- metre-point of shielding, corresponding to a real-life halving of -- radiation, reduces radiation by 0.01 nepers (a factor of about 1.01). -- This scales down the difference between shielded and unshielded safe -- distances, avoiding the latter becoming impractically large. -- -- Damage is processed at rates down to 0.25 HP/s, which in the absence of -- shielding is attained at the distance specified by the "radioactive" -- group value. Computed damage rates below 0.25 HP/s result in no -- damage at all to the player. This gives the player an opportunity -- to be safe, and limits the range at which source/player interactions -- need to be considered. local assumed_abdomen_offset = vector.new(0, 1, 0) local assumed_abdomen_offset_length = vector.length(assumed_abdomen_offset) minetest.register_abm({ nodenames = {"group:radioactive"}, interval = 1, chance = 1, action = function (pos, node) local strength = minetest.registered_nodes[node.name].groups.radioactive for _, o in ipairs(minetest.get_objects_inside_radius(pos, strength + assumed_abdomen_offset_length)) do if o:is_player() then local rel = vector.subtract(vector.add(o:getpos(), assumed_abdomen_offset), pos) local dist_sq = vector.length_square(rel) local dist = math.sqrt(dist_sq) local dirstep = dist == 0 and vector.new(0,0,0) or vector.divide(rel, dist*4) local intpos = pos local resistance = 0 for intdist = 0.25, dist, 0.25 do intpos = vector.add(intpos, dirstep) local intnodepos = vector.round(intpos) if not vector.equals(intnodepos, pos) then resistance = resistance + node_radiation_resistance(minetest.get_node(intnodepos).name) end end local dmg_rate = 0.25 * strength*strength * math.exp(-0.0025*resistance) / math.max(0.75, dist_sq) if dmg_rate >= 0.25 then local dmg_int = math.floor(dmg_rate) if math.random() < dmg_rate-dmg_int then dmg_int = dmg_int + 1 end if dmg_int > 0 then o:set_hp(math.max(o:get_hp() - dmg_int, 0)) end end end end end, }) minetest.register_node("default:toxic_water_source", { description = "Toxic_Water Source", inventory_image = minetest.inventorycube("default_toxic_water.png"), drawtype = "liquid", tiles = { { name = "default_toxic_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_toxic_water_source_animated.png", animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 2.0, }, backface_culling = false, }, }, alpha = 240, paramtype = "light", walkable = false, pointable = false, diggable = false, buildable_to = true, is_ground_content = false, drop = "", drowning = 1, liquidtype = "source", liquid_alternative_flowing = "default:toxic_water_flowing", liquid_alternative_source = "default:toxic_water_source", liquid_viscosity =3, damage_per_second = 3*2, post_effect_color = {a = 255, r = 30, g = 60, b = 90}, groups = {water = 3, liquid = 3, puts_out_fire = 1, radioactive = (state == "source" and 3 or 3),}, }) --NOTES: -- radioactive = (state == "source" and 32 or 16), --THIS IS DEFAULT SETTING FROM TECHNIC minetest.register_node("default:toxic_water_flowing", { description = "Toxic_Flowing Water", inventory_image = minetest.inventorycube("default_toxic_water.png"), drawtype = "flowingliquid", tiles = {"default_toxic_water.png"}, special_tiles = { { name = "default_toxic_water_flowing_animated.png", backface_culling = false, animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 0.8, }, }, { name = "default_toxic_water_flowing_animated.png", backface_culling = true, animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 0.8, }, }, }, alpha = 240, paramtype = "light", paramtype2 = "flowingliquid", walkable = false, pointable = false, diggable = false, buildable_to = true, is_ground_content = false, drop = "", drowning = 1, liquidtype = "flowing", liquid_alternative_flowing = "default:toxic_water_flowing", liquid_alternative_source = "default:toxic_water_source", liquid_viscosity = 2, damage_per_second = 2*2, post_effect_color = {a = 255, r = 30, g = 60, b = 90}, groups = {water = 3, liquid = 3, puts_out_fire = 1, not_in_creative_inventory = 1, radioactive = (state == "source" and 2 or 2),}, }) --[[--FOR REF -- Quicksand (old style, sinking inside shows black instead of yellow effect, -- works ok with noclip enabled though) minetest.register_node("ethereal:quicksand", { description = "Quicksand", tiles = {"default_sand.png"}, drop = "default:sand", liquid_viscosity = 15, liquidtype = "source", liquid_alternative_flowing = "ethereal:quicksand", liquid_alternative_source = "ethereal:quicksand", liquid_renewable = false, liquid_range = 0, drowning = 1, walkable = false, climbable = false, post_effect_color = { r=230, g=210, b=160, a=245 }, groups = {crumbly=3, falling_node=1, sand=1, liquid=3, disable_jump=1}, sounds = default.node_sound_sand_defaults(), }) ]] minetest.register_node("default:mud", { description = "Mud Source", inventory_image = minetest.inventorycube("default_mud.png"), drawtype = "liquid", tiles = {"default_mud.png"}, --[[ tiles = { { name = "default_mud_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_mud_source_animated.png", animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 2.0, }, backface_culling = false, }, },]] alpha = 255, paramtype = "light", walkable = false, pointable = false, diggable = false, buildable_to = true, is_ground_content = false, drop = "", drowning = 1, damage_per_second = 3*2, liquidtype = "source", liquid_alternative_flowing = "default:mud_flowing", liquid_alternative_source = "default:mud", liquid_viscosity = 18, post_effect_color = {a = 255, r = 43, g = 23, b = 9}, groups = {water = 3, liquid = 3, puts_out_fire = 1, radioactive = (state == "source" and 8 or 8),}, }) minetest.register_node("default:mud_flowing", { description = "Flowing mud", inventory_image = minetest.inventorycube("default_mud.png"), drawtype = "liquid",--change to liquid for a solid look tiles = {"default_mud.png"}, special_tiles = { { name = "default_mud_flowing_animated.png", backface_culling = false, animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 0.8, }, }, { name = "default_mud_flowing_animated.png", backface_culling = true, animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 0.8, }, }, }, alpha = 250, paramtype = "light", paramtype2 = "flowingliquid", walkable = false, pointable = false, diggable = false, buildable_to = true, is_ground_content = false, drop = "", drowning = 1, damage_per_second = 3*2, liquidtype = "flowing", liquid_alternative_flowing = "default:mud_flowing", liquid_alternative_source = "default:mud", liquid_viscosity = 19, post_effect_color = {a = 255, r = 43, g = 23, b = 9}, groups = {water = 3, liquid = 3, puts_out_fire = 1, not_in_creative_inventory = 1, radioactive = (state == "source" and 4 or 4),}, }) 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_source_animated.png", animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 2.0, }, backface_culling = false, }, }, alpha = 160, paramtype = "light", walkable = false, pointable = false, diggable = false, buildable_to = true, is_ground_content = false, drop = "", drowning = 1, liquidtype = "source", liquid_alternative_flowing = "default:water_flowing", liquid_alternative_source = "default:water_source", liquid_viscosity = 1, post_effect_color = {a = 120, r = 30, g = 60, b = 90}, groups = {water = 3, liquid = 3, puts_out_fire = 1, radioactive =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 = { { name = "default_water_flowing_animated.png", backface_culling = false, animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 0.8, }, }, { name = "default_water_flowing_animated.png", backface_culling = true, animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 0.8, }, }, }, alpha = 160, paramtype = "light", paramtype2 = "flowingliquid", walkable = false, pointable = false, diggable = false, buildable_to = true, is_ground_content = false, drop = "", drowning = 1, liquidtype = "flowing", liquid_alternative_flowing = "default:water_flowing", liquid_alternative_source = "default:water_source", liquid_viscosity = 1, post_effect_color = {a = 120, r = 30, g = 60, b = 90}, groups = {water = 3, liquid = 3, puts_out_fire = 1, not_in_creative_inventory = 1, radioactive =1}, }) minetest.register_node("default:river_water_source", { description = "River Water Source", inventory_image = minetest.inventorycube("default_river_water.png"), drawtype = "liquid", tiles = { { name = "default_river_water_source_animated.png", animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 2.0, }, }, }, special_tiles = { { name = "default_river_water_source_animated.png", animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 2.0, }, backface_culling = false, }, }, alpha = 160, paramtype = "light", walkable = false, pointable = false, diggable = false, buildable_to = true, is_ground_content = false, drop = "", drowning = 1, liquidtype = "source", liquid_alternative_flowing = "default:river_water_flowing", liquid_alternative_source = "default:river_water_source", liquid_viscosity = 1, liquid_renewable = false, liquid_range = 2, post_effect_color = {a = 120, r = 30, g = 76, b = 90}, groups = {water = 3, liquid = 3, puts_out_fire = 1}, }) minetest.register_node("default:river_water_flowing", { description = "Flowing River Water", inventory_image = minetest.inventorycube("default_river_water.png"), drawtype = "flowingliquid", tiles = {"default_river_water.png"}, special_tiles = { { name = "default_river_water_flowing_animated.png", backface_culling = false, animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 0.8, }, }, { name = "default_river_water_flowing_animated.png", backface_culling = true, animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 0.8, }, }, }, alpha = 160, paramtype = "light", paramtype2 = "flowingliquid", walkable = false, pointable = false, diggable = false, buildable_to = true, is_ground_content = false, drop = "", drowning = 1, liquidtype = "flowing", liquid_alternative_flowing = "default:river_water_flowing", liquid_alternative_source = "default:river_water_source", liquid_viscosity = 1, liquid_renewable = false, liquid_range = 2, post_effect_color = {a = 120, r = 30, g = 76, b = 90}, groups = {water = 3, liquid = 3, puts_out_fire = 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_source_animated.png", animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 3.0, }, backface_culling = false, }, }, paramtype = "light", light_source = default.LIGHT_MAX - 1, walkable = false, pointable = false, diggable = false, buildable_to = true, is_ground_content = false, drop = "", drowning = 1, liquidtype = "source", liquid_alternative_flowing = "default:lava_flowing", liquid_alternative_source = "default:lava_source", liquid_viscosity = 7, liquid_renewable = false, 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:lava_flowing", { description = "Flowing Lava", inventory_image = minetest.inventorycube("default_lava.png"), drawtype = "flowingliquid", tiles = {"default_lava.png"}, special_tiles = { { name = "default_lava_flowing_animated.png", backface_culling = false, animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 3.3, }, }, { name = "default_lava_flowing_animated.png", backface_culling = true, animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 3.3, }, }, }, paramtype = "light", paramtype2 = "flowingliquid", light_source = default.LIGHT_MAX - 1, walkable = false, pointable = false, diggable = false, buildable_to = true, is_ground_content = false, drop = "", drowning = 1, liquidtype = "flowing", liquid_alternative_flowing = "default:lava_flowing", liquid_alternative_source = "default:lava_source", liquid_viscosity = 7, liquid_renewable = false, 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}, }) -- -- Tools / "Advanced" crafting / Non-"natural" -- minetest.register_node("default:torch", { description = "Torch", drawtype = "torchlike", 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, is_ground_content = false, walkable = false, light_source = default.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(), }) local chest_formspec = "size[8,9]" .. default.gui_bg .. default.gui_bg_img .. default.gui_slots .. "list[current_name;main;0,0.3;8,4;]" .. "list[current_player;main;0,4.85;8,1;]" .. "list[current_player;main;0,6.08;8,3;8]" .. "listring[current_name;main]" .. "listring[current_player;main]" .. default.get_hotbar_bg(0,4.85) local function get_locked_chest_formspec(pos) local spos = pos.x .. "," .. pos.y .. "," .. pos.z local formspec = "size[8,9]" .. default.gui_bg .. default.gui_bg_img .. default.gui_slots .. "list[nodemeta:" .. spos .. ";main;0,0.3;8,4;]" .. "list[current_player;main;0,4.85;8,1;]" .. "list[current_player;main;0,6.08;8,3;8]" .. "listring[nodemeta:" .. spos .. ";main]" .. "listring[current_player;main]" .. default.get_hotbar_bg(0,4.85) return formspec 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", { 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 = {choppy = 2}, legacy_facedir_simple = true, is_ground_content = false, sounds = default.node_sound_wood_defaults(), on_construct = function(pos) local meta = minetest.get_meta(pos) meta:set_string("formspec", chest_formspec) 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.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, }) 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 = {choppy = 2}, legacy_facedir_simple = true, is_ground_content = false, sounds = default.node_sound_wood_defaults(), after_place_node = function(pos, placer) local meta = minetest.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.get_meta(pos) 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.get_meta(pos); local inv = meta:get_inventory() return inv:is_empty("main") and has_locked_chest_privilege(meta, player) end, allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) local meta = minetest.get_meta(pos) if not has_locked_chest_privilege(meta, player) then return 0 end return count end, allow_metadata_inventory_put = function(pos, listname, index, stack, player) local meta = minetest.get_meta(pos) if not has_locked_chest_privilege(meta, player) then return 0 end return stack:get_count() end, allow_metadata_inventory_take = function(pos, listname, index, stack, player) local meta = minetest.get_meta(pos) if not has_locked_chest_privilege(meta, player) then return 0 end return stack:get_count() 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, on_rightclick = function(pos, node, clicker) local meta = minetest.get_meta(pos) if has_locked_chest_privilege(meta, clicker) then minetest.show_formspec( clicker:get_player_name(), "default:chest_locked", get_locked_chest_formspec(pos) ) end end, on_blast = function() end, }) local bookshelf_formspec = "size[8,7;]" .. default.gui_bg .. default.gui_bg_img .. default.gui_slots .. "list[context;books;0,0.3;8,2;]" .. "list[current_player;main;0,2.85;8,1;]" .. "list[current_player;main;0,4.08;8,3;8]" .. "listring[context;books]" .. "listring[current_player;main]" .. default.get_hotbar_bg(0,2.85) minetest.register_node("default:bookshelf", { description = "Bookshelf", tiles = {"default_wood.png", "default_wood.png", "default_bookshelf.png"}, is_ground_content = false, groups = {choppy = 3, flammable = 3}, sounds = default.node_sound_wood_defaults(), on_construct = function(pos) local meta = minetest.get_meta(pos) meta:set_string("formspec", bookshelf_formspec) local inv = meta:get_inventory() inv:set_size("books", 8 * 2) end, can_dig = function(pos,player) local meta = minetest.get_meta(pos); local inv = meta:get_inventory() return inv:is_empty("books") end, allow_metadata_inventory_put = function(pos, listname, index, stack, player) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() local to_stack = inv:get_stack(listname, index) if listname == "books" then if minetest.get_item_group(stack:get_name(), "book") ~= 0 and to_stack:is_empty() then return 1 else return 0 end end end, allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() local stack = inv:get_stack(from_list, from_index) local to_stack = inv:get_stack(to_list, to_index) if to_list == "books" then if minetest.get_item_group(stack:get_name(), "book") ~= 0 and to_stack:is_empty() then return 1 else return 0 end end 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 bookshelf 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 bookshelf 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 bookshelf at " .. minetest.pos_to_string(pos)) end, }) minetest.register_node("default:sign_wall", { description = "Sign", drawtype = "nodebox", tiles = {"default_sign.png"}, inventory_image = "default_sign_wall.png", wield_image = "default_sign_wall.png", paramtype = "light", paramtype2 = "wallmounted", sunlight_propagates = true, is_ground_content = false, walkable = false, node_box = { type = "wallmounted", wall_top = {-0.4375, 0.4375, -0.3125, 0.4375, 0.5, 0.3125}, wall_bottom = {-0.4375, -0.5, -0.3125, 0.4375, -0.4375, 0.3125}, wall_side = {-0.5, -0.3125, -0.4375, -0.4375, 0.3125, 0.4375}, }, groups = {choppy = 2, dig_immediate = 2, attached_node = 1}, legacy_wallmounted = true, sounds = default.node_sound_defaults(), on_construct = function(pos) --local n = minetest.get_node(pos) local meta = minetest.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)) if minetest.is_protected(pos, sender:get_player_name()) then minetest.record_protection_violation(pos, sender:get_player_name()) return end local meta = minetest.get_meta(pos) if not fields.text then return end minetest.log("action", (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:ladder", { description = "Ladder", drawtype = "signlike", tiles = {"default_ladder.png"}, inventory_image = "default_ladder.png", wield_image = "default_ladder.png", paramtype = "light", paramtype2 = "wallmounted", sunlight_propagates = true, walkable = false, climbable = true, is_ground_content = false, selection_box = { type = "wallmounted", --wall_top = = --wall_bottom = = --wall_side = = }, groups = {choppy = 2, oddly_breakable_by_hand = 3, flammable = 2}, legacy_wallmounted = true, sounds = default.node_sound_wood_defaults(), }) local fence_texture = "default_fence_overlay.png^default_wood.png^default_fence_overlay.png^[makealpha:255,126,126" minetest.register_node("default:fence_wood", { description = "Wooden Fence", drawtype = "fencelike", tiles = {"default_wood.png"}, inventory_image = fence_texture, wield_image = fence_texture, paramtype = "light", sunlight_propagates = true, is_ground_content = false, selection_box = { type = "fixed", fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7}, }, groups = {choppy = 2, flammable = 2}, sounds = default.node_sound_wood_defaults(), }) minetest.register_node("default:glass", { description = "Glass", drawtype = "glasslike_framed_optional", tiles = {"default_glass.png", "default_glass_detail.png"}, inventory_image = minetest.inventorycube("default_glass.png"), paramtype = "light", sunlight_propagates = true, is_ground_content = false, groups = {cracky = 3, oddly_breakable_by_hand = 3}, sounds = default.node_sound_glass_defaults(), }) minetest.register_node("default:obsidian_glass", { description = "Obsidian Glass", drawtype = "glasslike", tiles = {"default_obsidian_glass.png"}, paramtype = "light", is_ground_content = false, sunlight_propagates = true, sounds = default.node_sound_glass_defaults(), groups = {cracky = 3, oddly_breakable_by_hand = 3}, }) 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", sunlight_propagates = true, walkable = false, is_ground_content = 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, dig_immediate = 2, attached_node = 1, connect_to_raillike = minetest.raillike_group("rail")}, }) minetest.register_node("default:brick", { description = "Brick Block", tiles = {"default_brick.png"}, is_ground_content = false, groups = {cracky = 3}, sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:meselamp", { description = "Mese Lamp", drawtype = "glasslike", tiles = {"default_meselamp.png"}, paramtype = "light", sunlight_propagates = true, is_ground_content = false, groups = {cracky = 3, oddly_breakable_by_hand = 3}, sounds = default.node_sound_glass_defaults(), light_source = default.LIGHT_MAX, }) -- -- Misc -- minetest.register_node("default:inv", { description = "inv", tiles = {"default_invis.png"}, wield_image = "unknown_node.png", drawtype = "airlike", paramtype = "light", sunlight_propagates = true, walkable = false, pointable = false, diggable = false, buildable_to = true, air_equivalent = true, drop = "", groups = {not_in_creative_inventory=1}, }) minetest.register_node("default:cloud", { description = "Cloud", tiles = {"default_cloud.png"}, is_ground_content = false, sounds = default.node_sound_defaults(), groups = {not_in_creative_inventory = 1}, }) 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}, is_ground_content = false, legacy_facedir_simple = true, sounds = default.node_sound_defaults(), }) minetest.register_node("default:nyancat_rainbow", { description = "Nyan Cat Rainbow", tiles = { "default_nc_rb.png^[transformR90", "default_nc_rb.png^[transformR90", "default_nc_rb.png", "default_nc_rb.png" }, paramtype2 = "facedir", groups = {cracky = 2}, is_ground_content = false, sounds = default.node_sound_defaults(), })