130 lines
3.2 KiB
Lua
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")
|