1 local playerdb = elidragon.playerdb
5 local players = playerdb.players
6 local admin = minetest.settings:get("name")
7 local server = minetest.settings:get("server_name")
8 playerdb.initial_data.rank = "player"
10 function ranks.get(name)
15 local playerdata = players[name]
17 rank = playerdata.rank
19 rank = name == admin and "console" or "offline"
22 return rank, ranks.defs[rank]
25 function ranks.get_player_name(name, brackets)
26 local _, rank_def = ranks.get(name)
27 brackets = brackets or {"", ""}
28 return minetest.colorize("#" .. rank_def.color, rank_def.tag) .. brackets[1] .. name .. brackets[2]
31 function ranks.reload(player)
32 local name = player:get_player_name()
33 local rank, rank_def = ranks.get(name)
34 player:set_nametag_attributes({text = rank == "system" and "" or ranks.get_player_name(name)})
35 minetest.set_player_privs(name, assert(rank_def.privs))
38 function ranks.set(name, rank)
40 return false, "The rank of the rpc player cannot be changed."
42 local rank_def = ranks.defs[rank]
43 if not rank_def or rank_def.can_assign == false then
44 return false, "Invalid rank."
46 local player = minetest.get_player_by_name(name)
48 return false, name .. " is not online."
50 local playerdata = players[name]
51 playerdata.rank = rank
56 function ranks.iterate_players(list)
58 for _, player in ipairs(list or minetest.get_connected_players()) do
59 local name = player:get_player_name()
61 local rank, rank_def = ranks.get(name)
62 table.insert(players, {
67 value = rank_def.value
71 table.sort(players, function(a, b)
72 return a.value > b.value
77 local player = players[i]
79 return i, player.name, player.ref, player.rank, player.rank_def
84 minetest.register_on_joinplayer(ranks.reload)
86 function minetest.send_join_message(name)
88 minetest.chat_send_all("*** " .. ranks.get_player_name(name) .. " joined " .. server .. ".")
92 function minetest.send_leave_message(name, timed_out)
94 minetest.chat_send_all("*** " .. ranks.get_player_name(name) .. " left " .. server .. (timed_out and " (timed out)" or "") .. ".")
98 minetest.register_on_chat_message(function(name, message)
99 if not minetest.check_player_privs(name, {shout = true}) then
102 minetest.chat_send_all(ranks.get_player_name(name, {"<", ">"}) .. " " .. message)
106 minetest.register_chatcommand("rank", {
107 params = "<player> <rank>",
108 description = "Set a player's rank",
109 privs = {privs = true},
110 func = function(name, param)
111 local target = param:split(" ")[1] or ""
112 local rank = param:split(" ")[2] or ""
113 return ranks.set(target, rank)
117 local function get_privs_setting(setting, tbl)
118 local privs = minetest.string_to_privs(minetest.settings:get(setting))
120 for k, v in pairs(tbl) do
127 minetest.register_on_mods_loaded(function()
128 local all_privs = minetest.registered_privileges
129 local default_privs = get_privs_setting("default_privs")
130 local moderator_privs = get_privs_setting("moderator_privs", default_privs)
131 local vip_privs = get_privs_setting("vip_privs", default_privs)
132 local mvp_privs = get_privs_setting("mvp_privs", vip_privs)
139 description = "The Developer rank is for the admins who maintain the server software.",
146 description = "The Admin rank is for people with ssh access to the server, they have all privileges. They are members of the Elidragon group.",
153 description = "People who moderate the server.",
154 privs = moderator_privs,
158 tag = "[Contributor]",
160 description = "The Contributor rank is for people that contribute to the server software. It has the same privs as the MVP rank.",
167 description = "The Builder rank is for people that have helped constructing the buildings in the lobby etc. It has the same privs as the MVP rank.",
174 description = "The MVP rank can be purchased in out store (upcoming). It is purely cosmetic.",
181 description = "The VIP rank can be purchased in out store (upcoming). It is purely cosmetic.",
188 description = "This is the rank for normal players.",
189 privs = default_privs,
195 description = "This is an offline rank for the console.",
201 description = "This is the default offline rank.",
207 description = "This is the rank for the rpc player, which is a bot.",
214 elidragon.ranks = ranks