1 Commits

Author SHA1 Message Date
ef553e8edf Fix crash 2020-06-27 16:37:31 +02:00
5 changed files with 26 additions and 85 deletions

View File

@ -1,16 +0,0 @@
read_globals = {
"DIR_DELIM",
"core",
"dump",
"vector", "nodeupdate",
"VoxelManip", "VoxelArea",
"PseudoRandom", "ItemStack",
"AreaStore",
"default",
table = { fields = { "copy", "getn" } }
}
globals = {
"minetest"
}

0
depends.txt Normal file
View File

1
description.txt Normal file
View File

@ -0,0 +1 @@
Warp locations and warp stones (portal stones)

View File

@ -10,9 +10,9 @@ of the license, or (at your option) any later version.
--]] --]]
local warps = {} warps = {}
local warps_queue = {} warps_queue = {}
local queue_state = 0 queue_state = 0
local warps_freeze = 5 local warps_freeze = 5
-- t = time in usec -- t = time in usec
-- p = player obj -- p = player obj
@ -22,19 +22,14 @@ local S = minetest.get_mod_storage()
assert(S, "mod_storage is required") assert(S, "mod_storage is required")
-- import warps or load -- import warps or load
local function firstload() local store = S:get("warps")
local store = S:get("warps") local worldpath = minetest.get_worldpath()
local worldpath = minetest.get_worldpath() if store then
if store then warps = minetest.deserialize(store)
warps = minetest.deserialize(store) else
return
end
local fh,err = io.open(worldpath .. "/warps.txt", "r") local fh,err = io.open(worldpath .. "/warps.txt", "r")
if err then if err then
-- If it doesn't exist, we've never used this mod before. minetest.log("action", "[warps] loaded ")
if not err:find("No such file or directory") then
minetest.log("error", "[warps] Error trying to load warps.txt: " .. err)
end
return return
end end
while true do while true do
@ -87,7 +82,7 @@ local warp = function(player, dest)
local pos = vector.new(warp) local pos = vector.new(warp)
pos.y = pos.y + 0.5 pos.y = pos.y + 0.5
player:set_pos(pos) player:setpos(pos)
player:set_look_horizontal(warp.yaw) player:set_look_horizontal(warp.yaw)
player:set_look_vertical(warp.pitch) player:set_look_vertical(warp.pitch)
minetest.chat_send_player(player:get_player_name(), "Warped to \"" .. dest .. "\"") minetest.chat_send_player(player:get_player_name(), "Warped to \"" .. dest .. "\"")
@ -95,7 +90,7 @@ local warp = function(player, dest)
minetest.sound_play("warps_plop", {pos = pos}) minetest.sound_play("warps_plop", {pos = pos})
end end
local function do_warp_queue() do_warp_queue = function()
if table.getn(warps_queue) == 0 then if table.getn(warps_queue) == 0 then
queue_state = 0 queue_state = 0
return return
@ -103,8 +98,8 @@ local function do_warp_queue()
local t = minetest.get_us_time() local t = minetest.get_us_time()
for i = table.getn(warps_queue),1,-1 do for i = table.getn(warps_queue),1,-1 do
local e = warps_queue[i] local e = warps_queue[i]
if e.p:get_pos() then if e.p:getpos() then
if vector.equals(e.p:get_pos(), e.pos) then if vector.equals(e.p:getpos(), e.pos) then
if t > e.t then if t > e.t then
warp(e.p, e.w) warp(e.p, e.w)
table.remove(warps_queue, i) table.remove(warps_queue, i)
@ -127,10 +122,10 @@ end
local warp_queue_add = function(player, dest) local warp_queue_add = function(player, dest)
table.insert(warps_queue, { table.insert(warps_queue, {
t = minetest.get_us_time() + (warps_freeze * 1000000), t = minetest.get_us_time() + (warps_freeze * 1000000),
pos = player:get_pos(), pos = player:getpos(),
p = player, p = player,
w = dest, w = dest,
sh = minetest.sound_play("warps_woosh", { pos = player:get_pos() }) sh = minetest.sound_play("warps_woosh", { pos = player:getpos() })
}) })
minetest.chat_send_player(player:get_player_name(), "Don't move for " .. warps_freeze .. " seconds!") minetest.chat_send_player(player:get_player_name(), "Don't move for " .. warps_freeze .. " seconds!")
if queue_state == 0 then if queue_state == 0 then
@ -181,7 +176,7 @@ minetest.register_chatcommand("setwarp", {
end end
local player = minetest.get_player_by_name(name) local player = minetest.get_player_by_name(name)
local pos = vector.round(player:get_pos()) local pos = vector.round(player:getpos())
table.insert(warps, { table.insert(warps, {
name = param, name = param,
x = pos.x, x = pos.x,
@ -241,32 +236,6 @@ minetest.register_chatcommand("warp", {
end end
}) })
local function prepare_dropdown(x,y,w,h,curr_dest)
local dd = string.format("dropdown[%f,%f;%f,%f;ddwarp;", x, y, w, h)
local sel = 0
for idx, warp in ipairs(warps) do
local warpname = warp.name
dd = dd .. minetest.formspec_escape(warpname) .. ","
if curr_dest == warpname then
sel = idx
end
end
dd = dd .. ";"..tostring(sel).."]"
return dd
end
local function prepare_formspec(dest)
local custdest = ""
if not lookup_warp(dest) then
custdest = dest
end
return "size[4.5,3]label[0.7,0;Warp destination]"
.."field[1,2.2;3,0.2;destination;Future destination;"
..minetest.formspec_escape(custdest).."]"
.."button_exit[0.7,2.7;3,0.5;proceed;Proceed]"
..prepare_dropdown(0.7,0.4,3,1, dest)
end
minetest.register_node("warps:warpstone", { minetest.register_node("warps:warpstone", {
visual = "mesh", visual = "mesh",
mesh = "warps_warpstone.obj", mesh = "warps_warpstone.obj",
@ -285,7 +254,8 @@ minetest.register_node("warps:warpstone", {
}, },
on_construct = function(pos) on_construct = function(pos)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
meta:set_string("formspec", prepare_formspec("")) meta:set_string("formspec",
"field[destination;Warp Destination;]")
meta:set_string("infotext", "Uninitialized Warp Stone") meta:set_string("infotext", "Uninitialized Warp Stone")
end, end,
on_receive_fields = function(pos, formname, fields, sender) on_receive_fields = function(pos, formname, fields, sender)
@ -293,24 +263,15 @@ minetest.register_node("warps:warpstone", {
minetest.chat_send_player(sender:get_player_name(), "You do not have permission to modify warp stones") minetest.chat_send_player(sender:get_player_name(), "You do not have permission to modify warp stones")
return false return false
end end
if not (fields.destination and fields.quit) then if not fields.destination then
return return
end end
local dest
if fields.destination == "" and fields.ddwarp then
dest = fields.ddwarp
else
dest = fields.destination
end
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
meta:set_string("formspec",
meta:set_string("formspec", prepare_formspec(dest)) "field[destination;Warp Destination;" .. fields.destination .. "]")
meta:set_string("infotext", "Warp stone to " .. dest) meta:set_string("infotext", "Warp stone to " .. fields.destination)
meta:set_string("warps_destination", dest) meta:set_string("warps_destination", fields.destination)
minetest.log("action", sender:get_player_name() .. " changed warp stone at " minetest.log("action", sender:get_player_name() .. " changed warp stone to \"" .. fields.destination .. "\"")
.. minetest.pos_to_string(pos) .. " to \"" .. dest .. "\"")
end, end,
on_punch = function(pos, node, puncher, pointed_thingo) on_punch = function(pos, node, puncher, pointed_thingo)
if puncher:get_player_control().sneak and if puncher:get_player_control().sneak and
@ -322,16 +283,12 @@ minetest.register_node("warps:warpstone", {
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local destination = meta:get_string("warps_destination") local destination = meta:get_string("warps_destination")
if destination == "" or lookup_warp(destination) == nil then if destination == "" then
minetest.chat_send_player(puncher:get_player_name(), minetest.chat_send_player(puncher:get_player_name(),
"Unknown warp location for this warp stone, cannot warp!") "Unknown warp location for this warp stone, cannot warp!")
return false return false
end end
minetest.log("action", string.format("Going to warp player %s to waypoint %s",
puncher:get_player_name(), destination
))
warp_queue_add(puncher, destination) warp_queue_add(puncher, destination)
end, end,
}) })
firstload()

View File

@ -1,2 +1 @@
name = warps name = warps
description = Warp locations and warp stones (portal stones)