visual-bots-cd2025/formspec_handler.lua
2019-08-09 06:46:57 +00:00

169 lines
6.9 KiB
Lua

-------------------------------------
-- generate new key & move data in table
-------------------------------------
local function bot_rekey(bot_key,meta)
local new_key = vbots.get_key()
vbots.bot_info[new_key] = vbots.bot_info[bot_key]
vbots.bot_info[bot_key] = nil
meta:set_string("key", new_key)
return new_key
end
minetest.register_on_player_receive_fields(function(player, bot_key, fields)
--print(dump( fields))
local bot_data = vbots.bot_info[bot_key]
-- Bot main formspec
if bot_data then
-- print("Main Bot formspec received:")
local inv=minetest.get_inventory({type="node", pos=bot_data.pos})
local meta = minetest.get_meta(bot_data.pos)
local meta_bot_key = meta:get_string("key")
-- print(bot_key.." vs "..meta_bot_key)
if bot_key == meta_bot_key then
bot_key = bot_rekey(bot_key,meta)
if fields.run then
minetest.after(0, vbots.bot_togglestate, bot_data.pos, "on")
end
if fields.save then
vbots.save(bot_data.pos)
end
if fields.load then
vbots.load(bot_data.pos,player)
end
if fields.quit=="true" then
return
end
if fields.commands then
meta:set_int("panel", 0)
end
if fields.player_inv then
meta:set_int("panel", 1)
end
if fields.trash then
local last = 0
local content = inv:get_list("p"..meta:get_int("program"))
for a = 1,56 do
if not content[a]:is_empty() then last=a end
end
if last>0 then
inv:set_stack("p"..meta:get_int("program"), last, ItemStack(nil))
end
end
if not fields.exit and not fields.run then
for f,v in pairs(fields) do
local nametable=string.split(f, "_")
if #nametable>=2 then
if nametable[1]=="sub" then
meta:set_int("program", nametable[2])
-- print(dump(
end
if nametable[1]=="move" or
nametable[1]=="turn" or
nametable[1]=="number" or
nametable[1]=="mode" or
nametable[1]=="run" then
--print("COMMAND!!!!!!!")
local leftover = inv:add_item("p"..meta:get_int("program"), ItemStack("vbots:"..f))
end
end
end
minetest.after(0, vbots.show_formspec, player, bot_data.pos)
end
end
else
local form_parts = string.split(bot_key,",")
local data = mod_storage:to_table()
local bot_list = {}
for n,d in pairs(data.fields) do
bot_list[#bot_list+1] = n
end
if #form_parts == 2 and form_parts[1] == "loadbot" then
-- print("Load Bot formspec received")
local bot_data = vbots.bot_info[form_parts[2]]
local pos=bot_data.pos
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
minetest.close_formspec(player:get_player_name(), bot_key)
if fields.delete then
vbots.load(pos,player,"delete")
end
if fields.rename then
vbots.load(pos,player,"rename")
end
if fields.saved then
local bot_name = bot_list[tonumber(string.split(fields.saved,":")[2])]
-- print('Loadbot '..bot_name)
local inv_list = minetest.deserialize(data.fields[bot_name])
local inv_involved = {}
if inv_list then
for _,v in pairs(inv_list) do
local parts = string.split(v," ")
if #parts == 3 then
inv_involved[parts[1]]=true
end
end
-- print(dump(inv_involved))
local size
for i,_ in pairs(inv_involved) do
size = inv:get_size(i)
for a=1,size do
inv:set_stack(i,a, "")
end
end
for _,v in pairs(inv_list) do
local parts = string.split(v," ")
if #parts == 3 then
inv:add_item(parts[1],parts[2].." "..parts[3])
end
end
end
end
elseif #form_parts == 2 and form_parts[1] == "delete" then
-- print("Delete Bot formspec received")
local bot_data = vbots.bot_info[form_parts[2]]
local pos=bot_data.pos
minetest.close_formspec(player:get_player_name(), bot_key)
if fields.saved then
local bot_name = bot_list[tonumber(string.split(fields.saved,":")[2])]
data.fields[bot_name]=nil
mod_storage:from_table(data)
--print(dump(mod_storage:to_table()))
end
elseif #form_parts == 2 and form_parts[1] == "rename" then
-- print("Rename Bot formspec received")
local bot_data = vbots.bot_info[form_parts[2]]
local pos=bot_data.pos
minetest.close_formspec(player:get_player_name(), bot_key)
if fields.saved then
local bot_name = bot_list[tonumber(string.split(fields.saved,":")[2])]
-- print("renamefrom_"..bot_name)
local parts = string.split(bot_name,",vbotsep,")
if #parts == 2 and parts[1] == player:get_player_name() then
bot_name = parts[2]
-- print("renamefrom_"..bot_name)
vbots.load(pos,player,"renamefrom_"..bot_name)
end
end
elseif #form_parts == 2 and form_parts[1] == "renamefrom" then
-- print("Renameto formspec received")
local bot_data = vbots.bot_info[form_parts[2]]
local pos=bot_data.pos
local pname = player:get_player_name()
minetest.close_formspec(pname, bot_key)
local oldname = fields.oldname
local newname = fields.newname
if newname and oldname then
local hold = data.fields[pname..",vbotsep,"..oldname]
data.fields[pname..",vbotsep,"..oldname] = nil
data.fields[pname..",vbotsep,"..newname] = hold
mod_storage:from_table(data)
-- print("renamed "..pname..",vbotsep,"..oldname.." to "..pname..",vbotsep,"..newname)
end
end
end
end)