diff --git a/mods/mobs/api.lua b/mods/mobs/api.lua index a2c68d07..4e67e7c5 100755 --- a/mods/mobs/api.lua +++ b/mods/mobs/api.lua @@ -2142,6 +2142,62 @@ end -- END mobs:register_mob function mobs.spawning_mobs = {} +function mobs:spawn_special(name, nodes, neighbors, interval, chance, active_object_count) -- MFF to special mobs + mobs.spawning_mobs[name] = true + -- chance override in minetest.conf for registered mob + local new_chance = tonumber(minetest.setting_get(name .. "_chance")) + if new_chance ~= nil then + if new_chance == 0 then + return + end + chance = new_chance + end + + minetest.register_abm({ + nodenames = nodes, + neighbors = neighbors, + interval = interval, + chance = chance, + action = function(pos, node, _, active_object_count_wider) + -- do not spawn if too many active entities in area + local count = 0 + local objs = minetest.get_objects_inside_radius(pos, 60) + for k, obj in pairs(objs) do + if obj:get_luaentity() ~= nil and obj:get_luaentity().name == name then + count = count + 1 + end + end + if count > active_object_count then + return + end + -- spawn above node + pos.y = pos.y + 1 + -- only spawn away from player + local objs = minetest.get_objects_inside_radius(pos, 10) + for _,oir in pairs(objs) do + if oir:is_player() then + return + end + end + + -- are we spawning inside solid nodes? + if minetest.registered_nodes[node_ok(pos).name].walkable == true then + return + end + + pos.y = pos.y + 1 + if minetest.registered_nodes[node_ok(pos).name].walkable == true then + return + end + + -- spawn mob half block higher than ground + pos.y = pos.y - 0.5 + minetest.add_entity(pos, name) + end + }) +end + + function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, interval, chance, active_object_count, min_height, max_height, spawn_in_area, day_toggle) --MFF crabman "spawn_in_area" diff --git a/mods/mobs/mese_dragon.lua b/mods/mobs/mese_dragon.lua index b2a96dcc..9fbd02bb 100644 --- a/mods/mobs/mese_dragon.lua +++ b/mods/mobs/mese_dragon.lua @@ -118,7 +118,7 @@ minetest.register_node("mobs:mese_dragon_spawner", { }) }) ---(name, nodes, neighbors, min_light, max_light, interval, chance, active_object_count, min_height, max_height, spawn_in_area) --- spawn on mobs:mese_dragon_spawner between 1 and 20 light, interval 300, 1 chance, 1 mese_dragon_spawner in area up to 31000 in height -mobs:spawn_specific("mobs:mese_dragon", {"mobs:mese_dragon_spawner"}, {"air"}, 1, 20, 300, 1, 100, -31000, 31000, true) +--(name, nodes, neighbors, interval, chance, active_object_count) +-- spawn on mobs:mese_dragon_spawner, interval 300, 1 chance, 1 mese_dragon_spawner +mobs:spawn_special("mobs:mese_dragon", {"mobs:mese_dragon_spawner"}, {"air"}, 300, 1, 1) mobs:register_egg("mobs:mese_dragon", "Mese Dragon", "mobs_mese_dragon_inv.png", 1) diff --git a/mods/mobs/pumpkins.lua b/mods/mobs/pumpkins.lua index 2a2c1d59..bf1f022d 100755 --- a/mods/mobs/pumpkins.lua +++ b/mods/mobs/pumpkins.lua @@ -133,6 +133,6 @@ minetest.register_node("mobs:pumpboom_spawner", { mobs:spawn_specific("mobs:pumpking", {"mobs:pumpking_spawner"}, {"air"}, 1, 20, 300, 1, 100, -31000, 31000, true) mobs:register_egg("mobs:pumpking", "Pumpking", "mobs_pumpking_inv.png", 1) --- spawn on mobs:pumpboom_spawner between 1 and 20 light, 4 interval, 1 chance, 100 pumpboom in area up to 31000 in height -mobs:spawn_specific("mobs:pumpboom", {"mobs:pumpboom_spawner"}, {"air"}, 1, 20, 10, 4, 100, -31000, 31000, true) +-- spawn on mobs:pumpboom_spawner, 4 interval, 1 chance, 30 pumpboom in area +mobs:spawn_special("mobs:pumpboom", {"mobs:pumpboom_spawner"}, {"air"}, 10, 4, 30) mobs:register_egg("mobs:pumpboom", "Pumpboom", "mobs_pumpboom_inv.png", 1)