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 local function filter_rpc(func)
57 for _, player in ipairs(minetest.get_connected_players()) do
58 local name = player:get_player_name()
65 function playerlist.iterator()
67 filter_rpc(function(player, name)
68 local _, rank_def = ranks.get(name)
69 table.insert(players, {
71 color = tonumber(rank_def.color, 16),
72 value = rank_def.value,
75 table.sort(players, function(a, b)
76 return a.value > b.value
81 local player = players[i]
83 return i, player.ref, player.color
88 function playerlist.count()
96 minetest.register_on_joinplayer(ranks.reload)
98 function minetest.send_join_message(name)
100 minetest.chat_send_all("*** " .. ranks.get_player_name(name) .. " joined " .. server .. ".")
104 function minetest.send_leave_message(name, timed_out)
105 if name ~= "rpc" then
106 minetest.chat_send_all("*** " .. ranks.get_player_name(name) .. " left " .. server .. (timed_out and " (timed out)" or "") .. ".")
110 minetest.register_on_chat_message(function(name, message)
111 if not minetest.check_player_privs(name, {shout = true}) then
114 minetest.chat_send_all(ranks.get_player_name(name, {"<", ">"}) .. " " .. message)
118 minetest.register_chatcommand("rank", {
119 params = "<player> <rank>",
120 description = "Set a player's rank",
121 privs = {privs = true},
122 func = function(name, param)
123 local target = param:split(" ")[1] or ""
124 local rank = param:split(" ")[2] or ""
125 return ranks.set(target, rank)
129 local function get_privs_setting(setting, tbl)
130 local privs = minetest.string_to_privs(minetest.settings:get(setting))
132 for k, v in pairs(tbl) do
139 minetest.register_on_mods_loaded(function()
140 local all_privs = minetest.registered_privileges
141 local default_privs = get_privs_setting("default_privs")
142 local moderator_privs = get_privs_setting("moderator_privs", default_privs)
143 local vip_privs = get_privs_setting("vip_privs", default_privs)
144 local mvp_privs = get_privs_setting("mvp_privs", vip_privs)
151 description = "The Developer rank is for the admins who maintain the server software.",
158 description = "The Admin rank is for people with ssh access to the server, they have all privileges. They are members of the Elidragon group.",
165 description = "People who moderate the server.",
166 privs = moderator_privs,
170 tag = "[Contributor]",
172 description = "The Contributor rank is for people that contribute to the server software. It has the same privs as the MVP rank.",
179 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.",
186 description = "The MVP rank can be purchased in out store (upcoming). It is purely cosmetic.",
193 description = "The VIP rank can be purchased in out store (upcoming). It is purely cosmetic.",
200 description = "This is the rank for normal players.",
201 privs = default_privs,
207 description = "This is an offline rank for the console.",
213 description = "This is the default offline rank.",
219 description = "This is the rank for the rpc player, which is a bot.",
226 elidragon.ranks = ranks