diff --git a/comandos.lua b/comandos.lua index f32c297..b8d8912 100644 --- a/comandos.lua +++ b/comandos.lua @@ -10,51 +10,9 @@ minetest.register_chatcommand("gestor", { params = "[Nenhum]", description = "Abrir tela de gerenciamento", func = function(name) + local player = minetest.get_player_by_name(name) + player:set_attribute("gestor_aba", "inicio") minetest.after(1, gestor.menu_principal, name, true) end }) - --- Comando de serializar estrutura -minetest.register_chatcommand("serializar", { - privs = {server=true}, - params = "[ ]", - description = "Serializa uma estrutura (recomenda-se 10 blocos de profundidade do solo da vila)", - func = function(name, param) - local m = string.split(param, " ") - local param1, param2, param3 = m[1], m[2], m[3] - if param1 then - local player = minetest.get_player_by_name(name) - local pos = player:getpos() - if gestor.estruturador.salvar(pos, param1, param2, param3) then - minetest.chat_send_player(name, "Estrutura serializada com sucesso") - else - minetest.chat_send_player(name, "Falha ao serializar estrutura") - end - else - minetest.chat_send_player(name, "Comando invalido") - end - end -}) - --- Comando de deserializar estrutura -minetest.register_chatcommand("deserializar", { - privs = {server=true}, - params = "[ ]", - description = "Serializa uma estrutura", - func = function(name, param) - local m = string.split(param, " ") - local param1, param2, param3 = m[1], m[2], m[3] - if param1 then - local player = minetest.get_player_by_name(name) - local pos = player:getpos() - if gestor.estruturador.carregar(pos, param1, param2, param3) then - minetest.chat_send_player(name, "Estrutura deserializada com sucesso") - else - minetest.chat_send_player(name, "Falha ao deserializar estrutura") - end - else - minetest.chat_send_player(name, "Comando invalido") - end - end -}) diff --git a/depends.txt b/depends.txt index 3afbedb..574204e 100644 --- a/depends.txt +++ b/depends.txt @@ -1,3 +1,2 @@ default areas? -memor diff --git a/estruturador.lua b/estruturador.lua deleted file mode 100644 index 60e60be..0000000 --- a/estruturador.lua +++ /dev/null @@ -1,262 +0,0 @@ --- --- Mod gestor --- --- Estruturador --- - --- Diretorio do Mundo -local worldpath = minetest.get_worldpath() - --- Nodes que podem ter metadados serializados -local meta_ok = { - "terrenos:livre", - "default:sign_wall_wood", - "default:sign_wall_steel", - "bau_comunitario:bau", - "antipvp:placa", - "portais:bilheteria", - "macromoney:caixa_de_banco", -} - --- Assegurar pasta de estruturas -do - local list = minetest.get_dir_list(worldpath, true) - local r = false - for n, ndir in ipairs(list) do - if ndir == "gestor" then - r = true - break - end - end - if r == false then - minetest.mkdir(worldpath.."/gestor") - end - - list = minetest.get_dir_list(worldpath.."/gestor", true) - r = false - for n, ndir in ipairs(list) do - if ndir == "estruturas" then - r = true - break - end - end - if r == false then - minetest.mkdir(worldpath.."/gestor/estruturas") - end - -end - - --- Variavel global de estruturador -gestor.estruturador = {} - - --- Arredondar posicao -local arredondar = function(pos) - local r = {} - if pos.x > (math.floor(pos.x)+0.5) then - r.x = math.ceil(pos.x) - else - r.x = math.floor(pos.x) - end - if pos.y > (math.floor(pos.y)+0.5) then - r.y = math.ceil(pos.y) - else - r.y = math.floor(pos.y) - end - if pos.z > (math.floor(pos.z)+0.5) then - r.z = math.ceil(pos.z) - else - r.z = math.floor(pos.z) - end - return r -end - - --- Serializar estrutura -gestor.estruturador.salvar = function(pos, nome, largura, altura, path, silencio) - if not pos or not nome then return false end - -- arredondar posicao - local as = pos.x - pos = arredondar(pos) - - if path == nil then - path = worldpath .. "/gestor/estruturas" - end - largura = largura or gestor.diretrizes.estruturas[nome][1] - altura = altura or gestor.diretrizes.estruturas[nome][1] - if not largura or not altura then return false end - - -- Coordenada do extremo oposto da estrutura - local pmax = {x=pos.x+largura, y=pos.y+altura, z=pos.z+largura} - - -- Criar arquivo schematic - if silencio == nil or silencio == false then minetest.chat_send_all("Criando arquivo esquematico da estrutura ...") end - minetest.create_schematic(pos, pmax, {}, path .. "/"..nome..".mts") - - -- Metadados de alguns nodes - local metadados = {} - - -- Metadados dos nodes - metadados.nodes = {} - - -- Armazena as dimensoes - metadados.altura = altura - metadados.largura = largura - - -- Pegar nodes quem podem ter seus metadados serializados - local nodes = minetest.find_nodes_in_area(pos, pmax, meta_ok) - - -- Pegar metadados dos nodes encontrados - for _,pn in ipairs(nodes) do - -- Serializa os metadados - local meta = minetest.get_meta(pn):to_table() - - -- Calcula a posicao relativa a coordenada extremo-negativa - local pr = {x=pn.x-pos.x, y=pn.y-pos.y, z=pn.z-pos.z} - metadados.nodes[pr.x.." "..pr.y.." "..pr.z] = meta - end - - -- Criar arquivo de metadados - local output = io.open(path .. "/"..nome..".meta", "w") - - -- Serializa os metadados - if silencio == nil or silencio == false then minetest.chat_send_all("Serializando metadados ...") end - metadados = minetest.serialize(metadados) - - if silencio == nil or silencio == false then minetest.chat_send_all("Escrevendo metadados serializados em arquivo ...") end - output:write(metadados) - io.close(output) - - -- Estrutura serializada com sucesso - return true -end - - --- Deserializar uma estrutura -gestor.estruturador.carregar = function(pos, nome, largura, altura, path, silencio) - if pos == nil or nome == nil then return false end - if silencio == nil or silencio == false then minetest.chat_send_all("Criando estrutura. Aguarde...") end - -- Coleta de dados - local dados = {} - if path == nil then - path = worldpath .. "/gestor/estruturas" - end - - -- Obter metadados - local metadados = "" - local input = io.open(path .. "/"..nome..".meta", "r") - if input then - metadados = input:read("*l") - else - return false - end - if not metadados then - minetest.chat_send_all("Erro. Faltou o arquivo de metadados") - return false - end - io.close(input) - - -- Deserializar metadados - metadados = minetest.deserialize(metadados) - - altura = metadados.altura - largura = metadados.largura - - - - -- Coordenada do extremo oposto da estrutura - local pmax = {x=pos.x+largura, y=pos.y+altura, z=pos.z+largura} - - -- Colocar estrutura esquematica - minetest.place_schematic(pos, path.."/"..nome..".mts", nil, nil, true) - - -- Restaurar metadados nos nodes - for pos_string,meta in pairs(metadados.nodes) do - - -- Obter pos em tabela - local pos_tb = string.split(pos_string, " ") - pos_tb = {x=tonumber(pos_tb[1]),y=tonumber(pos_tb[2]),z=tonumber(pos_tb[3])} - - -- Calcular pos real do node - local pn = {x=pos.x+pos_tb.x, y=pos.y+pos_tb.y, z=pos.z+pos_tb.z} - - -- Salva metadados - minetest.get_meta(pn):from_table(meta) - - end - - -- Estrutura construida com sucesso - if silencio == nil or silencio == false then minetest.chat_send_all("Estrutura construida. Aguarde o mapa ser renderizado.") end - return true -end - --- ------ --------- --- Nodes restaurador de escadarias -local criar_nivel_escadaria = function(pos, largura, name) - local limx, limz = pos.x+(largura/2), pos.z+(largura/2) - local x, z = pos.x-(largura/2), pos.z-(largura/2) - while (x<=limx) do - z = pos.z-(largura/2) - while (z<=limz) do - local npos = {x=x,y=pos.y,z=z} - local node = minetest.get_node(npos) - if node.name == "ignore" then - minetest.get_voxel_manip():read_from_map(npos, npos) - node = minetest.get_node(npos) - end - if node.name == "air" then - minetest.set_node(npos, {name=name}) - end - z=z+1 - end - x=x+1 - end -end -local criar_escadaria = function(pos, node) - local npos = {x=pos.x,y=pos.y-10,z=pos.z} - local altura = pos.y - 8 - while altura <= pos.y do - criar_nivel_escadaria({x=pos.x,y=altura,z=pos.z}, (math.abs(pos.y-altura)*4)+7, node) - altura = altura + 1 - end -end -minetest.register_node("gestor:escadaria", { - description = "Restaurador de escadaria", - tiles = { - "default_pine_wood.png", - "default_pine_wood.png", - "default_pine_wood.png", - "default_pine_wood.png", - "default_pine_wood.png", - "default_pine_wood.png" - }, - groups = {choppy=2,oddly_breakable_by_hand=2,wood=1}, - sounds = default.node_sound_wood_defaults(), - on_rightclick = function(pos) - local node = minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z}) - criar_escadaria({x=pos.x,y=pos.y-1,z=pos.z}, node.name) - minetest.set_node(pos, {name="air"}) - minetest.set_node({x=pos.x,y=pos.y+1,z=pos.z}, {name="air"}) - end, -}) --- Fim --------- ------ --- - --- Pegar metadados da estrutura -gestor.estruturador.get_meta = function(nome) - local path = worldpath .. "/gestor/estruturas" - - -- Obter metadados - local metadados = "" - local input = io.open(path .. "/"..nome..".meta", "r") - if not input then return nil end - metadados = input:read("*l") - io.close(input) - - return minetest.deserialize(metadados) -end diff --git a/init.lua b/init.lua index 225121b..13c9753 100644 --- a/init.lua +++ b/init.lua @@ -22,16 +22,15 @@ local modpath = minetest.get_modpath("gestor") gestor = {} -- Banco de Dados do gestor -gestor.bd = memor.montar_bd() +gestor.bd = dofile(modpath.."/lib/memor.lua") -- Carregar scripts notificar("Carregando...") dofile(modpath.."/diretrizes.lua") -dofile(modpath.."/estruturador.lua") -dofile(modpath.."/protetor.lua") -dofile(modpath.."/lugares_avulsos.lua") -dofile(modpath.."/vilas.lua") dofile(modpath.."/menu_principal.lua") dofile(modpath.."/comandos.lua") -dofile(modpath.."/alerta_de_crash.lua") +-- Recursos +dofile(modpath.."/recursos/desligar.lua") +dofile(modpath.."/recursos/conf.lua") +dofile(modpath.."/recursos/alerta_de_crash.lua") notificar("OK") diff --git a/lib/memor.lua b/lib/memor.lua new file mode 100644 index 0000000..bee9823 --- /dev/null +++ b/lib/memor.lua @@ -0,0 +1,302 @@ +--[[ + Lib Memor para Minetest + Memor v1.3 Copyright (C) 2017 BrunoMine (https://github.com/BrunoMine) + + Recebeste uma cópia da GNU Lesser General + Public License junto com esse software, + se não, veja em . + + Inicializador de scripts + ]] + +local modname = minetest.get_current_modname() + +local modpath = minetest.get_modpath(modname) + +-- Variavel global +local memor = {} + +-- Rotinas de interação com arquivos + +-- Diretorio do mundo +local wpath = minetest.get_worldpath() + +-- Cria um diretório na pasta do mundo +function memor.mkdir(dir) + if not dir then + minetest.log("error", "[Memor] Nenhum diretorio especificado (em memor.mkdir)") + return false + end + + dir = wpath.."/"..dir + + if minetest.mkdir then + minetest.mkdir(dir) + else + os.execute('mkdir "' .. dir .. '"') + end + return true +end + +-- Criar um arquivo com os dados serializados (Salvar) +function memor.escrever(dir, arquivo, dados, is_text) + + if dir == nil or arquivo == nil or dados == nil then + minetest.log("error", "[Memor] Faltou dados (em memor.escrever)") + return false + end + + if is_text ~= true then + dados = minetest.serialize(dados) + else + dados = string.format(dados) + end + if dados == "" then + minetest.log("error", "[Memor] Dado fornecido invalido (em memor.escrever)") + return false + end + local saida = io.open(wpath .. "/" .. modname .. "/" .. dir .. "/" .. arquivo, "w") + if saida then + saida:write(dados) + io.close(saida) + return true + end + -- Cria diretorio (tabela) caso nao exista + memor.mkdir(modname.."/"..dir) + saida = io.open(wpath .. "/" .. modname .. "/" .. dir .. "/" .. arquivo, "w") + if saida then + saida:write(dados) + io.close(saida) + return true + end + + minetest.log("error", "[Memor] Impossivel escrever dados em "..modname.."/"..dir.."/"..arquivo.." (em memor.escrever)") + return false +end + +-- Ler dados de um arquivo de memória (Carregar) +function memor.ler(dir, arquivo, is_text) + + if dir == nil or arquivo == nil then + minetest.log("error", "[Memor] Faltou dados (em memor.ler)") + return nil + end + + local entrada = io.open(wpath .. "/" .. modname .. "/" .. dir .. "/" .. arquivo, "r") + if entrada ~= nil then + local dados + if is_text ~= true then + dados = entrada:read("*l") + dados = minetest.deserialize(dados) + else + dados = entrada:read("*a") + dados = dados + end + io.close(entrada) + return dados + else + minetest.log("error", "[Memor] pasta e/ou arquivo inexiste(s) (em memor.ler)") + return nil + end +end + +-- Deletar um arquivo +function memor.deletar(dir, arquivo) + + if not dir or not arquivo then + minetest.log("error", "[Memor] Faltou dados (em memor.deletar)") + return false + end + + os.remove(wpath .. "/" .. modname .. "/" .. dir .. "/" .. arquivo) + return true +end + + +-- Deletar um diretório +function memor.deletar_dir(dir) + + if not dir then + minetest.log("error", "[Memor] Faltou dados (em memor.deletar_dir)") + return false + end + + local list = minetest.get_dir_list(wpath .. "/" .. modname .. "/" .. dir) + + for n, arquivo in ipairs(list) do + os.remove(wpath .. "/" .. modname .. "/" .. dir .. "/" .. arquivo) + end + + os.remove(wpath .. "/" .. modname .. "/" .. dir) + return true +end + +-- Fim + +-- Rotinas de consutas a arquivos + +-- Verifica diretorios e corrige +verificar = function(subdir) + + + -- Verifica e corrige diretorio + local list = minetest.get_dir_list(minetest.get_worldpath(), true) + local r = false + for n, ndir in ipairs(list) do + if ndir == modname then + r = true + break + end + end + -- Diretorio inexistente + if r == false then + memor.mkdir(modname) + end + + -- Verifica e corrige subdiretorio + local list = minetest.get_dir_list(minetest.get_worldpath().."/"..modname, true) + local r = false + for n, ndir in ipairs(list) do + if ndir == subdir then + r = true + break + end + end + -- Subdiretorio inexistente + if r == false then + memor.mkdir(modname.."/"..subdir) + end + +end + + +-- Inserir dados +memor.inserir = function(tb, index, valor, is_text) + + -- Tenta inserir direto + if memor.escrever(tb, index, valor, is_text) == true then return true end + + verificar(tb) + + if memor.escrever(tb, index, valor, is_text) then + return true + else + minetest.log("error", "[Memor] Impossivel salvar dados (em memor.inserir)") + return false + end + +end + + +-- Ler dados +memor.consultar = function(tb, index, is_text) + + local r = memor.ler(tb, index, is_text) + if r == nil then + local mod = modname + minetest.log("error", "[Memor] Registro acessado inexistente ("..dump(mod).."/"..dump(tb).."/"..dump(index)..") (em memor.consultar)") + end + + return r + +end + + +-- Verificar dados +memor.verificar = function(subdir, arquivo) + + local dir = modname + + local list = minetest.get_dir_list(wpath .. "/" .. dir .. "/" .. subdir) + local r = false + for n, arq in ipairs(list) do + if arq == arquivo then + r = true + break + end + end + + if r then + return true + else + return false + end +end + +-- Listar +memor.listar = function(subdir) + + local dir = modname + + if subdir then + + local list = minetest.get_dir_list(wpath .. "/" .. dir .. "/" .. subdir) + + if list == nil then + minetest.log("error", "[Memor] Impossivel listar diretorio (em memor.listar)") + return false + else + return list + end + + else + local list = minetest.get_dir_list(wpath .. "/" .. dir) + + if list == nil then + minetest.log("error", "[Memor] Impossivel listar diretorio (em memor.listar)") + return false + else + return list + end + end +end + +-- Fim + +-- Montagem de banco de dados + +bd = {} + +-- Inserir dados comuns +bd.salvar = function(tb, index, valor) + return memor.inserir(tb, index, valor) +end + +-- Inserir textos complexos +bd.salvar_texto = function(tb, index, valor) + return memor.inserir(tb, index, valor, true) +end + +-- Consultar dados +bd.pegar = function(tb, index) + return memor.consultar(tb, index) +end + +-- Inserir dados +bd.pegar_texto = function(tb, index, valor) + return memor.consultar(tb, index, true) +end + +-- Verificar dados +bd.verif = function(tb, index) + return memor.verificar(tb, index) +end + +-- Remover dados +bd.remover = function(tb, index) + return memor.deletar(tb, index) +end + +-- Remover tabela +bd.drop_tb = function(tb) + return memor.deletar_dir(tb) +end + +-- Listar dados +bd.listar = function(tb) + return memor.listar(tb) +end + +return bd + +-- Fim diff --git a/lugares_avulsos.lua b/lugares_avulsos.lua deleted file mode 100644 index f63b19e..0000000 --- a/lugares_avulsos.lua +++ /dev/null @@ -1,16 +0,0 @@ --- --- Mod gestor --- --- Lugares avulsos (gerenciamento) --- - --- Variavel global -gestor.lugares_avulsos = {} - --- Definir um lugar no banco de dados (usado para inserir e editar) -gestor.lugares_avulsos.definir = function(nome, status, texto) - if not nome or not texto then return false end - gestor.bd:salvar("avulsos", nome, {status=status, texto=texto}) - return true -end - diff --git a/menu_principal.lua b/menu_principal.lua index 8f982db..0f5039e 100644 --- a/menu_principal.lua +++ b/menu_principal.lua @@ -9,154 +9,57 @@ Menu Principal (Painel do gestor) ]] -local escolha_local_avulso = {} +-- Abas registradas +gestor.abas = {} -local escolha_vila = memor.online() - --- Caminho do mod -local modpath = minetest.get_modpath("gestor") - --- Desordenar tabela -local desordenar = function(tb) - local ntb = {} - for _,d in ipairs(tb) do - ntb[d] = {} - end - return ntb -end - --- Lista-string configurada altomaticamente -gestor.lista_vilas = "" -local i = 1 -while (gestor.vilas[i]~=nil) do - gestor.lista_vilas = gestor.lista_vilas..gestor.vilas[i] - if i < table.maxn(gestor.vilas) then gestor.lista_vilas = gestor.lista_vilas .. "," end - i = i + 1 +-- Registrar aba +local botoes_abas = { + "0,1;3,1", -- 1 + "0,2;3,1", -- 2 + "0,3;3,1", -- 3 + "0,4;3,1", -- 4 + "0,5;3,1", -- 5 + "0,6;3,1", -- 6 + "0,7;3,1", -- 7 + "0,8;3,1", -- 8 + "0,9;3,1", -- 9 +} +gestor.registrar_aba = function(name, def) + gestor.abas[name] = def + gestor.abas[name].formspec_button = "button["..botoes_abas[1]..";"..name..";"..def.titulo.."]" + table.remove(botoes_abas, 1) end -- Abrir Menu principal -local aba = {} -- salva em que aba o jogador esta -gestor.menu_principal = function(name, inicio) - if inicio == true then aba[name] = "inicio" end +gestor.menu_principal = function(name) + local player = minetest.get_player_by_name(name) + + -- Verifica aba em acesso + local aba_atual = player:get_attribute("gestor_aba") + if aba_atual == nil then + aba_atual = "inicio" + player:set_attribute("gestor_aba", aba_atual) + end local formspec = "size[14,11]" ..default.gui_bg ..default.gui_bg_img .."label[0,0;Gestor Administrativos do Servidor]" - .."button[0,1;3,1;desligar;Desligar]" -- Botao 1 - .."button[0,2;3,1;lugares;Lugares]" -- Botao 2 - .."button[0,3;3,1;conf;Diretrizes]" -- Botao 3 - .."button[0,4;3,1;alerta_de_crash;Alerta de Crash]" -- Botao 4 - --.."button[0,5;3,1;;]" -- Botao 5 - --.."button[0,6;3,1;;]" -- Botao 6 - --.."button[0,7;3,1;;]" -- Botao 7 - --.."button[0,8;3,1;;]" -- Botao 8 - --.."button[0,9;3,1;;]" -- Botao 9 - + + -- Botoes de abas + for name_aba,def in pairs(gestor.abas) do + formspec = formspec..def.formspec_button + end + -- -- Gerando Abas -- - -- Lugares - if aba[name] == "lugares" then - local lugares = {} - lugares["centro"] = desordenar(minetest.get_dir_list(minetest.get_worldpath().."/gestor/centro")) - lugares["vilas"] = desordenar(minetest.get_dir_list(minetest.get_worldpath().."/gestor/lugares")) - lugares["avulsos"] = desordenar(minetest.get_dir_list(minetest.get_worldpath().."/gestor/avulsos")) - local status_lugares = {} - - -- Status e teleporte do Centro do Servidor - if gestor.bd:verif("centro", "status") then - status_lugares["centro"] = "Ativo" - formspec = formspec.."button_exit[7,2.5;3,1;ir_centro;Ir para Centro]" - formspec = formspec.."button[10,2.5;3,1;tp_centro;Redefinir pos. tp.]" - else - status_lugares["centro"] = "Inativo" - end + if aba_atual ~= "inicio" then - -- Preparar variaveis para Lugares avulsos - local lista_avulsos = "" - local desc_avulso = "Selecione um lugar \nna lista ao lado \n<<<<<<<<<<<<<\npara saber sobre" - .."\nMaximizar a tela \najuda na leitura da \nlista e do texto" - local n = 0 - for nome_avulso, v in pairs(lugares["avulsos"]) do - if lista_avulsos ~= "" then lista_avulsos = lista_avulsos.."," end - if v.status then lista_avulsos = lista_avulsos.."OK |" else lista_avulsos = lista_avulsos.."PEND. |" end - lista_avulsos = lista_avulsos.." "..nome_avulso - n = n + 1 - if tonumber(escolha_local_avulso[name]) == n then desc_avulso = v.texto end - end - if lista_avulsos == "" then lista_avulsos = "Nenhum" end - formspec = formspec.. - "label[4,1;Lugares]".. - -- Centro do Servidor - "label[4,2;Centro do Servidor - Spawn ("..status_lugares["centro"]..")]".. - "button[4,2.5;3,1;construir_centro;Constrir Aqui]".. - -- Vilas - "label[4,4;Vilas]".. - "dropdown[4,4.5;4,1;vila;"..gestor.lista_vilas..";1]".. - "button[8,4.4;2.5,1;construir_vila;Constrir Aqui]".. - "button_exit[10.5,4.4;3.1,1;tp_vila;Definir spawn de vila]".. - -- Lugares Avulsos - "label[4,6;Lugares Avulsos]".. - "textlist[4,6.5;5,4;avulsos;"..lista_avulsos.."]".. - "textarea[9.4,6.48;4.5,4.73;desc_avulso;Sobre o lugar;"..desc_avulso.."]" - - -- Diretrizes - elseif aba[name] == "diretrizes" then - - formspec = formspec - .."label[4,1;Diretrizes]" - .."label[4,2;Ponto de Spawn]" - .."button_exit[4,2.4;3,1;definir_spawn;Definir Aqui]" - .."button_exit[7,2.4;3,1;ir_spawn;Ir para Spawn]" - .."field[4.3,4.1;3,1;slots;Limite de Jogadores;"..minetest.setting_get("max_users").."]" - .."button_exit[7,3.8;3,1;definir_slots;Redefinir Limite]" - - -- Alerta de crash - elseif aba[name] == "alerta_de_crash" then + -- Gerar formspec + formspec = formspec .. gestor.abas[aba_atual].get_formspec(name) - -- Pegar dados - local status_alerta_de_crash = minetest.setting_getbool("gestor_alerta_de_crash") or false - local servidor_smtp = minetest.setting_get("gestor_servidor_smtp") or "-" - local login_smtp = minetest.setting_get("gestor_login_smtp") or "-" - local senha_login_smtp = minetest.setting_get("gestor_senha_login_smtp") - local email_destinatario = minetest.setting_get("gestor_email_destinatario") or "-" - local titulo = minetest.setting_get("gestor_titulo_email") or "-" - local texto = minetest.setting_get("gestor_texto_email") or "-" - - local status_senha = "nenhuma" - if senha_login_smtp then - status_senha = "salva" - end - - - if status_alerta_de_crash == false then - status_alerta_de_crash = "1" - else - status_alerta_de_crash = "2" - end - - formspec = formspec - - .."label[4,1;Alerta de Crash]" - - -- Sistema Verificador AntiCrash - .."label[4,2;Sistema Verificador AntiCrash]" - .."button[4,2.6;3,1;salvar;Salvar Dados]" - -- Sistema Notificador via Email - .."label[4,5;Sistema Notificador via Email]" - .."label[4,5.4;Estado]" - - .."dropdown[4,5.8;2,1;status_email;Inativo,Ativo;"..status_alerta_de_crash.."]" - .."field[6.3,6;4.3,1;login_smtp;Login emissor;"..login_smtp.."]" - .."pwdfield[10.6,6;3.3,1;senha;Senha ("..status_senha..")]" - .."field[4.3,7.2;9.6,1;servidor_smtp;Servidor SMTP de envio (host:porta);"..servidor_smtp.."]" - .."field[4.3,8.4;5,1;titulo;Titulo da mensagem de email enviada;"..titulo.."]" - .."field[9.3,8.4;4.6,1;email_destinatario;Email do destinatario;"..email_destinatario.."]" - .."field[4.3,9.6;9.6,1;texto;Texto;"..texto.."]" - .."button[4,10;5,1;testar_email;Enviar mensagem de teste]" - end -- Exibir tela @@ -167,283 +70,36 @@ end -- Receptor de campos minetest.register_on_player_receive_fields(function(player, formname, fields) + -- Verifica aba em acesso + local aba_atual = player:get_attribute("gestor_aba") + if aba_atual == nil then + aba_atual = "inicio" + player:set_attribute("gestor_aba", aba_atual) + end + -- Menu Principal if formname == "gestor:menu_principal" then local name = player:get_player_name() - -- - -- Alternar aba selecionada - -- - - if fields.lugares then -- Lugares - aba[name] = "lugares" - gestor.menu_principal(name) - return true - elseif fields.conf then -- Diretrizes - aba[name] = "diretrizes" - gestor.menu_principal(name) - return true - elseif fields.alerta_de_crash then -- Alerta de Crash - aba[name] = "alerta_de_crash" - gestor.menu_principal(name) - return true - end - - - -- Botao Desligar servidor - if fields.desligar then - minetest.show_formspec(name, "gestor:aviso_desligamento", "size[4,1.8]".. - default.gui_bg.. - default.gui_bg_img.. - "label[0,0;Tem certeza que quer \ndesligar do servidor?]".. - "button[0,1;2,1;cancelar;Cancelar]".. - "button_exit[2,1;2,1;ok;Sim]" - ) - end - - -- - -- Recebendo campos de Abas - -- - - -- Lugares - if aba[name] == "lugares" then - if fields.construir_centro then - minetest.show_formspec(name, "gestor:aviso_construir_centro", "size[4,1.8]".. - default.gui_bg.. - default.gui_bg_img.. - "label[0,0;Tem certeza que quer \nconstruir Centro do Servidor]".. - "button[0,1;2,1;cancelar;Cancelar]".. - "button_exit[2,1;2,1;ok;Sim]" - ) - elseif fields.construir_vila then - escolha_vila[name] = fields.vila - minetest.show_formspec(name, "gestor:aviso_construir_vila", "size[4,4.8]".. - default.gui_bg.. - default.gui_bg_img.. - "label[0,0;Tem certeza que quer \nconstruir essa vila?]".. - "label[0,1;"..core.colorize("#FF0000", "Fique na faixa de altura \n") .. core.colorize("#FF0000", "maxima dos picos em volta").."]".. - "field[0.25,3.2;4,1;nome_vila;;Nome da Vila]".. - "label[0,2;Arquivo de midia: \n"..escolha_vila[name].."]".. - "button[0,4;2,1;cancelar;Cancelar]".. - "button_exit[2,4;2,1;ok;Sim]" - ) - elseif fields.tp_vila then - if fields.vila then - if gestor.bd:verif("vilas", fields.vila) then - local dados_vila = gestor.bd:pegar("vilas", fields.vila) - gestor.bd:salvar("vilas", fields.vila, {nome=dados_vila.nome, pos=player:getpos()}) - minetest.chat_send_player(name, "Posicao de teleporte da vila "..fields.vila.." redefinido para esse local.") - else - minetest.chat_send_player(name, "Vila "..fields.vila.." ainda nao existe.") - end - else - minetest.log("error", "Nome da vila parece inconsistente ("..dump(fields.vila)..").") - end - elseif fields.ir_centro then - player:setpos(gestor.bd:pegar("centro", "pos")) - minetest.chat_send_player(name, "Teleportado para o Centro do Servidor") - elseif fields.tp_centro then - gestor.bd:salvar("centro", "pos", player:getpos()) - minetest.show_formspec(name, "gestor:aviso", "size[4,1.8]".. - default.gui_bg.. - default.gui_bg_img.. - "label[0,0;AVISO\nPosicao de teleport \ndo Centro do Servidor \nredefinido para aqui]" - ) - minetest.after(2, gestor.menu_principal, name) - elseif fields.avulsos then - local n = string.split(fields.avulsos, ":") - escolha_local_avulso[name] = n[2] + -- Alternar aba + for name_aba,dados in pairs(gestor.abas) do + if fields[name_aba] then + -- Gerar formspec + player:set_attribute("gestor_aba", name_aba) gestor.menu_principal(name) - end - - -- Diretrizes - elseif aba[name] == "diretrizes" then - if fields.definir_spawn then - local pos = player:getpos() - minetest.setting_set("static_spawnpoint", pos.x.." "..pos.y.." "..pos.z) - minetest.chat_send_player(name, "Spawn redefinido aqui.") - elseif fields.ir_spawn then - local pos = minetest.setting_get_pos("static_spawnpoint") or {x=0,y=0,z=0} - player:setpos(pos) - minetest.chat_send_player(name, "Teleportado para ponto de Spawn.") - elseif fields.definir_slots then - if tonumber(fields.slots) then - minetest.setting_set("max_users", fields.slots) - minetest.chat_send_player(name, "Limite de jogadores redefinido para "..fields.slots..".") - else - minetest.chat_send_player(name, "Digite um numero para o limite de jogadores") - end - end - - -- Alerta de Crash - elseif aba[name] == "alerta_de_crash" then - - if fields.salvar then - - -- Salvar todos os dados - - -- Status de alerta de email - if fields.status_email == "Ativo" then - minetest.setting_setbool("gestor_alerta_de_crash", true) - else - minetest.setting_setbool("gestor_alerta_de_crash", false) - end - - -- Servidor SMTP - if fields.servidor_smtp and fields.servidor_smtp ~= "-" then - minetest.setting_set("gestor_servidor_smtp", fields.servidor_smtp) - end - - -- Login SMTP - if fields.login_smtp and fields.login_smtp ~= "-" then - minetest.setting_set("gestor_login_smtp", fields.login_smtp) - end - - -- Senha de Login SMTP - if fields.senha and fields.senha ~= "" then - minetest.setting_set("gestor_senha_login_smtp", fields.senha) - end - - -- Email do Destinatario - if fields.email_destinatario and fields.email_destinatario ~= "-" then - minetest.setting_set("gestor_email_destinatario", fields.email_destinatario) - end - - -- Titulo da mensagem de Email - if fields.titulo and fields.titulo ~= "-" then - minetest.setting_set("gestor_titulo_email", fields.titulo) - end - - -- Texto da mensagem de Email - if fields.texto and fields.texto ~= "-" then - minetest.setting_set("gestor_texto_email", fields.texto) - end - - minetest.show_formspec(name, "gestor:aviso", "size[4,1.8]".. - default.gui_bg.. - default.gui_bg_img.. - "label[0,0;SUCESSO \nOs dados validos foram \nsalvos.]" - ) - minetest.after(2, gestor.menu_principal, name) return - - - elseif fields.testar_email then - - if gestor.alerta_de_crash.enviar_email() then - minetest.show_formspec(name, "gestor:aviso", "size[4,1.8]".. - default.gui_bg.. - default.gui_bg_img.. - "label[0,0;FEITO \nComando de envio feito.\nVeja o arquivo de relatorio\ngestor_envios_de_alerta.out]" - ) - else - minetest.show_formspec(name, "gestor:aviso", "size[4,1.8]".. - default.gui_bg.. - default.gui_bg_img.. - "label[0,0;FALHA \nFaltam dados para\nrealizar o comando de envio.\n]" - ) - end - minetest.after(2, gestor.menu_principal, name) - end end - end - - -- - -- Janelas de aviso e outros - -- - - -- Desligamento - if formname == "gestor:aviso_desligamento" then - local name = player:get_player_name() - if fields.ok then - minetest.chat_send_all("*** Servidor desligando em 3 segundos. (Por "..name..")") - minetest.after(3, minetest.chat_send_all, "*** Servidor Desligado") - minetest.after(3, minetest.request_shutdown) - end - if fields.cancelar then - gestor.menu_principal(name) - end - end + -- Retornos para a aba registrada + if aba_atual ~= "inicio" then - -- Construir Centro do Servidor - if formname == "gestor:aviso_construir_centro" then - local name = player:get_player_name() + -- Retorno + gestor.abas[aba_atual].on_receive_fields(player, fields) + return + end - if fields.ok then - -- adquirindo dados - local pos = player:getpos() - local dados_estrutura = gestor.estruturador.get_meta("centro") - if not dados_estrutura then return minetest.chat_send_player(name, "Estrutura nao encontrada") end - local pos_c = {x=pos.x-(dados_estrutura.largura/2), y=pos.y-8, z=pos.z-(dados_estrutura.largura/2)} - local n_spawn = {x=pos.x, y=pos.y+2, z=pos.z} - -- Construir estrutura - if gestor.estruturador.carregar(pos_c, "centro") == false then return minetest.chat_send_player(name, "Estrutura nao encontrada") end - -- Proteger area da estrutura - local resp = gestor.proteger_area( - name, -- Quem registra - name, -- Quem vai ser o dono - "Centro", -- Nome(etiqueta) da area - {x=pos.x-(dados_estrutura.largura/2)-100, y=2000, z=pos.z-(dados_estrutura.largura/2)-100}, -- um dos cantos opostos - {x=pos.x+(dados_estrutura.largura/2)+100, y=pos.y-60, z=pos.z+(dados_estrutura.largura/2)+100} -- outro dos cantos opostos - ) - if resp ~= true then minetest.chat_send_player(name, "Falha ao proteger: "..resp) end - -- Salvar dados - minetest.setting_set("static_spawnpoint", pos.x.." "..(pos.y+10).." "..pos.z) - gestor.bd:salvar("centro", "pos", n_spawn) - gestor.bd:salvar("centro", "status", true) - -- Finalizando - player:moveto(n_spawn) - minetest.chat_send_player(name, "Centro construido e parcialmente definido. Configure a loja principal e o banco apenas. Recomendavel redefinir o spawn.") - - end - if fields.cancelar then - gestor.menu_principal(name) - end end - -- Construir vila - if formname == "gestor:aviso_construir_vila" then - local name = player:get_player_name() - - if fields.ok then - - local pos = player:getpos() - local vila = escolha_vila[name] - - -- Montar vila - local r = gestor.montar_vila(pos, vila) - if r ~= true then - return minetest.chat_send_player(name, r) - end - - - local dados_estrutura = gestor.estruturador.get_meta(vila) - local n_spawn = pos - - -- Proteger area da estrutura - local resp = gestor.proteger_area( - name, -- Quem registra - name, -- Quem vai ser o dono - fields.vila, -- Nome(etiqueta) da area - {x=pos.x-(dados_estrutura.largura/2)-10, y=2000, z=pos.z-(dados_estrutura.largura/2)-50}, -- um dos cantos opostos - {x=pos.x+(dados_estrutura.largura/2)+10, y=pos.y-60, z=pos.z+(dados_estrutura.largura/2)+50} -- outro dos cantos opostos - ) - if resp ~= true then minetest.chat_send_player(name, "Falha ao proteger: "..resp) end - - -- Salvar dados - gestor.bd:salvar("vilas", vila, {nome=fields.nome_vila,pos=n_spawn}) - - -- Finalizando - player:moveto(n_spawn) - minetest.chat_send_player(name, "*** Vila construida quase pronta. Ajuste as entradas da vila e o ponto de TP(spawn) perto da bilheteria.") - end - if fields.cancelar then - gestor.menu_principal(name) - end - end - - end) diff --git a/protetor.lua b/protetor.lua deleted file mode 100644 index bd23eab..0000000 --- a/protetor.lua +++ /dev/null @@ -1,43 +0,0 @@ --- --- Mod gestor --- --- Protetor --- - --- Proteger uma area -gestor.proteger_area = function(name, PlayerName, AreaName, pos1, pos2, silencio) - if not tostring(PlayerName) or not tostring(AreaName) then return "Faltam argumentos ou estao incorretos" end - if not areas or not areas.add then return "Faltou mod areas" end - local param = tostring(PlayerName).." "..tostring(AreaName) - local found, _, ownername, areaname = param:find('^([^ ]+) (.+)$') - - if not found then - return "Incorrect usage, see /help set_owner" - end - - if pos1 and pos2 then - pos1, pos2 = areas:sortPos(pos1, pos2) - else - return "Você precisa selecionar a area primeiro" - end - - if not areas:player_exists(ownername) then - return "O jogador \""..ownername.."\" não existe." - end - - minetest.log("action", name.." runs /set_owner. Owner = "..ownername.. - " AreaName = "..areaname.. - " StartPos = "..minetest.pos_to_string(pos1).. - " EndPos = " ..minetest.pos_to_string(pos2)) - - local id = areas:add(ownername, areaname, pos1, pos2, nil) - areas:save() - - if silencio == nil or silencio == false then - minetest.chat_send_player(ownername, - "Voce registrou essa area para o jogador #".. - id..". Use /lista para ver as areas.") - minetest.chat_send_player(name, "Area protected. ID: "..id) - end - return true -end diff --git a/recursos/alerta_de_crash.lua b/recursos/alerta_de_crash.lua new file mode 100644 index 0000000..2906f08 --- /dev/null +++ b/recursos/alerta_de_crash.lua @@ -0,0 +1,128 @@ +--[[ + Mod Gestor para Minetest + Gestor v2.0 Copyright (C) 2018 BrunoMine (https://github.com/BrunoMine) + + Recebeste uma cópia da GNU Lesser General + Public License junto com esse software, + se não, veja em . + + Recurso para alerta de crash do servidor + ]] + +-- Registrar aba 'diretrizes' +gestor.registrar_aba("alerta_de_crash", { + titulo = "Alerta de Crash", + get_formspec = function(name) + + -- Pegar dados + local status_alerta_de_crash = minetest.setting_getbool("gestor_alerta_de_crash") or false + local servidor_smtp = minetest.setting_get("gestor_servidor_smtp") or "-" + local login_smtp = minetest.setting_get("gestor_login_smtp") or "-" + local senha_login_smtp = minetest.setting_get("gestor_senha_login_smtp") + local email_destinatario = minetest.setting_get("gestor_email_destinatario") or "-" + local titulo = minetest.setting_get("gestor_titulo_email") or "-" + local texto = minetest.setting_get("gestor_texto_email") or "-" + + local status_senha = "nenhuma" + if senha_login_smtp then + status_senha = "salva" + end + + if status_alerta_de_crash == false then + status_alerta_de_crash = "1" + else + status_alerta_de_crash = "2" + end + + formspec = "label[3.5,1;Alerta de Crash]" + + -- Sistema Verificador AntiCrash + .."label[3.5,2;Sistema Verificador AntiCrash]" + .."button[3.5,2.6;3,1;salvar;Salvar Dados]" + -- Sistema Notificador via Email + .."label[3.5,5;Sistema Notificador via Email]" + .."label[3.5,5.4;Estado]" + + .."dropdown[3.5,5.8;2,1;status_email;Inativo,Ativo;"..status_alerta_de_crash.."]" + .."field[5.8,6;4.3,1;login_smtp;Login emissor;"..login_smtp.."]" + .."pwdfield[10.1,6;3.3,1;senha;Senha ("..status_senha..")]" + .."field[3.8,7.2;9.6,1;servidor_smtp;Servidor SMTP de envio (host:porta);"..servidor_smtp.."]" + .."field[3.8,8.4;5,1;titulo;Titulo da mensagem de email enviada;"..titulo.."]" + .."field[8.8,8.4;4.6,1;email_destinatario;Email do destinatario;"..email_destinatario.."]" + .."field[3.8,9.6;9.6,1;texto;Texto;"..texto.."]" + .."button[3.5,10;5,1;testar_email;Enviar mensagem de teste]" + + return formspec + end, + on_receive_fields = function(player, fields) + local name = player:get_player_name() + + if fields.salvar then + + -- Salvar todos os dados + + -- Status de alerta de email + if fields.status_email == "Ativo" then + minetest.setting_setbool("gestor_alerta_de_crash", true) + else + minetest.setting_setbool("gestor_alerta_de_crash", false) + end + + -- Servidor SMTP + if fields.servidor_smtp and fields.servidor_smtp ~= "-" then + minetest.setting_set("gestor_servidor_smtp", fields.servidor_smtp) + end + + -- Login SMTP + if fields.login_smtp and fields.login_smtp ~= "-" then + minetest.setting_set("gestor_login_smtp", fields.login_smtp) + end + + -- Senha de Login SMTP + if fields.senha and fields.senha ~= "" then + minetest.setting_set("gestor_senha_login_smtp", fields.senha) + end + + -- Email do Destinatario + if fields.email_destinatario and fields.email_destinatario ~= "-" then + minetest.setting_set("gestor_email_destinatario", fields.email_destinatario) + end + + -- Titulo da mensagem de Email + if fields.titulo and fields.titulo ~= "-" then + minetest.setting_set("gestor_titulo_email", fields.titulo) + end + + -- Texto da mensagem de Email + if fields.texto and fields.texto ~= "-" then + minetest.setting_set("gestor_texto_email", fields.texto) + end + + minetest.show_formspec(name, "gestor:aviso", "size[4,1.8]".. + default.gui_bg.. + default.gui_bg_img.. + "label[0,0;SUCESSO \nOs dados validos foram \nsalvos.]" + ) + minetest.after(2, gestor.menu_principal, name) + return + + + elseif fields.testar_email then + + if gestor.alerta_de_crash.enviar_email() then + minetest.show_formspec(name, "gestor:aviso", "size[4,1.8]".. + default.gui_bg.. + default.gui_bg_img.. + "label[0,0;FEITO \nComando de envio feito.\nVeja o arquivo de relatorio\ngestor_envios_de_alerta.out]" + ) + else + minetest.show_formspec(name, "gestor:aviso", "size[4,1.8]".. + default.gui_bg.. + default.gui_bg_img.. + "label[0,0;FALHA \nFaltam dados para\nrealizar o comando de envio.\n]" + ) + end + minetest.after(2, gestor.menu_principal, name) + end + end, +}) diff --git a/recursos/conf.lua b/recursos/conf.lua new file mode 100644 index 0000000..b9617f4 --- /dev/null +++ b/recursos/conf.lua @@ -0,0 +1,287 @@ +--[[ + Mod Gestor para Minetest + Gestor v2.0 Copyright (C) 2018 BrunoMine (https://github.com/BrunoMine) + + Recebeste uma cópia da GNU Lesser General + Public License junto com esse software, + se não, veja em . + + Recurso para edição de diretrizes do servidor + ]] + +-- Lista de configurações alteraveis +local lista_configs = { + -- Nome do servidor + { + name = "Nome do Servidor", + format = "string", + desc = "Esse nome vai ser exibido na lista de servidores publicos", + check_value = function(value) + return true + end, + get_value = function() + return minetest.setting_get("server_name") + end, + set_value = function(value) + minetest.setting_set("server_name", value) + end, + }, + -- Descritivo do servidor + { + name = "Descritivo do Servidor", + format = "string", + desc = "Esse texto descritivo do servidor vai ser exibido na lista de servidores publicos", + check_value = function(value) + return true + end, + get_value = function() + return minetest.setting_get("server_description") + end, + set_value = function(value) + minetest.setting_set("server_description", value) + end, + }, + -- Website do servidor + { + name = "Website do Servidor", + format = "string", + desc = "Precisar ser o URL do website do servidor", + check_value = function(value) + return true + end, + get_value = function() + return minetest.setting_get("server_url") + end, + set_value = function(value) + minetest.setting_set("server_url", value) + end, + }, + -- Endereço do servidor + { + name = "Endereço do Servidor", + format = "string", + desc = "Endereço do servidor", + check_value = function(value) + return true + end, + get_value = function() + return minetest.setting_get("server_address") + end, + set_value = function(value) + minetest.setting_set("server_address", value) + end, + }, + -- Porta do servidor + { + name = "Porta do Servidor", + format = "int", + desc = "Porta do servidor", + check_value = function(value) + return true + end, + get_value = function() + return minetest.setting_get("port") + end, + set_value = function(value) + minetest.setting_set("port", value) + end, + }, + -- Vagas/Slots + { + name = "Vagas", + format = "int", + desc = "Vagas para jogadores online" + .."\nJogadores com o privilegio 'server' possuem vaga reservada", + check_value = function(value) + return true + end, + get_value = function() + return minetest.setting_get("max_users") + end, + set_value = function(value) + minetest.setting_set("max_users", value) + end, + }, + -- PvP + { + name = "PvP", + format = "bool", + desc = "Permitir que jogadores ataquem diretamente outros jogadores", + check_value = function(value) + return true + end, + get_value = function() + return minetest.setting_get("enable_pvp") + end, + set_value = function(value) + minetest.setting_set("enable_pvp", value) + end, + }, + -- Mensagem de bem vindo + { + name = "Mensagem de Bem Vindo", + format = "string", + desc = "Mensagem apresentada ao jogador quando conectar ao servidor", + check_value = function(value) + return true + end, + get_value = function() + return minetest.setting_get("motd") + end, + set_value = function(value) + minetest.setting_set("motd", value) + end, + }, + -- Mensagem de crash do servidor + { + name = "Mensagem de Crash", + format = "string", + desc = "Mensagem exibida aos jogadores que estiverem online quando o servidor parar de funcionar inesperadamente (por erros do jogo)", + check_value = function(value) + return true + end, + get_value = function() + return minetest.setting_get("kick_msg_crash") + end, + set_value = function(value) + minetest.setting_set("kick_msg_crash", value) + end, + }, +} + +-- Lista de itens do menu do shop em formato de string +local string_menu_configs = "" +for _,d in pairs(lista_configs) do + if string_menu_configs ~= "" then string_menu_configs = string_menu_configs .. "," end + string_menu_configs = string_menu_configs .. d.name +end + +-- Controle de acessos +local acessos = {} +minetest.register_on_joinplayer(function(player) + acessos[player:get_player_name()] = {} +end) +minetest.register_on_leaveplayer(function(player) + acessos[player:get_player_name()] = nil +end) + + +-- Registrar aba 'diretrizes' +gestor.registrar_aba("conf", { + titulo = "Diretrizes", + get_formspec = function(name) + + local formspec = "label[3.5,1;Diretrizes]" + .."textlist[9,1;4.5,9.8;menu;"..string_menu_configs.."]" + --.."label[3.5,2;Ponto de Spawn]" + --.."button_exit[3.5,2.4;3,1;definir_spawn;Definir Aqui]" + --.."button_exit[6.5,2.4;3,1;ir_spawn;Ir para Spawn]" + --.."field[3.8,4.1;3,1;slots;Limite de Jogadores;"..minetest.setting_get("max_users").."]" + --.."button_exit[6.5,3.8;3,1;definir_slots;Redefinir Limite]" + + -- Construir formulario de acordo com item escolhido + if acessos[name].escolha then + local escolha = lista_configs[tonumber(acessos[name].escolha)] + + -- Formspec do item escolhido + local form = "" + + -- Nome + form = form .. "label[3.5,1.5;"..escolha.name.."]" + + -- Campo para preenchimento numero ou texto simples + if escolha.format == "int" or escolha.format == "float" or escolha.format == "string" then + form = form .. "field[3.8,2.3;5,1;config_label_1;;"..escolha.get_value().."]" + + -- Botao para definir configuração + form = form .. "button[3.5,2.8;5,1;definir;Definir]" + + -- Texto de aviso + if acessos[name].aviso then + form = form .. "label[3.5,3.7;"..acessos[name].aviso.."]" + acessos[name].aviso = nil + end + + -- Descritivo + form = form .. "textarea[3.8,4.3;5,7.7;;Descritivo:\n"..escolha.desc..";]" + end + + -- Campo para preenchimento + if escolha.format == "bool" then + form = form .. "checkbox[3.5,1.8;checkbox;Ativar PvP;true]" + + + -- Texto de aviso + if acessos[name].aviso or 1 == 1 then + form = form .. "label[3.5,2.6;"..acessos[name].aviso.."]" + acessos[name].aviso = nil + end + + -- Descritivo + form = form .. "textarea[3.8,3.3;5,8.7;;Descritivo:\n"..escolha.desc..";]" + end + + -- Insere no formspec + formspec = formspec .. form + end + + return formspec + end, + on_receive_fields = function(player, fields) + local name = player:get_player_name() + + -- Salva os campos editados para reexibir + acessos[name].config_label_1 = fields.config_label_1 + + -- Escolher um item + if fields.menu then + local n = string.split(fields.menu, ":") + acessos[name].escolha = tonumber(n[2]) or 1 + gestor.menu_principal(name) + + -- Definir valor + elseif fields.definir then + local escolha = lista_configs[tonumber(acessos[name].escolha)] + + -- Valor a ser salvo + local value = fields.config_label_1 + + -- Verificar valor + -- Formato de numero + if escolha.format == "int" or escolha.format == "float" then + if tonumber(value) == nil then + acessos[name].aviso = "Precisar ser numero" + gestor.menu_principal(name) + return + else + value = tonumber(fields.config_label_1) + + -- Arredonda para baixo caso precise ser inteiro + if escolha.format == "int" then + value = math.ceil(value) + end + end + + -- Outros formatos + else + value = fields.config_label_1 + end + + -- Atualiza campo exibido no painel + acessos[name].config_label_1 = value + + -- Verificador personalizado + local check = escolha.check_value() + if check ~= true then + acessos[name].aviso = check + gestor.menu_principal(name) + return + end + + -- Configurar valor + escolha.set_value(value) + acessos[name].aviso = "Definido" + gestor.menu_principal(name) + end + end, +}) diff --git a/recursos/desligar.lua b/recursos/desligar.lua new file mode 100644 index 0000000..2e323b4 --- /dev/null +++ b/recursos/desligar.lua @@ -0,0 +1,28 @@ +--[[ + Mod Gestor para Minetest + Gestor v2.0 Copyright (C) 2018 BrunoMine (https://github.com/BrunoMine) + + Recebeste uma cópia da GNU Lesser General + Public License junto com esse software, + se não, veja em . + + Recurso para desligamento do servidor + ]] + +-- Registrar aba 'desligar' +gestor.registrar_aba("desligar", { + titulo = "Desligar", + get_formspec = function(name) + formspec = "label[6,2;Tem certeza que quer \ndesligar do servidor?]" + .."button_exit[6,3;4,1;ok;Confirmar]" + return formspec + end, + on_receive_fields = function(player, fields) + if fields.ok then + local name = player:get_player_name() + minetest.chat_send_all("*** Servidor desligando em 3 segundos. (Por "..name..")") + minetest.after(3, minetest.chat_send_all, "*** Servidor Desligado") + minetest.after(3, minetest.request_shutdown) + end + end, +}) diff --git a/vilas.lua b/vilas.lua deleted file mode 100644 index 3e4e326..0000000 --- a/vilas.lua +++ /dev/null @@ -1,100 +0,0 @@ --- --- Mod gestor --- --- Vilas --- - - --- Encontrar altura de um bloco alvo (em uma coluna) -local pegar_altura_solo = function(pos, alvos, amplitude) - if not pos then - minetest.log("error", "[Plagen] Tabela 'pos' nula (em pegar_altura_solo)") - return false - end - - local y = pos.y + amplitude - local resp = pos.y - while y >= pos.y - amplitude do - if table.maxn(minetest.find_nodes_in_area({x=pos.x,y=y,z=pos.z}, {x=pos.x,y=y,z=pos.z}, alvos)) == 1 then - resp = y - break - end - y = y - 1 - end - return resp -end - - --- Comando para colocar vila ---[[ - Esse metodo monta uma vila no mapa e retorna - uma mensagem de erro quando ocorre alguma falha - ou algo impede - Retorno: - Pode ser true (booleano) caso de tudo certo e - uma string de mensagem de erro caso ocorra algum problema - Argumentos: - <> - ]] -gestor.montar_vila = function(pos, vila) - - -- Verificar dados - if not pos then - minetest.log("error", "[Plagen] Tabela 'pos' nula (em gestor.montar_vila)") - return "Erro interno" - end - if not vila then - minetest.log("error", "[Plagen] String de 'vila' nula (em gestor.montar_vila)") - return "Erro interno" - end - - -- Destacar tabela pos (evitar bugs) - pos = {x=pos.x, y=pos.y, z=pos.z} - - -- Verificando se ja existe essa vila - - if gestor.bd:verif("vilas", vila) then return "Vila ja existente" end - - -- Pegar material do solo - local p_solo = {x=pos.x, y=pos.y, z=pos.z} - p_solo.y = pegar_altura_solo(pos, {"default:dirt", "default:desert_sand"}, 15) - local node_solo = minetest.get_node(p_solo) - if pos == false then return "Impossivel encontrar solo" end - if node_solo.name == "default:dirt" then - p_solo.y = p_solo.y + 1 - elseif node_solo.name == "default:desert_sand" then - p_solo.y = p_solo.y - else - return "Solo inapropriado" - end - local solo = minetest.get_node({x=p_solo.x, y=p_solo.y, z=p_solo.z}).name - local subsolo = minetest.get_node({x=p_solo.x, y=p_solo.y-1, z=p_solo.z}).name - local rocha = "default:stone" - local materiais = {solo=solo,subsolo=subsolo,rocha=rocha} - if solo.name == "air" then return "Falha ao pegar solo" end - - - -- Adquirindo dados - - local dados = gestor.diretrizes.estruturas[vila] - - if not dados then return "Estrutura nao encontrada" end - - -- Planificar - if plagen.planificar(pos, "quadrada", dados[1]+2, 15, materiais, 15, true, true) ~= true then - return "Falha ao planificar" - end - - pos.y = pegar_altura_solo(pos, {solo}, 15) + 1 - - -- Variaveis auxiliares - - local minp = {x=pos.x-(dados[1]/2), y=pos.y-dados[3], z=pos.z-(dados[1]/2)} - - - -- Construir estrutura - - if gestor.estruturador.carregar(minp, vila) == false then return "Estrutura nao encontrada" end - - return true -end