Implement spawn checker

Implement a checker to prevent player from spawning in water or inside nodes.
This commit is contained in:
Brayd 2023-04-22 17:06:54 +02:00
parent 267e001609
commit f5975c98f2
Signed by: brayd
GPG Key ID: C2B176B9DEB8BA48
2 changed files with 50 additions and 0 deletions

View File

@ -16,4 +16,9 @@ minetest.register_item(":", {
}
})
local path = minetest.get_modpath("arbuinia_essentials")
dofile(path.."/spawn.lua")
print("[Arbuinia Essentials] Successfully loaded Arbuinia Essentials!")

45
spawn.lua Normal file
View File

@ -0,0 +1,45 @@
local function spawn_player(player)
if minetest.setting_get("static_spawnpoint") then return end
for bx = -20, 20 do
for bz = -20, 20 do
local minp = {x = -32 + 3 * bx, y = -32, z = -32 + 3 * bz}
local pos = {x = math.random(minp.x, minp.x + 79), y = minp.y, z = math.random(minp.z, minp.z + 79)}
for u = 300, 0, -1 do
pos.y = u
local node = minetest.get_node({x = pos.x, y = pos.y, z = pos.z})
local under = minetest.get_node({x = pos.x, y = pos.y - 1, z = pos.z})
minetest.chat_send_player(player:get_player_name(), "Checking position X = " .. dump(pos.x) .. " Y = " .. dump(pos.y) .. " Z = " .. dump(pos.z) .. " Found node: " .. under.name)
player:set_hp(20, nil)
if node.name == "air" and under.name ~= "ignore" and under.name ~= "water_source" and under.name ~= "air" then
player:setpos({x = pos.x, y = pos.y, z = pos.z})
minetest.chat_send_player(player:get_player_name(), "Spawn point found and player has been spawned!")
player:set_hp(20, nil)
return
end
end
end
end
minetest.chat_send_player(player:get_player_name(), "No spawn position could be found. Please try generating a new world...Sorry :/")
end
minetest.register_on_newplayer(function (player)
local spawnpos1 = {x = -100, y = 0, z = -100}
local spawnpos2 = {x = 100, y = 300, z = 100}
minetest.emerge_area(spawnpos1, spawnpos2)
minetest.chat_send_player(player:get_player_name(), "Waiting 10 seconds before trying to find a spawnpoint to let map pre-generate...")
player:set_hp(20, nil)
minetest.after(10, spawn_player,player)
return true
end)
minetest.register_on_respawnplayer(function (player)
local spawnpos1 = {x = -100, y = 0, z = -100}
local spawnpos2 = {x = 100, y = 300, z = 100}
minetest.emerge_area(spawnpos1, spawnpos2)
spawn_player(player)
return true
end)