diff --git a/balao.lua b/balao.lua index 34fde8a..5ac7013 100644 --- a/balao.lua +++ b/balao.lua @@ -19,121 +19,54 @@ local function pegar_node(pos) return node end - --- Registro da entidade -minetest.register_entity("telepro:balao", { - hp_max = 1, - physical = true, - weight = 5, - collisionbox = {-7,0,-7, 7,25,7}, - visual = "mesh", - visual_size = {x=5, y=5}, - mesh = "telepro_balao.b3d", - textures = {"telepro_balao.png"}, -- number of required textures depends on visual - spritediv = {x=1, y=1}, - initial_sprite_basepos = {x=0, y=0}, - is_visible = true, - makes_footstep_sound = false, - automatic_rotate = false, - on_step = function(self, dtime) - self.timer = (self.timer or 0) + dtime - - if self.timer > 4 then - self.timer = 0 - - -- Pegar nome do jogador - local name = self.dono - - -- Pegar coordenada do balao - local pos = self.object:getpos() - - -- Pegar coordenada do bau - local bau_pos = {x=pos.x, y=pos.y-23, z=pos.z} - - -- Verifica se ainda tem o bau - - if pegar_node(bau_pos).name == "telepro:bau" then - - -- Verifica se o bau eh do dono - - -- Pegar metadados - local meta = minetest.get_meta(bau_pos) - - if - meta:get_string("dono") == name - and meta:get_string("status") == "ativo" - then - return - end - end - - -- Remover cordas - do - local y = -1 - while y <= 24 do - if pegar_node({x=pos.x, y=pos.y-y, z=pos.z}).name == "telepro:corda_balao" then - minetest.remove_node({x=pos.x, y=pos.y-y, z=pos.z}) - end - y = y + 1 - end - end - - -- Remove o objeto pois nao encontrou o bau do dono - self.object:remove() - return - end - end, - - on_activate = function(self, staticdata) - if staticdata ~= "" then - self.dono = minetest.serialize({dono=self.dono,name=self.name}).dono - self.name = minetest.serialize({dono=self.dono,name=self.name}).name - end - end, - - get_staticdata = function(self) - return minetest.serialize({dono=self.dono,name=self.name}) - end, +-- Node +minetest.register_node("telepro:balao_jogador", { + description = "Balao Decorativo", + tiles = {"telepro_balao.png"}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + drawtype = "mesh", + mesh = "telepro_node_balao.b3d", + visual_scale = 0.45, + groups = {choppy = 2, oddly_breakable_by_hand = 2}, + sounds = default.node_sound_wood_defaults(), + drop = "", }) --- Criar um balao -telepro.criar_balao = function(pos, bau_pos, name) - if not pos then - minetest.log("error", "[Telepro] pos == nil (em telepro.criar_balao)") - return false - end - if not bau_pos then - minetest.log("error", "[Telepro] bau_pos == nil (em telepro.criar_balao)") - return false - end - if not name then - minetest.log("error", "[Telepro] name == nil (em telepro.criar_balao)") - return false - end - - -- Cria o objeto - local obj = minetest.add_entity(pos, "telepro:balao") - - -- Verifica se foi criado - if not obj then - minetest.log("error", "[Telepro] Falha ao cria o objeto (em telepro.criar_balao)") - return false - end - - -- Cria animação no objeto - obj:set_animation({x=1,y=40}, 5, 0) - - -- Pega a entidade - local ent = obj:get_luaentity() - - -- Cria o temporizador - ent.timer = 0 - - -- Salva o nome do dono - ent.dono = name - - -- Salva nome da entidade - ent.name = "telepro:balao" - - return true -end +-- Verifica se tem bau ativo +minetest.register_abm{ + nodenames = {"telepro:balao_jogador"}, + interval = 4, + chance = 1, + action = function(pos) + + -- Pos bau + local pos_bau = {x=pos.x, y=pos.y-25, z=pos.z} + + -- Bau + local node = pegar_node(pos_bau) + + -- Verifica se tem bau + if node.name ~= "telepro:bau" then + minetest.remove_node(pos) + return + end + + -- Pegar metadados do bau + local meta = minetest.get_meta(pos_bau) + + -- Verifica se o bau tem dono + if meta:get_string("dono") == "" then + minetest.remove_node(pos) + return + end + + -- Verifica se o bau ta ativo + if meta:get_string("status") ~= "ativo" then + minetest.remove_node(pos) + return + end + + end, +} diff --git a/balao_decor.lua b/balao_decor.lua new file mode 100644 index 0000000..8198f5b --- /dev/null +++ b/balao_decor.lua @@ -0,0 +1,25 @@ +--[[ + Mod Telepro para Minetest + 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 . + + Balao Decorativo para Spawn + ]] + +-- Node +minetest.register_node("telepro:balao_decorativo", { + description = "Balao Decorativo", + tiles = {"telepro_balao.png"}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + drawtype = "mesh", + mesh = "telepro_node_balao.b3d", + visual_scale = 0.45, + groups = {choppy = 2, oddly_breakable_by_hand = 2}, + sounds = default.node_sound_wood_defaults(), + drop = "", +}) diff --git a/bau.lua b/bau.lua index e14d713..4109807 100644 --- a/bau.lua +++ b/bau.lua @@ -9,6 +9,16 @@ Bau do balao ]] +-- Pegar node distante nao carregado +local function pegar_node(pos) + local node = minetest.get_node(pos) + if node.name == "ignore" then + minetest.get_voxel_manip():read_from_map(pos, pos) + node = minetest.get_node(pos) + end + return node +end + -- Node minetest.register_node("telepro:bau", { description = "Bau do Balao", @@ -37,7 +47,7 @@ minetest.register_node("telepro:bau", { -- Atualização constante do balão minetest.register_abm{ nodenames = {"telepro:bau"}, - interval = 2, + interval = 5, chance = 1, action = function(pos) @@ -51,46 +61,6 @@ minetest.register_abm{ -- Verificar se ta tudo ok -- - -- Salvar o nome do dono - if meta:get_string("status") == "ativo" then - - -- Verificar cordas - do - -- Pegar os nodes - local nodes = minetest.find_nodes_in_area( - {x=pos.x, y=pos.y+1, z=pos.z}, - {x=pos.x, y=pos.y+24, z=pos.z}, - {"telepro:corda_balao"} - ) - -- Verificar se estao todos - if table.maxn(nodes) < 24 then - -- Desativa o bau - meta:set_string("status", "inativo") - return - end - end - - -- Verifica balao - do - local r = false -- Variavel que avisa se achou o balao - for _,obj in ipairs(minetest.get_objects_inside_radius(pos, 30)) do - local ent = obj:get_luaentity() or {} - -- Verifica se eh o balao - if ent and ent.name == "telepro:balao" and ent.dono == meta:get_string("dono") then - r = true -- achou balao - end - end - if r == false then - -- Desativa o bau - meta:set_string("status", "inativo") - return - end - end - - -- Tudo ok - return - end - -- -- Verificar se consegue colocar o balao e cordas -- @@ -115,7 +85,7 @@ minetest.register_abm{ local nodes = minetest.find_nodes_in_area( {x=pos.x-7, y=pos.y+24, z=pos.z-7}, {x=pos.x+7, y=pos.y+24+25, z=pos.z+7}, - {"air", "telepro:corda_balao"} + {"air", "telepro:corda_balao", "telepro:balao_jogador"} ) -- Verifica se pegou todos nodes de ar @@ -133,7 +103,19 @@ minetest.register_abm{ -- Montar o balao e cordas -- - telepro.montar_balao(pos, meta:get_string("dono")) + -- Verifica se ja tem todas as cordas + if table.maxn(minetest.find_nodes_in_area( + {x=pos.x, y=pos.y+1, z=pos.z}, + {x=pos.x, y=pos.y+24, z=pos.z}, + {"telepro:corda_balao"} + )) ~= 24 + -- Verifica balao + or pegar_node({x=pos.x, y=pos.y+25, z=pos.z}).name ~= "telepro:balao_jogador" + + then + -- Repara tudo + telepro.montar_balao(pos) + end meta:set_string("status", "ativo") diff --git a/bau_spawn.lua b/bau_spawn.lua index c0384b7..2c219bd 100644 --- a/bau_spawn.lua +++ b/bau_spawn.lua @@ -26,5 +26,18 @@ minetest.register_node("telepro:bau_spawn", { on_rightclick = function(pos, node, player) telepro.acessar_bau_spawn(player) end, + + after_place_node = function(pos, placer, itemstack, pointed_thing) + -- Verifica privilegios de quem coloca + if pointed_thing and pointed_thing.above and minetest.check_player_privs(placer:get_player_name(), {server=true}) == true then + telepro.spawn = pos + telepro.bd.salvar("centro", "pos", {x=pos.x, y=pos.y+2, z=pos.z}) + minetest.chat_send_all("Novo centro definido") + else + minetest.chat_send_all("Precisa do privilegio 'server' para colocar esse bau") + minetest.remove_node(pos) + end + end, + drop = "", }) diff --git a/check_balao_proprio.lua b/check_balao_proprio.lua index 575367d..621debf 100644 --- a/check_balao_proprio.lua +++ b/check_balao_proprio.lua @@ -21,13 +21,13 @@ telepro.check_balao_proprio = function(player) local name = player:get_player_name() -- Verificar se o jogador tem um balao - if telepro.bd.verif(name, "pos") ~= true then + if telepro.bd.verif("jogador_"..name, "pos") ~= true then minetest.chat_send_player(name, "Precisas ter um balao ativo") return 1, "Nenhum balao proprio existente" end -- Pega os metadados do bau - local meta = minetest.get_meta(telepro.bd.pegar(name, "pos")) + local meta = minetest.get_meta(telepro.bd.pegar("jogador_"..name, "pos")) if meta:get_string("status") ~= "ativo" then return 2, "Balao proprio inoperante" end diff --git a/comum.lua b/comum.lua index 5df394d..72bd7c2 100644 --- a/comum.lua +++ b/comum.lua @@ -45,7 +45,7 @@ end -- Criar balao e cordas para um bau de balao (ignora verificações) -telepro.montar_balao = function(pos, name) +telepro.montar_balao = function(pos) -- Colocar cordas do @@ -63,6 +63,6 @@ telepro.montar_balao = function(pos, name) end -- Colocar balao - telepro.criar_balao({x=pos.x, y=pos.y+23, z=pos.z}, pos, name) + minetest.set_node({x=pos.x, y=pos.y+25, z=pos.z}, {name="telepro:balao_jogador"}) end diff --git a/gerar_balao_aleatorio.lua b/gerar_balao_aleatorio.lua index 85daa7d..30493da 100644 --- a/gerar_balao_aleatorio.lua +++ b/gerar_balao_aleatorio.lua @@ -44,9 +44,9 @@ local finalizar = function(name, spos) -- Desativa o bau anterior do -- Verificar se existe registro no banco de dados - if telepro.bd.verif(name, "pos") == true then + if telepro.bd.verif("jogador_"..name, "pos") == true then -- Pega a coordenada - local pp = telepro.bd.pegar(name, "pos") + local pp = telepro.bd.pegar("jogador_"..name, "pos") -- Acessa os metadados local meta = minetest.get_meta(pp) -- Limpa o parametro dono @@ -63,7 +63,7 @@ local finalizar = function(name, spos) meta:set_string("status", "ativo") -- Salvar status inicial -- Salva a coordenada do novo bau no banco de dados - telepro.bd.salvar(name, "pos", pb) + telepro.bd.salvar("jogador_"..name, "pos", pb) -- Montar balao telepro.montar_balao(pb, name) diff --git a/init.lua b/init.lua index 1fcd8f4..b9bd107 100644 --- a/init.lua +++ b/init.lua @@ -21,15 +21,17 @@ local modpath = minetest.get_modpath("telepro") -- Variavel global telepro = {} --- Spawn do servidor (para onde os baloes permitem ir) -telepro.spawn = minetest.setting_get_pos("static_spawnpoint") or {x=0, y=0, z=0} - -- Carregar scripts notificar("Carregando scripts...") -- Criação do banco de dados telepro.bd = dofile(modpath.."/lib/memor.lua") +-- Spawn do servidor (para onde os baloes permitem ir) +if telepro.bd.verif("centro", "pos") == true then + telepro.spawn = telepro.bd.pegar("centro", "pos") +end + -- Funções dofile(modpath.."/online.lua") dofile(modpath.."/reivindicar.lua") @@ -52,6 +54,7 @@ dofile(modpath.."/balao.lua") dofile(modpath.."/corda.lua") dofile(modpath.."/bau.lua") dofile(modpath.."/bau_spawn.lua") +dofile(modpath.."/balao_decor.lua") -- Comandos dofile(modpath.."/comandos.lua") diff --git a/interface_bau.lua b/interface_bau.lua index 3be4bb0..853d884 100644 --- a/interface_bau.lua +++ b/interface_bau.lua @@ -29,10 +29,14 @@ telepro.acessar_bau = function(player) local formspec = "size[6,5.8]" ..default.gui_bg ..default.gui_bg_img - .."image[0,0;7.3,3;telepro_intro.png]" - .."button_exit[0,3;6,1;ir_centro;Ir para Centro]" - .."button_exit[0,4;6,1;reparar;Reparar Balao]" - .."button[0,5;6,1;visitas;Receber seguidor]" + .."image[1.7,-0.25;3,3;telepro_ir_centro.png]" + .."button_exit[0,2.4;6,1;ir_centro;Ir para Centro]" + + .."image[0.1,3.7;1,1;screwdriver.png]" + .."button_exit[1,3.7;5,1;reparar;Reparar Balao]" + + .."image[0.1,5;1,1;telepro_aceitar_visita.png]" + .."button[1,5;5,1;visitas;Receber seguidor]" -- Exibir formspec minetest.show_formspec(player:get_player_name(), "telepro:bau", formspec) @@ -49,12 +53,14 @@ telepro.acessar_bau_spawn = function(player) -- Exibir formulario de opcoes ao jogador -- Cria formspec - local formspec = "size[6,5]" + local formspec = "size[6,3]" ..default.gui_bg ..default.gui_bg_img - .."image[0,0;7.3,3;telepro_intro.png]" - .."button[0,3;6,1;visitas;Seguir jogador]" - .."button_exit[0,4;6,1;ir_balao;Ir para o posto de seu Balao]" + .."image[0.1,-0.2;3,3;telepro_ir_casa.png]" + .."button_exit[0,2;3,1;ir_balao;Ir para seu Balao]" + .."image[3.1,-0.2;3,3;telepro_visitar.png]" + .."button[3,2;3,1;visitas;Seguir jogador]" + -- Exibir formspec minetest.show_formspec(player:get_player_name(), "telepro:bau_spawn", formspec) @@ -81,7 +87,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) local pos = player:getpos() -- Verificar se o jogador tem um balao - if telepro.bd.verif(name, "pos") ~= true then + if telepro.bd.verif("jogador_"..name, "pos") ~= true then minetest.chat_send_player(name, "Precisas ter um balao ativo") return end @@ -95,7 +101,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) -- Verifica status do bau do balao do -- Pega os metadados do bau - local meta = minetest.get_meta(telepro.bd.pegar(name, "pos")) + local meta = minetest.get_meta(telepro.bd.pegar("jogador_"..name, "pos")) if meta:get_string("status") ~= "ativo" then minetest.chat_send_player(name, "Balao inoperante. Aguarde mantenha o local limpo e aberto e aguarde ele ficar pronto.") @@ -118,7 +124,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end -- Pegar coordenada do bau - local pos = telepro.bd.pegar(name, "pos") + local pos = telepro.bd.pegar("jogador_"..name, "pos") -- Verificar se o balao ja esta ativo local meta = minetest.get_meta(pos) @@ -155,12 +161,13 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end -- Verificar se o jogador tem um balao - if telepro.bd.verif(name, "pos") ~= true then + if telepro.bd.verif("jogador_"..name, "pos") ~= true then + minetest.chat_send_all("dados de jogador_"..name.." nao encontrado") return telepro.acessar(minetest.get_player_by_name(name)) end -- Verificar se o balao esta ativo - if minetest.get_meta(telepro.bd.pegar(name, "pos")):get_string("status") ~= "ativo" then + if minetest.get_meta(telepro.bd.pegar("jogador_"..name, "pos")):get_string("status") ~= "ativo" then minetest.chat_send_player(name, "O Seu Balao nao esta funcionando. O local foi destruido ou obstruido.") end diff --git a/ir_balao.lua b/ir_balao.lua index afc2eae..fd716b2 100644 --- a/ir_balao.lua +++ b/ir_balao.lua @@ -30,13 +30,13 @@ telepro.ir_balao = function(player) local name = player:get_player_name() -- Verifica se o registro de balao existe no banco de dados - if telepro.bd.verif(name, "pos") == false then + if telepro.bd.verif("jogador_"..name, "pos") == false then minetest.chat_send_player(player:get_player_name(), "Sem nenhum balao ainda.") return false end -- Pegar coordenada do bau - local pos = telepro.bd.pegar(name, "pos") + local pos = telepro.bd.pegar("jogador_"..name, "pos") -- Verificar se o balao existente no banco de dados ainda existe no mapa do diff --git a/lib/memor.lua b/lib/memor.lua index d3e8486..cfef902 100644 --- a/lib/memor.lua +++ b/lib/memor.lua @@ -1,12 +1,13 @@ --[[ Lib Memor para Minetest - Memor v1.3 Copyright (C) 2017 BrunoMine (https://github.com/BrunoMine) + Memor v2.0.0 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 + Autoria do código: + Originalmente por BrunoMine, Bruno Borges ]] local modname = minetest.get_current_modname() @@ -14,7 +15,7 @@ local modname = minetest.get_current_modname() local modpath = minetest.get_modpath(modname) -- Variavel global -local memor = {} +memor = {} -- Rotinas de interação com arquivos @@ -57,18 +58,10 @@ function memor.escrever(dir, arquivo, dados) saida:write(dados) io.close(saida) return true + else + minetest.log("info", "[Memor] memor.escrever tentou escrever num diretorio inexistente") + return false 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) @@ -131,23 +124,24 @@ end -- Verifica diretorios e corrige verificar = function(subdir) + local dir = modname -- 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 + if ndir == dir then r = true break end end -- Diretorio inexistente if r == false then - memor.mkdir(modname) + memor.mkdir(dir) end -- Verifica e corrige subdiretorio - list = minetest.get_dir_list(minetest.get_worldpath().."/"..modname, true) + list = minetest.get_dir_list(minetest.get_worldpath().."/"..dir, true) r = false for n, ndir in ipairs(list) do if ndir == subdir then @@ -157,7 +151,7 @@ verificar = function(subdir) end -- Subdiretorio inexistente if r == false then - memor.mkdir(modname.."/"..subdir) + memor.mkdir(dir.."/"..subdir) end end diff --git a/models/telepro_node_balao.b3d b/models/telepro_node_balao.b3d new file mode 100644 index 0000000..1717590 Binary files /dev/null and b/models/telepro_node_balao.b3d differ diff --git a/models/telepro_node_balao.blend b/models/telepro_node_balao.blend new file mode 100644 index 0000000..16fabc0 Binary files /dev/null and b/models/telepro_node_balao.blend differ diff --git a/models/telepro_node_balao.blend1 b/models/telepro_node_balao.blend1 new file mode 100644 index 0000000..541d560 Binary files /dev/null and b/models/telepro_node_balao.blend1 differ diff --git a/reivindicar.lua b/reivindicar.lua index 169b3ff..9f34b30 100644 --- a/reivindicar.lua +++ b/reivindicar.lua @@ -37,16 +37,16 @@ telepro.reivindicar = function(player) local pos = player:getpos() -- Verifica se está numa coordenada muito baixa (menor que o nível do mar) - if pos.y < 0 then + if pos.y < 10 then minetest.chat_send_player(name, "Local muito baixo. Precisa subir para um local mais alto.") return false end -- Verificar se está na luz do dia (força estar na superficie) do - local luz = minetest.get_node_light(pos) + local luz = minetest.get_node_light(pos, 0.5) if not luz or luz < 13 then - minetest.chat_send_player(name, "Precisa estar na luz do dia.") + minetest.chat_send_player(name, "Precisa estar num lugar mais aberto.") return false end end @@ -111,9 +111,9 @@ telepro.reivindicar = function(player) -- Desativa o bau anterior do -- Verificar se existe registro no banco de dados - if telepro.bd.verif(name, "pos") == true then + if telepro.bd.verif("jogador_"..name, "pos") == true then -- Pega a coordenada - local p = telepro.bd.pegar(name, "pos") + local p = telepro.bd.pegar("jogador_"..name, "pos") -- Acessa os metadados local meta = minetest.get_meta(p) -- Limpa o parametro dono @@ -130,7 +130,7 @@ telepro.reivindicar = function(player) meta:set_string("status", "ativo") -- Salvar status inicial -- Salva a coordenada do novo bau no banco de dados - telepro.bd.salvar(name, "pos", pos) + telepro.bd.salvar("jogador_"..name, "pos", pos) -- Montar balao telepro.montar_balao(pos, name) diff --git a/reparar_balao.lua b/reparar_balao.lua index 59115fb..3fe8d96 100644 --- a/reparar_balao.lua +++ b/reparar_balao.lua @@ -14,9 +14,9 @@ telepro.reparar_balao = function(name, pos) -- Verificar se está na luz do dia (força estar na superficie) do - local luz = minetest.get_node_light({x=pos.x, y=pos.y+1, z=pos.z+1}) + local luz = minetest.get_node_light({x=pos.x, y=pos.y+1, z=pos.z+1}, 0.5) if not luz or luz < 13 then - minetest.chat_send_player(name, "Precisa estar na luz do dia.") + minetest.chat_send_player(name, "Precisa estar em local aberto.") return false end end diff --git a/textures/telepro_aceitar_visita.png b/textures/telepro_aceitar_visita.png new file mode 100644 index 0000000..20032a0 Binary files /dev/null and b/textures/telepro_aceitar_visita.png differ diff --git a/textures/telepro_ir_casa.png b/textures/telepro_ir_casa.png new file mode 100644 index 0000000..f719ae1 Binary files /dev/null and b/textures/telepro_ir_casa.png differ diff --git a/textures/telepro_ir_centro.png b/textures/telepro_ir_centro.png new file mode 100644 index 0000000..83d0e31 Binary files /dev/null and b/textures/telepro_ir_centro.png differ diff --git a/textures/telepro_visitar.png b/textures/telepro_visitar.png new file mode 100644 index 0000000..11fc118 Binary files /dev/null and b/textures/telepro_visitar.png differ diff --git a/visitas.lua b/visitas.lua index 45f8a4b..92ecaf1 100644 --- a/visitas.lua +++ b/visitas.lua @@ -35,7 +35,8 @@ telepro.acessar_visitas = function(player, tipo) .."label[0,0;Pedidos recebidos]" .."dropdown[0,0.5;5.25,1;visita;"..visitas..";]" .."button[0,1.15;5,1;receber_visita;Receber seguidor]" - + + .."image[0.4,2;1.5,1.5;telepro_aceitar_visita.png]" .."button[2,2.25;3,1;voltar;Voltar]" elseif tipo == "centro" then @@ -45,7 +46,8 @@ telepro.acessar_visitas = function(player, tipo) ..default.gui_bg_img .."field[0.28,0.8;5,1;visitado;Seguir jogador;]" .."button_exit[0,1.25;5,1;enviar_pedido;Enviar pedido]" - + + .."image[0.4,2;1.5,1.5;telepro_visitar.png]" .."button[2,2.25;3,1;voltar;Voltar]" end