81 lines
2.3 KiB
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)
|