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