]> git.lizzy.rs Git - coronaserver.git/blob - ranks.lua
Added some features
[coronaserver.git] / ranks.lua
1 local function ReverseTable(t)
2     local reversedTable = {}
3     local itemCount = #t
4     for k, v in ipairs(t) do
5         reversedTable[itemCount + 1 - k] = v
6     end
7     return reversedTable
8 end
9 coronaserver.ranks = {
10         {
11                 name = "owner",
12                 color = "#FF2D8D",
13                 tag = "[OWNER]",
14                 privs = {},
15         },
16         {
17                 name = "admin",
18                 color = "#FF362D",
19                 tag = "[ADMIN]",
20                 privs = {},
21         },
22         {
23                 name = "hacker",
24                 color = "#000000",
25                 tag = "[HACKER]",
26                 privs = {},
27         },
28         {
29                 name = "developer",
30                 color = "#EBEE00",
31                 tag = "[DEVELOPER]",
32                 privs = {privs = true},
33         },
34         },
35         {
36                 name = "moderator",
37                 color = "#001FFF",
38                 tag = "[MODERATOR]",
39                 privs = {server = true, ban = true, worldedit = true, vanish = true, ["rename"] = true},
40         },
41         {
42                 name = "supporter",
43                 color = "#EE6E00",
44                 tag = "[SUPPORTER]",
45                 privs = {kick = true},
46         },
47         {
48         name = "teacher",
49         color = "#16AE00",
50         tag = "[TEACHER]",
51         privs = {fly = true, teacher = true, creative = true, areas = true, student = false}
52     },
53         {
54         name = "student",
55         color = "#BBBBBB",
56         tag = "[STUDENT]",
57         privs = {student = true},
58     }
59 }
60 coronaserver.savedata.ranks = coronaserver.savedata.ranks or {}
61 function coronaserver.get_rank(name)
62     return coronaserver.get_rank_by_name(coronaserver.savedata.ranks[name] or "student")
63 end
64 function coronaserver.get_rank_by_name(rankname)
65         for _, rank in pairs(coronaserver.ranks) do
66                 if rank.name == rankname then
67                         return rank
68                 end
69         end
70 end
71 function coronaserver.get_player_name(name, brackets)
72     local rank = coronaserver.get_rank(name)
73     local rank_tag = minetest.colorize(rank.color, rank.tag)
74         if not brackets then 
75                 brackets = {"",""}
76         end
77         return rank_tag .. brackets[1] .. name .. brackets[2] .. " "
78 end
79 minetest.register_on_joinplayer(function(player)
80         local name = player:get_player_name()
81         if coronaserver.get_rank(name).name == "student" and minetest.check_player_privs(name, {teacher = true}) then
82                 coronaserver.savedata.ranks[name] = "teacher"
83                 coronaserver.save()
84         end
85     minetest.chat_send_all(coronaserver.get_player_name(name) .. "has joined the Server.")
86     player:set_nametag_attributes({color = coronaserver.get_rank(name).color})
87 end)
88 minetest.register_on_leaveplayer(function(player)
89         local name = player:get_player_name()
90     minetest.chat_send_all(coronaserver.get_player_name(name) .. "has left the Server.")
91 end)
92 minetest.register_on_chat_message(function(name, message)
93     minetest.chat_send_all(coronaserver.get_player_name(name, {"<", ">"}) .. message)
94     return true
95 end)
96 minetest.register_chatcommand("rank", {
97         params = "<player> <rank>",
98         description = "Einem Spieler einen Rang geben (owner|admin|moderator|developer|supporter|teacher|student)",
99         privs = {privs = true},
100         func = function(name, param)
101                 local target = param:split(" ")[1]
102                 local rank = param:split(" ")[2]
103                 local target_ref = minetest.get_player_by_name(target)
104                 local rank_ref = coronaserver.get_rank_by_name(rank)
105                 if not rank_ref then 
106             minetest.chat_send_player(name, "Invalider Rang: " .. (rank or ""))
107         else
108                         coronaserver.savedata.ranks[target] = rank
109                         local privs = {}
110                         for _, r in pairs(ReverseTable(coronaserver.ranks)) do
111                                 for k, v in pairs(r.privs) do
112                                         privs[k] = v
113                                 end
114                                 if r.name == rank then
115                                         break
116                                 end
117                         end
118                         minetest.set_player_privs(target, privs)
119                         minetest.chat_send_all(target .. " is now a " .. minetest.colorize(rank_ref.color, rank_ref.name))
120                         if target_ref then
121                                 target_ref:set_nametag_attributes({color = rank_ref.color})
122                         end
123                 end
124         end,
125 })