twmlib/init.lua

81 lines
2.3 KiB
Lua

twmlib = {}
twmlib.registered_twm = {}
function twmlib.next_interval()
return tonumber(minetest.settings:get("twmlib.interval")) or 2
end
local mod_path = minetest.get_modpath(minetest.get_current_modname())
function twmlib.register_twm(twm_definition)
for _, nodename in ipairs(twm_definition.nodenames) do
if twmlib.registered_twm[nodename] == nil then
twmlib.registered_twm[nodename] = {}
end
table.insert(twmlib.registered_twm[nodename], twm_definition)
end
end
local range = (minetest.settings:get("active_block_range") or 3) * 16
local function loop()
-- Take one player at random
local players = minetest.get_connected_players()
if #players == 0 then return end -- players not loaded yet
local picked = players[math.random(1, #players)]
-- Take a random position around
local pos = picked:get_pos()
if not pos then return end -- player not positioned yet
pos.y = pos.y + math.random(-range, range)
pos.x = pos.x + math.random(-range, range)
pos.z = pos.z + math.random(-range, range)
local rand_pos = vector.new(pos.x, pos.y, pos.z)
local node = minetest.get_node(rand_pos)
if node.name == "air" then
-- go up or down a few times until something is found
local dy = (math.random() > 0.5)
if dy then
dy = 1
else
dy = -1
end
local i = 0
while i < range / 2 and node.name == "air" do
rand_pos = vector.add(rand_pos, vector.new(0, dy, 0))
node = minetest.get_node(rand_pos)
i = i + 1
end
end
if node.name == "air" or node.name == "ignore" then return end
-- look for a registered twm for the node or group
if twmlib.registered_twm[node.name] then
-- trigger twm by node
for _, def in ipairs(twmlib.registered_twm[node.name]) do
if def.chance then
if math.random(1, def.chance) == 1 then
def.action(rand_pos, node)
end
else
def.action(rand_pos, node)
end
end
end
local node_def = minetest.registered_nodes[node.name]
for group, level in ipairs(node_def.groups) do
local str_group = "group:" .. group
if twmlib.registered_twm[str_group] then
-- trigger twm by group
for _, def in ipairs(twmlib.registered_twm[str_group]) do
if def.chance then
if math.random(1, def.chance) == 1 then
def.action(rand_pos, node)
end
else
def.action(rand_pos, node)
end
end
end
end
minetest.after(twmlib.next_interval(), loop)
end
minetest.after(twmlib.next_interval(), loop)