Added player detection to spawners
parent
72cd57aea7
commit
82ced7af84
|
@ -28,7 +28,7 @@ This mod contains the following additions:
|
|||
|
||||
Changelog:
|
||||
|
||||
1.25- Mobs no longer spawn within 12 blocks of player or despawn within same range. Code tidy and tweak.
|
||||
1.25- Mobs no longer spawn within 12 blocks of player or despawn within same range, spawners now have player detection, Code tidy and tweak.
|
||||
1.24- Added feature where certain animals run away when punched (runaway = true in mob definition)
|
||||
1.23- Added mob spawner block for admin to setup spawners in-game (place and right click to enter settings)
|
||||
1.22- Added ability to name tamed animals and npc using nametags, also npc will attack anyone who punches them apart from owner
|
||||
|
|
54
spawner.lua
54
spawner.lua
|
@ -1,6 +1,6 @@
|
|||
-- mob spawner
|
||||
|
||||
local spawner_default = "mobs:pumba 10 14 0"
|
||||
local spawner_default = "mobs:pumba 10 15 0 0"
|
||||
|
||||
minetest.register_node("mobs:spawner", {
|
||||
tiles = {"mob_spawner.png"},
|
||||
|
@ -15,13 +15,18 @@ minetest.register_node("mobs:spawner", {
|
|||
local meta = minetest.get_meta(pos)
|
||||
|
||||
-- text entry formspec
|
||||
meta:set_string("formspec", "field[text;mob_name min_light max_light amount;${command}]")
|
||||
meta:set_string("formspec", "field[text;Mob MinLight MaxLight Amount PlayerDist;${command}]")
|
||||
meta:set_string("infotext", "Spawner Not Active (enter settings)")
|
||||
meta:set_string("command", spawner_default)
|
||||
end,
|
||||
|
||||
on_right_click = function(pos, placer)
|
||||
local meta = minetest.get_meta(pos)
|
||||
|
||||
if minetest.is_protected(pos, placer:get_player_name()) then
|
||||
return
|
||||
end
|
||||
|
||||
-- local meta = minetest.get_meta(pos)
|
||||
end,
|
||||
|
||||
on_receive_fields = function(pos, formname, fields, sender)
|
||||
|
@ -39,15 +44,17 @@ minetest.register_node("mobs:spawner", {
|
|||
return
|
||||
end
|
||||
|
||||
local mob = comm[1]
|
||||
local mlig = tonumber(comm[2])
|
||||
local xlig = tonumber(comm[3])
|
||||
local num = tonumber(comm[4])
|
||||
local mob = comm[1] -- mob to spawn
|
||||
local mlig = tonumber(comm[2]) -- min light
|
||||
local xlig = tonumber(comm[3]) -- max light
|
||||
local num = tonumber(comm[4]) -- total mobs in area
|
||||
local pla = tonumber(comm[5])-- player distance (0 to disable)
|
||||
|
||||
if mob and mob ~= ""
|
||||
and num and num >= 0 and num <= 10
|
||||
and mlig and mlig >= 0 and mlig <= 14
|
||||
and xlig and xlig >= 0 and xlig <= 14 then
|
||||
and mlig and mlig >= 0 and mlig <= 15
|
||||
and xlig and xlig >= 0 and xlig <= 15
|
||||
and pla >=0 and pla <= 20 then
|
||||
|
||||
meta:set_string("command", fields.text)
|
||||
meta:set_string("infotext", "Spawner Active (" .. mob .. ")")
|
||||
|
@ -79,6 +86,7 @@ minetest.register_abm({
|
|||
local mlig = tonumber(comm[2])
|
||||
local xlig = tonumber(comm[3])
|
||||
local num = tonumber(comm[4])
|
||||
local pla = tonumber(comm[5]) or 0
|
||||
|
||||
-- if amount is 0 then do nothing
|
||||
if num == 0 then
|
||||
|
@ -88,7 +96,7 @@ minetest.register_abm({
|
|||
local count = 0
|
||||
local ent = nil
|
||||
|
||||
-- count objects of same type in area
|
||||
-- count mob objects of same type in area
|
||||
for k, obj in pairs(objs) do
|
||||
|
||||
ent = obj:get_luaentity()
|
||||
|
@ -103,6 +111,28 @@ minetest.register_abm({
|
|||
return
|
||||
end
|
||||
|
||||
-- spawn mob if player detected and in range
|
||||
if pla > 0 then
|
||||
|
||||
local in_range = 0
|
||||
local objs = minetest.get_objects_inside_radius(pos, pla)
|
||||
|
||||
for _,oir in pairs(objs) do
|
||||
|
||||
if oir:is_player() then
|
||||
|
||||
in_range = 1
|
||||
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
-- player not found
|
||||
if in_range == 0 then
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
-- find air blocks within 5 nodes of spawner
|
||||
local air = minetest.find_nodes_in_area(
|
||||
{x = pos.x - 5, y = pos.y, z = pos.z - 5},
|
||||
|
@ -113,12 +143,12 @@ minetest.register_abm({
|
|||
if air and #air > 0 then
|
||||
|
||||
local pos2 = air[math.random(#air)]
|
||||
local lig = minetest.get_node_light(pos2)
|
||||
local lig = minetest.get_node_light(pos2) or 0
|
||||
|
||||
pos2.y = pos2.y + 0.5
|
||||
|
||||
-- only if light levels are within range
|
||||
if lig and lig >= mlig and lig <= xlig then
|
||||
if lig >= mlig and lig <= xlig then
|
||||
minetest.add_entity(pos2, mob)
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in New Issue