commit cd982d2c011a860b8faa9cb797c45e44d106edfc Author: rnd1 Date: Fri Aug 26 11:39:11 2016 +0200 init diff --git a/README b/README new file mode 100644 index 0000000..963825c --- /dev/null +++ b/README @@ -0,0 +1,23 @@ +OLD PLAYER +minetest 0.4.14 + +Keep only those players that really did something, like getting some materials (can adjust what in settings). +Removes all player data of players that dont really play and come to just check out the server. +Removed data includes player files and auth.txt info. + +Tested on: Win7, Minetest 0.4.14 + +(c) 2015-2016 rnd + +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 . \ No newline at end of file diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..26d70f8 --- /dev/null +++ b/init.lua @@ -0,0 +1,101 @@ +-- OLD PLAYER : keep only serious players data on server +--(c) 2015-2016 rnd + +local oldplayer = {} + +-- SETTINGS + +oldplayer.requirement = {"default:dirt 1", "default:iron_lump 9"}; +oldplayer.welcome = "*** IMPORTANT *** please have at least 1 dirt and 9 iron ore in your inventory when leaving to register as serious player. If not, your player data will be deleted."; + +-- END OF SETTINGS + + +oldplayer.players = {}; +local worldpath = minetest.get_worldpath(); + +minetest.register_on_joinplayer(function(player) + local name = player:get_player_name(); if name == nil then return end + + -- read player inventory data + local inv = player:get_inventory(); + local isoldplayer = inv:get_stack("oldplayer", 1):get_count(); + if isoldplayer > 0 then + oldplayer.players[name] = 1 + else + oldplayer.players[name] = 0 + minetest.chat_send_player(name, oldplayer.welcome); + end + +end) + +minetest.register_on_leaveplayer(function(player, timed_out) + local name = player:get_player_name(); if name == nil then return end + if oldplayer.players[name] == 1 then return end -- already old, do nothing + + local delete = false; -- should we delete player? + + -- read player inventory data + local inv = player:get_inventory(); + + -- does player have all the required items in inventory? + for _,item in pairs(oldplayer.requirement) do + if not inv:contains_item("main", item) then + delete = true + end + end + + if not delete then -- set up oldplayer inventory so we know player is old next time + inv:set_size("oldplayer", 1); + inv:set_stack("oldplayer", 1, ItemStack("oldplayer")); + else -- delete player profile + + local filename = worldpath .. "\\players\\" .. name; + + -- PROBLEM: deleting doesnt always work? seems minetest itself is saving stuff. + -- so we wait a little and then delete + minetest.after(10,function() + print("[oldplayer] removing player filename " .. filename) + local err,msg = os.remove(filename) + if err==nil then + print ("[oldplayer] error removing player data " .. filename .. " error message: " .. msg) + end + + -- TO DO: how to remove players from auth.txt easily without editing file manually like below + + print("[oldplayer] removing player ".. name .." data from auth.txt") + local f = io.open(worldpath.."\\auth.txt", "r"); + local s = f:read("*a"); + local p1,p2; + p1 = string.find(s,"\n"..name..":"); -- careful: we need to get full name not just part so include newline char too + if p1 then + p1=p1+1; -- skip previous newline + p2 = string.find(s,"\n",p1); + end + if p1 and p2 then + f:close(); + f = io.open(worldpath.."\\auth.txt", "w"); + f:write(string.sub(s,1,p1-1)..string.sub(s,p2+1)); -- write back everything but player data + f:close(); + return + end + + f:close(); + end); + + end + +end +) + +-- "FUN STUFF", might be useful + +-- STUPID DESIGN: writing path as "xxx\bin\..\worlds\xxx", have to waste time fixing that? + -- local filename = ""; + -- local p1,p2 = string.find(worldpath,"\\bin\\.."); + -- if false then --p1 then + -- print("changing path"); + -- filename = string.sub(worldpath,1,p1-1)..string.sub(worldpath,p2+1).. "\\players\\" .. name; + -- else filename = worldpath .. "\\players\\" .. name; + -- end + -- print("filename " .. filename ); \ No newline at end of file