diff --git a/control.lua b/control.lua index 299038eb..450eba1e 100644 --- a/control.lua +++ b/control.lua @@ -29,7 +29,7 @@ Color, Game, Event = require('/locale/StdLib/load'){'Color','Game','Event'} -- loads the ExpLib, functions are plased into the lua global local ExpLib = require 'ExpLib' ExpLib._unpack_to_G(ExpLib) ---_G.discord_emit = nil -- un-comment this line if you are not using the json.data +_G.discord_emit = nil -- un-comment this line if you are not using the json.data -- loads the ExpCore files these are need in order to run the other addons Ranking, Server, Gui = require('/locale/ExpCore/load'){'Ranking','Server','Gui'} \ No newline at end of file diff --git a/locale/ExpCore/load.lua b/locale/ExpCore/load.lua index 47a759e0..4f5b6e25 100644 --- a/locale/ExpCore/load.lua +++ b/locale/ExpCore/load.lua @@ -19,11 +19,10 @@ local StdExpCoreLib = {} require '/commands' StdExpCoreLib.Server = require '/server' -StdExpCoreLib.Ranking = {} StdExpCoreLib.Gui = {} ---[[StdExpCoreLib.Ranking = require '/ranking' +StdExpCoreLib.Ranking = require '/ranking' require '/ranks' -StdExpCoreLib.Gui = require '/gui' +--[[StdExpCoreLib.Gui = require '/gui' require '/GuiParts/inputs' require '/GuiParts/toolbar' require '/GuiParts/center' diff --git a/locale/ExpCore/ranking.lua b/locale/ExpCore/ranking.lua new file mode 100644 index 00000000..55a69cd4 --- /dev/null +++ b/locale/ExpCore/ranking.lua @@ -0,0 +1,175 @@ +--[[ +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 \ No newline at end of file diff --git a/locale/ExpCore/ranks.lua b/locale/ExpCore/ranks.lua new file mode 100644 index 00000000..2fee45a1 --- /dev/null +++ b/locale/ExpCore/ranks.lua @@ -0,0 +1,11 @@ +--[[ +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 ranks = {} \ No newline at end of file