remove some unneeded function calls
[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     if xplevels[name] == nil then
56         xplevels[name] = {xp = 0, level = 0}
57     end
58
59     if ismaxlvl(xplevels[name].level) then
60         -- minetest.chat_send_player(name, "You are too advanced to gain a level. You may not gain levels past "..max_level..".")
61     else
62         if xplevels[name].xp < lastpoint(xplevels[name].level) - 1 then
63             xplevels[name].xp = xplevels[name].xp + 1
64         else
65             xplevels[name].level = xplevels[name].level + 1
66             xplevels[name].xp = 0
67
68             if ismaxlvl(xplevels[name].level) then
69                 minetest.chat_send_player(name, "Welcome to level "..xplevels[name].level.."! (max)")
70             else
71                 minetest.chat_send_player(name, "Welcome to level "..xplevels[name].level.."!")
72             end
73         end
74     end
75
76     changed = true
77 end
78
79 -- minetest.register_privilege("xp", "Can gain xp and use /showxp command")
80
81 minetest.register_chatcommand("plusxp", {
82     -- privs = {xp=true},
83     privs = {},
84     description = "Set your experience points",
85     func = gainxp,
86 })
87
88 minetest.register_chatcommand("showxp", {
89     -- privs = {xp=true},
90     privs = {},
91     description = "show your experience points",
92     func = function(name, param)
93
94         if xplevels[name] == nil then
95             xplevels[name] = {xp = 0, level = 0}
96             changed = true
97         end
98
99         if ismaxlvl(xplevels[name].level) then
100             minetest.chat_send_player(name, "Your are level "..xplevels[name].level.." (max)")
101         else
102             minetest.chat_send_player(name, "Your are level "..xplevels[name].level.." with "..xplevels[name].xp.."/"..lastpoint(xplevels[name].level).." experience points.")
103
104         end
105     end,
106 })
107
108 minetest.register_on_dignode(function(pos, node, player)
109     local name = player:get_player_name()
110     gainxp(name)
111     minetest.chat_send_player(name, "you gained an xp point digging a "..node.name..".")
112 end)
113
114 local delta = 0
115 minetest.register_globalstep(function(dtime)
116     delta = delta + dtime
117     -- save it every <save_delta> seconds
118     if delta > save_delta then
119         delta = delta - save_delta
120         if changed then
121             local output = io.open(xplevels_file, "w")
122             for i, v in pairs(xplevels) do
123                 output:write(v.level.." "..v.xp.." "..i.."\n")
124             end
125             io.close(output)
126             changed = false
127         end
128     end
129 end)