131 lines
4.1 KiB
Lua
131 lines
4.1 KiB
Lua
-- Visual Bots v0.3
|
|
-- (c)2019 Nigel Garnett.
|
|
--
|
|
-- see licence.txt
|
|
--
|
|
|
|
vbots={}
|
|
vbots.modpath = minetest.get_modpath("vbots")
|
|
vbots.bot_info = {}
|
|
|
|
local trashInv = minetest.create_detached_inventory(
|
|
"bottrash",
|
|
{
|
|
on_put = function(inv, toList, toIndex, stack, player)
|
|
inv:set_stack(toList, toIndex, ItemStack(nil))
|
|
end
|
|
})
|
|
trashInv:set_size("main", 1)
|
|
mod_storage = minetest.get_mod_storage()
|
|
|
|
|
|
vbots.save = function(pos)
|
|
local meta = minetest.get_meta(pos)
|
|
local meta_table = meta:to_table()
|
|
local botname = meta:get_string("name")
|
|
local inv_list = {}
|
|
for i,t in pairs(meta_table.inventory) do
|
|
if i ~= "main" then
|
|
for _,s in pairs(t) do
|
|
if s and s:get_count()>0 then
|
|
inv_list[#inv_list+1] = i.." "..s:get_name().." "..s:get_count()
|
|
end
|
|
end
|
|
end
|
|
end
|
|
mod_storage:set_string(botname,minetest.serialize(inv_list))
|
|
end
|
|
|
|
vbots.load = function(pos,player,mode)
|
|
local meta = minetest.get_meta(pos)
|
|
local key = meta:get_string("key")
|
|
local data = mod_storage:to_table().fields
|
|
local bot_list = ""
|
|
for n,d in pairs(data) do
|
|
bot_list = bot_list..n..","
|
|
end
|
|
bot_list = bot_list:sub(1,#bot_list-1)
|
|
local formspec
|
|
local formname
|
|
if not mode then
|
|
formspec = "size[5,9]"..
|
|
"image_button_exit[4,0;1,1;vbots_gui_delete.png;delete;]"..
|
|
"tooltip[4,0;1,1;delete]"..
|
|
"image_button_exit[4,1;1,1;vbots_gui_rename.png;rename;]"..
|
|
"tooltip[4,1;1,1;rename]"..
|
|
"textlist[0,0;4,9;saved;"..bot_list.."]"
|
|
formname = "loadbot,"..key
|
|
elseif mode == "delete" then
|
|
formspec = "size[4,9]no_prepend[]"..
|
|
"bgcolor[#F00]"..
|
|
"textlist[0,0;4,9;saved;"..bot_list.."]"
|
|
formname = "delete,"..key
|
|
elseif mode == "rename" then
|
|
formspec = "size[4,9]no_prepend[]"..
|
|
"bgcolor[#0F0]"..
|
|
"textlist[0,0;4,9;saved;"..bot_list.."]"
|
|
formname = "rename,"..key
|
|
elseif mode:sub(1,8) == "renameto" then
|
|
local fromname = mode:sub(10)
|
|
formspec = "size[5,5]no_prepend[]"..
|
|
"bgcolor[#00F]"..
|
|
"field[0,0;5,2;oldname;Old Name;"..fromname.."]"..
|
|
"field[0,1;5,4;newname;New Name;]"
|
|
formname = "renameto,"..key
|
|
end
|
|
minetest.after(0.2, minetest.show_formspec, player:get_player_name(), formname, formspec)
|
|
end
|
|
|
|
|
|
-------------------------------------
|
|
-- Generate 32 bit key for formspec identification
|
|
-------------------------------------
|
|
function vbots.get_key()
|
|
math.randomseed(minetest.get_us_time())
|
|
local w = math.random()
|
|
local key = tostring( math.random(255) +
|
|
math.random(255) * 256 +
|
|
math.random(255) * 256*256 +
|
|
math.random(255) * 256*256*256 )
|
|
return key
|
|
end
|
|
|
|
vbots.bot_togglestate = function(pos,mode)
|
|
local meta = minetest.get_meta(pos)
|
|
local node = minetest.get_node(pos)
|
|
local timer = minetest.get_node_timer(pos)
|
|
local newname
|
|
if not mode then
|
|
if node.name == "vbots:off" then
|
|
mode = "on"
|
|
elseif node.name == "vbots:on" then
|
|
mode = "off"
|
|
end
|
|
end
|
|
if mode == "on" then
|
|
newname = "vbots:on"
|
|
timer:start(1/meta:get_int("steptime"))
|
|
meta:set_int("PC",0)
|
|
meta:set_int("PR",0)
|
|
meta:set_string("stack","")
|
|
meta:set_string("home",minetest.serialize(pos))
|
|
elseif mode == "off" then
|
|
newname = "vbots:off"
|
|
timer:stop()
|
|
meta:set_int("PC",0)
|
|
meta:set_int("PR",0)
|
|
meta:set_string("stack","")
|
|
end
|
|
--print(node.name.." "..newname)
|
|
if newname then
|
|
minetest.swap_node(pos,{name=newname, param2=node.param2})
|
|
end
|
|
end
|
|
|
|
|
|
dofile(vbots.modpath.."/formspec.lua")
|
|
dofile(vbots.modpath.."/formspec_handler.lua")
|
|
dofile(vbots.modpath.."/register_bot.lua")
|
|
dofile(vbots.modpath.."/register_commands.lua")
|
|
dofile(vbots.modpath.."/register_joinleave.lua")
|