Melhorias no balao

master
BrunoMine 2018-07-11 18:46:22 -03:00
parent 3158aef19d
commit be9173f69e
21 changed files with 171 additions and 212 deletions

165
balao.lua
View File

@ -19,121 +19,54 @@ local function pegar_node(pos)
return node
end
-- Registro da entidade
minetest.register_entity("telepro:balao", {
hp_max = 1,
physical = true,
weight = 5,
collisionbox = {-7,0,-7, 7,25,7},
visual = "mesh",
visual_size = {x=5, y=5},
mesh = "telepro_balao.b3d",
textures = {"telepro_balao.png"}, -- number of required textures depends on visual
spritediv = {x=1, y=1},
initial_sprite_basepos = {x=0, y=0},
is_visible = true,
makes_footstep_sound = false,
automatic_rotate = false,
on_step = function(self, dtime)
self.timer = (self.timer or 0) + dtime
if self.timer > 4 then
self.timer = 0
-- Pegar nome do jogador
local name = self.dono
-- Pegar coordenada do balao
local pos = self.object:getpos()
-- Pegar coordenada do bau
local bau_pos = {x=pos.x, y=pos.y-23, z=pos.z}
-- Verifica se ainda tem o bau
if pegar_node(bau_pos).name == "telepro:bau" then
-- Verifica se o bau eh do dono
-- Pegar metadados
local meta = minetest.get_meta(bau_pos)
if
meta:get_string("dono") == name
and meta:get_string("status") == "ativo"
then
return
end
end
-- Remover cordas
do
local y = -1
while y <= 24 do
if pegar_node({x=pos.x, y=pos.y-y, z=pos.z}).name == "telepro:corda_balao" then
minetest.remove_node({x=pos.x, y=pos.y-y, z=pos.z})
end
y = y + 1
end
end
-- Remove o objeto pois nao encontrou o bau do dono
self.object:remove()
return
end
end,
on_activate = function(self, staticdata)
if staticdata ~= "" then
self.dono = minetest.serialize({dono=self.dono,name=self.name}).dono
self.name = minetest.serialize({dono=self.dono,name=self.name}).name
end
end,
get_staticdata = function(self)
return minetest.serialize({dono=self.dono,name=self.name})
end,
-- Node
minetest.register_node("telepro:balao_jogador", {
description = "Balao Decorativo",
tiles = {"telepro_balao.png"},
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
drawtype = "mesh",
mesh = "telepro_node_balao.b3d",
visual_scale = 0.45,
groups = {choppy = 2, oddly_breakable_by_hand = 2},
sounds = default.node_sound_wood_defaults(),
drop = "",
})
-- Criar um balao
telepro.criar_balao = function(pos, bau_pos, name)
if not pos then
minetest.log("error", "[Telepro] pos == nil (em telepro.criar_balao)")
return false
end
if not bau_pos then
minetest.log("error", "[Telepro] bau_pos == nil (em telepro.criar_balao)")
return false
end
if not name then
minetest.log("error", "[Telepro] name == nil (em telepro.criar_balao)")
return false
end
-- Cria o objeto
local obj = minetest.add_entity(pos, "telepro:balao")
-- Verifica se foi criado
if not obj then
minetest.log("error", "[Telepro] Falha ao cria o objeto (em telepro.criar_balao)")
return false
end
-- Cria animação no objeto
obj:set_animation({x=1,y=40}, 5, 0)
-- Pega a entidade
local ent = obj:get_luaentity()
-- Cria o temporizador
ent.timer = 0
-- Salva o nome do dono
ent.dono = name
-- Salva nome da entidade
ent.name = "telepro:balao"
return true
end
-- Verifica se tem bau ativo
minetest.register_abm{
nodenames = {"telepro:balao_jogador"},
interval = 4,
chance = 1,
action = function(pos)
-- Pos bau
local pos_bau = {x=pos.x, y=pos.y-25, z=pos.z}
-- Bau
local node = pegar_node(pos_bau)
-- Verifica se tem bau
if node.name ~= "telepro:bau" then
minetest.remove_node(pos)
return
end
-- Pegar metadados do bau
local meta = minetest.get_meta(pos_bau)
-- Verifica se o bau tem dono
if meta:get_string("dono") == "" then
minetest.remove_node(pos)
return
end
-- Verifica se o bau ta ativo
if meta:get_string("status") ~= "ativo" then
minetest.remove_node(pos)
return
end
end,
}

25
balao_decor.lua Normal file
View File

@ -0,0 +1,25 @@
--[[
Mod Telepro para Minetest
Copyright (C) 2018 BrunoMine (https://github.com/BrunoMine)
Recebeste uma cópia da GNU Lesser General
Public License junto com esse software,
se não, veja em <http://www.gnu.org/licenses/>.
Balao Decorativo para Spawn
]]
-- Node
minetest.register_node("telepro:balao_decorativo", {
description = "Balao Decorativo",
tiles = {"telepro_balao.png"},
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
drawtype = "mesh",
mesh = "telepro_node_balao.b3d",
visual_scale = 0.45,
groups = {choppy = 2, oddly_breakable_by_hand = 2},
sounds = default.node_sound_wood_defaults(),
drop = "",
})

68
bau.lua
View File

@ -9,6 +9,16 @@
Bau do balao
]]
-- Pegar node distante nao carregado
local function pegar_node(pos)
local node = minetest.get_node(pos)
if node.name == "ignore" then
minetest.get_voxel_manip():read_from_map(pos, pos)
node = minetest.get_node(pos)
end
return node
end
-- Node
minetest.register_node("telepro:bau", {
description = "Bau do Balao",
@ -37,7 +47,7 @@ minetest.register_node("telepro:bau", {
-- Atualização constante do balão
minetest.register_abm{
nodenames = {"telepro:bau"},
interval = 2,
interval = 5,
chance = 1,
action = function(pos)
@ -51,46 +61,6 @@ minetest.register_abm{
-- Verificar se ta tudo ok
--
-- Salvar o nome do dono
if meta:get_string("status") == "ativo" then
-- Verificar cordas
do
-- Pegar os nodes
local nodes = minetest.find_nodes_in_area(
{x=pos.x, y=pos.y+1, z=pos.z},
{x=pos.x, y=pos.y+24, z=pos.z},
{"telepro:corda_balao"}
)
-- Verificar se estao todos
if table.maxn(nodes) < 24 then
-- Desativa o bau
meta:set_string("status", "inativo")
return
end
end
-- Verifica balao
do
local r = false -- Variavel que avisa se achou o balao
for _,obj in ipairs(minetest.get_objects_inside_radius(pos, 30)) do
local ent = obj:get_luaentity() or {}
-- Verifica se eh o balao
if ent and ent.name == "telepro:balao" and ent.dono == meta:get_string("dono") then
r = true -- achou balao
end
end
if r == false then
-- Desativa o bau
meta:set_string("status", "inativo")
return
end
end
-- Tudo ok
return
end
--
-- Verificar se consegue colocar o balao e cordas
--
@ -115,7 +85,7 @@ minetest.register_abm{
local nodes = minetest.find_nodes_in_area(
{x=pos.x-7, y=pos.y+24, z=pos.z-7},
{x=pos.x+7, y=pos.y+24+25, z=pos.z+7},
{"air", "telepro:corda_balao"}
{"air", "telepro:corda_balao", "telepro:balao_jogador"}
)
-- Verifica se pegou todos nodes de ar
@ -133,7 +103,19 @@ minetest.register_abm{
-- Montar o balao e cordas
--
telepro.montar_balao(pos, meta:get_string("dono"))
-- Verifica se ja tem todas as cordas
if table.maxn(minetest.find_nodes_in_area(
{x=pos.x, y=pos.y+1, z=pos.z},
{x=pos.x, y=pos.y+24, z=pos.z},
{"telepro:corda_balao"}
)) ~= 24
-- Verifica balao
or pegar_node({x=pos.x, y=pos.y+25, z=pos.z}).name ~= "telepro:balao_jogador"
then
-- Repara tudo
telepro.montar_balao(pos)
end
meta:set_string("status", "ativo")

View File

@ -26,5 +26,18 @@ minetest.register_node("telepro:bau_spawn", {
on_rightclick = function(pos, node, player)
telepro.acessar_bau_spawn(player)
end,
after_place_node = function(pos, placer, itemstack, pointed_thing)
-- Verifica privilegios de quem coloca
if pointed_thing and pointed_thing.above and minetest.check_player_privs(placer:get_player_name(), {server=true}) == true then
telepro.spawn = pos
telepro.bd.salvar("centro", "pos", {x=pos.x, y=pos.y+2, z=pos.z})
minetest.chat_send_all("Novo centro definido")
else
minetest.chat_send_all("Precisa do privilegio 'server' para colocar esse bau")
minetest.remove_node(pos)
end
end,
drop = "",
})

View File

@ -21,13 +21,13 @@ telepro.check_balao_proprio = function(player)
local name = player:get_player_name()
-- Verificar se o jogador tem um balao
if telepro.bd.verif(name, "pos") ~= true then
if telepro.bd.verif("jogador_"..name, "pos") ~= true then
minetest.chat_send_player(name, "Precisas ter um balao ativo")
return 1, "Nenhum balao proprio existente"
end
-- Pega os metadados do bau
local meta = minetest.get_meta(telepro.bd.pegar(name, "pos"))
local meta = minetest.get_meta(telepro.bd.pegar("jogador_"..name, "pos"))
if meta:get_string("status") ~= "ativo" then
return 2, "Balao proprio inoperante"
end

View File

@ -45,7 +45,7 @@ end
-- Criar balao e cordas para um bau de balao (ignora verificações)
telepro.montar_balao = function(pos, name)
telepro.montar_balao = function(pos)
-- Colocar cordas
do
@ -63,6 +63,6 @@ telepro.montar_balao = function(pos, name)
end
-- Colocar balao
telepro.criar_balao({x=pos.x, y=pos.y+23, z=pos.z}, pos, name)
minetest.set_node({x=pos.x, y=pos.y+25, z=pos.z}, {name="telepro:balao_jogador"})
end

View File

@ -44,9 +44,9 @@ local finalizar = function(name, spos)
-- Desativa o bau anterior
do
-- Verificar se existe registro no banco de dados
if telepro.bd.verif(name, "pos") == true then
if telepro.bd.verif("jogador_"..name, "pos") == true then
-- Pega a coordenada
local pp = telepro.bd.pegar(name, "pos")
local pp = telepro.bd.pegar("jogador_"..name, "pos")
-- Acessa os metadados
local meta = minetest.get_meta(pp)
-- Limpa o parametro dono
@ -63,7 +63,7 @@ local finalizar = function(name, spos)
meta:set_string("status", "ativo") -- Salvar status inicial
-- Salva a coordenada do novo bau no banco de dados
telepro.bd.salvar(name, "pos", pb)
telepro.bd.salvar("jogador_"..name, "pos", pb)
-- Montar balao
telepro.montar_balao(pb, name)

View File

@ -21,15 +21,17 @@ local modpath = minetest.get_modpath("telepro")
-- Variavel global
telepro = {}
-- Spawn do servidor (para onde os baloes permitem ir)
telepro.spawn = minetest.setting_get_pos("static_spawnpoint") or {x=0, y=0, z=0}
-- Carregar scripts
notificar("Carregando scripts...")
-- Criação do banco de dados
telepro.bd = dofile(modpath.."/lib/memor.lua")
-- Spawn do servidor (para onde os baloes permitem ir)
if telepro.bd.verif("centro", "pos") == true then
telepro.spawn = telepro.bd.pegar("centro", "pos")
end
-- Funções
dofile(modpath.."/online.lua")
dofile(modpath.."/reivindicar.lua")
@ -52,6 +54,7 @@ dofile(modpath.."/balao.lua")
dofile(modpath.."/corda.lua")
dofile(modpath.."/bau.lua")
dofile(modpath.."/bau_spawn.lua")
dofile(modpath.."/balao_decor.lua")
-- Comandos
dofile(modpath.."/comandos.lua")

View File

@ -29,10 +29,14 @@ telepro.acessar_bau = function(player)
local formspec = "size[6,5.8]"
..default.gui_bg
..default.gui_bg_img
.."image[0,0;7.3,3;telepro_intro.png]"
.."button_exit[0,3;6,1;ir_centro;Ir para Centro]"
.."button_exit[0,4;6,1;reparar;Reparar Balao]"
.."button[0,5;6,1;visitas;Receber seguidor]"
.."image[1.7,-0.25;3,3;telepro_ir_centro.png]"
.."button_exit[0,2.4;6,1;ir_centro;Ir para Centro]"
.."image[0.1,3.7;1,1;screwdriver.png]"
.."button_exit[1,3.7;5,1;reparar;Reparar Balao]"
.."image[0.1,5;1,1;telepro_aceitar_visita.png]"
.."button[1,5;5,1;visitas;Receber seguidor]"
-- Exibir formspec
minetest.show_formspec(player:get_player_name(), "telepro:bau", formspec)
@ -49,12 +53,14 @@ telepro.acessar_bau_spawn = function(player)
-- Exibir formulario de opcoes ao jogador
-- Cria formspec
local formspec = "size[6,5]"
local formspec = "size[6,3]"
..default.gui_bg
..default.gui_bg_img
.."image[0,0;7.3,3;telepro_intro.png]"
.."button[0,3;6,1;visitas;Seguir jogador]"
.."button_exit[0,4;6,1;ir_balao;Ir para o posto de seu Balao]"
.."image[0.1,-0.2;3,3;telepro_ir_casa.png]"
.."button_exit[0,2;3,1;ir_balao;Ir para seu Balao]"
.."image[3.1,-0.2;3,3;telepro_visitar.png]"
.."button[3,2;3,1;visitas;Seguir jogador]"
-- Exibir formspec
minetest.show_formspec(player:get_player_name(), "telepro:bau_spawn", formspec)
@ -81,7 +87,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
local pos = player:getpos()
-- Verificar se o jogador tem um balao
if telepro.bd.verif(name, "pos") ~= true then
if telepro.bd.verif("jogador_"..name, "pos") ~= true then
minetest.chat_send_player(name, "Precisas ter um balao ativo")
return
end
@ -95,7 +101,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
-- Verifica status do bau do balao
do
-- Pega os metadados do bau
local meta = minetest.get_meta(telepro.bd.pegar(name, "pos"))
local meta = minetest.get_meta(telepro.bd.pegar("jogador_"..name, "pos"))
if meta:get_string("status") ~= "ativo" then
minetest.chat_send_player(name, "Balao inoperante. Aguarde mantenha o local limpo e aberto e aguarde ele ficar pronto.")
@ -118,7 +124,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
end
-- Pegar coordenada do bau
local pos = telepro.bd.pegar(name, "pos")
local pos = telepro.bd.pegar("jogador_"..name, "pos")
-- Verificar se o balao ja esta ativo
local meta = minetest.get_meta(pos)
@ -155,12 +161,13 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
end
-- Verificar se o jogador tem um balao
if telepro.bd.verif(name, "pos") ~= true then
if telepro.bd.verif("jogador_"..name, "pos") ~= true then
minetest.chat_send_all("dados de jogador_"..name.." nao encontrado")
return telepro.acessar(minetest.get_player_by_name(name))
end
-- Verificar se o balao esta ativo
if minetest.get_meta(telepro.bd.pegar(name, "pos")):get_string("status") ~= "ativo" then
if minetest.get_meta(telepro.bd.pegar("jogador_"..name, "pos")):get_string("status") ~= "ativo" then
minetest.chat_send_player(name, "O Seu Balao nao esta funcionando. O local foi destruido ou obstruido.")
end

View File

@ -30,13 +30,13 @@ telepro.ir_balao = function(player)
local name = player:get_player_name()
-- Verifica se o registro de balao existe no banco de dados
if telepro.bd.verif(name, "pos") == false then
if telepro.bd.verif("jogador_"..name, "pos") == false then
minetest.chat_send_player(player:get_player_name(), "Sem nenhum balao ainda.")
return false
end
-- Pegar coordenada do bau
local pos = telepro.bd.pegar(name, "pos")
local pos = telepro.bd.pegar("jogador_"..name, "pos")
-- Verificar se o balao existente no banco de dados ainda existe no mapa
do

View File

@ -1,12 +1,13 @@
--[[
Lib Memor para Minetest
Memor v1.3 Copyright (C) 2017 BrunoMine (https://github.com/BrunoMine)
Memor v2.0.0 Copyright (C) 2017 BrunoMine (https://github.com/BrunoMine)
Recebeste uma cópia da GNU Lesser General
Public License junto com esse software,
se não, veja em <http://www.gnu.org/licenses/>.
Inicializador de scripts
Autoria do código:
Originalmente por BrunoMine, Bruno Borges <borgesdossantosbruno@gmail.com>
]]
local modname = minetest.get_current_modname()
@ -14,7 +15,7 @@ local modname = minetest.get_current_modname()
local modpath = minetest.get_modpath(modname)
-- Variavel global
local memor = {}
memor = {}
-- Rotinas de interação com arquivos
@ -57,18 +58,10 @@ function memor.escrever(dir, arquivo, dados)
saida:write(dados)
io.close(saida)
return true
else
minetest.log("info", "[Memor] memor.escrever tentou escrever num diretorio inexistente")
return false
end
-- Cria diretorio (tabela) caso nao exista
memor.mkdir(modname.."/"..dir)
saida = io.open(wpath .. "/" .. modname .. "/" .. dir .. "/" .. arquivo, "w")
if saida then
saida:write(dados)
io.close(saida)
return true
end
minetest.log("error", "[Memor] Impossivel escrever dados em "..modname.."/"..dir.."/"..arquivo.." (em memor.escrever)")
return false
end
-- Ler dados de um arquivo de memória (Carregar)
@ -131,23 +124,24 @@ end
-- Verifica diretorios e corrige
verificar = function(subdir)
local dir = modname
-- Verifica e corrige diretorio
local list = minetest.get_dir_list(minetest.get_worldpath(), true)
local r = false
for n, ndir in ipairs(list) do
if ndir == modname then
if ndir == dir then
r = true
break
end
end
-- Diretorio inexistente
if r == false then
memor.mkdir(modname)
memor.mkdir(dir)
end
-- Verifica e corrige subdiretorio
list = minetest.get_dir_list(minetest.get_worldpath().."/"..modname, true)
list = minetest.get_dir_list(minetest.get_worldpath().."/"..dir, true)
r = false
for n, ndir in ipairs(list) do
if ndir == subdir then
@ -157,7 +151,7 @@ verificar = function(subdir)
end
-- Subdiretorio inexistente
if r == false then
memor.mkdir(modname.."/"..subdir)
memor.mkdir(dir.."/"..subdir)
end
end

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -37,16 +37,16 @@ telepro.reivindicar = function(player)
local pos = player:getpos()
-- Verifica se está numa coordenada muito baixa (menor que o nível do mar)
if pos.y < 0 then
if pos.y < 10 then
minetest.chat_send_player(name, "Local muito baixo. Precisa subir para um local mais alto.")
return false
end
-- Verificar se está na luz do dia (força estar na superficie)
do
local luz = minetest.get_node_light(pos)
local luz = minetest.get_node_light(pos, 0.5)
if not luz or luz < 13 then
minetest.chat_send_player(name, "Precisa estar na luz do dia.")
minetest.chat_send_player(name, "Precisa estar num lugar mais aberto.")
return false
end
end
@ -111,9 +111,9 @@ telepro.reivindicar = function(player)
-- Desativa o bau anterior
do
-- Verificar se existe registro no banco de dados
if telepro.bd.verif(name, "pos") == true then
if telepro.bd.verif("jogador_"..name, "pos") == true then
-- Pega a coordenada
local p = telepro.bd.pegar(name, "pos")
local p = telepro.bd.pegar("jogador_"..name, "pos")
-- Acessa os metadados
local meta = minetest.get_meta(p)
-- Limpa o parametro dono
@ -130,7 +130,7 @@ telepro.reivindicar = function(player)
meta:set_string("status", "ativo") -- Salvar status inicial
-- Salva a coordenada do novo bau no banco de dados
telepro.bd.salvar(name, "pos", pos)
telepro.bd.salvar("jogador_"..name, "pos", pos)
-- Montar balao
telepro.montar_balao(pos, name)

View File

@ -14,9 +14,9 @@ telepro.reparar_balao = function(name, pos)
-- Verificar se está na luz do dia (força estar na superficie)
do
local luz = minetest.get_node_light({x=pos.x, y=pos.y+1, z=pos.z+1})
local luz = minetest.get_node_light({x=pos.x, y=pos.y+1, z=pos.z+1}, 0.5)
if not luz or luz < 13 then
minetest.chat_send_player(name, "Precisa estar na luz do dia.")
minetest.chat_send_player(name, "Precisa estar em local aberto.")
return false
end
end

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@ -35,7 +35,8 @@ telepro.acessar_visitas = function(player, tipo)
.."label[0,0;Pedidos recebidos]"
.."dropdown[0,0.5;5.25,1;visita;"..visitas..";]"
.."button[0,1.15;5,1;receber_visita;Receber seguidor]"
.."image[0.4,2;1.5,1.5;telepro_aceitar_visita.png]"
.."button[2,2.25;3,1;voltar;Voltar]"
elseif tipo == "centro" then
@ -45,7 +46,8 @@ telepro.acessar_visitas = function(player, tipo)
..default.gui_bg_img
.."field[0.28,0.8;5,1;visitado;Seguir jogador;]"
.."button_exit[0,1.25;5,1;enviar_pedido;Enviar pedido]"
.."image[0.4,2;1.5,1.5;telepro_visitar.png]"
.."button[2,2.25;3,1;voltar;Voltar]"
end