minetest-spawntrap/trap.lua

95 lines
2.6 KiB
Lua

-- The trap node
minetest.register_node("spawnstep:spawntrap",{
description = "Spawn a mob depending on the block beneath it",
tiles = spawnstep.tiles,
drawtype = "normal",
groups = {crumbly = 1},
on_dig = function(pos,node,player)
if minetest.check_player_privs(player:get_player_name(), {digspawntrap=true}) then
minetest.remove_node(pos)
end
end
})
if spawnstep.craftable == true then
core.register_craft({
output="spawnstep:spawntrap",
recipe={
{"","default:mese",""},
{"","default:obsidian",""},
{"default:diamondblock","default:obsidian","default:diamondblock"},
}
})
end
local count_nearby_mobs = function(pos,radius)
-- check if there are entities around already
local objcount = 0
for _,obj in pairs(minetest.get_objects_inside_radius(pos ,radius)) do
if not obj:is_player() then
objcount = objcount+1
end
end
return objcount
end
local match_from_pairs = function(lookuptable,tellernode)
for _,mobnode in pairs(lookuptable) do
-- if match, return mobstring
if mobnode.node == tellernode then
return mobnode.mob
end
end
return nil
end
local get_tellerpos = function(pos)
local tellerpos = {x=pos.x, y=pos.y-1, z=pos.z}
if spawnstep.overmode == true then
tellerpos = {x=pos.x, y=pos.y+1, z=pos.z}
end
return tellerpos
end
local get_mob_from_node = function(pos)
-- return the expected mob, or nil if none matches
-- get node under or over position
local tellerpos = get_tellerpos(pos)
local tellernode = minetest.get_node(tellerpos).name
return match_from_pairs(spawnstep.mobnodes,tellernode)
end
minetest.register_abm{
nodenames = {"spawnstep:spawntrap"},
neighbors = nil,
interval = spawnstep.interval,
chance = 1,
action = function(pos)
for _,obj in pairs(minetest.get_objects_inside_radius(pos ,spawnstep.proximity)) do
if obj:is_player() then
minetest.debug("Player "..obj:get_player_name().." triggered spawn trap")
if count_nearby_mobs(pos,math.ceil(spawnstep.spawnrange*1.4)) < spawnstep.maxmobs then
local mobname = get_mob_from_node(pos)
if mobname ~= nil then
local mobnicename = mobname:sub(mobname:find(':')+1,#mobname )
minetest.chat_send_player(obj:get_player_name(),"A wild "..mobnicename.." appeared!")
spawnstep.spawn_mob(pos,mobname)
if spawnstep.remove == true then
minetest.remove_node(pos)
end
if spawnstep.removeteller == true then
minetest.remove_node(get_tellerpos(pos))
end
else
minetest.debug("Failed to determine a mob.")
end
else
minetest.debug("Too many mobs. Not spawning.")
end
end
end
end,
}