mirror of
https://github.com/PHIDIAS0303/ExpCluster.git
synced 2025-12-27 11:35:22 +09:00
175 lines
6.5 KiB
Lua
175 lines
6.5 KiB
Lua
--[[
|
|
Explosive Gaming
|
|
|
|
This file can be used with permission but this and the credit below must remain in the file.
|
|
Contact a member of management on our discord to seek permission to use our code.
|
|
Any changes that you may make to the code are yours but that does not make the script yours.
|
|
Discord: https://discord.gg/r6dC2uK
|
|
]]
|
|
--Please Only Edit Below This Line-----------------------------------------------------------
|
|
local Ranking = {}
|
|
|
|
-- this function is to avoid errors - see /ranks.lua
|
|
function Ranking._form_links()
|
|
return false
|
|
end
|
|
|
|
-- this function is to avoid errors - see /ranks.lua
|
|
function Ranking._ranks()
|
|
return {}
|
|
end
|
|
|
|
-- this function is to avoid errors - see /ranks.lua
|
|
function Ranking._groups()
|
|
return {}
|
|
end
|
|
|
|
--- Returns a rank object given a player or rank name
|
|
-- @usage Ranking.get_rank(game.player)
|
|
-- Ranking.get_rank('admin')
|
|
-- @param mixed player|player index|player name|rank name|rank|'server'|'root' what rank to get
|
|
-- @treturn table the rank that is linked to mixed
|
|
function Ranking.get_rank(mixed)
|
|
local ranks = Ranking._ranks()
|
|
return game.players[mixed] and ranks[game.players[mixed].permission_group.name]
|
|
or mixed.index and game.players[mixed.index] and ranks[mixed.permission_group.name]
|
|
or is_type(mixed,'table') and mixed.group and mixed
|
|
or is_type(mixed,'string') and ranks[string.lower(mixed)] and ranks[string.lower(mixed)]
|
|
or is_type(mixed,'string') and mixed == 'server' and ranks['root']
|
|
or is_type(mixed,'string') and mixed == 'root' and ranks['root']
|
|
or false
|
|
-- ranks[mixed] and ranks[mixed] is to avoid returning nil given any string
|
|
end
|
|
|
|
--- Returns the group object used to sort ranks given group name or see Ranking.get_rank
|
|
-- @usage Ranking.get_group(game.player)
|
|
-- Ranking.get_group('root')
|
|
-- @param mixed player|player index|player name|rank name|rank|'server'|'root'|group name|group what group to get
|
|
-- @treturn table the group that is linked to mixed
|
|
function Ranking.get_group(mixed)
|
|
local groups = Ranking._groups()
|
|
local rank = Ranking.get_rank(mixed)
|
|
return rank and rank.group
|
|
or is_type(mixed,'table') and mixed.ranks and mixed
|
|
or is_type(mixed,'string') and groups[mixed] and groups[mixed]
|
|
or false
|
|
end
|
|
|
|
--- Prints to all rank of greater/lower power of the rank given
|
|
-- @usage Ranking.print('admin','We got a grifer')
|
|
-- @param rank_base the rank that acts as the cut off point (rank is always included)
|
|
-- @param rtn what do you want to return to the players
|
|
-- @tparam bolean below if true rank below base are printed to
|
|
function Ranking.print(rank_base,rtn,below)
|
|
local rank_base = Ranking.get_rank(rank_base)
|
|
local ranks = Ranking._ranks()
|
|
if below then
|
|
for power,rank in pairs(ranks) do
|
|
if rank_base.power >= power then rank:print(rtn) end
|
|
end
|
|
else
|
|
for power,rank in pairs(ranks) do
|
|
if rank_base.power <= power then rank:print(rtn) end
|
|
end
|
|
end
|
|
end
|
|
|
|
--- Gives a user a rank
|
|
-- @usage Ranking.give_rank(1,'admin')
|
|
-- @param player the player to give the rank to
|
|
-- @param rank the rank to give to the player
|
|
-- @param[opt='server'] by_player the player who is giving the rank
|
|
-- @param[opt=game.tick] tick the tick that the rank is being given on
|
|
function Ranking.give_rank(player,rank,by_player,tick)
|
|
local tick = tick or game.tick
|
|
local by_player_name = Game.get_player(by_player).name or game.player and game.player.name or 'server'
|
|
local rank = Ranking.get_rank(rank)
|
|
local player = Game.get_player(player)
|
|
local old_rank = Ranking.get_rank(player)
|
|
local message = 'ranking.rank-down'
|
|
-- messaging
|
|
if old_rank.name == rank.name then return end
|
|
if rank.power < old_rank.power then message = 'ranking.rank-up' end
|
|
game.print{message,player.name,rank.name,by_player_name}
|
|
if not rank.group.name == 'User' then player.print{'ranking.rank-given',rank.name} end
|
|
if not player.tag == old_rank.tag then player.print{'ranking.tag-reset'} end
|
|
-- rank change
|
|
player.permission_group = game.permissions.get_group(rank.name)
|
|
player.tag = rank.tag
|
|
if not old_rank.group.name == 'Jail' then Ranking._presets().old[player.index] = rank.name end
|
|
if Ranking._presets()._event then
|
|
script.raise_event(Ranking._presets()._event,{
|
|
tick=tick,
|
|
player=player,
|
|
by_player_name=by_player_name,
|
|
new_rank=rank,
|
|
old_rank=old_rank
|
|
})
|
|
end
|
|
end
|
|
|
|
--- Revert the last change to a players rank
|
|
-- @usage Ranking.revert(1)
|
|
-- @param player the player to revert the rank of
|
|
-- @param[opt=nil] by_player the player who is doing the revert
|
|
function Ranking.revert(player,by_player)
|
|
local player = Game.get_player(player)
|
|
Ranking.give_rank(player,Ranking._presets().old[player.index],by_player)
|
|
end
|
|
|
|
|
|
|
|
-- this is the base rank object, do not store in global
|
|
Ranking._rank = {}
|
|
|
|
--- Is this rank allowed to open this gui or use this command etc.
|
|
-- @usage rank:allowed('server-interface')
|
|
-- @tparam teh action to test for
|
|
-- @treturn bolean is it allowed
|
|
function Ranking._rank:allowed(action)
|
|
return self.allowed[action] or self.is_root or false
|
|
end
|
|
|
|
--- Get all the players in this rank
|
|
-- @usage rank:get_players()
|
|
-- @tparam bolean online get only online players
|
|
-- @treturn table a table of all players in this rank
|
|
function Ranking._rank:get_players(online)
|
|
local _return = {}
|
|
if online then
|
|
for _,player in pairs(game.connected_players) do
|
|
if Ranking.get_rank(player).name == self.name then table.insert(_return,player) end
|
|
end
|
|
else
|
|
for _,player in pairs(game.players) do
|
|
if Ranking.get_rank(player).name == self.name then table.insert(_return,player) end
|
|
end
|
|
end
|
|
return _return
|
|
end
|
|
|
|
--- Print a message to all players of this rank
|
|
-- @usage rank:print('foo')
|
|
-- @param rtn any value you want to return
|
|
function Ranking._rank:print(rtn)
|
|
if not Server or not Server._thread then
|
|
for _,player in pairs(self:get_players()) do
|
|
player_return(rtn,player)
|
|
end
|
|
else
|
|
-- using threads to make less lag
|
|
local thread = Server.new_thread{data={rank=self,rtn=rtn}}
|
|
thread.on_event('resolve',function(thread)
|
|
return self.data:get_players(true)
|
|
end)
|
|
thread.on_event('success',function(thread,players)
|
|
for _,player in pairs(players) do
|
|
player_return(rtn,player)
|
|
end
|
|
end)
|
|
end
|
|
end
|
|
-- this is the base rank object, do not store in global
|
|
Ranking._group = {}
|
|
|
|
return Ranking |