bau_coop/nodes.lua

461 lines
13 KiB
Lua

--[[
Mod Bau_Coop 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 <http://www.gnu.org/licenses/>.
Nodes
]]
-- Tradutor
local S = bau_coop.S
-- Variavel de acesso
local acessos = {}
-- Remover nome dos acessos ao sair
minetest.register_on_leaveplayer(function(player)
acessos[player:get_player_name()] = nil
end)
-- Formspec de acesso negado
local formspec_acesso_negado = "size[7,2]"
.. default.gui_bg
.. default.gui_bg_img
.. "image[0,0;2,2;bau_coop_acesso.png]"
.. "label[2,0.75;"..core.colorize("#FF0000", S("Acesso Negado")).."]"
local function pegar_formspec_bau_compartilhado(pos)
local spos = pos.x .. "," .. pos.y .. "," .. pos.z
local formspec =
"size[8,10]" ..
default.gui_bg ..
default.gui_bg_img ..
default.gui_slots ..
"list[nodemeta:" .. spos .. ";main;0,1.3;8,4;]" ..
"list[current_player;main;0,5.85;8,1;]" ..
"list[current_player;main;0,7.08;8,3;8]" ..
"listring[nodemeta:" .. spos .. ";main]" ..
"listring[current_player;main]" ..
default.get_hotbar_bg(0,5.85) ..
"label[0,0;"..S("Bau Compartilhado").."]" ..
"image_button[7,0;1,1;bau_coop_acesso.png;controle_acesso;]"
return formspec
end
local function pegar_formspec_painel_acesso(name, meta, msg, erro)
local lista = ""
local donos = meta:get_string("permitidos")
if donos and donos ~= "" then
donos = minetest.deserialize(donos)
for _,n in ipairs(donos) do
if lista ~= "" then lista = lista .. "," end
lista = lista .. n
end
end
local formspec = "size[8,7]"
.. default.gui_bg
.. default.gui_bg_img
.. "image[0,0;2,2;bau_coop_acesso.png]"
.. "label[2,0;"..S("Bau Compartilhado").."]"
.. "button[6,0;2,1;voltar;"..S("Voltar").."]"
-- Adicionar acesso
.. "field[0.3,2.8;4.8,1;novo_acesso;"..S("Adicionar novo jogador")..";]"
.. "button[5,2.49;3,1;adicionar;"..S("Adicionar Acesso").."]"
-- Remover acesso
.. "label[0,3.7;"..S("Jogadores com acesso").."]"
.. "dropdown[0,4.125;5,1;nome_acesso;"..lista..";]"
.. "button[5,4;3,1;remover;"..S("Remover Acesso").."]"
if msg then
if erro then
formspec = formspec .. "label[2,1;"..core.colorize("#FF0000", msg).."]"
else
formspec = formspec .. "label[2,1;"..msg.."]"
end
end
return formspec
end
local function verificar_acesso(meta, player)
local name = ""
if player then
if minetest.check_player_privs(player, "protection_bypass") then
return true
end
name = player:get_player_name()
end
if meta:get_string("permitidos") == "" then
return true
end
for _,n in ipairs(minetest.deserialize(meta:get_string("permitidos"))) do
if name == n then
return true
end
end
return false
end
-- Fechar bau
local fechar = function(name)
local pos = acessos[name]
if not pos then return end
local node = minetest.get_node(pos)
-- Verifica se tem mais alguem acessando
for k, v in pairs(acessos) do
if k ~= name and pos.x == pos.x and pos.y == pos.y and pos.z == pos.z then
acessos[name] = nil -- Remover nome dos acessos
return
end
end
minetest.after(0.2, minetest.swap_node, minetest.deserialize(minetest.serialize(pos)), { name = "bau_coop:bau_compartilhado",
param2 = node.param2 })
minetest.sound_play("bau_coop_close", {gain = 0.3, pos = pos, max_hear_distance = 10})
acessos[name] = nil -- Remover nome dos acessos
end
-- Receptor de botoes
minetest.register_on_player_receive_fields(function(player, formname, fields)
-- Ao sair
if formname == "bau_coop:bau_compartilhado" and fields.quit then
local name = player:get_player_name()
fechar(name)
end
-- Dono
if formname == "bau_coop:bau_compartilhado" then
if not acessos[player:get_player_name()] then return end
local pos = acessos[player:get_player_name()]
local meta = minetest.get_meta(pos)
-- Verificar se eh o dono
if meta:get_string("dono") ~= player:get_player_name() then
return
end
if verificar_acesso(meta, player) == false then
return minetest.show_formspec(
player:get_player_name(),
"bau_coop:bau_compartilhado",
formspec_acesso_negado
)
end
-- Acessar painel de controle de acesso
if fields.controle_acesso then
return minetest.show_formspec(
player:get_player_name(),
"bau_coop:bau_compartilhado",
pegar_formspec_painel_acesso(player:get_player_name(), meta)
)
-- Adicionar acesso de um jogador
elseif fields.adicionar then
local donos = minetest.deserialize(meta:get_string("permitidos"))
-- Verificar se um nome foi especificado
if fields.novo_acesso == "" then
return minetest.show_formspec(
player:get_player_name(),
"bau_coop:bau_compartilhado",
pegar_formspec_painel_acesso(player:get_player_name(), meta, S("Nenhum nome especificado"), true)
)
end
-- Verificar se ja esta no limite de acessos
if table.maxn(donos) >= bau_coop.lim_acess then
return minetest.show_formspec(
player:get_player_name(),
"bau_coop:bau_compartilhado",
pegar_formspec_painel_acesso(player:get_player_name(), meta, S("Limite de @1 jogadores", bau_coop.lim_acess), true)
)
end
-- Verificar se ja esta registrado
for _,n in ipairs(donos) do
if n == fields.novo_acesso then
return minetest.show_formspec(
player:get_player_name(),
"bau_coop:bau_compartilhado",
pegar_formspec_painel_acesso(player:get_player_name(), meta, S("Jogador ja registrado"), true)
)
end
end
-- Adiciona o acesso ao jogador
table.insert(donos, fields.novo_acesso)
meta:set_string("permitidos", minetest.serialize(donos))
minetest.sound_play("bau_coop_blip", {gain = 0.2,
pos = pos, max_hear_distance = 10})
return minetest.show_formspec(
player:get_player_name(),
"bau_coop:bau_compartilhado",
pegar_formspec_painel_acesso(player:get_player_name(), meta, S("@1 agora tem acesso", fields.novo_acesso))
)
-- Remover acesso de um jogador
elseif fields.remover then
local donos = minetest.deserialize(meta:get_string("permitidos"))
-- Verifica se eh o proprio dono se removendo
if fields.nome_acesso == meta:get_string("dono") then
return minetest.show_formspec(
player:get_player_name(),
"bau_coop:bau_compartilhado",
pegar_formspec_painel_acesso(player:get_player_name(), meta, S("Nao pode remover a si mesmo"), true)
)
end
-- Verificar se o jogador selecionado eh ultimo dono
if table.maxn(donos) == 1 then
return minetest.show_formspec(
player:get_player_name(),
"bau_coop:bau_compartilhado",
pegar_formspec_painel_acesso(player:get_player_name(), meta, S("Apenas um dono restante"), true)
)
end
-- Remover o acesso
local tb = {}
for _,n in ipairs(donos) do
if n ~= fields.nome_acesso then
table.insert(tb, n)
end
end
donos = tb
meta:set_string("permitidos", minetest.serialize(donos))
-- Verifica se o jogador ainda tem acesso
if verificar_acesso(meta, player) == false then
return minetest.show_formspec(
player:get_player_name(),
"bau_coop:bau_compartilhado",
formspec_acesso_negado
)
end
minetest.sound_play("bau_coop_blip", {gain = 0.2,
pos = pos, max_hear_distance = 10})
return minetest.show_formspec(
player:get_player_name(),
"bau_coop:bau_compartilhado",
pegar_formspec_painel_acesso(player:get_player_name(), meta, S("@1 perdeu o acesso", fields.nome_acesso))
)
-- Voltar para a formspec normal do bau
elseif fields.voltar then
if verificar_acesso(meta, player) then
minetest.show_formspec(
player:get_player_name(),
"bau_coop:bau_compartilhado",
pegar_formspec_bau_compartilhado(pos)
)
end
end
end
end)
minetest.register_node("bau_coop:bau_compartilhado", {
description = S("Bau Compartilhado"),
tiles = {
"default_chest_top.png",
"default_chest_top.png",
"default_chest_side.png^[transformFX",
"default_chest_side.png",
"default_chest_side.png",
"default_chest_side.png^bau_coop_frente.png"
},
paramtype2 = "facedir",
groups = {choppy = 2, oddly_breakable_by_hand = 2},
legacy_facedir_simple = true,
is_ground_content = false,
sounds = default.node_sound_wood_defaults(),
after_place_node = function(pos, placer)
local meta = minetest.get_meta(pos)
meta:set_string("dono", placer:get_player_name())
meta:set_string("permitidos", minetest.serialize({placer:get_player_name()}))
meta:set_string("infotext", S("Bau Compartilhado (@1)", placer:get_player_name()))
end,
on_construct = function(pos)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
inv:set_size("main", 8 * 4)
end,
can_dig = function(pos,player)
local meta = minetest.get_meta(pos);
local inv = meta:get_inventory()
return ( inv:is_empty("main") and verificar_acesso(meta, player) ) or minetest.check_player_privs(player, "protection_bypass")
end,
allow_metadata_inventory_move = function(pos, from_list, from_index,
to_list, to_index, count, player)
local meta = minetest.get_meta(pos)
if minetest.check_player_privs(player, "protection_bypass") then return count end
if not verificar_acesso(meta, player) then
return 0
end
return count
end,
allow_metadata_inventory_put = function(pos, listname, index, stack, player)
local meta = minetest.get_meta(pos)
if minetest.check_player_privs(player, "protection_bypass") then return stack:get_count() end
if not verificar_acesso(meta, player) then
return 0
end
return stack:get_count()
end,
allow_metadata_inventory_take = function(pos, listname, index, stack, player)
local meta = minetest.get_meta(pos)
if minetest.check_player_privs(player, "protection_bypass") then return stack:get_count() end
if not verificar_acesso(meta, player) then
return 0
end
return stack:get_count()
end,
on_metadata_inventory_put = function(pos, listname, index, stack, player)
minetest.log("action", player:get_player_name() ..
" moveu " .. stack:get_name() ..
" para o bau compartilhado em " .. minetest.pos_to_string(pos))
end,
on_metadata_inventory_take = function(pos, listname, index, stack, player)
minetest.log("action", player:get_player_name() ..
" pegou " .. stack:get_name() ..
" do bau compartilhado em " .. minetest.pos_to_string(pos))
end,
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
local name = clicker:get_player_name()
local meta = minetest.get_meta(pos)
if verificar_acesso(meta, clicker) then
if minetest.get_node(pos).name == "bau_coop:bau_compartilhado" then
minetest.sound_play("bau_coop_open", {gain = 0.2,
pos = pos, max_hear_distance = 10})
minetest.after(0.1 , minetest.swap_node, minetest.deserialize(minetest.serialize(pos)),
{ name = "bau_coop:bau_compartilhado_aceso",
param2 = node.param2 })
if minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}).name == "air" then
minetest.after(0.5 , minetest.swap_node, minetest.deserialize(minetest.serialize(pos)),
{ name = "bau_coop:bau_compartilhado_open",
param2 = node.param2 })
end
end
acessos[clicker:get_player_name()] = {x=pos.x, y=pos.y, z=pos.z}
minetest.after(0.65, minetest.show_formspec,
clicker:get_player_name(),
"bau_coop:bau_compartilhado",
pegar_formspec_bau_compartilhado(pos)
)
end
return itemstack
end,
on_blast = function() end,
})
-- Bau com telinha acessa
do
-- Copiar tabela de definições
local def = {}
for n,d in pairs(minetest.registered_nodes["bau_coop:bau_compartilhado"]) do
def[n] = d
end
-- Mantem a tabela groups separada
def.groups = minetest.deserialize(minetest.serialize(def.groups))
def.groups.not_in_creative_inventory = 1
def.drop = "bau_coop:bau_compartilhado"
-- Altera alguns paremetros
def.tiles = {
"default_chest_top.png",
"default_chest_top.png",
"default_chest_side.png^[transformFX",
"default_chest_side.png",
"default_chest_side.png",
"default_chest_side.png^bau_coop_frente_acesa.png"
}
-- Registra o novo node
minetest.register_node("bau_coop:bau_compartilhado_aceso", def)
end
-- Bau aberto
do
-- Copiar tabela de definições
local def = {}
for n,d in pairs(minetest.registered_nodes["bau_coop:bau_compartilhado"]) do
def[n] = d
end
-- Mantem a tabela groups separada
def.groups = minetest.deserialize(minetest.serialize(def.groups))
-- Altera alguns paremetros
def.tiles = {
"default_chest_top.png",
"default_chest_top.png",
"default_chest_side.png",
"default_chest_side.png",
"default_chest_side.png^bau_coop_frente_acesa.png",
"default_chest_inside.png"
}
def.drawtype = "mesh"
def.visual = "mesh"
def.paramtype = "light"
def.paramtype2 = "facedir"
def.legacy_facedir_simple = true
def.is_ground_content = false
def.groups.not_in_creative_inventory = 1
def.mesh = "chest_open.obj"
def.drop = "bau_coop:bau_compartilhado"
def.selection_box = {
type = "fixed",
fixed = { -1/2, -1/2, -1/2, 1/2, 3/16, 1/2 },
}
def.can_dig = function()
return false
end
-- Registra o novo node
minetest.register_node("bau_coop:bau_compartilhado_open", def)
end
-- Fecha baus que ficaram abertos ao fechar o mundo
minetest.register_lbm({
name = "bau_coop:fechar_bau",
nodenames = {"bau_coop:bau_compartilhado_open"},
run_at_every_load = true,
action = function(pos, node)
minetest.swap_node(pos, { name = "bau_coop:bau_compartilhado",
param2 = node.param2 })
end,
})
minetest.register_craft({
output = 'bau_coop:bau_compartilhado',
recipe = {
{'default:chest_locked', 'default:copper_ingot'},
{'default:tin_ingot', 'default:glass'}
}
})