MoreMesecons/moremesecons_luacontroller_.../init.lua

154 lines
4.1 KiB
Lua

local templates = {
singleplayer = {fir = "daw", mak = "delay()"},
}
-- when adding templates minetest.formspec_escape(string) should be used, even for the names
-- this way it doesn't work for multiplayer (missing tests at receiving)
-- formspec, luacontroller identification, saving etc. is unfinished
-- used for the dropdown formspec element
local function fill_formspec_dropdown_list(t, selected)
local it,num = {},1
for i in pairs(t) do
it[num] = i
num = num+1
end
num = num-1
table.sort(it)
local txt = ""
for i = 1,num do
txt = txt..i -- add available indices
if i ~= num then
txt = txt..","
end
end
return txt
--spec = string.sub(spec, 1, -2)
end
local pdata = {}
local function get_selection_formspec(pname, selected_template)
-- current player name
pname = pname or pdata[pname].player_name
selected_template = selected_template or pdata[pname].template_name
local spec = "size[3,1]"..
-- show available players, field player_name, current player name is the selected one
"dropdown[0,0;3,1;player_name;"..
fill_formspec_dropdown_list(templates, pname)..
";"..pname.."]"..
-- show templates of pname
"dropdown[0,1;3,1;template_name;"..
fill_formspec_dropdown_list(templates[pname], selected_template)..
";"..selected_template.."]"..
-- show selected template
"multiline["..templates[pname][selected_template]..
buttonset..
buttonadd..
buttonsave
return spec
end
local function is_luacontroller(pos)
return string.match(minetest.get_node(pos).name, "mesecons_luacontroller:luacontroller%d%d%d%d")
end
minetest.register_tool("moremesecons_luacontroller_tool:luacontroller_template_tool", {
description = "luacontroller template tool",
inventory_image = "moremesecons_luacontroller_tool.png",
on_place = function(itemstack, player, pt)
if not player
or not pt then
return
end
local pos = pt.under
if not is_luacontroller(pos) then
return
end
local pname = player:get_player_name()
pdata[pname] = {
pos = pos,
player_name = pname,
template_name = next(templates[pname]),
}
minetest.show_formspec(pname, "moremesecons:luacontroller_tool", spec)
end,
})
minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname ~= "moremesecons:luacontroller_tool"
or fields.quit
or not player then
return
end
local pname = player:get_player_name()
if fields.player_name then
-- show available templates of that player
minetest.show_formspec(pname, "moremesecons:luacontroller_tool",
get_selection_formspec(fields.player_name)
)
pdata[pname].player_name = fields.player_name
return
end
if fields.template_name then
-- show selected template of that player
minetest.show_formspec(pname, "moremesecons:luacontroller_tool",
get_selection_formspec(nil, fields.template_name)
)
pdata[pname].template_name = fields.template_name
return
end
local pos = pdata[pname].pos
if not is_luacontroller(pos) then
-- this can happen
return
end
local meta = minetest.get_meta(pos)
if fields.set then
-- replace the code of the luacontroller with the template
meta:set_string("code", templates[pdata[pname].player_name][pdata[pname].template_name])
minetest.chat_send_player(pname, "code set to template at "..vector.pos_to_string(pos))
return
end
if fields.add then
-- add the template to the end of the code of the luacontroller
meta:set_string("code", meta:get_string("code")..templates[pdata[pname].player_name][pdata[pname].template_name])
minetest.chat_send_player(pname, "code added to luacontroller at "..vector.pos_to_string(pos))
return
end
if fields.save then
-- save the template, when you try to change others' templates, yours become changed
local savename = fields.save_name or pdata[pname].template_name
local code = fields.template_code or templates[pdata[pname].player_name][pdata[pname].template_name]
--[[
if not code then
minetest.chat_send_player(pname, "you can't save if you didn't change the code")
return
end--]]
local template_name = pdata[pname].template_name
templates[pname][template_name] = code
minetest.chat_send_player(pname, "template "..pname.."/"..template_name.." saved")
return
end
end)