diff --git a/API.txt b/API.txt index 2bafca7..11ba505 100644 --- a/API.txt +++ b/API.txt @@ -14,6 +14,16 @@ API para mod Xpro v1.0.0 * Retorna o numero de pontos de xp do jogador * `xpro.get_player_lvl(name)` * Retorna o numero do nivel do jogador +* `xpro.registrar_premio(name, Definições do Prêmio)` + * Registra um premio para ser trocado por cash xp + * `name` é o nome de exibição do item na lista de prêmios + * Definições de Prêmio + { + item=, -- Item string do item a ser dado ao jogador + qtd=, -- Quantidade de itens a ser dado ao jogador + custo=, -- Custo da troca em cash xp que o jogador vai ter que pagar + } + diff --git a/api.lua b/api.lua index f6fd4f6..cb03634 100644 --- a/api.lua +++ b/api.lua @@ -100,7 +100,7 @@ end -- Adicionar XP xpro.add_xp = function(name, xp_add) - + minetest.chat_send_all(name.." recebeu "..xp_add.."XP") -- Nome da tabela referente ao jogador no banco de dados local tb_name = "jogador_"..name @@ -135,7 +135,7 @@ end -- Remover XP xpro.rem_xp = function(name, xp_rem) - + minetest.chat_send_all(name.." perdeu "..xp_rem.."XP") -- Nome da tabela referente ao jogador no banco de dados local tb_name = "jogador_"..name diff --git a/depends.txt b/depends.txt index 069f340..1b6f5fc 100644 --- a/depends.txt +++ b/depends.txt @@ -1,3 +1,4 @@ default intllib? sfinv? +hudbars? diff --git a/hud.lua b/hud.lua new file mode 100644 index 0000000..d7f2289 --- /dev/null +++ b/hud.lua @@ -0,0 +1,244 @@ +--[[ + Mod Xpro 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 . + + Hud de XP e nivel + ]] + +local S = xpro.S + +-- Mod Hudbars +if hb then + + local get_progress = function(my_xp, my_lvl) + local xp = xpro.niveis[my_lvl] - my_xp + local xp_t = xpro.niveis[my_lvl] - xpro.niveis[my_lvl+1] + local p = xp/xp_t + local r = math.ceil(p*100) + if r == 100 and (p*100) < 100 then r = 99 end + return r + end + + -- Atualizar barra + local update_hb = function(name) + + local player = minetest.get_player_by_name(name) + + local my_xp = xpro.get_player_xp(name) + local my_lvl = xpro.get_player_lvl(name) + + hb.change_hudbar( + -- player + player, + -- identifier + "xpro:xp", + -- new_value + get_progress(my_xp, my_lvl) + -- new_max_value + --nil, + -- new_icon + --"xpro_xp_icon.png", + -- new_bgicon + --"xpro_xp_bar_bgicon.png", + -- new_bar + --"xpro_xp_bar_icon.png", + -- new_label + --"Nivel "..my_lvl, + -- new_text_color + --"0xFFFFFF" + ) + end + + -- Inicializa HUD + minetest.register_on_joinplayer(function(player) + + local name = player:get_player_name() + local my_xp = xpro.get_player_xp(name) + local my_lvl = xpro.get_player_lvl(name) + + hb.init_hudbar( + -- player + player, + -- identifier + "xpro:xp", + -- start_value + get_progress(my_xp, my_lvl), + -- start_max + nil, + -- start_hidden + false + ) + + end) + + -- Registrar barra + hb.register_hudbar( + -- identifier + "xpro:xp", + -- text_color + "0xFFFFFF", + -- label + "XP", + -- textures + { + bar = "xpro_hudbars_bar_xp.png", + icon = "xpro_hudbars_icon_xp.png", + bgicon = "xpro_hudbars_bgicon_xp.png", + }, + -- default_start_value + 0, + -- default_start_max + 100, + -- default_start_hidden + false, + -- format_string + "%s: %d%%" + ) + + -- Alterar barra ao adicionar XP + xpro.register_on_add_xp(function(name) + update_hb(name) + end) + -- Alterar barra ao remover XP + xpro.register_on_rem_xp(function(name) + update_hb(name) + end) + +end + +-- Exibir pontos recebidos no hub +-- Remover elemento do hud +local remover_hud = function(player, id) + if player == nil then return end + player:hud_remove(id) +end +-- Adicionar elemento no hud +local adicionar_hud = function(player, def, time) + if player == nil then return end + local id = player:hud_add(def) + -- Remover apos `time` segundos + minetest.after(time, remover_hud, player, id) +end + +-- Alterar barra ao adicionar XP +xpro.register_on_add_xp(function(name, xp_added, lvl_changed) + -- Elemento + local def = { + hud_elem_type = "text", + position = {x=(math.random(1, 100)/100)*0.5+0.23,y=(math.random(1, 100)/100)*0.15+0.58}, + scale = {x=500,y=500}, + text = "+"..xp_added.."XP", + number = 0x00FF00, + alignment = {x=1,y=1}, + offset = {x=0, y=0}, + } + adicionar_hud(minetest.get_player_by_name(name), def, 3) + + -- Ao evoluir de nivel e liga + if lvl_changed == true then + local new_lvl = xpro.get_player_lvl(name) + local liga = xpro.ligas[new_lvl] + local def_bg_liga = { + hud_elem_type = "image", + position = {x=0.5,y=0.15}, + scale = {x=0.3,y=0.3}, + text = "(xpro_bg_alfa.png^[resize:500x500)^xpro_liga_bg.png", + alignment = {x=0,y=0}, + offset = {x=0, y=0}, + } + adicionar_hud(minetest.get_player_by_name(name), def_bg_liga, 8) + local def_liga = { + hud_elem_type = "image", + position = {x=0.5,y=0.15}, + scale = {x=0.27,y=0.27}, + text = "("..liga.img..")^xpro_bg_alfa.png^[resize:500x500", + alignment = {x=0,y=0}, + offset = {x=0, y=0}, + } + adicionar_hud(minetest.get_player_by_name(name), def_liga, 8) + local def_text_liga = { + hud_elem_type = "text", + position = {x=0.505,y=0.265}, + scale = {x=500,y=500}, + text = "Liga "..liga.name, + number = 0x00FF00, + alignment = {x=0,y=0}, + offset = {x=0, y=0}, + } + adicionar_hud(minetest.get_player_by_name(name), def_text_liga, 8) + local def_text_lvl = { + hud_elem_type = "text", + position = {x=0.505,y=0.29}, + scale = {x=500,y=500}, + text = "Nivel "..new_lvl, + number = 0x00FF00, + alignment = {x=0,y=0}, + offset = {x=0, y=0}, + } + adicionar_hud(minetest.get_player_by_name(name), def_text_lvl, 8) + end +end) +-- Alterar barra ao remover XP +xpro.register_on_rem_xp(function(name, xp_removed, lvl_changed) + -- Elemento + local def = { + hud_elem_type = "text", + position = {x=(math.random(1, 100)/100)*0.5+0.23,y=(math.random(1, 100)/100)*0.15+0.58}, + scale = {x=500,y=500}, + text = "-"..xp_removed.."XP", + number = 0xFF0000, + alignment = {x=1,y=1}, + offset = {x=0, y=0}, + } + adicionar_hud(minetest.get_player_by_name(name), def, 5) + + -- Ao evoluir de nivel e liga + if lvl_changed == true then + local new_lvl = xpro.get_player_lvl(name) + local liga = xpro.ligas[new_lvl] + local def_bg_liga = { + hud_elem_type = "image", + position = {x=0.5,y=0.15}, + scale = {x=0.3,y=0.3}, + text = "(xpro_bg_alfa.png^[resize:500x500)^xpro_liga_bg.png", + alignment = {x=0,y=0}, + offset = {x=0, y=0}, + } + adicionar_hud(minetest.get_player_by_name(name), def_bg_liga, 8) + local def_liga = { + hud_elem_type = "image", + position = {x=0.5,y=0.15}, + scale = {x=0.27,y=0.27}, + text = "("..liga.img..")^xpro_bg_alfa.png^[resize:500x500", + alignment = {x=0,y=0}, + offset = {x=0, y=0}, + } + adicionar_hud(minetest.get_player_by_name(name), def_liga, 8) + local def_text_liga = { + hud_elem_type = "text", + position = {x=0.505,y=0.265}, + scale = {x=500,y=500}, + text = "Liga "..liga.name, + number = 0xFF0000, + alignment = {x=0,y=0}, + offset = {x=0, y=0}, + } + adicionar_hud(minetest.get_player_by_name(name), def_text_liga, 8) + local def_text_lvl = { + hud_elem_type = "text", + position = {x=0.505,y=0.29}, + scale = {x=500,y=500}, + text = "Nivel "..new_lvl, + number = 0xFF0000, + alignment = {x=0,y=0}, + offset = {x=0, y=0}, + } + adicionar_hud(minetest.get_player_by_name(name), def_text_lvl, 8) + end + +end) + diff --git a/init.lua b/init.lua index 8574be1..163b1a1 100644 --- a/init.lua +++ b/init.lua @@ -27,7 +27,7 @@ notificar("Carregando scripts...") -- Criação do banco de dados xpro.bd = dofile(modpath.."/lib/memor.lua") --- Plucar itens "PLUS" +-- Lib tror xpro.tror = dofile(modpath.."/lib/tror.lua") -- Variaveis personalizaveis @@ -40,8 +40,11 @@ dofile(modpath.."/shop.lua") dofile(modpath.."/sfinv.lua") dofile(modpath.."/progresso.lua") dofile(modpath.."/ranking.lua") +dofile(modpath.."/hud.lua") -- Metodos para evoluir +dofile(modpath.."/metodos/die.lua") +dofile(modpath.."/metodos/craft.lua") dofile(modpath.."/metodos/dig_node.lua") dofile(modpath.."/metodos/place_node.lua") diff --git a/metodos/craft.lua b/metodos/craft.lua new file mode 100644 index 0000000..a3dfcfa --- /dev/null +++ b/metodos/craft.lua @@ -0,0 +1,40 @@ +--[[ + Mod Xpro 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 . + + Eventos de ganho ou perca de XP ao craftar um node + ]] + +-- Lista de itens que geram recompensa +xpro.craft_xp_list = { + --["default:torch"] = 1, +} + +-- Chamada global +minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv) + + -- Verifica se node gera XP + local name = itemstack:get_name() + if xpro.craft_xp_list[name] then + if xpro.craft_xp_list[name] > 0 then + xpro.add_xp(player:get_player_name(), xpro.craft_xp_list[name]) + else + xpro.rem_xp(player:get_player_name(), math.abs(xpro.craft_xp_list[name])) + end + end +end) + + + + + + + + + + + diff --git a/metodos/die.lua b/metodos/die.lua new file mode 100644 index 0000000..798a971 --- /dev/null +++ b/metodos/die.lua @@ -0,0 +1,29 @@ +--[[ + Mod Xpro 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 . + + Regredir pontos de XP ao morrer + ]] + +-- Chamada Global +minetest.register_on_dieplayer(function(player) + local name = player:get_player_name() + local lvl = xpro.get_player_lvl(name) + local xp_rem = 25*lvl + xpro.rem_xp(name, xp_rem) +end) + + + + + + + + + + + diff --git a/metodos/dig_node.lua b/metodos/dig_node.lua index cfb84a4..f0dbad6 100644 --- a/metodos/dig_node.lua +++ b/metodos/dig_node.lua @@ -6,14 +6,31 @@ Public License junto com esse software, se não, veja em . - Evoluir ao cavar um node + Eventos de ganho ou perca de XP ao cavar um node ]] +-- Lista de itens que geram recompensa +xpro.dig_node_xp_list = { + ["default:stone_with_coal"] = 1, + ["default:stone_with_tin"] = 1, + ["default:stone_with_copper"] = 2, + ["default:stone_with_iron"] = 3, + ["default:stone_with_gold"] = 5, + ["default:stone_with_mese"] = 5, + ["default:stone_with_diamond"] = 5, +} +-- Chamada global minetest.register_on_dignode(function(pos, oldnode, digger) - - xpro.add_xp(digger:get_player_name(), 200) - + + -- Verifica se node gera XP + if xpro.dig_node_xp_list[oldnode.name] then + if xpro.dig_node_xp_list[oldnode.name] > 0 then + xpro.add_xp(digger:get_player_name(), xpro.dig_node_xp_list[oldnode.name]) + else + xpro.rem_xp(digger:get_player_name(), math.abs(xpro.dig_node_xp_list[oldnode.name])) + end + end end) diff --git a/metodos/place_node.lua b/metodos/place_node.lua index 8109851..dc91f37 100644 --- a/metodos/place_node.lua +++ b/metodos/place_node.lua @@ -6,13 +6,26 @@ Public License junto com esse software, se não, veja em . - Evoluir ao colocar um node + Eventos de ganho ou perca de XP ao colocar um node ]] +-- Lista de itens que geram recompensa +xpro.place_node_xp_list = { + --["default:stone_with_coal"] = 1, + --["default:stone_with_mese"] = -5, +} + +-- Chamada global minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack, pointed_thing) - - xpro.rem_xp(placer:get_player_name(), 200) - + + -- Verifica se node gera XP + if xpro.place_node_xp_list[newnode.name] then + if xpro.place_node_xp_list[newnode.name] > 0 then + xpro.add_xp(placer:get_player_name(), xpro.place_node_xp_list[newnode.name]) + else + xpro.rem_xp(placer:get_player_name(), math.abs(xpro.place_node_xp_list[newnode.name])) + end + end end) diff --git a/sfinv.lua b/sfinv.lua index d575edb..395f535 100644 --- a/sfinv.lua +++ b/sfinv.lua @@ -24,6 +24,7 @@ sfinv.register_page("xpro:info", { local my_lvl = xpro.get_player_lvl(name) local xp_gasto = player:get_attribute("xpro_xp_gasto") local xp_disp = my_xp-xp_gasto + if xp_disp < 0 then xp_disp = 0 end -- Calcula progresso da barra local progresso = 1 @@ -40,7 +41,7 @@ sfinv.register_page("xpro:info", { .."button[0,2.5;3,1;ranking;Ranking Global]" -- Liga - .."image[2.8,0.4;"..(1.3*5)..","..(1.3*3)..";xpro_liga_bg.png]" + .."image[3.8,0.34;4,4;xpro_liga_bg.png]" .."label[3,0;Liga "..xpro.ligas[my_lvl].name.."]" .."image[4.17,0.7;3.2,3.2;"..xpro.ligas[my_lvl].img.."]" diff --git a/shop.lua b/shop.lua index 49a13a0..53f4de3 100644 --- a/shop.lua +++ b/shop.lua @@ -30,15 +30,13 @@ end) -- Itens a venda -xpro.premios = { - {name="Terra", item="default:dirt", qtd=20, custo=5000}, - {name="Pedregulho", item="default:cobble", qtd=25, custo=50}, -} +xpro.premios = {} -- Lista de itens do menu do shop em formato de string local string_menu_shop = "" local atualizar_string_menu_shop = function() + string_menu_shop = "" -- zera string for _,d in pairs(xpro.premios) do if string_menu_shop ~= "" then string_menu_shop = string_menu_shop .. "," end string_menu_shop = string_menu_shop .. d.name @@ -54,7 +52,7 @@ xpro.acessar_shop = function(name, aviso) local xp_gasto = player:get_attribute("xpro_xp_gasto") local my_xp = xpro.get_player_xp(name) local xp_disp = my_xp-xp_gasto - + if xp_disp < 0 then xp_disp = 0 end local formspec = "size[8,5]" ..default.gui_bg @@ -64,7 +62,7 @@ xpro.acessar_shop = function(name, aviso) .."textlist[3.2,0;4.5,5;menu;"..string_menu_shop.."]" if aviso then - formspec = formspec .. "textarea[0.36,1.1;3.2,1;;"..aviso..";]" + formspec = formspec .. "textarea[0.26,1;3.2,1.2;;"..aviso..";]" end -- Nenhum item escolhido @@ -91,7 +89,6 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) local name = player:get_player_name() local n = string.split(fields.menu, ":") acessos[name].escolha = tonumber(n[2]) or 1 - xpro.acessar_shop(name) -- Comprar @@ -102,6 +99,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) local my_xp = xpro.get_player_xp(name) local xp_gasto = player:get_attribute("xpro_xp_gasto") local xp_disp = my_xp-xp_gasto + if xp_disp < 0 then xp_disp = 0 end -- Tenta trocar if xp_disp < escolha.custo then @@ -111,7 +109,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) xpro.acessar_shop(name, "Inventario lotado") else player:set_attribute("xpro_xp_gasto", (xp_gasto+escolha.custo)) - xpro.acessar_shop(name, "Adiquirido") + xpro.acessar_shop(name, minetest.colorize("#0C0", "Adiquirido")) end end end @@ -119,3 +117,30 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end) +-- Registrar premios +xpro.registrar_premio = function(name, def) + table.insert(xpro.premios, + { + name=name, + item=def.item, + qtd=def.qtd, + custo=def.custo, + } + ) + -- Atualiza lista de exibição + atualizar_string_menu_shop() +end + + +-- Premios basicos +for _,dados in ipairs({ + {name="Pedras", item="default:dirt", qtd=50, custo=100}, + {name="Pedregulho", item="default:cobble", qtd=25, custo=50}, +}) do + xpro.registrar_premio(dados.name, { + item=dados.item, + qtd=dados.qtd, + custo=dados.custo, + }) +end + diff --git a/textures/xpro_bg_alfa.png b/textures/xpro_bg_alfa.png new file mode 100644 index 0000000..07f7b0e Binary files /dev/null and b/textures/xpro_bg_alfa.png differ diff --git a/textures/xpro_hudbars_bar_xp.png b/textures/xpro_hudbars_bar_xp.png new file mode 100644 index 0000000..d060583 Binary files /dev/null and b/textures/xpro_hudbars_bar_xp.png differ diff --git a/textures/xpro_hudbars_bgicon_xp.png b/textures/xpro_hudbars_bgicon_xp.png new file mode 100644 index 0000000..6719132 Binary files /dev/null and b/textures/xpro_hudbars_bgicon_xp.png differ diff --git a/textures/xpro_hudbars_icon_xp.png b/textures/xpro_hudbars_icon_xp.png new file mode 100644 index 0000000..d27967c Binary files /dev/null and b/textures/xpro_hudbars_icon_xp.png differ diff --git a/textures/xpro_liga_bg.png b/textures/xpro_liga_bg.png index da69521..1abda87 100644 Binary files a/textures/xpro_liga_bg.png and b/textures/xpro_liga_bg.png differ diff --git a/textures/xpro_xp_icon.png b/textures/xpro_xp_icon.png new file mode 100644 index 0000000..a1250cd Binary files /dev/null and b/textures/xpro_xp_icon.png differ