104 lines
2.7 KiB
Lua
104 lines
2.7 KiB
Lua
xp = {}
|
|
|
|
xp.values = {}
|
|
|
|
dofile(minetest.get_modpath("xp").."/values.lua")
|
|
|
|
xp.level = {}
|
|
xp.xp = {}
|
|
xp.huds = {}
|
|
local mod_storage = minetest.get_mod_storage()
|
|
local blue = minetest.get_color_escape_sequence("#0000ff")
|
|
|
|
function xp.levelfunc(level)
|
|
return (math.floor(1.15^level)+100)
|
|
end
|
|
|
|
function xp.add_xp(player,XP)
|
|
local name = player:get_player_name()
|
|
XP = xp.xp[name]+XP
|
|
local level = xp.level[name]
|
|
local temp = level
|
|
if (xp.levelfunc(level)-XP)<1 then
|
|
XP = XP-(xp.levelfunc(level))
|
|
level = level+1
|
|
xp.level[name] = level
|
|
mod_storage:set_int(name.."_level",level)
|
|
player:set_nametag_attributes({text = name.." "..blue..level})
|
|
end
|
|
if temp~=level and math.mod(level,5)==0 then
|
|
minetest.chat_send_all(name.." reached level " ..level.."!")
|
|
end
|
|
xp.xp[name] = XP
|
|
mod_storage:set_int(name.."_xp",XP)
|
|
xp.update_hud(player,level,XP)
|
|
end
|
|
|
|
function xp.update_hud(player,level,XP)
|
|
local name = player:get_player_name()
|
|
if xp.huds[name] then
|
|
player:hud_change(xp.huds[name],"text","Level: "..level.."\nXP: "..XP.."\nXP needed: "..(xp.levelfunc(level)-XP))
|
|
else
|
|
xp.huds[name] = player:hud_add({
|
|
hud_elem_type = "text",
|
|
position = {x = 0, y = 0.5},
|
|
offset = {x = 10, y = 0},
|
|
scale = {x = 100, y = 100},
|
|
text = "Level: "..level.."\nXP: "..XP.."\nXP needed: "..xp.levelfunc(level),
|
|
number = 0xFFFFFF,
|
|
alignment = {x = 1, y = 0.5},
|
|
direction = 2,
|
|
})
|
|
end
|
|
end
|
|
|
|
minetest.register_on_joinplayer(function(player)
|
|
local name = player:get_player_name()
|
|
local level = mod_storage:get_int(name.."_level")
|
|
local XP = mod_storage:get_int(name.."_xp")
|
|
if level == 0 then
|
|
level = 1
|
|
mod_storage:set_int(name.."_level",level)
|
|
end
|
|
if XP == 0 then
|
|
XP = 0
|
|
mod_storage:set_int(name.."_xp",XP)
|
|
end
|
|
xp.level[name] = level
|
|
xp.xp[name] = XP
|
|
player:set_nametag_attributes({text = name..blue.." "..level})
|
|
xp.update_hud(player,level,XP)
|
|
end)
|
|
|
|
minetest.register_on_leaveplayer(function(player)
|
|
local name = player:get_player_name()
|
|
xp.huds[name] = nil
|
|
xp.level[name] = nil
|
|
xp.xp[name] = nil
|
|
end)
|
|
|
|
|
|
minetest.register_on_dignode(function(pos, oldnode, digger)
|
|
local XP = xp.values[oldnode.name]
|
|
if digger then
|
|
if digger.is_fake_player then return end
|
|
local name = digger:get_player_name()
|
|
if XP and name and xp.level[name] then
|
|
XP = XP*(math.ceil(xp.level[name]/30))
|
|
xp.add_xp(digger,XP)
|
|
end
|
|
end
|
|
|
|
end)
|
|
|
|
minetest.register_chatcommand("getxp",{
|
|
privs = {server = true},
|
|
params = "<name>",
|
|
description = "returns the xp level of a player",
|
|
func = function(name, param)
|
|
local level = mod_storage:get_int(param.."_level")
|
|
local XP = mod_storage:get_int(param.."_xp")
|
|
minetest.chat_send_player(name,"Level: "..level.."\nXP: "..XP.."\nXP needed: "..(math.floor(1.15^level)+100-XP))
|
|
end,
|
|
})
|