added wtfpl license header
[minetest-xpmod:xp.git] / init.lua
1 -- Copyright 2012 Andrew Engelbrecht.
2 -- This file is licensed under the WTFPL.
3 --
4 -- (this mod is based on the sethome mod.)
5
6
7 -- Some variables you can change:
8
9 -- How often (in seconds) xplevels file saves
10 local save_delta = 10
11 -- Max level a player can become
12 -- set to 0 for no level cap
13 local max_level = 32
14 ----------------------------------
15
16
17 local xplevels_file = minetest.get_worldpath() .. "/xplevels"
18 local xplevels = {}
19
20 local function loadxp()
21     local input = io.open(xplevels_file, "r")
22     if input then
23         while true do
24             local level = input:read("*n")
25             if level == nil then
26                 break
27             end
28             local xp = input:read("*n")
29             local name = input:read("*l")
30             xplevels[name:sub(2)] = {xp = xp, level = level}
31         end
32         io.close(input)
33     else
34         xplevels = {}
35     end
36 end
37
38 loadxp()
39
40 local function get_time()
41     return os.time()
42 end
43
44 local function lastpoint(level)
45     return 2 ^ level
46 end
47
48 local function ismaxlvl(level)
49     return max_level ~= 0 and level >= max_level
50 end
51
52 local changed = false
53
54 local function gainxp(name, param)
55     local player = minetest.env:get_player_by_name(name)
56     if player == nil then
57         -- just a check to prevent server death
58         return false
59     end
60     if xplevels[name] == nil then
61         xplevels[name] = {xp = 0, level = 0}
62     end
63
64     if ismaxlvl(xplevels[name].level) then
65         -- minetest.chat_send_player(name, "You are too advanced to gain a level. You may not gain levels past "..max_level..".")
66     else
67         if xplevels[name].xp < lastpoint(xplevels[name].level) - 1 then
68             xplevels[name].xp = xplevels[name].xp + 1
69         else
70             xplevels[name].level = xplevels[name].level + 1
71             xplevels[name].xp = 0
72
73             if ismaxlvl(xplevels[name].level) then
74                 minetest.chat_send_player(name, "Welcome to level "..xplevels[name].level.."! (max)")
75             else
76                 minetest.chat_send_player(name, "Welcome to level "..xplevels[name].level.."!")
77             end
78         end
79     end
80
81     changed = true
82 end
83
84 -- minetest.register_privilege("xp", "Can gain xp and use /showxp command")
85
86 minetest.register_chatcommand("plusxp", {
87     -- privs = {xp=true},
88     privs = {},
89     description = "Set your experience points",
90     func = gainxp,
91 })
92
93 minetest.register_chatcommand("showxp", {
94     -- privs = {xp=true},
95     privs = {},
96     description = "show your experience points",
97     func = function(name, param)
98         local player = minetest.env:get_player_by_name(name)
99
100         if xplevels[name] == nil then
101             xplevels[name] = {xp = 0, level = 0}
102             changed = true
103         end
104
105         if ismaxlvl(xplevels[name].level) then
106             minetest.chat_send_player(name, "Your are level "..xplevels[name].level.." (max)")
107         else
108             minetest.chat_send_player(name, "Your are level "..xplevels[name].level.." with "..xplevels[name].xp.."/"..lastpoint(xplevels[name].level).." experience points.")
109
110         end
111     end,
112 })
113
114 minetest.register_on_punchnode(function(pos, node, player)
115     local name = player:get_player_name()
116     gainxp(name)
117     minetest.chat_send_player(name, "you gained an xp point punching a "..node.name..".")
118 end)
119
120 local delta = 0
121 minetest.register_globalstep(function(dtime)
122     delta = delta + dtime
123     -- save it every <save_delta> seconds
124     if delta > save_delta then
125         delta = delta - save_delta
126         if changed then
127             local output = io.open(xplevels_file, "w")
128             for i, v in pairs(xplevels) do
129                 output:write(v.level.." "..v.xp.." "..i.."\n")
130             end
131             io.close(output)
132             changed = false
133         end
134     end
135 end)