95 lines
2.7 KiB
Lua
95 lines
2.7 KiB
Lua
|
function creatures.register_spawner(mob,size,offset,mesh,texture,range,max,max_ll,min_ll,day_only)
|
||
|
local DUMMY = {
|
||
|
hp_max = 1,
|
||
|
physical = true,
|
||
|
collisionbox = {0,0,0,0,0,0},
|
||
|
visual = "mesh",
|
||
|
visual_size = size,
|
||
|
mesh = mesh,
|
||
|
textures = texture,
|
||
|
makes_footstep_sound = false,
|
||
|
timer = 0,
|
||
|
automatic_rotate = math.pi * -2.9,
|
||
|
m_name = "dummy"
|
||
|
}
|
||
|
|
||
|
DUMMY.on_activate = function(self)
|
||
|
self.object:setvelocity({x=0, y=0, z=0})
|
||
|
self.object:setacceleration({x=0, y=0, z=0})
|
||
|
self.object:set_armor_groups({immortal=1})
|
||
|
end
|
||
|
|
||
|
DUMMY.on_step = function(self, dtime)
|
||
|
self.timer = self.timer + 0.01
|
||
|
local n = minetest.get_node_or_nil(self.object:getpos())
|
||
|
if self.timer > 1 then
|
||
|
if n and n.name and n.name ~= "creatures:"..mob.."_spawner" then
|
||
|
self.object:remove()
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
DUMMY.on_punch = function(self, hitter)
|
||
|
end
|
||
|
|
||
|
minetest.register_entity("creatures:dummy_"..mob, DUMMY)
|
||
|
|
||
|
-- node
|
||
|
minetest.register_node("creatures:"..mob.."_spawner", {
|
||
|
description = mob.." spawner",
|
||
|
paramtype = "light",
|
||
|
tiles = {"creatures_spawner.png"},
|
||
|
is_ground_content = true,
|
||
|
drawtype = "allfaces",
|
||
|
groups = {cracky=1,level=1},
|
||
|
drop = "",
|
||
|
on_construct = function(pos)
|
||
|
pos.y = pos.y + offset
|
||
|
minetest.env:add_entity(pos,"creatures:dummy_"..mob)
|
||
|
end,
|
||
|
on_destruct = function(pos)
|
||
|
for _,obj in ipairs(minetest.env:get_objects_inside_radius(pos, 1)) do
|
||
|
if not obj:is_player() then
|
||
|
if obj ~= nil and obj:get_luaentity().m_name == "dummy" then
|
||
|
obj:remove()
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
})
|
||
|
--abm
|
||
|
minetest.register_abm({
|
||
|
nodenames = {"creatures:"..mob.."_spawner"},
|
||
|
interval = 2.0,
|
||
|
chance = 20,
|
||
|
action = function(pos, node, active_object_count, active_object_count_wider)
|
||
|
local res,player_near = false
|
||
|
local mobs = 0
|
||
|
res,mobs,player_near = creatures.find_mates(pos, mob, range)
|
||
|
if player_near then
|
||
|
if mobs < max then
|
||
|
pos.x = pos.x+1
|
||
|
local p = minetest.find_node_near(pos, 5, {"air"})
|
||
|
local ll = minetest.env:get_node_light(p)
|
||
|
local wtime = minetest.env:get_timeofday()
|
||
|
if not ll then return end
|
||
|
if ll > max_ll then return end
|
||
|
if ll < min_ll then return end
|
||
|
if minetest.env:get_node(p).name ~= "air" then return end
|
||
|
p.y = p.y+1
|
||
|
if minetest.env:get_node(p).name ~= "air" then return end
|
||
|
if not day_only then
|
||
|
if (wtime > 0.2 and wtime < 0.805) and pos.y > 0 then return end
|
||
|
end
|
||
|
|
||
|
p.y = p.y-1
|
||
|
creatures.spawn(p, 1, "creatures:"..mob,range,max)
|
||
|
end
|
||
|
end
|
||
|
end })
|
||
|
end
|
||
|
|
||
|
-- spawner
|
||
|
creatures.register_spawner("zombie",{x=0.42,y=0.42},0.08,"creatures_mob.x",{"creatures_zombie.png"},17,6,7,-1,false)
|
||
|
creatures.register_spawner("sheep",{x=0.42,y=0.42},-0.3,"creatures_sheep.x",{"creatures_sheep.png"},17,6,18,10,true)
|