diff --git a/README.md b/README.md index dc094d7..0787f60 100644 --- a/README.md +++ b/README.md @@ -2,3 +2,5 @@ Chat+nametags ranks mod, custom rank text and color * `/getrank [player]` - check your rank or rank of any player * `/setrank ` - privs: `ranks` - set rank for any player +* `/delrank [player]` - delete your rank or rank of any player +* `/players` - view list of online players with their ranks \ No newline at end of file diff --git a/init.lua b/init.lua index ca89fa4..26631ba 100644 --- a/init.lua +++ b/init.lua @@ -1,40 +1,47 @@ +local ranks = {} +local rlist = core.get_mod_storage() + +function ranks.get_rank(name) + if not name then return end + local rank,color = rlist:get_string(name):match("(%S+)%s(%S+)") + return rank,color +end +function ranks.set_rank(name,rank,color) + if not (name and rank and color) then return end + rlist:set_string(name,"["..rank.."] "..color) +end +function ranks.del_rank(name) + if not name then return end + rlist:set_string(name,"") +end + + core.register_privilege("ranks","Allow manage ranks") core.register_on_chat_message(function(name,message) - local player = core.get_player_by_name(name) - if not player then return end - local pmeta = player:get_meta() - if not pmeta then return end - local rank = pmeta:get_string("rank") - --if not rank or rank == "" then rank = "[Player] " end - local color = pmeta:get_string("rankcolor") - --if not color or color == "" then color = "#BBB" end - if rank and rank ~= "" and core.check_player_privs(name, {shout = true}) then - if core.get_modpath("irc") then - irc.say("<"..name.."> "..core.strip_colors(message)) - end - core.log("action","CHAT: "..core.format_chat_message(rank..name,core.strip_colors(message))) - core.chat_send_all(core.format_chat_message(core.colorize(color,rank)..name,message)) - return true - end + local rank,color = ranks.get_rank(name) + + if rank and color and core.check_player_privs(name, {shout = true}) then + if core.get_modpath("irc") then + irc.say("<"..name.."> "..core.strip_colors(message)) + end + core.log("action","CHAT: "..core.format_chat_message(name,core.strip_colors(message))) + core.chat_send_all(core.format_chat_message(core.colorize(color,rank).." "..name,message)) + return true + end end) core.register_chatcommand("getrank", { description="Get rank of player or you", params="[player]", func = function(name,param) - local player if not param or param == "" then - player = core.get_player_by_name(name) - else - player = core.get_player_by_name(param) + param = name + end + local rank,color = ranks.get_rank(param) + if rank and color then + return true, param.."'s rank is "..core.colorize(color,rank).." (color: "..color..")" + else + return false, "Specified player doesn't have any rank" end - if not player then return false,"Invalid player" end - local pmeta = player:get_meta() - if not pmeta then return end - local rank = pmeta:get_string("rank") - if not rank or rank == "" then rank = "Player" end - local color = pmeta:get_string("rankcolor") - if not color or color == "" then color = "#BBB" end - return true,player:get_player_name().."'s rank is "..core.colorize(color,rank)..", color: "..color end}) core.register_chatcommand("setrank", { privs={ranks=true}, @@ -42,43 +49,56 @@ core.register_chatcommand("setrank", { params=" ", func = function(name,param) local pname, rank, color = param:match("(%S+)%s+(%S+)%s+(.+)") - if not (pname and rank and color) then return false,"Invalid params" end + if not (pname and rank and color) then return false, "Invalid parameters" end + ranks.set_rank(pname,rank,color) local player = core.get_player_by_name(pname) - if not player then return false,"Invalid player" end - local pmeta = player:get_meta() - if not pmeta then return end - pmeta:set_string("rank","["..rank.."] ") - pmeta:set_string("rankcolor",color) - player:set_nametag_attributes({text = core.colorize(color,"["..rank.."] ")..pname}) - return true,"Rank of "..pname..' now set to '..core.colorize(color,rank) + if player then + player:set_nametag_attributes({text = core.colorize(color,"["..rank.."] ")..pname}) + end + return true,"Rank of "..pname.." now set to "..core.colorize(color,"["..rank.."]") +end}) + +core.register_chatcommand("delrank", { + privs={ranks=true}, + description="Delete rank of player or of you", + params="", + func = function(name,param) + if not param or param == "" then + param = name + end + ranks.del_rank(param) + local player = core.get_player_by_name(param) + if player then + player:set_nametag_attributes({text = param}) + end + return true,"Rank of "..param.." deleted" end}) core.register_on_joinplayer(function(player) local name = player:get_player_name() - local pmeta = player:get_meta() - if not pmeta then return end - local rank = pmeta:get_string("rank") - --if not rank or rank == "" then rank = "[Player] " end - local color = pmeta:get_string("rankcolor") - --if not color or color == "" then color = "#BBB" end - player:set_nametag_attributes({text = core.colorize(color,rank)..name}) + if not name then return end + local rank,color = ranks.get_rank(name) + if rank and color then + player:set_nametag_attributes({text = core.colorize(color,rank).." "..name}) + end end) core.register_chatcommand("players", { - description = "List all players currently online.", - func = function(name, _) - local onlineCount = #(core.get_connected_players()) - local listString = onlineCount.." Online: " - local iterated=1 - for _,player in ipairs(core.get_connected_players()) do - local ntag = player:get_nametag_attributes(player).text - listString=listString..ntag - if iterated < onlineCount then - listString=listString..", " - end - iterated=iterated+1 - end - core.chat_send_player(name, listString) - end -}) + description = "List all players currently online with their ranks", + func = function(name, param) + local list = core.get_connected_players() + local out = "" + for _,player in ipairs(list) do + local name = player:get_player_name() + if name then + local rank,color = ranks.get_rank(name) + if rank and color then + out = out..core.colorize(color,rank).." "..name.." " + else + out = out..name.." " + end + end + end + return true, #list.." Online: "..out +end}) diff --git a/mod.conf b/mod.conf index f3e7a6a..32a238c 100644 --- a/mod.conf +++ b/mod.conf @@ -1,2 +1,3 @@ name = ranks -optional_depends = irc +author = Zemtzov7 +optional_depends = irc \ No newline at end of file