diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..65c5ca8 --- /dev/null +++ b/LICENSE @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/README.md b/README.md index 723a540..30fc335 100644 --- a/README.md +++ b/README.md @@ -1 +1,35 @@ -telepro +# Telepro v1.0.0 + +[![Baixar](https://img.shields.io/badge/Baixar-v1.0.0-green.svg)](https://github.com/BrunoMine/telepro/archive/v1.0.0.zip) +[![Projeto](https://img.shields.io/badge/Git-Projeto-green.svg)](https://github.com/BrunoMine/telepro) +[![Licença](https://img.shields.io/badge/Licença-LGPL_v3.0-blue.svg)](https://github.com/BrunoMine/telepro/blob/master/LICENSE) + +## Descrição +Transporte para jogadores + +## Recursos do projeto + +* [Baixar](https://github.com/BrunoMine/telepro/archive/v1.0.0.zip) +* [Projeto](https://github.com/BrunoMine/telepro) + +## Requisitos + +* Minetest 0.4.15 ou superior +* Mod default +* Mod memor (opcional) + +## Licença +Veja LICENSE.txt para informações detalhadas da licença LGPL 3.0 + +### Autores do código fonte +Originalmente por BrunoMine, Bruno Borges (LGPL 3.0) + +### Autores de mídias (texturas, modelos and sons) +BrunoMine, Bruno Borges (CC BY-SA 3.0) + +Zeg'9 (CC BY-SA 3.0) + telepro_balao.png (tecidos) + +philipbenr (WTFPL) + telepro_balao.png (madeira) + diff --git a/autogen.lua b/autogen.lua new file mode 100644 index 0000000..f45640b --- /dev/null +++ b/autogen.lua @@ -0,0 +1,33 @@ +--[[ + Mod Telepro para Minetest + 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 . + + Gerar balao automaticamente + ]] + +minetest.register_on_newplayer(function(player) + if not player then return end + + minetest.after(3, minetest.show_formspec, player:get_player_name(), "telepro:intro", "size[10,8]" + ..default.gui_bg + ..default.gui_bg_img + .."image[0,0;12,4.5;telepro_intro.png]" + + .."image[1,4;1.5,1;telepro_pt.png]" + .."label[2.5,4;Esse Bau pode te teleportar de sua casa para \no centro e vice versa]" + + .."image[1,5.5;1.5,1;telepro_es.png]" + .."label[2.5,5.5;Este Bau que puede teletransportarse desde su \ncasa al centro y viceversa]" + + .."image[1,7;1.5,1;telepro_en.png]" + .."label[2.5,7;This Block can teleport you from your home \nto the center and vice versa]" + ) + + telepro.gerar_balao_aleatorio(player) +end) + + diff --git a/balao.lua b/balao.lua new file mode 100644 index 0000000..34fde8a --- /dev/null +++ b/balao.lua @@ -0,0 +1,139 @@ +--[[ + Mod Telepro para Minetest + 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 . + + 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 + + +-- 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, +}) + +-- 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 diff --git a/bau.lua b/bau.lua new file mode 100644 index 0000000..e14d713 --- /dev/null +++ b/bau.lua @@ -0,0 +1,141 @@ +--[[ + Mod Telepro para Minetest + 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 . + + Bau do balao + ]] + +-- Node +minetest.register_node("telepro:bau", { + description = "Bau do Balao", + tiles = { + "default_chest_top.png^telepro_bau_cima.png", -- Cima + "default_chest_top.png", -- Baixo + "default_chest_side.png^telepro_bau_direita.png", -- Direita + "default_chest_side.png^telepro_bau_esquerda.png", -- Esquerda + "default_chest_side.png^telepro_bau_fundo.png", -- Fundo + "default_chest_front.png" -- Frente + }, + paramtype2 = "facedir", + groups = {choppy = 2, oddly_breakable_by_hand = 2}, + sounds = default.node_sound_wood_defaults(), + on_rightclick = function(pos, node, player) + local meta = minetest.get_meta(pos) + if (meta:get_string("dono") or "") == player:get_player_name() then + telepro.acessar_bau(player) + else + minetest.chat_send_player(player:get_player_name(), "Esse Balao nao lhe pertence.") + end + end, + drop = "", +}) + +-- Atualização constante do balão +minetest.register_abm{ + nodenames = {"telepro:bau"}, + interval = 2, + chance = 1, + action = function(pos) + + -- Pegar metadados do bau + local meta = minetest.get_meta(pos) + + -- Verifica se o bau tem dono + if meta:get_string("dono") == "" then return end + + -- + -- 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 + -- + + -- Verificar se consegue colocar cordas + do + -- Pegar os nodes que podem ser substituidos por corda normalmente + 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}, + {"air", "telepro:corda_balao"} + ) + -- Verificar se esta tudo livre + if table.maxn(nodes) < 24 then + return + end + end + + -- Verificar se consegue colocar balao + do + -- Pegar nodes + 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"} + ) + + -- Verifica se pegou todos nodes de ar + if table.maxn(nodes) < 5850 then -- 15 * 15 * 26 + return + end + end + + -- Verificar entidades na area do balao + if table.maxn(minetest.get_objects_inside_radius({x=pos.x, y=pos.y+23+15, z=pos.z}, 15)) > 0 then + return + end + + -- + -- Montar o balao e cordas + -- + + telepro.montar_balao(pos, meta:get_string("dono")) + + meta:set_string("status", "ativo") + + end, +} diff --git a/bau_spawn.lua b/bau_spawn.lua new file mode 100644 index 0000000..c0384b7 --- /dev/null +++ b/bau_spawn.lua @@ -0,0 +1,30 @@ +--[[ + Mod Telepro para Minetest + 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 . + + Bau do balao do spawn + ]] + +-- Node +minetest.register_node("telepro:bau_spawn", { + description = "Bau do Balao do Centro", + tiles = { + "default_chest_top.png^telepro_bau_cima.png", -- Cima + "default_chest_top.png", -- Baixo + "default_chest_side.png^telepro_bau_direita.png", -- Direita + "default_chest_side.png^telepro_bau_esquerda.png", -- Esquerda + "default_chest_side.png^telepro_bau_fundo.png", -- Fundo + "default_chest_front.png" -- Frente + }, + paramtype2 = "facedir", + groups = {choppy = 2, oddly_breakable_by_hand = 2}, + sounds = default.node_sound_wood_defaults(), + on_rightclick = function(pos, node, player) + telepro.acessar_bau_spawn(player) + end, + drop = "", +}) diff --git a/comandos.lua b/comandos.lua new file mode 100644 index 0000000..fc67579 --- /dev/null +++ b/comandos.lua @@ -0,0 +1,29 @@ +--[[ + Mod Telepro para Minetest + 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 . + + Comandos + ]] + +-- Reivindicar balao +minetest.register_chatcommand("sethome", { + privs = {}, + params = "Nenhum", + description = "Reivindica um balao no local", + func = function(name, param) + telepro.acessar(minetest.get_player_by_name(name)) + end +}) + +minetest.register_chatcommand("home", { + privs = {}, + params = "Nenhum", + description = "Vai para o balao", + func = function(name, param) + minetest.chat_send_player(name, "Utilize o Bau do Balao para isso.") + end +}) diff --git a/compatibilidade.lua b/compatibilidade.lua new file mode 100644 index 0000000..6eb8f19 --- /dev/null +++ b/compatibilidade.lua @@ -0,0 +1,11 @@ +--[[ + Mod Telepro para Minetest + 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 . + + Ajuste de compatibilidade com outros mods + ]] + diff --git a/comum.lua b/comum.lua new file mode 100644 index 0000000..5df394d --- /dev/null +++ b/comum.lua @@ -0,0 +1,68 @@ +--[[ + Mod Telepro para Minetest + 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 . + + Funções simples e comuns + ]] + +-- Verificar se o bau de balaode um jogador está perto +telepro.verif_prox_bau = function(player) + + -- Pegar nome do jogador + local name = player:get_player_name() + + -- Pegar coordenada do jogador + local pos = player:getpos() + + -- Pegar nodes de Bau de Balao proximos + local nodes = minetest.find_nodes_in_area( + {x=pos.x-8, y=pos.y-8, z=pos.z-8}, + {x=pos.x+8, y=pos.y+8, z=pos.z+8}, + {"telepro:bau"} + ) + + -- Verifica todos os baus encontrados + for _,p in ipairs(nodes) do + -- Pega os metadados do bau + local meta = minetest.get_meta(p) + -- Pega o nome do dono do bau + local n = meta:get_string("dono") or "" + -- Verifica se é o mesmo nome do jogador + if n == name then + -- Retorna que encontrou o bau do jogador + return true + end + end + + -- Retorna que nao encontrou o bau do jogador + return false + +end + + +-- Criar balao e cordas para um bau de balao (ignora verificações) +telepro.montar_balao = function(pos, name) + + -- Colocar cordas + do + -- Desativa as verificações das cordas + telepro.cordas_f = false + + local y = 1 + while y <= 24 do + minetest.set_node({x=pos.x, y=pos.y+y, z=pos.z}, {name="telepro:corda_balao"}) + y = y + 1 + end + + -- Reativa as verificações das cordas + telepro.cordas_f = true + end + + -- Colocar balao + telepro.criar_balao({x=pos.x, y=pos.y+23, z=pos.z}, pos, name) + +end diff --git a/corda.lua b/corda.lua new file mode 100644 index 0000000..558bfcc --- /dev/null +++ b/corda.lua @@ -0,0 +1,45 @@ +--[[ + Mod Telepro para Minetest + 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 . + + Corda do Balao + ]] + +-- Variavel que impede que cordas sejam colocadas (ativa as verificações da fisica das cordas) +telepro.cordas_f = true + +-- Node +minetest.register_node("telepro:corda_balao", { + description = "Corda de Balao", + drawtype = "torchlike", + tiles = {"telepro_corda_balao.png"}, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {0, 0, 0, 0, 0, 0}, + }, + groups = {choppy = 2, oddly_breakable_by_hand = 2, not_in_creative_inventory = 1}, + drop = "", + + -- Ao ser removido de uma pos + after_destruct = function(pos) + -- Remove corda abaixo + if telepro.cordas_f == true and minetest.get_node({x=pos.x,y=pos.y-1,z=pos.z}).name == "telepro:corda_balao" then + minetest.remove_node({x=pos.x,y=pos.y-1,z=pos.z}) + end + end, + + -- Ao ser colocado de uma pos + on_construct = function(pos) + -- Remove caso nao tenha corda em cima + if telepro.cordas_f == true and minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z}).name ~= "telepro:corda_balao" then + minetest.remove_node(pos) + end + end, +}) diff --git a/depends.txt b/depends.txt new file mode 100644 index 0000000..61cb572 --- /dev/null +++ b/depends.txt @@ -0,0 +1,2 @@ +memor? +default diff --git a/gerar_balao_aleatorio.lua b/gerar_balao_aleatorio.lua new file mode 100644 index 0000000..9761792 --- /dev/null +++ b/gerar_balao_aleatorio.lua @@ -0,0 +1,113 @@ +--[[ + Mod Telepro para Minetest + 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 . + + Gerar um Balao Aleatorio + ]] + +-- Finaliza o procedimento de gerar balao +local finalizar = function(player, pos) + if not player then return end + + -- Carregar mapa + minetest.get_voxel_manip():read_from_map({x=pos.x-10,y=pos.y-10, z=pos.z-10}, {x=pos.x+10,y=pos.y+80, z=pos.z+10}) + + -- Procura grama + local nodes = minetest.find_nodes_in_area({x=pos.x-10,y=pos.y-10, z=pos.z-10}, {x=pos.x+10,y=pos.y+80, z=pos.z+10}, {"group:spreading_dirt_type"}) + + -- Verifica se encontrou uma terra superficial + if table.maxn(nodes) == 0 then + return telepro.gerar_balao_aleatorio(player) + end + + local name = player:get_player_name() + + -- Pegar uma coordenada + local p = nodes[1] + + -- Cordenada do bau + local pb = {x=p.x, y=p.y+1, z=p.z} + + -- Colocar balao + -- Desativa o bau anterior + do + -- Verificar se existe registro no banco de dados + if telepro.bd:verif(name, "pos") == true then + -- Pega a coordenada + local pp = telepro.bd:pegar(name, "pos") + -- Acessa os metadados + local meta = minetest.get_meta(pp) + -- Limpa o parametro dono + meta:set_string("dono", "") + end + end + + -- Colocar Bau + minetest.set_node(pb, {name="telepro:bau"}) + -- Pega os metadados do bau + local meta = minetest.get_meta(pb) + -- Salvar o nome do dono + meta:set_string("dono", name) + meta:set_string("status", "ativo") -- Salvar status inicial + + -- Salva a coordenada do novo bau no banco de dados + telepro.bd:salvar(name, "pos", pb) + + -- Montar balao + telepro.montar_balao(pb, name) + + -- Levar o jogador um pouco pra cima + player:setpos({x=pb.x, y=pb.y+1.5, z=pb.z}) + + -- Travar por 24 horas para impedir ficar gerando em vaios locais + telepro.travados[name] = true + minetest.after(3600, telepro.destravar, name) + + -- Finaliza + minetest.chat_send_player(name, "Novo local gerado. Mantenha o local do balao bem aberto.") + +end + +-- Gerar um balao aleatorio (ignora verificações) +telepro.gerar_balao_aleatorio = function(player) + + -- Pegar uma coordenada aleatória + local pos = {x=math.random(-25000, 25000), y = 10, z=math.random(-25000, 25000)} + + local name = player:get_player_name() + + -- Verificar area protegida + if minetest.is_protected({x=pos.x+5, y=pos.y, z=pos.z+5}, name) + or minetest.is_protected({x=pos.x-5, y=pos.y, z=pos.z+5}, name) + or minetest.is_protected({x=pos.x+5, y=pos.y, z=pos.z-5}, name) + or minetest.is_protected({x=pos.x-5, y=pos.y, z=pos.z-5}, name) + -- Em uma distancia maior + or minetest.is_protected({x=pos.x+20, y=pos.y, z=pos.z+20}, name) + or minetest.is_protected({x=pos.x-20, y=pos.y, z=pos.z+20}, name) + or minetest.is_protected({x=pos.x+20, y=pos.y, z=pos.z-20}, name) + or minetest.is_protected({x=pos.x-20, y=pos.y, z=pos.z-20}, name) + -- Em cima + or minetest.is_protected({x=pos.x+5, y=pos.y+25, z=pos.z+5}, name) + or minetest.is_protected({x=pos.x-5, y=pos.y+25, z=pos.z+5}, name) + or minetest.is_protected({x=pos.x+5, y=pos.y+25, z=pos.z-5}, name) + or minetest.is_protected({x=pos.x-5, y=pos.y+25, z=pos.z-5}, name) + -- Em uma distancia maior (em cima) + or minetest.is_protected({x=pos.x+20, y=pos.y+25, z=pos.z+20}, name) + or minetest.is_protected({x=pos.x-20, y=pos.y+25, z=pos.z+20}, name) + or minetest.is_protected({x=pos.x+20, y=pos.y+25, z=pos.z-20}, name) + or minetest.is_protected({x=pos.x-20, y=pos.y+25, z=pos.z-20}, name) + then + return telepro.gerar_balao_aleatorio(player) + end + + -- Inicia geração de mapa + minetest.emerge_area({x=pos.x-10,y=pos.y-10, z=pos.z-10}, {x=pos.x+10,y=pos.y+80, z=pos.z+10}) + + -- Espera um tempo para continuar + minetest.after(8, finalizar, player, pos) + +end diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..c2f12c6 --- /dev/null +++ b/init.lua @@ -0,0 +1,65 @@ +--[[ + Mod Telepro para Minetest + 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 variaveis e scripts + ]] + +-- Notificador de Inicializador +local notificar = function(msg) + if minetest.setting_get("log_mods") then + minetest.debug("[Telepro]"..msg) + end +end + +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...") + +-- Scripts mod memor embarcado +dofile(modpath.."/memor/init.lua") +-- Criação do banco de dados +telepro.bd = memor.montar_bd() +-- Criar tabela de jogadores online +telepro.online = memor.online() + +-- Funções +dofile(modpath.."/reivindicar.lua") +dofile(modpath.."/ir_balao.lua") +dofile(modpath.."/comum.lua") +dofile(modpath.."/reparar_balao.lua") +dofile(modpath.."/gerar_balao_aleatorio.lua") + +-- Interfaces +dofile(modpath.."/interface_bau.lua") +dofile(modpath.."/interface_jogador.lua") + +-- Balao +dofile(modpath.."/balao.lua") + +-- Nodes +dofile(modpath.."/corda.lua") +dofile(modpath.."/bau.lua") +dofile(modpath.."/bau_spawn.lua") + +-- Comandos +dofile(modpath.."/comandos.lua") + +-- Gerador de balao automatico +dofile(modpath.."/autogen.lua") + +-- Ajuste de compatibilidade com outros mods +dofile(modpath.."/compatibilidade.lua") +notificar("OK") + diff --git a/interface_bau.lua b/interface_bau.lua new file mode 100644 index 0000000..3c474a4 --- /dev/null +++ b/interface_bau.lua @@ -0,0 +1,156 @@ +--[[ + Mod Telepro para Minetest + 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 . + + Interface do Bau do balao + ]] + + +-- Acessar um Bau de Balao +telepro.acessar_bau = function(player) + if not player then + minetest.log("error", "[Telepro] player == nil (em telepro.acessar)") + return false + end + + -- Verificar se tem um Bau de Balao perto do jogador que pertenca a ele + if telepro.verif_prox_bau(player) == false then + minetest.chat_send_player(player:get_player_name(), "Muito distante do seu Bau de Balao") + return false + end + + -- Exibir formulario de opcoes ao jogador + + -- Cria formspec + local formspec = "size[6,4.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]" + + -- Exibir formspec + minetest.show_formspec(player:get_player_name(), "telepro:bau", formspec) + +end + +-- Acessar um Bau de Centro de Balao +telepro.acessar_bau_spawn = function(player) + if not player then + minetest.log("error", "[Telepro] player == nil (em telepro.acessar)") + return false + end + + -- Exibir formulario de opcoes ao jogador + + -- Cria formspec + local formspec = "size[6,4]" + ..default.gui_bg + ..default.gui_bg_img + .."image[0,0;7.3,3;telepro_intro.png]" + .."button_exit[0,3;6,1;ir_balao;Ir para o posto de seu Balao]" + + -- Exibir formspec + minetest.show_formspec(player:get_player_name(), "telepro:bau_spawn", formspec) + +end + +-- Receber botoes +minetest.register_on_player_receive_fields(function(player, formname, fields) + + -- Bau do jogador + if formname == "telepro:bau" then + + -- Botao de ir para o centro + if fields.ir_centro then + + -- Pegar nome do jogador + local name = player:get_player_name() + + -- Pegar coordenada do jogador + local pos = player:getpos() + + -- Verificar se tem um Bau de Balao perto do jogador que pertenca a ele + if telepro.verif_prox_bau(player) == false then + minetest.chat_send_player(name, "Muito distante do seu Bau de Balao") + return + end + + -- Verifica status do bau do balao + do + -- Pega os metadados do bau + local meta = minetest.get_meta(telepro.bd:pegar(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.") + return + end + end + + -- Teleportar jogador + player:setpos(telepro.spawn) + minetest.chat_send_player(name, "Viagem ao Centro realizada.") + elseif fields.reparar then + + -- Pegar nome do jogador + local name = player:get_player_name() + + -- Verificar se tem um Bau de Balao perto do jogador que pertenca a ele + if telepro.verif_prox_bau(player) == false then + minetest.chat_send_player(name, "Muito distante do seu Bau de Balao") + return + end + + -- Pegar coordenada do bau + local pos = telepro.bd:pegar(name, "pos") + + -- Verificar se o balao ja esta ativo + local meta = minetest.get_meta(pos) + if meta:get_string("status") == "ativo" then + minetest.chat_send_player(name, "O Balao ja esta ativo. Nao precisa reparar.") + return + end + + -- Reparar o balao + telepro.reparar_balao(name, pos) + + end + + -- Bau do Spawn + elseif formname == "telepro:bau_spawn" then + + -- Teleportar para o posto do balao do jogador + if fields.ir_balao then + + -- Pegar nome do jogador + local name = player:get_player_name() + + -- Pegar coordenada do jogador + local pos = player:getpos() + + -- Verificar se tem um Bau de Centro de Balao por perto + if not minetest.find_node_near({x=pos.x, y=pos.y-2, z=pos.z}, 8, {"telepro:bau_spawn"}) then + minetest.chat_send_player(name, "Muito distante do Bau de Balao do Centro") + return + end + + -- Verificar se o jogador tem um balao + if telepro.bd:verif(name, "pos") ~= true then + 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 + minetest.chat_send_player(name, "O Seu Balao nao esta funcionando. O local foi destruido ou obstruido.") + end + + -- Tenta teleportar o jogador + telepro.ir_balao(player) + return + end + end +end) diff --git a/interface_jogador.lua b/interface_jogador.lua new file mode 100644 index 0000000..c5e36b2 --- /dev/null +++ b/interface_jogador.lua @@ -0,0 +1,56 @@ +--[[ + Mod Telepro para Minetest + 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 . + + Interface do Jogador + ]] + +-- Acesar interface do jogador +telepro.acessar = function(player) + if not player then + minetest.log("error", "[Telepro] player == nil (em telepro.acessar)") + return false + end + + -- Cria formspec + local formspec = "size[3,5]" + ..default.gui_bg + ..default.gui_bg_img + .."image[0,0;3.5,3.5;telepro_mapa.png]" + .."button_exit[0,3.25;3,1;gerar_balao;Gerar Balao]" + .."button_exit[0,4.25;3,1;por_balao_aqui;Por Balao Aqui]" + + -- Exibir formspec + minetest.show_formspec(player:get_player_name(), "telepro:jogador", formspec) +end + +-- Receber botoes +minetest.register_on_player_receive_fields(function(player, formname, fields) + + if formname == "telepro:jogador" then + + if fields.gerar_balao then + + if telepro.travados[name] == true then + minetest.chat_send_player(player:get_player_name(), "Nao pode gerar um novo balao ainda. (sao necessarias 24 horas desde a ultima vez que gerou)") + return + end + + minetest.chat_send_player(player:get_player_name(), "Aguarde alguns segundos enquanto o balao esta endo preparado.") + telepro.gerar_balao_aleatorio(player) + elseif fields.por_balao_aqui then + if telepro.travados[name] == true then + minetest.chat_send_player(player:get_player_name(), "Nao pode colocar um novo balao ainda. (sao necessarias 24 horas desde a ultima vez que gerou ou colocou)") + return + end + + telepro.reivindicar(player) + end + + end + +end) diff --git a/ir_balao.lua b/ir_balao.lua new file mode 100644 index 0000000..1e4457e --- /dev/null +++ b/ir_balao.lua @@ -0,0 +1,71 @@ +--[[ + Mod Telepro para Minetest + 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 . + + Função para teleportar para balao + ]] + +-- Pegar node, mesmo que não esteja na memoria +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 + +-- Teleportar jogador para o posto de seu balao +telepro.ir_balao = function(player) + if not player then + minetest.log("error", "[Telepro] player == nil (em telepro.reivindicar)") + return false + end + + -- Pegar nome do jogador + 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 + 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") + + -- Verificar se o balao existente no banco de dados ainda existe no mapa + do + + -- Verificar se o nome do bloco é o de uma bau + if pegar_node(pos).name ~= "telepro:bau" then + minetest.chat_send_player(player:get_player_name(), "Seu balao foi destruido.") + return false + end + + -- Pega os metadados do bau + local meta = minetest.get_meta(pos) + + -- Pega o nome do dono do bau + local n = meta:get_string("dono") or "" + + -- Verifica se é o mesmo nome do jogador + if n ~= name then + minetest.chat_send_player(player:get_player_name(), "Seu balao foi destruido.") + return false + end + + end + + --Teleporta o jogador para o balao + player:setpos({x=pos.x, y=pos.y+1.5, z=pos.z}) + + -- Finaliza + minetest.chat_send_player(player:get_player_name(), "Viagem para o posto de seu balao realizada.") + return true + +end diff --git a/memor/API.txt b/memor/API.txt new file mode 100644 index 0000000..6289a74 --- /dev/null +++ b/memor/API.txt @@ -0,0 +1,99 @@ +Mod Memor para Minetest +Memor v1.2 Copyright (C) 2016 BrunoMine (https://github.com/BrunoMine) + +Recebeste uma cópia da GNU Lesser General +Public License junto com esse software, +se não, veja em . + +API + +===================================> Montar um banco de dados rápido <=================================== +Esse banco de dados fica em uma subpasta com o nome do mod especificado portanto não deve existir nenhum +arquivo ou pasta com o nome do mod dentro da pasta do mundo pois isso ocasionaria um conflito de nomes + +memor.montar_bd() -- Função que retorna uma tabela de funções para gerenciar o banco de + dados do mod + + OPCIONAL é o nome do mod que usará o banco de dados + Se nulo, fica sendo o nome do mod que executar a função + +Chamadas de função para o banco de dados criado + + salvar(tb, index, valor) -- Salva um valor no banco de dados (cria as tabelas se não existirem) + + é o nome da tabela (exemplo: players, nodes, casas) + é o endereço do valor (exemplo: fome, altura, dono) + é o valor armazenado (exemplo: 6, 30, "Caio") + + pegar(tb, index) -- Retorna o valor armazenado (ou nulo caso seja inexistente) + + é o nome da tabela (exemplo: players, nodes, casas) + é o endereço do valor (exemplo: fome, altura, dono) + + verif(tb, index) -- Verifica se um determinado registro existe (retorna 'true' se existir) + + é o nome da tabela (exemplo: players, nodes, casas) + é o endereço do valor (exemplo: fome, altura, dono) + + remover(tb, index) -- Remove um valor da tabela (apaga o dado armazenado) + + é o nome da tabela (exemplo: players, nodes, casas) + é o endereço do valor (exemplo: fome, altura, dono) + + drop_tb(tb) -- Remove uma tabela (apagando todos os seus dados) + + é o nome da tabela (exemplo: players, nodes, casas) + + listar(tb) -- Retorna uma tabela ordenada com strings dos nomes de tabelas ou indices + + OPICIONAL é uma tabela a qual desejar listar os sues indices + ^ Se nulo, retorna as listagem das tabelas do banco de dados + +Exemplo de uso: + +-- Montar um banco de dados na variavel 'registro' +local registro = memor.montar_bd(minetest.get_current_modname()) + +-- Criar uma tabela de "medalhas" onde "Maria" terá 15 +registro:salvar("medalhas", "Maria", 15) + +-- Verifica se "Maria" existe na tabela de "Medalhas" +if registro:verif("medalhas", "Maria") then + + -- Consulta quantas "medalhas" "Maria" tem + local medalhas = registro:pegar("medalhas", "Maria") -- retorna 15 + + minetest.chat_send_all("Maria tem " .. medalhas .. " medalhas") + +end + +-- Remover "Maria" da tabela "medalhas" +registro:remover("medalhas", "Maria") + +-- Remove a tabela "medalhas" +registro:drop_tb("medalhas") + +========================================================================================================= + +=====================================> Tabela de jogadores online <====================================== + +memor.online() -- Retorna uma tabela desordenada com índices com nomes dos jogadores online + ^ A tabela só mantém dados dos índices de jogadores online + ^ Caso um nome de jogador que não esteja online for inserido, ele vai + ser apagado assim que algum jogador sair do servidor + + OPCIONAL é uma string com o nome do mod dono da tabela (o que opera a tabela) + Se nulo, fica sendo o nome do mod que executar a função + +Exemplo de uso: + +-- Tabela que guarda quem é o convidado de um jogador (controlada para manter apenas jogadores online) +local convidados = memor.online() + +-- Jogador "Arnaldo" tem "Luiz" como convidado +convidados["Arnaldo"] = "Luiz" + +-- Quando o jogador "Arnaldo" sair do servidor, esse dado será apagado da memória + +========================================================================================================= + diff --git a/memor/arquivo.lua b/memor/arquivo.lua new file mode 100644 index 0000000..4d4561b --- /dev/null +++ b/memor/arquivo.lua @@ -0,0 +1,105 @@ +--[[ + Mod Memor para Minetest + Memor v1.2 Copyright (C) 2016 BrunoMine (https://github.com/BrunoMine) + + Recebeste uma cópia da GNU Lesser General + Public License junto com esse software, + se não, veja em . + + Operadores de arquivamento e leitura + ]] + + +-- Diretorio do mundo +local wpath = minetest.get_worldpath() + +-- Cria um diretório na pasta do mundo +function memor.mkdir(dir, sub) + 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(mod, dir, arquivo, dados) + if mod == nil or dir == nil or arquivo == nil or dados == nil then + minetest.log("error", "[Memor] Faltou dados (em memor.escrever)") + return false + end + + local dados = minetest.serialize(dados) + if dados == "" then + minetest.log("error", "[Memor] Dado fornecido invalido (em memor.escrever)") + return false + end + + local saida = io.open(wpath .. "/" .. mod .. "/" .. dir .. "/" .. arquivo, "w") + if saida then + saida:write(dados) + io.close(saida) + return true + else + minetest.log("info", "[Memor] memor.escrever tentou escrever num diretorio inexistente") + return false + end +end + +-- Ler dados de um arquivo de memória (Carregar) +function memor.ler(mod, dir, arquivo) + if mod == nil or dir == nil or arquivo == nil then + minetest.log("error", "[Memor] Faltou dados (em memor.ler)") + return nil + end + + local entrada = io.open(wpath .. "/" .. mod .. "/" .. dir .. "/" .. arquivo, "r") + if entrada then + local dados = entrada:read("*l") + if dados ~= "" or dados ~= nil then + dados = minetest.deserialize(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(mod, dir, arquivo) + if not mod or not dir or not arquivo then + minetest.log("error", "[Memor] Faltou dados (em memor.deletar)") + return false + end + + os.remove(wpath .. "/" .. mod .. "/" .. dir .. "/" .. arquivo) + return true +end + + +-- Deletar um diretório +function memor.deletar_dir(mod, dir) + if not mod or not dir then + minetest.log("error", "[Memor] Faltou dados (em memor.deletar_dir)") + return false + end + + local list = minetest.get_dir_list(wpath .. "/" .. mod .. "/" .. dir) + + for n, arquivo in ipairs(list) do + os.remove(wpath .. "/" .. mod .. "/" .. dir .. "/" .. arquivo) + end + + os.remove(wpath .. "/" .. mod .. "/" .. dir) + return true +end diff --git a/memor/consulta.lua b/memor/consulta.lua new file mode 100644 index 0000000..d540edc --- /dev/null +++ b/memor/consulta.lua @@ -0,0 +1,129 @@ +--[[ + Mod Memor para Minetest + Memor v1.2 Copyright (C) 2016 BrunoMine (https://github.com/BrunoMine) + + Recebeste uma cópia da GNU Lesser General + Public License junto com esse software, + se não, veja em . + + Operadores de consulta + ]] + +-- Diretório do Mundo +local wpath = minetest.get_worldpath() + +-- Verifica diretorios e corrige +verificar = function(dir, 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 == dir then + r = true + break + end + end + -- Diretorio inexistente + if r == false then + memor.mkdir(dir) + end + + -- Verifica e corrige subdiretorio + list = minetest.get_dir_list(minetest.get_worldpath().."/"..dir, true) + 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(dir.."/"..subdir) + end + +end + + +-- Inserir dados +memor.inserir = function(mod, tb, index, valor) + + -- Tenta inserir direto + if memor.escrever(mod, tb, index, valor) == true then return true end + + verificar(mod, tb) + + if memor.escrever(mod, tb, index, valor) then + return true + else + minetest.log("error", "[Memor] Impossivel salvar dados (em memor.inserir)") + return false + end + +end + + +-- Ler dados +memor.consultar = function(mod, tb, index) + + local r = memor.ler(mod, tb, index) + if r == nil then + 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(dir, subdir, arquivo) + + list = minetest.get_dir_list(wpath .. "/" .. dir .. "/" .. subdir) + 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(dir, subdir) + if dir == nil then + minetest.log("error", "[Memor] Diretorio inexistente (em memor.listar)") + return false + end + + 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 + + diff --git a/memor/init.lua b/memor/init.lua new file mode 100644 index 0000000..ff956d5 --- /dev/null +++ b/memor/init.lua @@ -0,0 +1,38 @@ +--[[ + Mod Memor para Minetest + Memor v1.2 Copyright (C) 2016 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 + ]] + +--[[ + Script alterado para permitir funcionamento dentro do mod telepro + ]] + +-- Verifica se o mod memor original esta ativo +if minetest.get_modpath("memor") then return end + +-- Notificador de Inicializador +local notificar = function(msg) + if minetest.setting_get("log_mods") then + minetest.debug("[Aventuras/Memor]"..msg) + end +end + +local modpath = minetest.get_modpath("telepro").."/memor" + +-- Variavel global +memor = {} + +-- Carregar scripts +notificar("Carregando scripts...") +dofile(modpath.."/arquivo.lua") +dofile(modpath.."/consulta.lua") +dofile(modpath.."/montagem.lua") +dofile(modpath.."/online.lua") +notificar("OK") + diff --git a/memor/montagem.lua b/memor/montagem.lua new file mode 100644 index 0000000..15244ea --- /dev/null +++ b/memor/montagem.lua @@ -0,0 +1,49 @@ +--[[ + Mod Memor para Minetest + Memor v1.2 Copyright (C) 2016 BrunoMine (https://github.com/BrunoMine) + + Recebeste uma cópia da GNU Lesser General + Public License junto com esse software, + se não, veja em . + + Montagem de bando de dados + ]] + + +-- Montar banco de dados em um mod +function memor.montar_bd(mod) + v = {} + v.mod = mod or minetest.get_current_modname() + + -- Inserir dados + v.salvar = function(v, tb, index, valor) + return memor.inserir(v.mod, tb, index, valor) + end + + -- Consultar dados + v.pegar = function(v, tb, index) + return memor.consultar(v.mod, tb, index) + end + + -- Verificar dados + v.verif = function(v, tb, index) + return memor.verificar(v.mod, tb, index) + end + + -- Remover dados + v.remover = function(v, tb, index) + return memor.deletar(v.mod, tb, index) + end + + -- Remover tabela + v.drop_tb = function(v, tb) + return memor.deletar_dir(v.mod, tb) + end + + -- Listar dados + v.listar = function(v, tb) + return memor.listar(v.mod, tb) + end + + return v +end diff --git a/memor/online.lua b/memor/online.lua new file mode 100644 index 0000000..ad28cfa --- /dev/null +++ b/memor/online.lua @@ -0,0 +1,37 @@ +--[[ + Mod Memor para Minetest + Memor v1.3 Copyright (C) 2016 BrunoMine (https://github.com/BrunoMine) + + Recebeste uma cópia da GNU Lesser General + Public License junto com esse software, + se não, veja em . + + Controle de jogadores online + ]] + + +-- Controle de jogadores de cada mod +memor.online_mods = {} + +-- Montar banco de dados simples de jogadores online +function memor.online(mod) + local mod = mod or minetest.get_current_modname() + + memor.online_mods[mod] = {} + + return memor.online_mods[mod] +end + +-- Adiciona o jogador em todas listas quando entrar no servidor +minetest.register_on_joinplayer(function(player) + for mod,l in pairs(memor.online_mods) do + memor.online_mods[mod][player:get_player_name()] = {} + end +end) + +-- Remove o jogador de todas listas quando entrar no servidor +minetest.register_on_leaveplayer(function(player) + for mod,l in pairs(memor.online_mods) do + memor.online_mods[mod][player:get_player_name()] = nil + end +end) diff --git a/models/telepro_balao.b3d b/models/telepro_balao.b3d new file mode 100644 index 0000000..0e94a7e Binary files /dev/null and b/models/telepro_balao.b3d differ diff --git a/models/telepro_balao.blend b/models/telepro_balao.blend new file mode 100644 index 0000000..ef97709 Binary files /dev/null and b/models/telepro_balao.blend differ diff --git a/models/telepro_balao.blend1 b/models/telepro_balao.blend1 new file mode 100644 index 0000000..228380b Binary files /dev/null and b/models/telepro_balao.blend1 differ diff --git a/reivindicar.lua b/reivindicar.lua new file mode 100644 index 0000000..d822f0a --- /dev/null +++ b/reivindicar.lua @@ -0,0 +1,148 @@ +--[[ + Mod Telepro para Minetest + 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 . + + Função para Reivindicar balao + ]] + +-- Lista de jogadores que não podem gerar novo balao +telepro.travados = {} + +-- Metodo para destravar jogador (apos um tempo) +telepro.destravar = function(name) + telepro.travados[name] = false +end + +-- Metodo para reivindicar balao no local +telepro.reivindicar = function(player) + if not player then + minetest.log("error", "[Telepro] player == nil (em telepro.reivindicar)") + return false + end + + -- Pegar nome do jogador + local name = player:get_player_name() + + -- Verificar se está travado + if telepro.travados[name] == true then + minetest.chat_send_player(name, "Nao pode gerar um novo balao ainda. (sao necessarias 24 horas desde a ultima vez que gerou)") + return false + end + + -- Pegar coordenada do jogador + local pos = player:getpos() + + -- Verifica se está numa coordenada muito baixa (menor que o nível do mar) + if pos.y < 0 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) + if not luz or luz < 13 then + minetest.chat_send_player(name, "Precisa estar na luz do dia.") + return false + end + end + + -- Verifica se cabe o balao + + --[[ + - Caminho de bloco para cima totalmente livre 40 blocos + - Cubo de espaço onde fica o balão + ]] + + -- Verificar caminho de bloco para cima + do + -- Pegar nodes + local nodes = minetest.find_nodes_in_area( + {x=pos.x, y=pos.y, z=pos.z}, + {x=pos.x, y=pos.y+24, z=pos.z}, + {"air"} + ) + + -- Verifica se pegou nodes de ar + if table.maxn(nodes) < 25 then + minetest.chat_send_player(name, "O caminho para cima esta obstruido. Encontre um lugar onde de para o balao descer.") + return false + end + end + + -- Verificar espaço onde fica o balão + do + -- Pegar nodes + 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"} + ) + + -- Verifica se pegou todos nodes de ar + if table.maxn(nodes) < 5850 then -- 15 * 15 * 26 + minetest.chat_send_player(name, "Parte de cima obstruida. Libere o local ou suba.") + return false + end + end + + -- Verificar area protegida + if minetest.is_protected(pos, name) -- local do bau + -- corda para subir no balao + or minetest.is_protected({x=pos.x, y=pos.y+5, z=pos.z}, name) + or minetest.is_protected({x=pos.x, y=pos.y+10, z=pos.z}, name) + or minetest.is_protected({x=pos.x, y=pos.y+15, z=pos.z}, name) + or minetest.is_protected({x=pos.x, y=pos.y+20, z=pos.z}, name) + then + minetest.chat_send_player(name, "Local protegido.") + return + end + + -- Verificar entidades na area do balao + if table.maxn(minetest.get_objects_inside_radius({x=pos.x, y=pos.y+23, z=pos.z}, 15)) > 0 then + minetest.chat_send_player(name, "Objetos obstruem a parte de cima. Libere o local ou suba.") + return + end + + -- Desativa o bau anterior + do + -- Verificar se existe registro no banco de dados + if telepro.bd:verif(name, "pos") == true then + -- Pega a coordenada + local p = telepro.bd:pegar(name, "pos") + -- Acessa os metadados + local meta = minetest.get_meta(p) + -- Limpa o parametro dono + meta:set_string("dono", "") + end + end + + -- Colocar Bau + minetest.set_node(pos, {name="telepro:bau"}) + -- Pega os metadados do bau + local meta = minetest.get_meta(pos) + -- Salvar o nome do dono + meta:set_string("dono", name) + meta:set_string("status", "ativo") -- Salvar status inicial + + -- Salva a coordenada do novo bau no banco de dados + telepro.bd:salvar(name, "pos", pos) + + -- Montar balao + telepro.montar_balao(pos, name) + + -- Levar o jogador um pouco pra cima + player:setpos({x=pos.x, y=pos.y+1.5, z=pos.z}) + + -- Travar por 24 horas para impedir ficar gerando em vaios locais + telepro.travados[name] = true + minetest.after(3600, telepro.destravar, name) + + -- Finaliza + minetest.chat_send_player(name, "Balao reivindicado com sucesso.") + return true +end diff --git a/reparar_balao.lua b/reparar_balao.lua new file mode 100644 index 0000000..59115fb --- /dev/null +++ b/reparar_balao.lua @@ -0,0 +1,72 @@ +--[[ + Mod Telepro para Minetest + 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 . + + Reparar Balao + ]] + +-- Metodo para reparar o balao +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}) + if not luz or luz < 13 then + minetest.chat_send_player(name, "Precisa estar na luz do dia.") + return false + end + end + + -- Verificar caminho de bloco para cima + do + -- Pegar nodes + local nodes = minetest.find_nodes_in_area( + {x=pos.x, y=pos.y, z=pos.z}, + {x=pos.x, y=pos.y+24, z=pos.z}, + {"air", "telepro:corda_balao"} + ) + + -- Verifica se pegou nodes de ar + if table.maxn(nodes) < 24 then + minetest.chat_send_player(name, "O caminho para cima esta obstruido (corda). Abra mais o local."..table.maxn(nodes)) + return false + end + end + + -- Verificar espaço onde fica o balão + do + -- Pegar nodes + 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"} + ) + + -- Verifica se pegou todos nodes de ar + if table.maxn(nodes) < 5850 then -- 15 * 15 * 26 + minetest.chat_send_player(name, "Parte de cima obstruida (onde fica o balao). Libere o local ou suba.") + return false + end + end + + -- Verificar entidades na area do balao + if table.maxn(minetest.get_objects_inside_radius({x=pos.x, y=pos.y+23, z=pos.z}, 15)) > 0 then + minetest.chat_send_player(name, "Objetos obstruem a parte de cima. remova os objetos e tente novamente.") + return + end + + -- Montar balao + telepro.montar_balao(pos, name) + + -- Ativa o balao + local meta = minetest.get_meta(pos) + meta:set_string("status", "ativo") + +end + + + diff --git a/textures/telepro_balao.png b/textures/telepro_balao.png new file mode 100644 index 0000000..b16b197 Binary files /dev/null and b/textures/telepro_balao.png differ diff --git a/textures/telepro_bau_cima.png b/textures/telepro_bau_cima.png new file mode 100644 index 0000000..77af8d6 Binary files /dev/null and b/textures/telepro_bau_cima.png differ diff --git a/textures/telepro_bau_direita.png b/textures/telepro_bau_direita.png new file mode 100644 index 0000000..aed5173 Binary files /dev/null and b/textures/telepro_bau_direita.png differ diff --git a/textures/telepro_bau_esquerda.png b/textures/telepro_bau_esquerda.png new file mode 100644 index 0000000..e057006 Binary files /dev/null and b/textures/telepro_bau_esquerda.png differ diff --git a/textures/telepro_bau_fundo.png b/textures/telepro_bau_fundo.png new file mode 100644 index 0000000..bd1c9fd Binary files /dev/null and b/textures/telepro_bau_fundo.png differ diff --git a/textures/telepro_corda_balao.png b/textures/telepro_corda_balao.png new file mode 100644 index 0000000..6cf66a7 Binary files /dev/null and b/textures/telepro_corda_balao.png differ diff --git a/textures/telepro_en.png b/textures/telepro_en.png new file mode 100644 index 0000000..99d86d0 Binary files /dev/null and b/textures/telepro_en.png differ diff --git a/textures/telepro_es.png b/textures/telepro_es.png new file mode 100644 index 0000000..ff0443d Binary files /dev/null and b/textures/telepro_es.png differ diff --git a/textures/telepro_intro.png b/textures/telepro_intro.png new file mode 100644 index 0000000..48bbca3 Binary files /dev/null and b/textures/telepro_intro.png differ diff --git a/textures/telepro_mapa.png b/textures/telepro_mapa.png new file mode 100644 index 0000000..7435e3d Binary files /dev/null and b/textures/telepro_mapa.png differ diff --git a/textures/telepro_pt.png b/textures/telepro_pt.png new file mode 100644 index 0000000..e6b91e9 Binary files /dev/null and b/textures/telepro_pt.png differ