308 lines
7.2 KiB
Lua
308 lines
7.2 KiB
Lua
-- boilerplate to support localized strings if intllib mod is installed
|
|
|
|
local S
|
|
if minetest.global_exists("intllib") then
|
|
if intllib.make_gettext_pair then
|
|
-- New method using gettext.
|
|
S = intllib.make_gettext_pair()
|
|
else
|
|
-- Old method using text files.
|
|
S = intllib.Getter()
|
|
end
|
|
else
|
|
S = function(s) return s end
|
|
end
|
|
|
|
|
|
-- WORMS --------------------------------------------------
|
|
|
|
minetest.register_node("glow:cave_worms", {
|
|
description = S("Glow Worms"),
|
|
drawtype = "nodebox",
|
|
tiles = { "worms.png" },
|
|
inventory_image = "worms.png",
|
|
wield_image = "worms.png",
|
|
groups = { dig_immediate = 2 },
|
|
sounds = default.node_sound_stone_defaults(),
|
|
drop = "glow:cave_worms",
|
|
paramtype = "light",
|
|
light_source = 4,
|
|
paramtype2 = "facedir",
|
|
sunlight_propagates = true,
|
|
walkable = false,
|
|
node_box = {
|
|
type = "fixed",
|
|
fixed = { -1/2, -1/2, -1/2, 1/2, -15/32, 1/2 },
|
|
},
|
|
selection_box = {
|
|
type = "fixed",
|
|
fixed = { -1/2, -1/2, -1/2, 1/2, -7/16, 1/2 },
|
|
},
|
|
on_place = minetest.rotate_node,
|
|
})
|
|
|
|
local function near_surface(pos)
|
|
for dx = -1, 1, 1 do
|
|
for dy = -1, 1, 1 do
|
|
for dz = -1, 1, 1 do
|
|
local dpos = { x=pos.x+dx, y=pos.y+dy, z=pos.z+dz }
|
|
local light = minetest.get_node_light(dpos, 0.5) -- 0.5 means noon
|
|
if light and light > 5 then
|
|
return true
|
|
end
|
|
end
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
local function place_worms(pos)
|
|
local axes = {
|
|
{ x=pos.x, y=pos.y-1, z=pos.z },
|
|
{ x=pos.x, y=pos.y, z=pos.z-1 },
|
|
{ x=pos.x, y=pos.y, z=pos.z+1 },
|
|
{ x=pos.x-1, y=pos.y, z=pos.z },
|
|
{ x=pos.x+1, y=pos.y, z=pos.z },
|
|
{ x=pos.x, y=pos.y+1, z=pos.z },
|
|
}
|
|
for i, cpos in ipairs(axes) do
|
|
if minetest.get_node(cpos).name == "default:stone" then
|
|
local facedir = (i-1) * 4 + math.random(0, 3) -- see 6d facedir info
|
|
minetest.set_node(pos, { name = "glow:cave_worms", param2 = facedir })
|
|
return
|
|
end
|
|
end
|
|
end
|
|
|
|
local function make_worms(pos)
|
|
local spot = minetest.find_node_near(pos, 1, "air")
|
|
if not spot or near_surface(spot) then
|
|
return
|
|
end
|
|
local minp = vector.subtract(pos, 6)
|
|
local maxp = vector.add(pos, 6)
|
|
if #(minetest.find_nodes_in_area(minp, maxp, "default:lava_source")) == 0
|
|
and #(minetest.find_nodes_in_area(minp, maxp, "glow:cave_worms")) == 0
|
|
and #(minetest.find_nodes_in_area(minp, maxp, "group:water")) > 1 then
|
|
place_worms(spot)
|
|
end
|
|
end
|
|
|
|
minetest.register_on_generated(function(minp, maxp)
|
|
for _,pos in pairs(minetest.find_nodes_in_area(minp, maxp, "default:stone")) do
|
|
if math.random() < 0.001 then
|
|
make_worms(pos)
|
|
end
|
|
end
|
|
end)
|
|
|
|
minetest.register_abm({
|
|
nodenames = { "default:stone" },
|
|
neighbors = { "air" },
|
|
interval = 120.0,
|
|
chance = 200,
|
|
action = make_worms,
|
|
})
|
|
|
|
minetest.register_abm({
|
|
nodenames = { "glow:cave_worms" },
|
|
interval = 60.0,
|
|
chance = 10,
|
|
action = function(pos)
|
|
if math.random() < 0.7 then
|
|
local minp = vector.subtract(pos, 2)
|
|
local maxp = vector.add(pos, 2)
|
|
local worms_count = #(minetest.find_nodes_in_area(minp, maxp, "glow:cave_worms"))
|
|
if worms_count < 20 then
|
|
local spot = minetest.find_node_near(pos, 3, "air")
|
|
if spot and not near_surface(spot) then
|
|
place_worms(spot)
|
|
return
|
|
end
|
|
end
|
|
end
|
|
minetest.remove_node(pos)
|
|
end,
|
|
})
|
|
|
|
--[[
|
|
function is_facing(pos, nodename)
|
|
for d = -1, 1, 2 do
|
|
if nodename == minetest.get_node({pos.x+d, pos.y, pos.z }).name then return true end
|
|
if nodename == minetest.get_node({pos.x, pos.y+d, pos.z }).name then return true end
|
|
if nodename == minetest.get_node({pos.x, pos.y, pos.z+d}).name then return true end
|
|
end
|
|
return false
|
|
end--]]
|
|
|
|
-- clean up stupid way of doing worms ---------------------
|
|
|
|
minetest.register_node("glow:stone_with_worms", {
|
|
description = S("Glow Worms in Stone"),
|
|
tiles = { "default_stone.png^worms.png" },
|
|
is_ground_content = true,
|
|
groups = { cracky = 1 },
|
|
sounds = default.node_sound_stone_defaults(),
|
|
drop = "glow:stone_with_worms",
|
|
paramtype = "light",
|
|
light_source = 4,
|
|
})
|
|
|
|
minetest.register_abm({
|
|
nodenames = { "glow:stone_with_worms" },
|
|
interval = 60.0,
|
|
chance = 1,
|
|
action = function(pos)
|
|
minetest.set_node(pos, { name = "default:stone" })
|
|
end,
|
|
})
|
|
|
|
|
|
-- SHROOMS -------------------------------------------------
|
|
|
|
minetest.register_node("glow:shrooms", {
|
|
description = S("Glow Shrooms"),
|
|
drawtype = "plantlike",
|
|
tiles = { "shrooms.png" },
|
|
inventory_image = "shrooms.png",
|
|
wield_image = "shrooms.png",
|
|
drop = 'glow:shrooms',
|
|
groups = { snappy=3, flammable=2, flower=1, flora=1, attached_node=1 },
|
|
sunlight_propagates = true,
|
|
walkable = false,
|
|
pointable = true,
|
|
diggable = true,
|
|
climbable = false,
|
|
buildable_to = true,
|
|
paramtype = "light",
|
|
light_source = 3,
|
|
sounds = default.node_sound_leaves_defaults(),
|
|
selection_box = {
|
|
type = "fixed",
|
|
fixed = { -0.4, -0.5, -0.4, 0.4, 0.0, 0.4 },
|
|
},
|
|
})
|
|
|
|
local function add_shrooms(pos)
|
|
if minetest.find_node_near(pos, 2, "glow:shrooms") then
|
|
return
|
|
end
|
|
for nx = -1, 1, 2 do
|
|
for nz = -1, 1, 2 do
|
|
for ny = 1, -1, -1 do
|
|
if math.random() < 0.2 then
|
|
local p = { x=pos.x+nx, y=pos.y-1+ny, z=pos.z+nz }
|
|
if minetest.get_item_group(minetest.get_node(p).name, "soil") ~= 0 then
|
|
p.y = p.y+1
|
|
if minetest.get_node(p).name == "air" then
|
|
minetest.set_node(p, { name = "glow:shrooms" })
|
|
end
|
|
break
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
minetest.register_on_generated(function(minp, maxp, seed)
|
|
for _,pos in pairs(minetest.find_nodes_in_area(minp, maxp, "default:tree")) do
|
|
if math.random() < 0.2
|
|
and minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name ~= "default:tree" then
|
|
add_shrooms(pos)
|
|
end
|
|
end
|
|
end)
|
|
|
|
minetest.register_abm({
|
|
nodenames = { "default:tree" },
|
|
neighbors = {
|
|
"air",
|
|
"group:soil",
|
|
},
|
|
interval = 60.0,
|
|
chance = 60,
|
|
action = function(pos)
|
|
local minp = vector.subtract(pos, 1)
|
|
local maxp = vector.add(pos, 1)
|
|
local shroom_count = #(minetest.find_nodes_in_area(minp, maxp, "glow:shrooms"))
|
|
if shroom_count == 0 or (shroom_count == 1 and math.random() < 0.3) then
|
|
add_shrooms(pos)
|
|
end
|
|
end,
|
|
})
|
|
|
|
minetest.register_abm({
|
|
nodenames = { "glow:shrooms" },
|
|
neighbors = {
|
|
"air",
|
|
"group:soil",
|
|
},
|
|
interval = 40.0,
|
|
chance = 10,
|
|
action = function(pos)
|
|
if math.random() < 0.3 then
|
|
add_shrooms(pos)
|
|
else
|
|
minetest.remove_node(pos)
|
|
end
|
|
end,
|
|
})
|
|
|
|
|
|
-- FIREFLIES ----------------------------------------------
|
|
|
|
minetest.register_node("glow:fireflies", {
|
|
description = S("Fireflies"),
|
|
drawtype = "glasslike",
|
|
tiles = {
|
|
{
|
|
name = "fireflies.png",
|
|
animation = {
|
|
type = "vertical_frames",
|
|
aspect_w = 16,
|
|
aspect_h = 16,
|
|
length = 2,
|
|
},
|
|
},
|
|
},
|
|
alpha = 100,
|
|
paramtype = "light",
|
|
light_source = 4,
|
|
walkable = false,
|
|
pointable = false,
|
|
diggable = false,
|
|
climbable = false,
|
|
buildable_to = true,
|
|
drop = "",
|
|
})
|
|
|
|
minetest.register_abm({
|
|
nodenames = { "air" },
|
|
neighbors = {
|
|
"default:grass_1",
|
|
"default:grass_2",
|
|
"default:grass_3",
|
|
"default:grass_4",
|
|
"default:grass_5",
|
|
},
|
|
interval = 2.0,
|
|
chance = 300,
|
|
action = function(pos)
|
|
local time = minetest.get_timeofday()
|
|
if time <= 0.74 and time >= 0.22 then
|
|
return
|
|
end
|
|
if not minetest.find_node_near(pos, 9, "glow:fireflies") then
|
|
minetest.set_node(pos, {name = "glow:fireflies"})
|
|
end
|
|
end,
|
|
})
|
|
|
|
minetest.register_abm({
|
|
nodenames = {"glow:fireflies"},
|
|
interval = 1.0,
|
|
chance = 2,
|
|
action = minetest.remove_node,
|
|
})
|