forked from minetest-mods/warps
Attempt to emerge/mapgen areas before teleporting to them.
The client will still have to actually load the mapblocks, but the server should safely teleport a player to the location, even if it wasn't even generated.
This commit is contained in:
parent
979ba1c934
commit
74e68db79c
44
init.lua
44
init.lua
@ -18,24 +18,31 @@ local warps_freeze = 5
|
|||||||
-- p = player obj
|
-- p = player obj
|
||||||
-- w = warp name
|
-- w = warp name
|
||||||
|
|
||||||
local warp = function(player, dest)
|
local function lookup_warp(name)
|
||||||
for i = 1,table.getn(warps) do
|
for i = 1,table.getn(warps) do
|
||||||
if warps[i].name == dest then
|
if warps[i].name == name then
|
||||||
player:setpos({x = warps[i].x, y = warps[i].y, z = warps[i].z})
|
return warps[i]
|
||||||
-- MT Core FIXME
|
|
||||||
-- get functions don't output proper values for set!
|
|
||||||
-- https://github.com/minetest/minetest/issues/2658
|
|
||||||
player:set_look_yaw(warps[i].yaw - (math.pi/2))
|
|
||||||
player:set_look_pitch(0 - warps[i].pitch)
|
|
||||||
minetest.chat_send_player(player:get_player_name(), "Warped to \"" .. dest .. "\"")
|
|
||||||
minetest.log("action", player:get_player_name() .. " warped to \"" .. dest .. "\"")
|
|
||||||
minetest.sound_play("warps_plop", {
|
|
||||||
pos = {x = warps[i].x, y = warps[i].y, z = warps[i].z},
|
|
||||||
})
|
|
||||||
return
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
minetest.chat_send_player(player:get_player_name(), "Unknown warp \"" .. dest .. "\"")
|
end
|
||||||
|
|
||||||
|
local warp = function(player, dest)
|
||||||
|
local warp = lookup_warp(dest)
|
||||||
|
if not warp then
|
||||||
|
minetest.chat_send_player(player:get_player_name(), "Unknown warp \"" .. dest .. "\"")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local pos = {x = warp.x, y = warp.y, z = warp.z}
|
||||||
|
player:setpos(pos)
|
||||||
|
-- MT Core FIXME
|
||||||
|
-- get functions don't output proper values for set!
|
||||||
|
-- https://github.com/minetest/minetest/issues/2658
|
||||||
|
player:set_look_yaw(warp.yaw - (math.pi/2))
|
||||||
|
player:set_look_pitch(0 - warp.pitch)
|
||||||
|
minetest.chat_send_player(player:get_player_name(), "Warped to \"" .. dest .. "\"")
|
||||||
|
minetest.log("action", player:get_player_name() .. " warped to \"" .. dest .. "\"")
|
||||||
|
minetest.sound_play("warps_plop", {pos = pos})
|
||||||
end
|
end
|
||||||
|
|
||||||
do_warp_queue = function()
|
do_warp_queue = function()
|
||||||
@ -79,6 +86,13 @@ local warp_queue_add = function(player, dest)
|
|||||||
queue_state = 1
|
queue_state = 1
|
||||||
minetest.after(1, do_warp_queue)
|
minetest.after(1, do_warp_queue)
|
||||||
end
|
end
|
||||||
|
-- attempt to emerge the target area before the player gets there
|
||||||
|
local warp = lookup_warp(dest)
|
||||||
|
local pos = {x = warp.x, y = warp.y, z = warp.z}
|
||||||
|
minetest.get_voxel_manip():read_from_map(pos, pos)
|
||||||
|
if not minetest.get_node_or_nil(pos) then
|
||||||
|
minetest.emerge_area(vector.subtract(pos, 80), vector.add(pos, 80))
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local worldpath = minetest.get_worldpath()
|
local worldpath = minetest.get_worldpath()
|
||||||
|
Loading…
Reference in New Issue
Block a user