Lançamento

master
BrunoMine 2017-06-18 21:53:19 -03:00
parent 58d94b5cef
commit 8674520429
31 changed files with 1369 additions and 1 deletions

32
API.txt Normal file
View File

@ -0,0 +1,32 @@
API.txt
Pontos importantes
* Jamais pode existir dois item como o mesmo nome (description)
* So pode montar 1 item especial por vez (jamais quantidades acima de 1 por vez)
* Pode ter de 1 a 6 tipos de itens requisitados podem variar suas quantidades individuais
* Apos o jogador sair do servidor os seus dados nao serao mais encontrados ate que entre novamente
* Nao pode existir itens cujo tempo total de montagem seja menor que 1 minuto (minimo 1 minuto)
* A principio nao deve existir mais de 10 receitas por oficio para nao travar muito o sistema e os jogadores
* Jamais usar itens com o profixo group nas strings dos itens (ex.: "groups:stick", "groups") ou qualquer outro prefixo
Funcoao de insercao no banco de dados (todos os valores sao obrigatorios)
oficios.montar_receita(
oficio, -- Nome do oficio que podera realizar (ex. "cozinheiro")
item, -- Item a ser criado (ex. "default:wood")
nivel, -- Nivel requerido (ex. 5)
desc, -- Breve descricao do item com ate 4 linhas com ate 26 caracteres de largura mediana
(ex. "Esse item pode ser util \nem varios casos e lhe traz \nmelhor desempenho no jogo.")
xp, -- Quantidade de XP recebido ao terminar (ex. 20)
item_requisitado, -- Tabela de itens requeridos (de 1 a 6 itens) (ex. {{"default:stone", 5},{"default:stick", 1}})
tempo -- Tempo que demora para concluir em dias(0 a 25), horas(0 a 23) e minutos(0 a 59) no formato {dd,hh,mm}
(ex. {00,00,05})
)

165
LICENSE Normal file
View File

@ -0,0 +1,165 @@
GNU LESSER GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
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.

View File

