2021-05-03 13:02:39 +08:00

130 lines
3.2 KiB
Lua

-- computers/init.lua
digicompute.c = {}
local path = digicompute.path
local main_path = path.."computers/"
-- Make computer directory
digicompute.builtin.mkdir(main_path)
-----------------------------
-- CURRENT USER MANAGEMENT --
-----------------------------
local current_users = {}
-- [event] remove current users on leave
minetest.register_on_leaveplayer(function(player)
local name = player:get_player_name()
if current_users[name] then
minetest.get_meta(current_users[name]):set_string("current_user", nil)
current_users[name] = nil
end
end)
-- [function] Set current user
function digicompute.c:set_user(pos, name)
current_users[name] = pos
local meta = minetest.get_meta(current_users[name])
local current_user = meta:get_string("current_user")
-- Check if there was already another user
if current_user ~= "" and current_user ~= name then
if minetest.get_player_by_name(current_user) then
local formname = meta:get_string("formname")
-- if formname is defined, close that formspec
if formname ~= "" then
minetest.close_formspec(current_user, "digicompute_redo:"..formname)
end
-- Remove from current users
current_users[current_user] = nil
minetest.log("Removed current user: "..dump(current_user))
end
end
-- Update node meta entry
meta:set_string("current_user", name)
end
-- [function] Unset current user
function digicompute.c:unset_user(pos, name)
if current_users[name] then
local meta = minetest.get_meta(current_users[name])
-- Clear node meta entry
meta:set_string("current_user", nil)
current_users[name] = nil -- Remove from table
local formname = meta:get_string("formname")
-- if formname is defined, close that formspec
if formname ~= "" then
minetest.close_formspec(name, "digicompute_redo:"..formname)
end
end
end
-------------------
-- ID MANAGEMENT --
-------------------
local computers = {}
-- [function] load computers
function digicompute.load_computers()
local res = digicompute.builtin.read(path.."/computers.txt")
if res then
res = minetest.deserialize(res)
if type(res) == "table" then
computers = res
end
end
end
-- Load all computers
digicompute.load_computers()
-- [function] save computers
function digicompute.save_computers()
digicompute.builtin.write(path.."/computers.txt", minetest.serialize(computers))
end
-- [function] generate new computer ID
function digicompute.c:new_id(pos)
assert(type(pos) == "table", "digicompute.c:new_id requires a valid position")
local meta = minetest.get_meta(pos)
local function count()
local c = 1
for _, i in pairs(computers) do
c = c + 1
end
return c
end
local id = "c_"..count()
computers[id] = {
pos = pos,
}
meta:set_string("id", id)
end
-- [event] save computers on shutdown
minetest.register_on_shutdown(digicompute.save_computers)
digicompute.loaded_computers = computers
-----------------------------
-- Load External Resources --
-----------------------------
local module_path = digicompute.get_module_path("computers")
-- Load env
dofile(module_path.."/env.lua")
-- Load GUI
dofile(module_path.."/gui.lua")
-- Load API
dofile(module_path.."/api.lua")
-- Load nodes (computers)
dofile(module_path.."/nodes.lua")