Compare commits

...

6 Commits

Author SHA1 Message Date
taikedz 38f74c8451 Fix to workaround #13 when a node seems undefined 2021-10-29 17:15:09 +01:00
Tai Kedzierski 677442f7f8
Merge pull request #12 from minenux/master-fix-content-ignore
fix for CONTENT_IGNORE cos try to replace already defined node with nil (fix #11)
2021-10-25 19:32:05 +01:00
mckaygerhard 92d4d85ab4 fix for CONTENT_IGNORE cos try to replace already defined node with nil
* check if the `rspawn.spawn_block` is defined and check if valid
* so then `rspawn.spawn_block` is used at `set_default_node` legally
* then `minetest.set_node(pos, {name=rspawn.spawn_block})` can work
* this closes closed https://github.com/taikedz-mt/rspawn/issues/11
2021-10-22 13:53:13 -05:00
taikedz f666465cdf Issue #6 - prevent infinite recursion in set_newplayer_spawn 2021-10-22 15:42:15 +01:00
Tai Kedzierski 60795a69e5
Merge pull request #9 from minenux/master-fix-areavolume-excedes
limit the altitude due it multiplies twice and generated a big area
2021-10-22 12:21:30 +01:00
mckaygerhard 4cb2b7a457 limit the altitude due it multiplies twice and generated a big area
* just use a altitude of same area, above water if spawn anywhere is disable
* it generated too much counts, so we must limit the `altitude`..
* old code just multiplice the ratius in altitude..
* ...that will make the `find_nodes_in_area` search a big amount of area in air:
* closed closes https://codeberg.org/minenux/spawnnew/issues/7
* closed closes https://github.com/taikedz-mt/rspawn/issues/8
2021-10-21 15:19:21 -05:00
1 changed files with 31 additions and 15 deletions

View File

@ -21,7 +21,7 @@ rspawn.kick_on_fail = minetest.settings:get_bool("rspawn.kick_on_fail") == true
rspawn.max_pregen_spawns = tonumber(minetest.settings:get("rspawn.max_pregen") or 5)
rspawn.search_radius = tonumber(minetest.settings:get("rspawn.search_radius") or 32)
rspawn.gen_frequency = tonumber(minetest.settings:get("rspawn.gen_frequency") or 30)
rspawn.spawn_block = minetest.settings:get("rspawn.spawn_block")
rspawn.spawn_block = minetest.settings:get("rspawn.spawn_block") or "default:dirt_with_grass"
rspawn.min_x = tonumber(minetest.settings:get("rspawn.min_x") or -31000)
rspawn.max_x = tonumber(minetest.settings:get("rspawn.max_x") or 31000)
@ -35,6 +35,11 @@ dofile(mpath.."/lua/forceload.lua")
dofile(mpath.."/lua/debugging.lua")
minetest.after(0,function()
if not minetest.registered_items[rspawn.spawn_block] then
rspawn.spawn_block = "default:dirt_with_grass"
end
end)
rspawn:spawnload()
@ -52,7 +57,11 @@ end
function rspawn:get_positions_for(pos, radius)
local breadth = radius
local altitude = radius*2
local altitude = water_level + radius
if rspawn.spawnanywhere then
altitude = radius
end
local pos1 = {x=pos.x-breadth, y=pos.y, z=pos.z-breadth}
local pos2 = {x=pos.x+breadth, y=pos.y+altitude, z=pos.z+breadth}
@ -81,15 +90,22 @@ function rspawn:newspawn(pos, radius)
under = minetest.registered_nodes[under]
over = minetest.registered_nodes[over]
if under.walkable
and not over.walkable
and not minetest.is_protected(anode, "")
and not (under.groups and under.groups.leaves ) -- no spawning on treetops!
and daylight_above(7, anode) then
if under.buildable_to then
validnodes[#validnodes+1] = {x=anode.x, y=anode.y-1, z=anode.z}
else
validnodes[#validnodes+1] = anode
if under == nil or over == nil then
-- `under` or `over` could be nil if a mod that defined that node was removed.
-- Not something this mod can resolve, and so we just ignore it.
rspawn:debug("Found an undefined node around "..minetest.pos_to_string(anode))
else
if under.walkable
and not over.walkable
and not minetest.is_protected(anode, "")
and not (under.groups and under.groups.leaves ) -- no spawning on treetops!
and daylight_above(7, anode) then
if under.buildable_to then
validnodes[#validnodes+1] = {x=anode.x, y=anode.y-1, z=anode.z}
else
validnodes[#validnodes+1] = anode
end
end
end
end
@ -141,7 +157,7 @@ function rspawn:set_player_spawn(name, newpos)
return true
end
function rspawn:set_newplayer_spawn(player)
function rspawn:set_newplayer_spawn(player, attempts)
-- only use for new players / players who have never had a randomized spawn
if not player then return end
@ -158,7 +174,7 @@ function rspawn:set_newplayer_spawn(player)
else
-- We did not get a new position
if rspawn.kick_on_fail then
if rspawn.kick_on_fail or attempts <= 0 then
minetest.kick_player(playername, "No personalized spawn points available - please try again later.")
else
@ -167,7 +183,7 @@ function rspawn:set_newplayer_spawn(player)
minetest.log("warning", "rspawn -- Exhausted spawns! Could not spawn "..playername)
minetest.after(rspawn.gen_frequency, function()
rspawn:set_newplayer_spawn(player)
rspawn:set_newplayer_spawn(player, attempts-1)
end)
end
end
@ -192,7 +208,7 @@ function rspawn:renew_player_spawn(playername)
end
minetest.register_on_joinplayer(function(player)
rspawn:set_newplayer_spawn(player)
rspawn:set_newplayer_spawn(player, 5)
end)
minetest.register_on_respawnplayer(function(player)