minetest-meseportals/meseportal_network.lua

149 lines
4.2 KiB
Lua

local function table_empty(tab)
for key in pairs(tab) do return false end
return true
end
meseportals.save_data = function(table_pointer)
local data = minetest.serialize( meseportals_network[table_pointer] )
local path = minetest.get_worldpath().."/meseportals_"..table_pointer..".data"
local file = io.open( path, "w" )
if( file ) then
file:write( data )
file:close()
return true
else return nil
end
end
meseportals.restore_data = function(table_pointer)
local path = minetest.get_worldpath().."/meseportals_"..table_pointer..".data"
local file = io.open( path, "r" )
if( file ) then
local data = file:read("*all")
meseportals_network[table_pointer] = minetest.deserialize( data )
file:close()
if table_empty(meseportals_network[table_pointer]) then os.remove(path) end
return true
else return nil
end
end
meseportals.load_players = function()
local path = minetest.get_worldpath().."/meseportals.players"
local file = io.open( path, "r" )
if( file ) then
local data = file:read("*all")
meseportals["registered_players"] = minetest.deserialize( data )
file:close()
if table_empty(meseportals["registered_players"]) then os.remove(path) end
return true
else return nil
end
end
meseportals.save_players = function()
if table_empty(meseportals["registered_players"]) then return end
local data = minetest.serialize( meseportals["registered_players"] )
local path = minetest.get_worldpath().."/meseportals.players"
local file = io.open( path, "w" )
if( file ) then
file:write( data )
file:close()
return true
else return nil
end
end
-- load meseportalss network data
if meseportals.load_players() ~= nil then
for __,tab in ipairs(meseportals["registered_players"]) do
if meseportals.restore_data(tab["player_name"]) == nil then
--print ("[meseportals] Error loading data!")
meseportals_network[tab["player_name"]] = {}
end
end
else
print ("[meseportals] Error loading data! Creating new file.")
meseportals["registered_players"]={}
meseportals.save_players()
end
-- register_on_joinplayer
minetest.register_on_joinplayer(function(player)
local player_name = player:get_player_name()
local registered=nil
for __,tab in ipairs(meseportals["registered_players"]) do
if tab["player_name"] == player_name then registered = true break end
end
if registered == nil then
local new={}
new["player_name"]=player_name
table.insert(meseportals["registered_players"],new)
meseportals_network[player_name]={}
meseportals.save_players()
meseportals.save_data(player_name)
end
meseportals_gui["players"][player_name]={
formspec = "",
current_page = meseportals.default_page,
own_portals ={},
own_portals_count =0,
public_portals ={},
public_portals_count =0,
current_index =0,
temp_portal ={},
}
end)
meseportals.unregisterPortal = function(pos)
for _,tab in pairs(meseportals.registered_players) do
local player_name=tab.player_name
for __,portal in ipairs(meseportals_network[player_name]) do
if portal["pos"].x==pos.x and portal["pos"].y==pos.y and portal["pos"].z==pos.z then
table.remove(meseportals_network[player_name], __)
if meseportals.save_data(player_name)==nil then
print ("[meseportals] Couldnt update network file!")
end
end
end
end
end
meseportals.registerPortal = function(player_name,pos,dir)
if meseportals.findPortal(pos) then
--An annoying glitch
meseportals.unregisterPortal(pos)
end
if meseportals_network[player_name]==nil then
meseportals_network[player_name]={}
end
local new_portal ={}
new_portal["pos"]=pos
new_portal["type"]="public"
new_portal["description"]="Portal at (" ..new_portal["pos"].x .."," ..new_portal["pos"].y .."," ..new_portal["pos"].z ..")"
new_portal["dir"]=dir
new_portal["owner"]=player_name
table.insert(meseportals_network[player_name],new_portal)
if meseportals.save_data(player_name)==nil then
print ("[meseportals] Couldnt update network file!")
end
end
meseportals.findPortal = function(pos)
if pos ~= nil then
for _,tab in pairs(meseportals.registered_players) do
local player_name=tab.player_name
for _,portals in pairs(meseportals_network[player_name]) do
if portals
and vector.equals(portals.pos, pos) then
return portals
end
end
end
end
return nil
end