@ -1 +1,29 @@
oficios
# Oficios v1.0.0
[![Baixar](https://img.shields.io/badge/Baixar-v1.0.0-green.svg)](https://github.com/BrunoMine/oficios/archive/v1.0.0.zip)
[![Projeto](https://img.shields.io/badge/Git-Projeto-green.svg)](https://github.com/BrunoMine/oficios)
[![Licença](https://img.shields.io/badge/Licença-LGPL_v3.0-blue.svg)](https://github.com/BrunoMine/oficios/blob/master/LICENSE)
## Descrição
API de oficios
## Recursos do projeto
* [Baixar](https://github.com/BrunoMine/oficios/archive/v1.0.0.zip)
* [Projeto](https://github.com/BrunoMine/oficios)
## Requisitos
* Minetest 0.4.15 ou superior
* Mod default
## 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 <borgesdossantosbruno@gmail.com> (LGPL 3.0)
### Autores de mídias (texturas, modelos and sons)
Todos os que não estão listados aqui são de autoria de
BrunoMine, Bruno Borges <borgesdossantosbruno@gmail.com> (CC BY-SA 3.0)

162
banco_de_dados.lua Normal file
View File

@ -0,0 +1,162 @@
--[[
Mod Oficios 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/>.
Banco de Dados
]]
oficios.bd = {}
-- Variavel de registros
registros_oficios = {}
-- Carregar registros de oficios salvos
local path = minetest.get_worldpath() .. "/oficios"
-- Cria o diretorio caso nao exista ainda
local function mkdir(path)
if minetest.mkdir then
minetest.mkdir(path)
else
os.execute('mkdir "' .. path .. '"')
end
end
mkdir(path)
minetest.register_on_joinplayer(function(player)
local name = player:get_player_name()
local input = io.open(path .. "/oficios_"..name, "r")
if input then
registros_oficios[name] = minetest.deserialize(input:read("*l"))
io.close(input)
end
end)
-- Retira da memoria quando o jogador sai
minetest.register_on_leaveplayer(function(player)
local name = player:get_player_name()
registros_oficios[name] = nil
end)
-- Salvar registros de oficios
oficios.bd.salvar = function(name)
local output = io.open(path .. "/oficios_"..name, "w")
output:write(minetest.serialize(registros_oficios[name]))
io.close(output)
end
-- Inserir registro
oficios.bd.inserir = function(name)
if not name then
minetest.log("error", "[Oficios]: variavel name invalida (name = "..dump(name)..")")
return false
end
registros_oficios[name] = {
oficio = "nenhum", -- Tipo de Ofício
nivel = 1, -- Nível
xp = 0, -- Quantidade de experiencia
montagem = {
status = false, -- Se está montando
item = "", -- Nome do item que está sendo montado
data_fim = 0 -- Data de termino da montagem
},
total_itens = 0, -- Total de itens feitos
coletar = "" -- Item a coletar
}
oficios.bd.salvar(name)
end
-- Coletou o item
oficios.bd.coletou_item = function(name)
registros_oficios[name].coletar = ""
oficios.bd.salvar(name)
end
-- Iniciar montagem
oficios.bd.iniciar_montagem = function(name, item, data_fim)
registros_oficios[name].montagem.status = true
registros_oficios[name].montagem.item = item
registros_oficios[name].montagem.data_fim = data_fim
oficios.bd.salvar(name)
end
-- Concluir montagem
oficios.bd.conluir_montagem = function(name, xp)
registros_oficios[name].montagem.status = false
registros_oficios[name].coletar = oficios.receitas[registros_oficios[name].montagem.item].item
registros_oficios[name].montagem.item = ""
registros_oficios[name].montagem.data_fim = 0
registros_oficios[name].total_itens = registros_oficios[name].total_itens + 1
if (registros_oficios[name].xp + xp) > LIMITE_DE_XP then
registros_oficios[name].xp = LIMITE_DE_XP
else
registros_oficios[name].xp = registros_oficios[name].xp + xp
end
-- atualizar nivel
local nivel_atual = 1
if registros_oficios[name].xp == LIMITE_DE_XP then
nivel_atual = LIMITE_DE_NIVEL
else
while registros_oficios[name].xp >= OFICIOS_NIVEIS[nivel_atual+1] do
nivel_atual = nivel_atual + 1
end
end
registros_oficios[name].nivel = nivel_atual
oficios.bd.salvar(name)
end
-- Definir Oficio
oficios.bd.definir_oficio = function(name, oficio)
registros_oficios[name].oficio = oficio
oficios.bd.salvar(name)
end
-- Aumentar experiencia
oficios.bd.aumentar_xp = function(name, valor)
if (registros_oficios[name].xp + valor) > LIMITE_DE_XP then
registros_oficios[name].xp = LIMITE_DE_XP
else
registros_oficios[name].xp = registros_oficios[name].xp + valor
end
-- atualizar nivel
local nivel_atual = 1
if registros_oficios[name].xp == LIMITE_DE_XP then
nivel_atual = LIMITE_DE_NIVEL
else
while registros_oficios[name].xp >= OFICIOS_NIVEIS[nivel_atual+1] do
nivel_atual = nivel_atual + 1
end
end
registros_oficios[name].nivel = nivel_atual
oficios.bd.salvar(name)
end
-- Diminuir experiencia
oficios.bd.diminuir_xp = function(name, valor)
if registros_oficios[name].xp < valor then
registros_oficios[name].xp = 0
else
registros_oficios[name].xp = registros_oficios[name].xp - valor
end
-- atualizar nivel
local nivel_atual = 1
if registros_oficios[name].xp == LIMITE_DE_XP then
nivel_atual = LIMITE_DE_NIVEL
else
while registros_oficios[name].xp >= OFICIOS_NIVEIS[nivel_atual+1] do
nivel_atual = nivel_atual + 1
end
end
registros_oficios[name].nivel = nivel_atual
oficios.bd.salvar(name)
end
-- Registra apenas novos jogadores
minetest.register_on_newplayer(function(player)
local name = player:get_player_name()
oficios.bd.inserir(name)
end)

208
contador_tempo.lua Normal file
View File

@ -0,0 +1,208 @@
--[[
Mod Oficios 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/>.
Contador de tempo
]]
-- Quantos dias tem cada mes
local dias_meses = {
31, -- Janeiro
28, -- Fevereiro (29 em ano bissexto)
31, -- Março
30, -- Abril
31, -- Maio
30, -- Junho
31, -- Julho
31, -- Agosto
30, -- Setembro
31, -- Outubro
30, -- Novembro
31 -- Dezembro
}
-- Pegar dias do mes naquele ano
local pegar_dias_mes = function(mes, ano)
-- converter para valor numerico
mes = tonumber(mes)
ano = tonumber(ano)
-- ajustando para numero entre 1 e 12
if mes > 12 then mes = mes - (math.floor(mes/12)*12) end
-- caso o mes de zero
if mes == 0 then mes = 12 end
if mes == 2 and math.fmod(ano, 4) == 0 then
return dias_meses[mes] + 1
else
return dias_meses[mes]
end
end
-- Pegar numero maior
local pegar_maior = function(n1, n2)
if tonumber(n1) > tonumber(n2) then
return n1
else
return n2
end
end
-- Pegar numero menor
local pegar_menor = function(n1, n2)
if n1 < n2 then
return n1
else
return n2
end
end
-- Comparar data
--[[
Esse metodo recebe uma data como argumento e retorna
as quantidades de dias, horas e minutos em relação à
data atual
Retorno:
<diferença de dias>
<diferença de horas>
<diferença de minutos>
Argumentos:
<ano da data>
<mes da data>
<dia do mes da data>
<hora do dia da data>
<minutos da hora do dia da data>
]]
oficios.comparar_data = function(ano, mes, dia, hora, minuto)
if not ano or not tonumber(ano) then
minetest.log("error", "[Oficios] Ano invalido em especificado (em oficios.comparar_data)")
return false
end
if not mes or not tonumber(mes) then
minetest.log("error", "[Oficios] Mes invalido em especificado (em oficios.comparar_data)")
return false
end
if not dia or not tonumber(dia) then
minetest.log("error", "[Oficios] Dia invalido em especificado (em oficios.comparar_data)")
return false
end
if not hora or not tonumber(hora) then
minetest.log("error", "[Oficios] Hora invalido em especificado (em oficios.comparar_data)")
return false
end
if not minuto or not tonumber(minuto) then
minetest.log("error", "[Oficios] Minuto invalido em especificado (em oficios.comparar_data)")
return false
end
-- Conversoes
ano = tonumber(ano)
mes = tonumber(mes)
dia = tonumber(dia)
hora = tonumber(hora)
minuto = tonumber(minuto)
-- Pegando data atual
local ano_atual = tonumber(os.date("%Y"))
local mes_atual = tonumber(os.date("%m"))
local dia_atual = tonumber(os.date("%d"))
local hora_atual = tonumber(os.date("%H"))
local minuto_atual = tonumber(os.date("%M"))
-- Pegar diferença de ano
local dif_ano = ano - ano_atual
-- Pegar diferença de meses
local dif_meses = mes - (mes_atual - (dif_ano*12)) -- (considerando os meses de um ano para outro)
-- Pegar a diferença de dias
local dif_dias = 0
-- Pegar dias dos meses que passaram
if dif_meses > 0 then -- do mes atual ate o mes futuro (apenas os meses inteiros, logo o ultimo nao conta, por isso o menos 1)
local a = ano_atual -- ano do mes contado
local n = mes_atual -- qual mes do ano contado
for m=mes_atual, mes_atual+dif_meses-1 do
if n > 12 then
n = n - 12
a = a + 1
end
dif_dias = dif_dias + pegar_dias_mes(m, a)
n = n + 1
end
elseif dif_meses < 0 then -- do mes passado do passado ate o mes atual
local a = ano -- ano do mes contado
local n = mes -- qual mes do ano contado
for m=mes, mes+math.abs(dif_meses)-1 do
if n > 12 then
n = n - 12
a = a + 1
end
dif_dias = dif_dias + pegar_dias_mes(m, a)
n = n + 1
end
dif_dias = dif_dias * (-1) -- mantem valor negativo por estar no passado
end
-- Adiciona a diferença de dias conforme os dias do mes de cada data
dif_dias = dif_dias + (dia - dia_atual)
-- Pegar diferença de horas
local dif_horas = 0
if dif_dias > 0 then
if hora >= hora_atual then
dif_horas = hora - hora_atual
else
dif_dias = dif_dias - 1
dif_horas = (hora + 24) - hora_atual
end
elseif dif_dias < 0 then
dif_dias = dif_dias + 1 -- (1 dia é tirado para ser fracionado em horas pois 1 desses dias não foi inteiro)
dif_horas = (24-hora) + hora_atual -- (desconta as horas de 24 horas de um dia que foi descontado)
if dif_horas >= 24 then
dif_dias = dif_dias - 1
dif_horas = dif_horas - 24
end
dif_horas = dif_horas * (-1) -- mantem valor negativo por estar no passado
else -- A data é do mesmo dia
dif_horas = hora - hora_atual
end
-- Pegar diferença de minutos
local dif_minutos = 0
if dif_horas > 0 then
if minuto >= minuto_atual then
dif_minutos = minuto - minuto_atual
else
dif_horas = dif_horas - 1
dif_minutos = (minuto + 60) - minuto_atual
end
elseif dif_horas < 0 then
dif_horas = dif_horas + 1 -- (1 dia é tirado para ser fracionado em horas pois 1 desses dias não foi inteiro)
dif_minutos = (60-minuto) + minuto_atual -- (desconta as horas de 24 horas de um dia que foi descontado)
if dif_minutos >= 60 then
dif_horas = dif_horas - 1
dif_minutos = dif_minutos - 60
end
dif_minutos = dif_minutos * (-1) -- mantem valor negativo por estar no passado
else -- A data é da mesma hora
dif_minutos = minuto - minuto_atual
end
-- Reajuste de valores (caso o saldo de horas esteja incompativel com saldo de dias)
if dif_horas > 1 and dif_dias < 1 then
dif_dias = dif_dias + 1
dif_horas = dif_horas - 24
end
if dif_horas < 1 and dif_dias > 1 then
dif_dias = dif_dias - 1
dif_horas = dif_horas + 24
end
return dif_dias, dif_horas, dif_minutos
end

1
depends.txt Normal file
View File

@ -0,0 +1 @@
default

33
diretrizes.lua Normal file
View File

@ -0,0 +1,33 @@
--[[
Mod Oficios 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/>.
Diretrizes
]]
-- Uso de sistema de registro emergencial
-- (para caso não esteja ativo desde o inicio do servidor)
SISTEMA_DE_REGISTRO_EMERGENCIAL = true
-- Escala de niveis (jamais alterar apos iniciar o uso no servidor)
OFICIOS_NIVEIS = {
00000, -- 1
00500, -- 2
01500, -- 3
02500, -- 4
04000, -- 5
06000, -- 6
08500, -- 7
11500, -- 8
14500, -- 9
20000 -- 10
}
-- Calculando limiteis de nível e experiência
local lim =table.maxn(OFICIOS_NIVEIS)
LIMITE_DE_XP = OFICIOS_NIVEIS[lim]
LIMITE_DE_NIVEL = lim

136
formularios.lua Normal file
View File

@ -0,0 +1,136 @@
--[[
Mod Oficios 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/>.
Formulários
]]
oficios.form = {}
-- Menu de Escolha
oficios.form.inicial = "size[8,4.5]"..
default.gui_bg..
default.gui_bg_img..
"label[0,0;Escolha o seu Oficio]"..
"button_exit[5,0;3,1;;Escolher depois]"..
-- Nomes dos Oficios
"label[0.2,1.1;Ferreiro]"..
"label[2.2,1.1;Cientista]"..
"label[4.2,1.1;Cozinheiro]"..
"label[6.2,1.1;Construtor]"..
-- Imagens dos Oficios
"image[0.1,1.5;2,2;oficios_ferreiro.png]"..
"image[2.1,1.5;2,2;oficios_cientista.png]"..
"image[4.1,1.5;2,2;oficios_cozinheiro.png]"..
"image[6.1,1.5;2,2;oficios_construtor.png]"..
-- Botoes de escolha de Oficio
"button[0.25,3.3;1.55,1;escolher_ferreiro;Escolher]"..
"button[2.25,3.3;1.55,1;escolher_cientista;Escolher]"..
"button[4.25,3.3;1.55,1;escolher_cozinheiro;Escolher]"..
"button[6.25,3.3;1.55,1;escolher_construtor;Escolher]"
-- Descricao de Ferreiro
oficios.form.desc_ferreiro = "size[9,4.5]"..
default.gui_bg..
default.gui_bg_img..
"label[1.4,0;FERREIRO]"..
-- Image do Oficio
"image[1.1,0.5;3,3;oficios_ferreiro.png]"..
-- Descricao
"label[4,0.5;O Ferreiro pode montar "..
"\nvarios itens compostos de "..
"\nmetais. "..
"\nSeu foco maior acaba por ser "..
"\nem itens para combate onde "..
"\npode causar maior dano. ]"..
"label[2.2,4.3;SUA ESCOLHA NAO TEM VOLTA]"..
"button[1.5,3.5;3,1;aceitar;Ser Ferreiro]"..
"button[4.5,3.5;3,1;voltar;Voltar]"
-- Descricao de Cientista
oficios.form.desc_cientista = "size[9,4.5]"..
default.gui_bg..
default.gui_bg_img..
"label[1.4,0;CIENTISTA]"..
-- Image do Oficio
"image[1.1,0.5;3,3;oficios_cientista.png]"..
-- Descricao
"label[4,0.5;O Cientista possui uma "..
"\ncaracteristica especial de "..
"\nmontar itens diversificados. "..
"\nSeu foco costuma estar em "..
"\nutilidades nada convensionais "..
"\nque as vezes pode surpreender. ]"..
"label[2.2,4.3;SUA ESCOLHA NAO TEM VOLTA]"..
"button[1.5,3.5;3,1;aceitar;Ser Cientista]"..
"button[4.5,3.5;3,1;voltar;Voltar]"
-- Descricao de Cientista
oficios.form.desc_cozinheiro = "size[9,4.5]"..
default.gui_bg..
default.gui_bg_img..
"label[1.4,0;COZINHEIRO]"..
-- Image do Oficio
"image[1.1,0.5;3,3;oficios_cozinheiro.png]"..
-- Descricao
"label[4,0.5;O Cozinheiro consegue "..
"\nperceber o que existe de "..
"\nmelhor para comer e prepara "..
"\nsempre bons pratos. "..
"\nSeu enfoque se encontra nos "..
"\ncomestiveis. ]"..
"label[2.2,4.3;SUA ESCOLHA NAO TEM VOLTA]"..
"button[1.5,3.5;3,1;aceitar;Ser Cozinheiro]"..
"button[4.5,3.5;3,1;voltar;Voltar]"
-- Descricao de Construtor
oficios.form.desc_construtor = "size[9,4.5]"..
default.gui_bg..
default.gui_bg_img..
"label[1.4,0;CONSTRUTOR]"..
-- Image do Oficio
"image[1.1,0.5;3,3;oficios_construtor.png]"..
-- Descricao
"label[4,0.5;O Construtor sempre sabe "..
"\ncomo erguer uma bela "..
"\nestrutura seja qual for "..
"\no material ou necessidade. "..
"\nSeu enfoque vai em itens"..
"\npara estruturar. ]"..
"label[2.2,4.3;SUA ESCOLHA NAO TEM VOLTA]"..
"button[1.5,3.5;3,1;aceitar;Ser Construtor]"..
"button[4.5,3.5;3,1;voltar;Voltar]"
-- Aviso de falta de itens
oficios.form.aviso_falta_item = "size[6,2]"..
default.gui_bg..
default.gui_bg_img..
"label[0,0;Precisar ter os itens requisitados \npara iniciar a montagem]"..
"button_exit[2,1;2,1;voltar_ao_item;Voltar]"
-- Aviso de falta espaco no inventario
oficios.form.aviso_inv_lotado = "size[6,2]"..
default.gui_bg..
default.gui_bg_img..
"label[0,0;Inventario lotado \nEsvazie um pouco]"..
"button_exit[2,1;2,1;voltar_ao_item;Voltar]"
-- Aviso de nivel insuficiente
oficios.form.aviso_nivel_insuficiente = "size[6,2]"..
default.gui_bg..
default.gui_bg_img..
"label[0,0;Nivel muito baixo. Precisa ter um \nnivel maior para montar esse item]"..
"button_exit[2,1;2,1;voltar_ao_item;Voltar]"
-- Aviso de falta de receitas em algum oficio
oficios.form.aviso_sem_receita = "size[6,2]"..
default.gui_bg..
default.gui_bg_img..
"label[0,0;Faltam receitas e algum oficios \nPrecisa existir ao menos uma receita \npara cada oficio]"

567
funcoes.lua Normal file
View File

@ -0,0 +1,567 @@
--[[
Mod Oficios 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/>.
Funcoes
]]
--
-----
--------
-- Montar Receitas
-- Ordenar vetor
local ordenar_por_nivel = function(vetor, lim)
local i = 1
local j = 1
while (i <= lim) do
j = i + 1
while (j <= lim) do
if (tonumber(vetor[i].nivel) > tonumber(vetor[j].nivel)) then
local aux = vetor[i]
vetor[i] = vetor[j]
vetor[j] = aux
end
j = j + 1
end
i = i + 1
end
return vetor
end
-- Vetores de niveis
local vetor_niveis = {["ferreiro"]={},["cientista"]={},["cozinheiro"]={},["construtor"]={}}
-- Listas
local lista_receitas = {["ferreiro"]="",["cientista"]="",["cozinheiro"]="",["construtor"]=""}
-- Tabela de relacionamento IDItem-NomeItem
local tabela_IDNome = {}
-- Tabela de relacionamento de sequencia NomeItem-IDItem
local dropdown_NomeID = {["ferreiro"]={},["cientista"]={},["cozinheiro"]={},["construtor"]={}}
oficios.montar_receita = function(oficio, item, nivel, desc, xp, item_requisitado, tempo)
-- Inserindo novos dados nas tabelas
oficios.receitas[minetest.registered_items[item].description] = {
item=item,
nivel=nivel,
desc=desc,
xp=xp,
item_requisitado=item_requisitado,
tempo=tempo
}
table.insert(vetor_niveis[oficio], {nivel=nivel, nome=minetest.registered_items[item].description, item=item})
tabela_IDNome["(Nivel "..nivel..") "..minetest.registered_items[item].description]={
item_id=item,
item_nome_real=minetest.registered_items[item].description
}
-- Calcular maior indice da tabela
local lim = table.maxn(vetor_niveis[oficio])
-- Ordenar
vetor_niveis[oficio] = ordenar_por_nivel(vetor_niveis[oficio], lim)
-- Escrever lista
lista_receitas[oficio] = "(Nivel "..vetor_niveis[oficio][1].nivel..") "..vetor_niveis[oficio][1].nome
dropdown_NomeID[oficio]["(Nivel "..vetor_niveis[oficio][1].nivel..") "..vetor_niveis[oficio][1].nome]=1
local i = 2
while (i <= lim) do
dropdown_NomeID[oficio]["(Nivel "..vetor_niveis[oficio][i].nivel..") "..vetor_niveis[oficio][i].nome]=i
lista_receitas[oficio] = lista_receitas[oficio]..",(Nivel "..vetor_niveis[oficio][i].nivel..") "..vetor_niveis[oficio][i].nome
i = i + 1
end
end
-- Fim de Montar Receitas
--------
-----
--
--
-----
--------
-- Receptor de Botoes
local receita_visualizada = {}
local visualizando_desc = {}
minetest.register_on_player_receive_fields(function(player, formname, fields)
-- Menu de Escolha
if formname == "oficios:menu_de_escolha" then
local name = player:get_player_name()
if fields.escolher_ferreiro then
minetest.show_formspec(name, "oficios:desc_ferreiro", oficios.form.desc_ferreiro)
elseif fields.escolher_cientista then
minetest.show_formspec(name, "oficios:desc_cientista", oficios.form.desc_cientista)
elseif fields.escolher_cozinheiro then
minetest.show_formspec(name, "oficios:desc_cozinheiro", oficios.form.desc_cozinheiro)
elseif fields.escolher_construtor then
minetest.show_formspec(name, "oficios:desc_construtor", oficios.form.desc_construtor)
end
end
--
-- Menus de Descricao
--
if formname == "oficios:desc_ferreiro"
or formname == "oficios:desc_cientista"
or formname == "oficios:desc_cozinheiro"
or formname == "oficios:desc_construtor"
then
local name = player:get_player_name()
if fields.voltar then
minetest.show_formspec(name, "oficios:menu_de_escolha", oficios.form.inicial)
elseif fields.aceitar then
if formname == "oficios:desc_ferreiro" then
oficios.bd.definir_oficio(name, "ferreiro")
oficios.gerar_menu_oficio(name)
elseif formname == "oficios:desc_cientista" then
oficios.bd.definir_oficio(name, "cientista")
oficios.gerar_menu_oficio(name)
elseif formname == "oficios:desc_cozinheiro" then
oficios.bd.definir_oficio(name, "cozinheiro")
oficios.gerar_menu_oficio(name)
elseif formname == "oficios:desc_construtor" then
oficios.bd.definir_oficio(name, "construtor")
oficios.gerar_menu_oficio(name)
end
end
end
--
-- Painel do Oficio
--
if formname == "oficios:menu_ferreiro"
or formname == "oficios:menu_cientista"
or formname == "oficios:menu_cozinheiro"
or formname == "oficios:menu_construtor"
then
local name = player:get_player_name()
-- Atualizar painel
local n = 0 -- Verificar se o jogador apenas mudou o dropdown
for campo,item in pairs(fields) do
n = n + 1
end
if n == 1 and fields.item_selecionado then
receita_visualizada[name] = fields.item_selecionado
oficios.gerar_menu_oficio(name, fields.item_selecionado)
end
-- voltar
if fields.voltar then
oficios.gerar_menu_oficio(name)
end
-- voltar ao item
if fields.voltar_ao_item then
visualizando_desc[name] = false
oficios.gerar_menu_oficio(name, receita_visualizada[name])
end
-- Ver descricao
if fields.desc then
visualizando_desc[name] = true
oficios.gerar_menu_oficio(name, receita_visualizada[name])
end
-- Coletar
if fields.coletar then
if player:get_inventory():room_for_item("main", registros_oficios[name].coletar) then
player:get_inventory():add_item("main", registros_oficios[name].coletar)
oficios.bd.coletou_item(name)
oficios.gerar_menu_oficio(name)
else
return minetest.show_formspec(name, "oficios:aviso_montagem", oficios.form.aviso_inv_lotado)
end
end
-- Iniciar montagem
if fields.iniciar then
local dados = oficios.receitas[tabela_IDNome[receita_visualizada[name]].item_nome_real]
-- Verifica o nivel
if registros_oficios[name].nivel < dados.nivel then
return minetest.show_formspec(name, "oficios:aviso_montagem", oficios.form.aviso_nivel_insuficiente)
else
local player_inv = player:get_inventory()
-- Verificar se possui os itens
local possui_itens = true
for _, valor in ipairs(dados.item_requisitado) do
if player_inv:contains_item("main", valor[1].." "..valor[2]) == false then
possui_itens = false
end
end
if possui_itens == false then
return minetest.show_formspec(name, "oficios:aviso_montagem", oficios.form.aviso_falta_item)
end
-- Retirar itens
for _, valor in ipairs(dados.item_requisitado) do
player_inv:remove_item("listname", valor[1].." "..valor[2])
end
-- Calcular Data fim
local data_atual = os.date("%Y %m %d %H %M")
data_atual = string.split(data_atual, " ")
local data_fim = {tonumber(data_atual[1]), tonumber(data_atual[2]), (tonumber(data_atual[3])+dados.tempo[1]), (tonumber(data_atual[4])+dados.tempo[2]), (tonumber(data_atual[5])+dados.tempo[3])}
if data_fim[5] >= 60 then
data_fim[4] = data_fim[4] + 1
data_fim[5] = data_fim[5] - 60
end
if data_fim[4] >= 24 then
data_fim[3] = data_fim[3] + 1
data_fim[4] = data_fim[4] - 24
end
if data_fim[3] > 30 then
data_fim[2] = data_fim[2] + 1
data_fim[3] = data_fim[3] - 30
end
if data_fim[2] > 12 then
data_fim[1] = data_fim[1] + 1
data_fim[2] = data_fim[2] - 12
end
-- Iniciar tarefa no banco de dados
oficios.bd.iniciar_montagem(name, tabela_IDNome[receita_visualizada[name]].item_nome_real, data_fim)
return oficios.gerar_menu_oficio(name)
end
end
end
-- Retorno dos avisos de montagem
if formname == "oficios:aviso_montagem" then
local name = player:get_player_name()
if fields.voltar_ao_item then
return oficios.gerar_menu_oficio(name, receita_visualizada[name])
end
end
end)
-- Fim do Receptor de Botoes
--------
-----
--
--
-----
--------
-- Gerar Menu de Oficio
-- Calcular_termino (retorna true se terminou caso contrario retorna quantos minutos faltam)
local calcular_se_terminou = function(data_fim)
local data_atual = os.date("%Y %m %d %H %M")
data_atual = string.split(data_atual, " ")
local total_atual = (tonumber(data_atual[1])*518400) + (tonumber(data_atual[2])*43200) + (tonumber(data_atual[3])*1440) + (tonumber(data_atual[4])*60) + tonumber(data_atual[5])
local total_fim = (data_fim[1]*518400) + (data_fim[2]*43200) + (data_fim[3]*1440) + (data_fim[4]*60) + data_fim[5]
local resultado = total_fim - total_atual
if resultado > 0 then
return resultado
else
return true
end
end
oficios.gerar_menu_oficio = function(name, item_nome)
local oficio = registros_oficios[name].oficio
local formspec = ""
if item_nome == nil then
if registros_oficios[name].montagem.status == true then
local item_id = oficios.receitas[registros_oficios[name].montagem.item].item
-- Verificar se a data termino ja passou
local data_fim = registros_oficios[name].montagem.data_fim
local dias, horas, minutos = oficios.comparar_data(data_fim[1], data_fim[2], data_fim[3], data_fim[4], data_fim[5])
if dias < 0 or horas < 0 or minutos < 0 or dias+horas+minutos == 0 then
-- Dar xp/ concluir
oficios.bd.conluir_montagem(name, oficios.receitas[registros_oficios[name].montagem.item].xp)
-- Iniciar novo processo de geracao do menu
oficios.gerar_menu_oficio(name)
return
else
-- Pegando valores absolutos
dias, horas, minutos = math.abs(dias), math.abs(horas), math.abs(minutos)
-- Calcular tempo restante
local tempo = {dias,horas,minutos}
local tempo_escrito = ""
if tempo[1] > 0 then
if tempo[1] == 1 then
tempo[1] = tempo[1].." dia"
else
tempo[1] = tempo[1].." dias"
end
end
if tempo[2] > 0 then
if tempo[2] == 1 then
tempo[2] = tempo[2].." hora"
else
tempo[2] = tempo[2].." horas"
end
end
if tempo[3] > 0 then
if tempo[3] == 1 then
tempo[3] = tempo[3].." minuto"
else
tempo[3] = tempo[3].." minutos"
end
end
if dias > 0 and horas > 0 then
tempo_escrito = tempo[1].." e "..tempo[2]
else
if horas > 0 and minutos > 0 then
tempo_escrito = tempo[2].." e "..tempo[3]
else
if dias > 0 then
tempo_escrito = tempo[1]
else
if horas > 0 then
tempo_escrito = tempo[2]
else
tempo_escrito = tempo[3]
end
end
end
end
-- Gerar Painel de esperar
formspec = "size[8,8.5]"..
default.gui_bg..
default.gui_bg_img..
default.gui_slots..
"list[current_player;main;0,4.25;8,1;]"..
"list[current_player;main;0,5.5;8,3;8]"..
default.get_hotbar_bg(0,4.25)..
-- Cabecalho do Oficio
"image[0,0;2.5,2.5;oficios_"..oficio..".png]"..
"label[2.2,-0.1;"..string.upper(oficio).." Nivel "..registros_oficios[name].nivel.."]"..
-- Painel de espera
"label[4.3,0.6;Montando \n"..registros_oficios[name].montagem.item..
"\n\nTermina em \n"..tempo_escrito.."]"..
"item_image_button[2.2,0.6;2,2;"..item_id..";;]"..
-- Botao sair
"button_exit[6.9,3.3;1.2,1;;Sair]"
end
else
if registros_oficios[name].coletar == "" then
-- Gerar painel normal
local xp_prox_nivel = OFICIOS_NIVEIS[(registros_oficios[name].nivel+1)]
formspec = "size[8,8.5]"..
default.gui_bg..
default.gui_bg_img..
default.gui_slots..
"list[current_player;main;0,4.25;8,1;]"..
"list[current_player;main;0,5.5;8,3;8]"..
default.get_hotbar_bg(0,4.25)..
-- Cabecalho do Oficio
"image[0,0;2.5,2.5;oficios_"..oficio..".png]"..
"label[2.2,-0.1;"..string.upper(oficio).." Nivel "..registros_oficios[name].nivel.."]"..
-- Botao sair
"button_exit[6.9,3.3;1.2,1;;Sair]"..
-- Painel de Montagem
"dropdown[2.2,0.35;6.15,1;item_selecionado;"..lista_receitas[oficio]..";]"..
"label[2.2,1.1;Selecione algo para produzir]"
-- Calcular e inserir dados de desempenho
formspec = formspec .. "label[0.2,2.3;Seu Desempenho \nAtualmente "..registros_oficios[name].xp.." XP "
if registros_oficios[name].nivel < LIMITE_DE_NIVEL then
formspec = formspec .. "\nProximo Nivel "..xp_prox_nivel.." XP"
end
formspec = formspec .. "\nTotal de "..registros_oficios[name].total_itens.." itens montados]"
else
-- Gerar painel para coletar item
formspec = "size[8,8.5]"..
default.gui_bg..
default.gui_bg_img..
default.gui_slots..
"list[current_player;main;0,4.25;8,1;]"..
"list[current_player;main;0,5.5;8,3;8]"..
default.get_hotbar_bg(0,4.25)..
-- Cabecalho do Oficio
"image[0,0;2.5,2.5;oficios_"..oficio..".png]"..
"label[2.2,-0.1;"..string.upper(oficio).." Nivel "..registros_oficios[name].nivel.."]"..
-- Painel de conclusao
"label[2.3,0.4;"..minetest.registered_items[registros_oficios[name].coletar].description.."]"..
"label[5.2,1;Montado]"..
"item_image_button[2.2,1;3,3;"..registros_oficios[name].coletar..";coletar;Coletar]"..
-- Botao sair
"button_exit[6.9,3.3;1.2,1;;Sair]"
end
end
else
if visualizando_desc[name] == true then
-- Gerar painel descritivo de um item
local item_nome_real = tabela_IDNome[receita_visualizada[name]].item_nome_real
local dados = oficios.receitas[item_nome_real]
formspec = formspec .. "size[8,8.8]"..
default.gui_bg..
default.gui_bg_img..
default.gui_slots..
"list[current_player;main;0,4.75;8,1;]"..
"list[current_player;main;0,6;8,3;8]"..
default.get_hotbar_bg(0,4.75)..
-- Cabecalho do Oficio
"image[0,0;2.5,2.5;oficios_"..oficio..".png]"..
"label[2.2,-0.1;"..string.upper(oficio).." Nivel "..registros_oficios[name].nivel.."]"..
-- Dados sobre a Montagem
"label[2.2,1.1;"..item_nome_real.."]"..
"item_image_button[0.1,2.5;2,2;"..dados.item..";item;]"..
-- descricao
"label[2.2,1.7;"..dados.desc.."]"..
-- Botao voltar
"button[6.9,3.3;1.2,1;voltar_ao_item;Voltar]"..
-- Painel de Montagem
"dropdown[2.2,0.35;6.15,1;item_selecionado;"..lista_receitas[oficio]..";"..dropdown_NomeID[oficio][receita_visualizada[name]].."]"
else
-- Gerar um Painel de montagem de um item
local item_id = tabela_IDNome[item_nome].item_id
local item_nome_real = tabela_IDNome[item_nome].item_nome_real
local item_requisitado = oficios.receitas[item_nome_real].item_requisitado
-- Colocando itens requisitados
formspec = formspec .. "size[8,8.8]"..
default.gui_bg..
default.gui_bg_img..
default.gui_slots..
"list[current_player;main;0,4.75;8,1;]"..
"list[current_player;main;0,6;8,3;8]"..
default.get_hotbar_bg(0,4.75)..
"label[2.2,3.1;Itens requisitados]"
if item_requisitado[1] ~= nil then
formspec = formspec .. "item_image_button[2.2,3.5;1,1;"..item_requisitado[1][1].." "..item_requisitado[1][2]..";item_req1;]"
end
if item_requisitado[2] ~= nil then
formspec = formspec .. "item_image_button[3.1,3.5;1,1;"..item_requisitado[2][1].." "..item_requisitado[2][2]..";item_req2;]"
end
if item_requisitado[3] ~= nil then
formspec = formspec .. "item_image_button[4.0,3.5;1,1;"..item_requisitado[3][1].." "..item_requisitado[3][2]..";item_req3;]"
end
if item_requisitado[4] ~= nil then
formspec = formspec .. "item_image_button[4.9,3.5;1,1;"..item_requisitado[4][1].." "..item_requisitado[4][2]..";item_req4;]"
end
if item_requisitado[5] ~= nil then
formspec = formspec .. "item_image_button[5.8,3.5;1,1;"..item_requisitado[5][1].." "..item_requisitado[5][2]..";item_req5;]"
end
if item_requisitado[6] ~= nil then
formspec = formspec .. "item_image_button[6.7,3.5;1,1;"..item_requisitado[6][1].." "..item_requisitado[6][2]..";item_req6;]"
end
-- Colocando Tempo de montagem
local tempo = oficios.receitas[item_nome_real].tempo
formspec = formspec .. "label[2.2,1.6;Tempo estimado \n"
if tempo[1] > 0 then
if tempo[1] == 1 then
formspec = formspec .. tempo[1].." dia"
else
formspec = formspec .. tempo[1].." dias"
end
if tempo[2] > 0 then
if tempo[2] == 1 then
formspec = formspec .. " e "..tempo[2].." hora"
else
formspec = formspec .. " e "..tempo[2].." horas"
end
end
elseif tempo[2] > 0 then
if tempo[2] == 1 then
formspec = formspec .. tempo[2].." hora"
else
formspec = formspec .. tempo[2].." horas"
end
if tempo[3] > 0 then
if tempo[3] == 1 then
formspec = formspec .. " e "..tempo[3].." minuto"
else
formspec = formspec .. " e "..tempo[3].." minutos"
end
end
else
if tempo[3] == 1 then
formspec = formspec .. tempo[3].." minuto"
else
formspec = formspec .. tempo[3].." minutos"
end
end
formspec = formspec .. "]"
formspec = formspec ..
-- Cabecalho do Oficio
"image[0,0;2.5,2.5;oficios_"..oficio..".png]"..
"label[2.2,-0.1;"..string.upper(oficio).." Nivel "..registros_oficios[name].nivel.."]"..
-- Painel de Montagem
"dropdown[2.2,0.35;6.15,1;item_selecionado;"..lista_receitas[oficio]..";"..dropdown_NomeID[oficio][item_nome].."]"..
-- Dados sobre a Montagem
"label[2.2,1.1;Montar "..item_nome_real.."]"..
"item_image_button[0.1,2.5;2,2;"..item_id..";iniciar;Iniciar]"..
"label[2.2,2.5;Recebe "..core.colorize("#00FF00", oficios.receitas[item_nome_real].xp.." XP").."]"..
"image_button[7,1.3;1,1;oficios_botao_desc.png;desc;]"..
-- Botao voltar
"button[6.9,2.3;1.2,1;voltar;Voltar]"
end
end
minetest.show_formspec(name, "oficios:menu_"..oficio, formspec)
end
-- Fim de Gerar Menu de Oficio
--------
-----
--
-- Abrir o menu de oficios
local acesso_ok = false -- variavel que informa se todos os oficios possuem receitas (para evitar bugs)
oficios.abrir_menu = function(name)
if acesso_ok == false then
-- Verifica se ja todos oficios possuem receita
if table.maxn(vetor_niveis.ferreiro) > 0
and table.maxn(vetor_niveis.cozinheiro) > 0
and table.maxn(vetor_niveis.cientista) > 0
and table.maxn(vetor_niveis.construtor) > 0
then
acesso_ok = true
else
-- Bloqueia o acesso
return minetest.show_formspec(name, "oficios:aviso_sem_receita", oficios.form.aviso_sem_receita)
end
end
if registros_oficios[name].oficio == "ferreiro"
or registros_oficios[name].oficio == "cientista"
or registros_oficios[name].oficio == "cozinheiro"
or registros_oficios[name].oficio == "construtor"
then
oficios.gerar_menu_oficio(name)
else
minetest.show_formspec(name, "oficios:menu_de_escolha", oficios.form.inicial)
end
end

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

36
init.lua Normal file
View File

@ -0,0 +1,36 @@
--[[
Mod Oficios 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/>.
Inicialização de scripts
]]
local path = minetest.get_modpath("oficios")
oficios = {}
oficios.receitas = {}
minetest.log('verbose',"[OFICIOS] iniciando carreamento...")
dofile(path.."/diretrizes.lua")
minetest.log('verbose',"[OFICIOS] diretrizes carregadas...")
dofile(path.."/formularios.lua")
minetest.log('verbose',"[OFICIOS] formularios carregados...")
dofile(path.."/banco_de_dados.lua")
minetest.log('verbose',"[OFICIOS] Banco de Dados carregado...")
dofile(path.."/contador_tempo.lua")
minetest.log('verbose',"[OFICIOS] Contador de tempo carregado...")
dofile(path.."/funcoes.lua")
minetest.log('verbose',"[OFICIOS] funcoes carregadas...")
minetest.log('action',"[OFICIOS] carregado.")

BIN
textures/oficios_botao.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 402 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB