commit 80a18d267b9a6ef71a9cecef50ca0309e11b601a Author: PilzAdam Date: Mon Dec 30 02:22:34 2013 +0100 Initial commit diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..b34a0d7 --- /dev/null +++ b/init.lua @@ -0,0 +1,196 @@ +--[[ +Stats Mod +Copyright (C) 2013 PilzAdam + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +]] + +-- +-- API +-- + +stats = {} +local playerstats = {} + +--[[ +def = { + name = "digged_nodes", + description = function(value) + return " - Digged nodes: "..value) + end, +} +]] +stats.registered_stats = {} +function stats.register_stat(def) + table.insert(stats.registered_stats, def) +end + +function stats.set_stat(player, name, value) + local pname = player + if type(pname) ~= "string" then + pname = player:get_player_name() + end + if not playerstats[pname] then + playerstats[pname] = {} + end + playerstats[pname][name] = value +end + +function stats.increase_stat(player, name, value) + local pname = player + if type(pname) ~= "string" then + pname = player:get_player_name() + end + if not playerstats[pname] then + playerstats[pname] = {} + end + if not playerstats[pname][name] then + playerstats[pname][name] = 0 + end + playerstats[pname][name] = playerstats[pname][name] + value +end + +function stats.get_stat(player, name) + local pname = player + if type(pname) ~= "string" then + pname = player:get_player_name() + end + if not playerstats[pname] then + playerstats[pname] = {} + end + if not playerstats[pname][name] then + playerstats[pname][name] = 0 + end + return playerstats[pname][name] +end + +-- +-- End API +-- + +stats.register_stat({ + name = "digged_nodes", + description = function(value) + return " - Digged nodes: "..value + end, +}) + +stats.register_stat({ + name = "placed_nodes", + description = function(value) + return " - Placed nodes: "..value + end, +}) + +stats.register_stat({ + name = "died", + description = function(value) + return " - Died: "..value + end, +}) + +stats.register_stat({ + name = "played_time", + description = function(time) + time = math.floor(time) + local timestring = "" .. (time%60) .. "s" + time = math.floor(time/60) + if time > 0 then + timestring = (time%60) .. "m " .. timestring + end + time = math.floor(time/60) + if time > 0 then + timestring = (time%24) .. "h " .. timestring + end + time = math.floor(time/24) + if time > 0 then + timestring = time .. "d " .. timestring + end + return " - Time played: "..timestring + end, +}) + +local file = io.open(minetest:get_worldpath().."/stats.txt", "r") +if file then + local table = minetest.deserialize(file:read("*all")) + if type(table) == "table" then + playerstats = table + else + minetest.log("error", "Corrupted stats file") + end + file:close() +end + +local function save_stats() + local file = io.open(minetest:get_worldpath().."/stats.txt", "w") + if file then + file:write(minetest.serialize(playerstats)) + file:close() + else + minetest.log("error", "Can't save stats") + end +end + +local timer = 0 +local timer2 = 0 +minetest.register_globalstep(function(dtime) + timer = timer + dtime + timer2 = timer2 + dtime + -- NOTE: Set this to a higher value to remove some load from the server + if timer < 0 then + return + end + for _,player in ipairs(minetest.get_connected_players()) do + stats.increase_stat(player, "played_time", timer) + end + timer = 0 + if timer2 > 30 then + save_stats() + end +end) + +minetest.register_on_shutdown(function() + save_stats() +end) + +minetest.register_on_dignode(function(pos, oldnode, player) + stats.increase_stat(player, "digged_nodes", 1) +end) + +minetest.register_on_placenode(function(pos, newnode, player, oldnode, itemstack) + stats.increase_stat(player, "placed_nodes", 1) +end) + +minetest.register_on_dieplayer(function(player) + stats.increase_stat(player, "died", 1) +end) + +minetest.register_chatcommand("stats", { + params = "", + description = "Prints the stats of the player", + privs = {}, + func = function(name, param) + local playername = name + local player = minetest.get_player_by_name(param) + if player then + playername = player:get_player_name() + end + + minetest.chat_send_player(name, "Stats for "..playername..":") + for _,def in ipairs(stats.registered_stats) do + local value = stats.get_stat(playername, def.name) + minetest.chat_send_player(name, def.description(value)) + end + end, +})