teleportmenu init

master
Emoji 2022-08-11 07:56:36 +08:00
parent a399ccaf9e
commit fb2d44eda4
2 changed files with 147 additions and 0 deletions

143
init.lua Normal file
View File

@ -0,0 +1,143 @@
local S = minetest.get_translator("teleportmenu")
local F = minetest.formspec_escape
local gui = flow.widgets
local function get_player_name_list()
local RLST = {}
for _,y in pairs(minetest.get_connected_players()) do
table.insert(RLST,y:get_player_name())
end
return RLST
end
local function confirm_func(player,ctx)
local name = player:get_player_name()
local privs = minetest.check_player_privs(name,{teleport=true,bring=true})
if not privs then
ctx.status = S("Missing privileges!")
else
local from_name = ctx.pnames[ctx.form.from]
local from_player = minetest.get_player_by_name(from_name)
if not from_player then
ctx.status = S("Player @1 does not exist!",ctx.pnames[ctx.form.from])
return true
end
local pos
if ctx.provide_pos then
pos = minetest.string_to_pos(ctx.form.pos)
else
local to_player = minetest.get_player_by_name(ctx.pnames_targetlist[ctx.form.to])
if not to_player then
ctx.status = S("Player @1 does not exist!",ctx.pnames_targetlist[ctx.form.to])
return true
end
pos = to_player:get_pos()
end
from_player:set_pos(pos)
local to_str = minetest.pos_to_string(vector.round(pos))
minetest.log("action",("%s teleported %s to %s"):format(name,from_name,to_str))
ctx.status = S("Teleported @1 to @2.",from_name,to_str)
minetest.chat_send_player(name,ctx.status)
end
return true
end
local function to_func(player,ctx)
print(ctx.form.to)
if ctx.form.to == ctx.targetlist_length then
ctx.provide_pos = true
else
ctx.provide_pos = false
end
return true
end
local menu = flow.make_gui(function(player,ctx)
ctx.pnames = ctx.pnames or get_player_name_list()
if not ctx.pnames_targetlist then
ctx.pnames_targetlist = table.copy(ctx.pnames)
table.insert(ctx.pnames_targetlist,S("Provide a Position"))
ctx.targetlist_length = #ctx.pnames_targetlist
end
if not ctx.status then
ctx.status = S("Idle")
end
if ctx.provide_pos then
return gui.VBox {
gui.HBox {
gui.Textlist {
h = 7, -- Optional
w = 4,
name = "from", -- Optional
listelems = ctx.pnames,
},
gui.VBox {
gui.Textlist {
h = 6,
w = 4,
name = "to",
on_event = to_func,
listelems = ctx.pnames_targetlist,
},
gui.Field {
w = 4, -- Optional
h = 1, -- Optional
name = "pos", -- Optional
label = "",
default = "(0,0,0)",
},
}
},
gui.HBox {
gui.Label {
label = ctx.status,
},
gui.Spacer{},
gui.ButtonExit{label = S("Exit")},
gui.Button{label = S("Teleport"),on_event = confirm_func},
}
}
else
return gui.VBox {
gui.HBox {
gui.Textlist {
h = 7, -- Optional
w = 4,
name = "from", -- Optional
listelems = ctx.pnames,
},
gui.Textlist {
h = 7,
w = 4,
name = "to",
on_event = to_func,
listelems = ctx.pnames_targetlist,
}
},
gui.HBox {
gui.Label {
label = ctx.status,
},
gui.Spacer{},
gui.ButtonExit{label = S("Exit")},
gui.Button{label = S("Teleport"),on_event = confirm_func},
}
}
end
end)
local orig_tp_func = minetest.registered_chatcommands["teleport"].func
minetest.registered_chatcommands["teleport"].func = function(name,param)
if param == "" then
menu:show(name)
return true, S("Teleport menu shown.")
else
return orig_tp_func(name,param)
end
end
minetest.registered_chatcommands["teleport"].params = "[" .. minetest.registered_chatcommands["teleport"].params .. "]"
minetest.registered_chatcommands["teleport"].description = S("Teleport to position or player, or open the teleport menu if no params provided")

4
mod.conf Normal file
View File

@ -0,0 +1,4 @@
name = teleportmenu
title = Teleport Menu
description = GUI tool to teleport players
depends = flow