forked from minetest-mods/warps
Compare commits
10 Commits
nalc-1.2.0
...
master
Author | SHA1 | Date | |
---|---|---|---|
d8036504da | |||
|
01ad0c80b3 | ||
ba5525305a | |||
cd7e524f03 | |||
b1b5c93f32 | |||
|
0a8f1683bc | ||
6afd3bced1 | |||
19da4d0919 | |||
02d41688ba | |||
|
b2d71bf105 |
16
.luacheckrc
Normal file
16
.luacheckrc
Normal file
|
@ -0,0 +1,16 @@
|
|||
read_globals = {
|
||||
"DIR_DELIM",
|
||||
"core",
|
||||
"dump",
|
||||
"vector", "nodeupdate",
|
||||
"VoxelManip", "VoxelArea",
|
||||
"PseudoRandom", "ItemStack",
|
||||
"AreaStore",
|
||||
"default",
|
||||
table = { fields = { "copy", "getn" } }
|
||||
}
|
||||
|
||||
globals = {
|
||||
"minetest"
|
||||
}
|
||||
|
|
@ -1 +0,0 @@
|
|||
Warp locations and warp stones (portal stones)
|
93
init.lua
93
init.lua
|
@ -10,9 +10,9 @@ of the license, or (at your option) any later version.
|
|||
|
||||
--]]
|
||||
|
||||
warps = {}
|
||||
warps_queue = {}
|
||||
queue_state = 0
|
||||
local warps = {}
|
||||
local warps_queue = {}
|
||||
local queue_state = 0
|
||||
local warps_freeze = 5
|
||||
-- t = time in usec
|
||||
-- p = player obj
|
||||
|
@ -22,14 +22,19 @@ local S = minetest.get_mod_storage()
|
|||
assert(S, "mod_storage is required")
|
||||
|
||||
-- import warps or load
|
||||
local store = S:get("warps")
|
||||
local worldpath = minetest.get_worldpath()
|
||||
if store then
|
||||
warps = minetest.deserialize(store)
|
||||
else
|
||||
local function firstload()
|
||||
local store = S:get("warps")
|
||||
local worldpath = minetest.get_worldpath()
|
||||
if store then
|
||||
warps = minetest.deserialize(store)
|
||||
return
|
||||
end
|
||||
local fh,err = io.open(worldpath .. "/warps.txt", "r")
|
||||
if err then
|
||||
minetest.log("action", "[warps] loaded ")
|
||||
-- If it doesn't exist, we've never used this mod before.
|
||||
if not err:find("No such file or directory") then
|
||||
minetest.log("error", "[warps] Error trying to load warps.txt: " .. err)
|
||||
end
|
||||
return
|
||||
end
|
||||
while true do
|
||||
|
@ -82,7 +87,7 @@ local warp = function(player, dest)
|
|||
|
||||
local pos = vector.new(warp)
|
||||
pos.y = pos.y + 0.5
|
||||
player:setpos(pos)
|
||||
player:set_pos(pos)
|
||||
player:set_look_horizontal(warp.yaw)
|
||||
player:set_look_vertical(warp.pitch)
|
||||
minetest.chat_send_player(player:get_player_name(), "Warped to \"" .. dest .. "\"")
|
||||
|
@ -90,7 +95,7 @@ local warp = function(player, dest)
|
|||
minetest.sound_play("warps_plop", {pos = pos})
|
||||
end
|
||||
|
||||
do_warp_queue = function()
|
||||
local function do_warp_queue()
|
||||
if table.getn(warps_queue) == 0 then
|
||||
queue_state = 0
|
||||
return
|
||||
|
@ -98,8 +103,8 @@ do_warp_queue = function()
|
|||
local t = minetest.get_us_time()
|
||||
for i = table.getn(warps_queue),1,-1 do
|
||||
local e = warps_queue[i]
|
||||
if e.p:getpos() then
|
||||
if vector.equals(e.p:getpos(), e.pos) then
|
||||
if e.p:get_pos() then
|
||||
if vector.equals(e.p:get_pos(), e.pos) then
|
||||
if t > e.t then
|
||||
warp(e.p, e.w)
|
||||
table.remove(warps_queue, i)
|
||||
|
@ -122,10 +127,10 @@ end
|
|||
local warp_queue_add = function(player, dest)
|
||||
table.insert(warps_queue, {
|
||||
t = minetest.get_us_time() + (warps_freeze * 1000000),
|
||||
pos = player:getpos(),
|
||||
pos = player:get_pos(),
|
||||
p = player,
|
||||
w = dest,
|
||||
sh = minetest.sound_play("warps_woosh", { pos = player:getpos() })
|
||||
sh = minetest.sound_play("warps_woosh", { pos = player:get_pos() })
|
||||
})
|
||||
minetest.chat_send_player(player:get_player_name(), "Don't move for " .. warps_freeze .. " seconds!")
|
||||
if queue_state == 0 then
|
||||
|
@ -176,7 +181,7 @@ minetest.register_chatcommand("setwarp", {
|
|||
end
|
||||
|
||||
local player = minetest.get_player_by_name(name)
|
||||
local pos = vector.round(player:getpos())
|
||||
local pos = vector.round(player:get_pos())
|
||||
table.insert(warps, {
|
||||
name = param,
|
||||
x = pos.x,
|
||||
|
@ -236,6 +241,32 @@ minetest.register_chatcommand("warp", {
|
|||
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", {
|
||||
visual = "mesh",
|
||||
mesh = "warps_warpstone.obj",
|
||||
|
@ -254,8 +285,7 @@ minetest.register_node("warps:warpstone", {
|
|||
},
|
||||
on_construct = function(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_string("formspec",
|
||||
"field[destination;Warp Destination;]")
|
||||
meta:set_string("formspec", prepare_formspec(""))
|
||||
meta:set_string("infotext", "Uninitialized Warp Stone")
|
||||
end,
|
||||
on_receive_fields = function(pos, formname, fields, sender)
|
||||
|
@ -263,15 +293,24 @@ minetest.register_node("warps:warpstone", {
|
|||
minetest.chat_send_player(sender:get_player_name(), "You do not have permission to modify warp stones")
|
||||
return false
|
||||
end
|
||||
if not fields.destination then
|
||||
if not (fields.destination and fields.quit) then
|
||||
return
|
||||
end
|
||||
|
||||
local dest
|
||||
if fields.destination == "" and fields.ddwarp then
|
||||
dest = fields.ddwarp
|
||||
else
|
||||
dest = fields.destination
|
||||
end
|
||||
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_string("formspec",
|
||||
"field[destination;Warp Destination;" .. fields.destination .. "]")
|
||||
meta:set_string("infotext", "Warp stone to " .. fields.destination)
|
||||
meta:set_string("warps_destination", fields.destination)
|
||||
minetest.log("action", sender:get_player_name() .. " changed warp stone to \"" .. fields.destination .. "\"")
|
||||
|
||||
meta:set_string("formspec", prepare_formspec(dest))
|
||||
meta:set_string("infotext", "Warp stone to " .. dest)
|
||||
meta:set_string("warps_destination", dest)
|
||||
minetest.log("action", sender:get_player_name() .. " changed warp stone at "
|
||||
.. minetest.pos_to_string(pos) .. " to \"" .. dest .. "\"")
|
||||
end,
|
||||
on_punch = function(pos, node, puncher, pointed_thingo)
|
||||
if puncher:get_player_control().sneak and
|
||||
|
@ -283,12 +322,16 @@ minetest.register_node("warps:warpstone", {
|
|||
|
||||
local meta = minetest.get_meta(pos)
|
||||
local destination = meta:get_string("warps_destination")
|
||||
if destination == "" then
|
||||
if destination == "" or lookup_warp(destination) == nil then
|
||||
minetest.chat_send_player(puncher:get_player_name(),
|
||||
"Unknown warp location for this warp stone, cannot warp!")
|
||||
return false
|
||||
end
|
||||
minetest.log("action", string.format("Going to warp player %s to waypoint %s",
|
||||
puncher:get_player_name(), destination
|
||||
))
|
||||
warp_queue_add(puncher, destination)
|
||||
end,
|
||||
})
|
||||
|
||||
firstload()
|
||||
|
|
Loading…
Reference in New Issue
Block a user