mirror of
https://github.com/PHIDIAS0303/ExpCluster.git
synced 2025-12-28 12:05:21 +09:00
Converted Modules To Use Roles
This commit is contained in:
@@ -50,9 +50,9 @@ setmetatable(commands,{
|
||||
-- @field player converts the input into a valid player
|
||||
-- @field player_online converts the input to a player if the player is online
|
||||
-- @field player_alive converts the input to a player if the player is online and alive
|
||||
-- @field player_rank converts the input to a player if the player is a lower rank than the user or if the person is not admin and the user is
|
||||
-- @field player_rank-online converts the input to a player if the player is a lower rank than the user and online
|
||||
-- @field player_rank_alive converts the input to a player if the player is a lower rank than the user and online and alive
|
||||
-- @field player_role converts the input to a player if the player is a lower rank than the user or if the person is not admin and the user is
|
||||
-- @field player_role-online converts the input to a player if the player is a lower rank than the user and online
|
||||
-- @field player_role_alive converts the input to a player if the player is a lower rank than the user and online and alive
|
||||
commands.validate = {
|
||||
['boolean']=function(value,event) local value = value.lower() if value == 'true' or valule == 'yes' or value == 'y' or value == '1' then return true else return false end end,
|
||||
['string']=function(value,event) return tostring(value) end,
|
||||
@@ -129,7 +129,7 @@ function commands.validate_args(event)
|
||||
if not arg and not data[1] then return commands.error('invalid-inputs') end
|
||||
if data[2] == 'string-inf' then rtn[name] = table.concat(words,' ',index) break end
|
||||
local valid = is_type(data[2],'function') and data[2] or commands.validate[data[2]] or error('Invalid type for command: "'..command.name..'/'..name..'"')
|
||||
local temp_tbl = table.deep_copy(data) table.remove(temp_tbl,1) table.remove(temp_tbl,2)
|
||||
local temp_tbl = table.deepcopy(data) table.remove(temp_tbl,1) table.remove(temp_tbl,1)
|
||||
local value, err = valid(arg,event,unpack(temp_tbl))
|
||||
if value == commands.error then return value, err end
|
||||
rtn[name] = value
|
||||
|
||||
@@ -177,11 +177,11 @@ function Gui:on_init()
|
||||
self.left:on_init(); self.left.on_init = nil
|
||||
self.toolbar:on_init(); self.toolbar.on_init = nil
|
||||
if loaded_modules['ExpGamingCore.Server'] then verbose('ExpGamingCore.Server is installed; Loading server src') require(module_path..'/src/server',{Gui=Gui}) end
|
||||
if loaded_modules['ExpGamingCore.Ranking'] then
|
||||
verbose('ExpGamingCore.Ranking is installed; Loading ranking src')
|
||||
script.on_event('on_rank_change',function(event)
|
||||
Gui.toolbar.on_rank_change(event)
|
||||
Gui.center.on_rank_change(event)
|
||||
if loaded_modules['ExpGamingCore.Role'] then
|
||||
verbose('ExpGamingCore.Role is installed; Loading ranking src')
|
||||
script.on_event('on_role_change',function(event)
|
||||
Gui.toolbar.on_role_change(event)
|
||||
Gui.center.on_role_change(event)
|
||||
end)
|
||||
end
|
||||
script.on_event('on_player_joined_game',function(event)
|
||||
|
||||
@@ -209,5 +209,5 @@ center._events = {[defines.events.on_gui_closed]=function(event)
|
||||
if event.element and event.element.valid then event.element.destroy() end
|
||||
end}
|
||||
|
||||
center.on_rank_change = center.clear
|
||||
center.on_role_change = center.clear
|
||||
return center
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
local Game = require('FactorioStdLib.Game')
|
||||
local Color = require('FactorioStdLib.Color')
|
||||
local Ranking -- this is optional and is hanndled by it being present, it is loaded on init
|
||||
local Role -- this is optional and is hanndled by it being present, it is loaded on init
|
||||
local mod_gui = require("mod-gui")
|
||||
local Gui = Gui -- this is to force gui to remain in the ENV
|
||||
|
||||
@@ -150,14 +150,14 @@ function left._left.toggle(event)
|
||||
if not success then error(err)
|
||||
elseif err == true then open = true
|
||||
elseif global.over_ride_left_can_open then
|
||||
if is_type(Ranking,'table') and Ranking.meta.rank_count > 0 then
|
||||
if Ranking.get_rank(player):allowed(_left.name) then open = true
|
||||
if is_type(Role,'table') then
|
||||
if Role.allowed(player,_left.name) then open = true
|
||||
else open = {gui.unauthorized} end
|
||||
else open = true end
|
||||
else open = err end
|
||||
else
|
||||
if is_type(Ranking,'table') and Ranking.meta.rank_count > 0 then
|
||||
if Ranking.get_rank(player):allowed(_left.name) then open = true
|
||||
if is_type(Role,'table') then
|
||||
if Role.allowed(player,_left.name) then open = true
|
||||
else open = {gui.unauthorized} end
|
||||
else open = true end
|
||||
end
|
||||
@@ -181,7 +181,7 @@ left.on_player_joined_game = function(event)
|
||||
end
|
||||
|
||||
function left:on_init()
|
||||
if loaded_modules['ExpGamingCore.Ranking'] then Ranking = require('ExpGamingCore.Ranking') end
|
||||
if loaded_modules['ExpGamingCore.Role'] then Role = require('ExpGamingCore.Role') end
|
||||
end
|
||||
|
||||
return left
|
||||
@@ -8,7 +8,7 @@
|
||||
-- @function _comment
|
||||
|
||||
local Game = require('FactorioStdLib.Game')
|
||||
local Ranking -- this is optional and is hanndled by it being present, it is loaded on init
|
||||
local Role -- this is optional and is hanndled by it being present, it is loaded on init
|
||||
local mod_gui = require("mod-gui")
|
||||
local Gui = Gui -- this is to force gui to remain in the ENV
|
||||
|
||||
@@ -39,9 +39,8 @@ function toolbar.draw(player)
|
||||
toolbar_frame.clear()
|
||||
if not Gui.data.toolbar then return end
|
||||
for name,button in pairs(Gui.data.toolbar) do
|
||||
if is_type(Ranking,'table') and Ranking.meta.rank_count > 0 then
|
||||
local rank = Ranking.get_rank(player)
|
||||
if rank:allowed(name) then
|
||||
if is_type(Role,'table') then
|
||||
if Role.allowed(player,name) then
|
||||
button:draw(toolbar_frame)
|
||||
end
|
||||
else button:draw(toolbar_frame) end
|
||||
@@ -49,9 +48,9 @@ function toolbar.draw(player)
|
||||
end
|
||||
|
||||
function toolbar:on_init()
|
||||
if loaded_modules['ExpGamingCore.Ranking'] then Ranking = require('ExpGamingCore.Ranking') end
|
||||
if loaded_modules['ExpGamingCore.Role'] then Role = require('ExpGamingCore.Role') end
|
||||
end
|
||||
|
||||
toolbar.on_rank_change = toolbar.draw
|
||||
toolbar.on_role_change = toolbar.draw
|
||||
toolbar.on_player_joined_game = toolbar.draw
|
||||
return toolbar
|
||||
@@ -1,492 +0,0 @@
|
||||
--- A full ranking system for factorio.
|
||||
-- @module ExpGamingCore.Ranking
|
||||
-- @alias Ranking
|
||||
-- @author Cooldude2606
|
||||
-- @license https://github.com/explosivegaming/scenario/blob/master/LICENSE
|
||||
|
||||
local Game = require('FactorioStdLib.Game')
|
||||
local Color = require('FactorioStdLib.Color')
|
||||
|
||||
local Ranking = {}
|
||||
local module_verbose = false --true|false
|
||||
|
||||
--- Global Table
|
||||
-- @table global
|
||||
-- @field old contains the previous rank a use had before a rank change
|
||||
-- @field preset contains the preset ranks that users will recive apon joining
|
||||
-- @field last_change contains the name of the player who last had there rank chagned
|
||||
local global = global{old={},preset={},last_change=nil}
|
||||
|
||||
--- Called when there is a rank change for a user
|
||||
-- @event on_rank_change
|
||||
-- @field name the rank id
|
||||
-- @field tick the tick which the event was raised on
|
||||
-- @field player_index the player whos rank was changed
|
||||
-- @field by_player_index the player who changed the rank, 0 means server
|
||||
-- @field new_rank the name of the rank that was given
|
||||
-- @field old_rank the name of the rank the player had
|
||||
script.generate_event_name('on_rank_change')
|
||||
|
||||
--- Outputs as a string all the ranks and the loaded order
|
||||
-- @usage Ranking.output_ranks(player) -- prints to player
|
||||
-- @tparam[opt=server] ?player_name|player_index|LuaPlayer player the player that the info will be printed to, nil will print to server
|
||||
-- @todo show inheritance of ranks
|
||||
function Ranking.output_ranks(player)
|
||||
local player = Game.get_player(player) or game.player or nil
|
||||
local function output(rank)
|
||||
local admin = 'No'; if rank.is_root then admin = 'Root' elseif rank.is_admin then admin = 'Yes' end
|
||||
local rtn = string.format('%s) %q %s > Admin: %s Group: %q AFK: %s Time: %s',
|
||||
rank.power,rank.name,rank.tag,admin,rank.group,tostring(rank.base_afk_time),tostring(rank.time))
|
||||
player_return(rtn,rank.colour,player)
|
||||
end
|
||||
local function recur(_rank)
|
||||
for name,rank in pairs(_rank.children) do output(Ranking.ranks[rank]) end
|
||||
for name,rank in pairs(_rank.children) do recur(Ranking.ranks[rank]) end
|
||||
end
|
||||
local root = Ranking.get_rank(Ranking.meta.root)
|
||||
output(root)
|
||||
recur(root)
|
||||
end
|
||||
|
||||
--- Contains the location of all the ranks, readonly during runtime
|
||||
-- @table Ranking.ranks
|
||||
Ranking.ranks = setmetatable({},{
|
||||
__metatable=false,
|
||||
__index=table.autokey,
|
||||
__newindex=function(tbl,key,value) if game then error('Can not create new ranks during runtime',2) else rawset(tbl,key,value) end end,
|
||||
__len=function(tbl)
|
||||
local rtn = 0
|
||||
for name,rank in pairs(tbl) do
|
||||
rtn=rtn+1
|
||||
end
|
||||
return rtn
|
||||
end
|
||||
})
|
||||
|
||||
--- Contains the location of all the rank groups, readonly during runtime
|
||||
-- @table Ranking.ranks
|
||||
Ranking.groups = setmetatable({},{
|
||||
__metatable=false,
|
||||
__index=table.autokey,
|
||||
__newindex=function(tbl,key,value) if game then error('Can not create new rank groups during runtime',2) else rawset(tbl,key,value) end end,
|
||||
__len=function(tbl)
|
||||
local rtn = 0
|
||||
for name,rank in pairs(tbl) do
|
||||
rtn=rtn+1
|
||||
end
|
||||
return rtn
|
||||
end
|
||||
})
|
||||
|
||||
--- Contains some meta data about the ranks
|
||||
-- @table Ranking.meta
|
||||
-- @field default this is the name of the default rank
|
||||
-- @field root this is the name of the root rank
|
||||
-- @field time_ranks a list of all ranks which have a time requirement
|
||||
-- @field time_highest the power of the highest rank that has a time requirement
|
||||
-- @field time_lowest the lowest amount of time required for a time rank
|
||||
Ranking.meta = setmetatable({},{
|
||||
__metatable=false,
|
||||
__call=function(tbl)
|
||||
local count = 0
|
||||
rawset(tbl,'time_ranks',{})
|
||||
for name,rank in pairs(Ranking.ranks) do
|
||||
count=count+1
|
||||
if not rawget(tbl,'default') and rank.is_default then rawset(tbl,'default',rank.name) end
|
||||
if not rawget(tbl,'root') and rank.is_root then rawset(tbl,'root',rank.name) end
|
||||
if rank.time then
|
||||
table.insert(tbl.time_ranks,rank.name)
|
||||
if not rawget(tbl,'time_highest') or rank.power < tbl.time_highest then if rank.power then rawset(tbl,'time_highest',rank.power) end end
|
||||
if not rawget(tbl,'time_lowest') or rank.time < tbl.time_lowest then rawset(tbl,'time_lowest',rank.time) end
|
||||
end
|
||||
end
|
||||
rawset(tbl,'rank_count',count)
|
||||
if not rawget(tbl,'default') then error('No default rank') end
|
||||
if not rawget(tbl,'root') then error('No root rank') end
|
||||
end,
|
||||
__index=function(tbl,key)
|
||||
tbl()
|
||||
return rawget(tbl,key)
|
||||
end,
|
||||
__newindex=function() error('Ranking metadata is read only',2) end
|
||||
})
|
||||
|
||||
--- Used to set the prset ranks that will be given to players
|
||||
-- @usage Ranking._base_preset{name=rank_name,nameTwo=rank_name_two} -- sets player name to have rank rank_name on join
|
||||
-- @tparam table ranks table of player names with the player name as the key and rank name as the value
|
||||
function Ranking._base_preset(ranks)
|
||||
if not is_type(ranks,'table') then error('Ranking._base_preset was not given a table',2) end
|
||||
global.preset = ranks
|
||||
end
|
||||
|
||||
--- Returns a rank object given a player or rank name
|
||||
-- @usage Ranking.get_rank(game.player) -- returns player's rank
|
||||
-- @usage Ranking.get_rank('admin') -- returns rank by the name of admin
|
||||
-- @tparam ?player|player_index|player_name|rank_name|Ranking._rank|'server'|'root' mixed what rank to get
|
||||
-- @treturn[1] table the rank that is linked to mixed
|
||||
-- @treturn[2] nil there was no rank found
|
||||
function Ranking.get_rank(mixed)
|
||||
if not mixed then return error('Ranking.get_rank recived no paramerters') end
|
||||
local ranks = Ranking.ranks
|
||||
local _return = false
|
||||
if is_type(mixed,'table') then
|
||||
-- is it a player, then get player rank; if it is a rank then return the rank
|
||||
if mixed.index then _return = game.players[mixed.index] and ranks[mixed.permission_group.name] or nil
|
||||
else _return = mixed.group and mixed or nil end
|
||||
else
|
||||
-- if it is a player name/index, then get player rank; if it is a rank name, get that rank; if it is server or root; return root rank; else nil
|
||||
_return = game and game.players[mixed] and ranks[game.players[mixed].permission_group.name]
|
||||
or table.autokey(ranks,mixed) and table.autokey(ranks,mixed)
|
||||
or string.find(mixed,'server') and Ranking.get_rank(Ranking.meta.root)
|
||||
or string.find(mixed,'root') and Ranking.get_rank(Ranking.meta.root)
|
||||
or nil
|
||||
end
|
||||
return _return
|
||||
end
|
||||
|
||||
--- Returns the group object used to sort ranks given group name or rank
|
||||
-- @usage Ranking.get_group(game.player) -- returns player's rank group
|
||||
-- @usage Ranking.get_group('root') -- returns group by name of root
|
||||
-- @tparam ?player|player_index|player_name|rank_name|rank|'server'|'root'|group_name|group mixed what group to get
|
||||
-- @see Ranking.get_rank
|
||||
-- @treturn[1] table the group that is linked to mixed
|
||||
-- @treturn[2] nil there was no rank group found
|
||||
function Ranking.get_group(mixed)
|
||||
if not mixed then return error('Ranking.get_group recived no paramerters') end
|
||||
local groups = Ranking.groups
|
||||
local rank = Ranking.get_rank(mixed)
|
||||
-- if it is a table see if it is a group, return the group; if it is a string, return group by that name; if there is a rank found, return the ranks group
|
||||
return is_type(mixed,'table') and not mixed.__self and mixed.ranks and mixed
|
||||
or is_type(mixed,'string') and table.autokey(groups,mixed)
|
||||
or rank and rank.group
|
||||
or nil
|
||||
end
|
||||
|
||||
--- Prints to all rank of greater/lower power of the rank given
|
||||
-- @usage Ranking.print('admin','We got a grifer')
|
||||
-- @todo change to use parent and child ranks rather than power
|
||||
-- @tparam ?Ranking._rank|pointerToRank 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[opt=defines.color.white] defines.color colour the colour that will be used to print
|
||||
-- @tparam[opt=false] boolean below if true print to children rather than parents
|
||||
function Ranking.print(rank_base,rtn,colour,below)
|
||||
local colour = colour or defines.color.white
|
||||
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,colour,true) end
|
||||
end
|
||||
else
|
||||
for power,rank in pairs(ranks) do
|
||||
if rank_base.power >= power then rank:print(rtn,colour) end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--- Gives a user a rank
|
||||
-- @usage Ranking.give_rank(1,'admin')
|
||||
-- @tparam ?LuaPlayer|pointerToPlayer player the player to give the rank to
|
||||
-- @tparam[opt=default] ?Ranking._rank|pointerToRank rank the rank to give to the player
|
||||
-- @tparam[opt='server'] ?LuaPlayer|pointerToPlayer by_player the player who is giving the rank
|
||||
-- @tparam[opt=game.tick] number tick the tick that the rank is being given on, used as pass though
|
||||
function Ranking.give_rank(player,rank,by_player,tick)
|
||||
local print_colour = defines.textcolor.info
|
||||
local tick = tick or game.tick
|
||||
local by_player_name = Game.get_player(by_player) and Game.get_player(by_player).name or game.player and game.player.name or is_type(by_player,'string') and by_player or 'server'
|
||||
local rank = Ranking.get_rank(rank) or Ranking.get_rank(Ranking.meta.default)
|
||||
local player = Game.get_player(player) or error('No player given to Ranking.give_rank',2)
|
||||
local old_rank = Ranking.get_rank(player) or Ranking.get_rank(Ranking.meta.default)
|
||||
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' player.play_sound{path='utility/achievement_unlocked'}
|
||||
else player.play_sound{path='utility/game_lost'} end
|
||||
if player.online_time > 60 or by_player_name ~= 'server' then game.print({message,player.name,rank.name,by_player_name},print_colour) end
|
||||
if rank.group ~= 'User' then player_return({'ranking.rank-given',rank.name},print_colour,player) end
|
||||
if player.tag ~= old_rank.tag then player_return({'ranking.tag-reset'},print_colour,player) end
|
||||
-- rank change
|
||||
player.permission_group = game.permissions.get_group(rank.name)
|
||||
player.tag = rank.tag
|
||||
if old_rank.group ~= 'Jail' then global.old[player.index] = old_rank.name end
|
||||
player.admin = rank.is_admin or false
|
||||
player.spectator = rank.is_spectator or false
|
||||
local by_player_index = by_player_name == 'server' and 0 or Game.get_player(by_player_name).index
|
||||
script.raise_event(defines.events.on_rank_change,{
|
||||
name=defines.events.on_rank_change,
|
||||
tick=tick,
|
||||
player_index=player.index,
|
||||
by_player_index=by_player_index,
|
||||
new_rank=rank.name,
|
||||
old_rank=old_rank.name
|
||||
})
|
||||
-- logs to file if rank is chagned after first join
|
||||
if player.online_time > 60 then
|
||||
game.write_file('ranking-change.json',
|
||||
table.json({
|
||||
tick=tick,
|
||||
play_time=player.online_time,
|
||||
player_name=player.name,
|
||||
by_player_name=by_player_name,
|
||||
new_rank=rank.name,
|
||||
old_rank=old_rank.name
|
||||
})..'\n'
|
||||
, true, 0)
|
||||
end
|
||||
end
|
||||
|
||||
--- Revert the last change to a players rank
|
||||
-- @usage Ranking.revert(1) -- reverts the rank of player with index 1
|
||||
-- @tparam ?LuaPlayer|pointerToPlayer 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,global.old[player.index],by_player)
|
||||
end
|
||||
|
||||
--- Given that the player has a rank in the preset table it is given; also will attempt to promote players if a time requirement is met
|
||||
-- @usage Ranking.find_preset(1) -- attemps to find the preset for player with index 1
|
||||
-- @tparam ?LuaPlayer|pointerToPlayer player the player to test for an auto rank
|
||||
-- @tparam[opt=nil] number tick the tick it happens on
|
||||
function Ranking.find_preset(player,tick)
|
||||
local presets = global.preset
|
||||
local meta_data = Ranking.meta
|
||||
local default = Ranking.get_rank(meta_data.default)
|
||||
local player = Game.get_player(player)
|
||||
local current_rank = Ranking.get_rank(player) or {power=-1,group='not jail'}
|
||||
local ranks = {default}
|
||||
-- users in rank group jail are ingroned
|
||||
if current_rank.group == 'Jail' then return end
|
||||
-- looks in preset table for player name
|
||||
if presets[string.lower(player.name)] then
|
||||
local rank = Ranking.get_rank(presets[string.lower(player.name)])
|
||||
table.insert(ranks,rank)
|
||||
end
|
||||
-- if the player mets check requirements then play time is checked
|
||||
if current_rank.power > meta_data.time_highest and tick_to_min(player.online_time) > meta_data.time_lowest then
|
||||
for _,rank_name in pairs(meta_data.time_ranks) do
|
||||
local rank = Ranking.get_rank(rank_name)
|
||||
if tick_to_min(player.online_time) > rank.time then
|
||||
table.insert(ranks,rank)
|
||||
end
|
||||
end
|
||||
end
|
||||
-- if the new rank is closer to root then it is the new rank
|
||||
local _rank = current_rank
|
||||
for _,rank in pairs(ranks) do
|
||||
if rank.power < _rank.power or _rank.power == -1 then _rank = rank end
|
||||
end
|
||||
-- this new rank is given to the player
|
||||
if _rank.name == current_rank.name then return end
|
||||
if _rank.name == default.name then
|
||||
player.tag = _rank.tag
|
||||
player.permission_group = game.permissions.get_group(_rank.name)
|
||||
else
|
||||
Ranking.give_rank(player,_rank,nil,tick)
|
||||
end
|
||||
end
|
||||
|
||||
--- The class for the ranks
|
||||
-- @type Rank
|
||||
-- @alias Ranking._rank
|
||||
-- @field name the name that is given to the rank, must be unique
|
||||
-- @field short_hand the shorter way of displaying this rank, can be used by other modules
|
||||
-- @field tag the tag that player in this rank will be given
|
||||
-- @field colour the colour that modules should display this rank as in guis
|
||||
-- @field parent the name of the rank that permissions are inherited from, allow comes from children, disallow given to children
|
||||
-- @field base_afk_time a relative number that the rank should be given that other modules can use for relitive importance
|
||||
-- @field time the time that is requied for this rank to be given, can be nil for manal only
|
||||
-- @field allow a list of permissions that this rank is allowed
|
||||
-- @field disallow a list of acctions that is blocked by the ingame permission system
|
||||
-- @field is_default will be given to all players if no other rank is set for them
|
||||
-- @field is_admin will promote player to ingame admin if flag set (will auto demote if not set)
|
||||
-- @field is_spectator will auto set the spectator option for the player (will cleat option if not set)
|
||||
-- @field is_root rank is always allowed all action, when present in root group will become the root child that all ranks are indexed from
|
||||
Ranking._rank = {}
|
||||
|
||||
--- Is this rank allowed to open this gui or use this command etc.
|
||||
-- @usage rank:allowed('interface') -- does the rank have permision for 'interface'
|
||||
-- @tparam teh action to test for
|
||||
-- @treturn boolean is it allowed
|
||||
function Ranking._rank:allowed(action)
|
||||
return self.allow[action] or self.is_root or false
|
||||
end
|
||||
|
||||
--- Get all the players in this rank
|
||||
-- @usage rank:get_players()
|
||||
-- @tparam[opt=false] boolean online get only online players
|
||||
-- @treturn table a table of all players in this rank
|
||||
function Ranking._rank:get_players(online)
|
||||
local players = game.permissions.get_group(self.name).players
|
||||
local _return = {}
|
||||
if online then
|
||||
for _,player in pairs(players) do if player.connected then table.insert(_return,player) end end
|
||||
else _return = players end
|
||||
return _return
|
||||
end
|
||||
|
||||
--- Print a message to all players of this rank
|
||||
-- @usage rank:print('foo') -- prints to all members of this rank
|
||||
-- @param rtn any value you want to return
|
||||
-- @tparam[opt=defines.color.white] define.color colour the colour that will be used to print
|
||||
-- @tparam[opt=false] boolean show_default weather to use the default rank name for the print, used as a pass though
|
||||
function Ranking._rank:print(rtn,colour,show_default)
|
||||
local colour = colour or defines.color.white
|
||||
local default = Ranking.get_rank(Ranking.meta.default)
|
||||
for _,player in pairs(self:get_players(true)) do
|
||||
if self.name == default.name or show_default then player_return({'ranking.all-rank-print',rtn},colour,player)
|
||||
else player_return({'ranking.rank-print',self.name,rtn},colour,player) end
|
||||
end
|
||||
end
|
||||
|
||||
--- Allows for a clean way to edit rank objects
|
||||
-- @usage rank:edit('allow',{'interface'}) -- allows this rank to use 'interface'
|
||||
-- @tparam string key the key to edit, often allow or disallow
|
||||
-- @param value the new value to be set
|
||||
function Ranking._rank:edit(key,value)
|
||||
if game then return end
|
||||
verbose('Edited Rank: '..self.group..'/'..self.name..'/'..key)
|
||||
if key == 'disallow' then self.disallow = table.merge(self.disallow,value,true)
|
||||
elseif key == 'allow' then self.allow = table.merge(self.allow,value)
|
||||
else self[key] = value end
|
||||
end
|
||||
|
||||
--- The class for the rank groups, the way to allow modules to idex a group that is always present, ranks will always look to there group as a parent
|
||||
-- @type Group
|
||||
-- @alias Ranking._group
|
||||
-- @field name the name that is given to the rank group, must be unique
|
||||
-- @field parent the name of the group that permissions are inherited from
|
||||
-- @field allow a list of permissions that this rank is allowed
|
||||
-- @field disallow a list of acctions that is blocked by the ingame permission system
|
||||
Ranking._group = {}
|
||||
|
||||
--- Creates a new group
|
||||
-- @usage Ranking._group:create{name='root'} -- returns group with name root
|
||||
-- @tparam table obj the fields for this object
|
||||
-- @treturn Ranking._group returns the object to allow chaining
|
||||
function Ranking._group:create(obj)
|
||||
if game then return end
|
||||
if not is_type(obj.name,'string') then error('Group creationg is invalid',2) end
|
||||
verbose('Created Group: '..obj.name)
|
||||
setmetatable(obj,{__index=Ranking._group})
|
||||
obj.ranks = {}
|
||||
obj.allow = obj.allow or {}
|
||||
obj.disallow = obj.disallow or {}
|
||||
Ranking.groups[obj.name] = obj
|
||||
return obj
|
||||
end
|
||||
|
||||
--- Creats a new rank with this group as its group
|
||||
-- @usage group:add_rank{name='root'} -- returns self
|
||||
-- @tparam table obj the fields for this object
|
||||
-- @treturn Ranking._group returns the object to allow chaining
|
||||
function Ranking._group:add_rank(obj)
|
||||
if game then return end
|
||||
if not is_type(obj.name,'string') or
|
||||
not is_type(obj.short_hand,'string') or
|
||||
not is_type(obj.tag,'string') or
|
||||
not is_type(obj.colour,'table') then error('Rank creation is invalid',2) end
|
||||
verbose('Created Rank: '..obj.name)
|
||||
setmetatable(obj,{__index=Ranking._rank})
|
||||
obj.group = self.name
|
||||
obj.children = {}
|
||||
obj.allow = obj.allow or {}
|
||||
obj.disallow = obj.disallow or {}
|
||||
table.insert(self.ranks,obj.name)
|
||||
Ranking.ranks[obj.name] = obj
|
||||
return self
|
||||
end
|
||||
|
||||
--- Allows for a clean way to edit rank group objects
|
||||
-- @usage group:edit('allow',{'interface'}) -- allows this rank to use 'interface'
|
||||
-- @tparam string key the key to edit, often allow or disallow
|
||||
-- @param value the new value to be set
|
||||
function Ranking._group:edit(key,value)
|
||||
if game then return end
|
||||
verbose('Edited Group: '..self.name..'/'..key)
|
||||
if key == 'disallow' then self.disallow = table.merge(self.disallow,value,true)
|
||||
elseif key == 'allow' then self.allow = table.merge(self.allow,value)
|
||||
else self[key] = value end
|
||||
end
|
||||
|
||||
script.on_event('on_player_joined_game',function(event)
|
||||
Ranking.find_preset(event.player_index)
|
||||
end)
|
||||
|
||||
script.on_event('on_init',function(event)
|
||||
for name,rank in pairs(Ranking.ranks) do
|
||||
local perm = game.permissions.create_group(name)
|
||||
for _,toRemove in pairs(rank.disallow) do
|
||||
perm.set_allows_action(defines.input_action[toRemove],false)
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
script.on_event('on_tick',function(event)
|
||||
if (((event.tick+10)/(3600*game.speed))+(15/2))% 15 == 0 then
|
||||
-- this is the system to auto rank players
|
||||
for _,player in pairs(game.connected_players) do
|
||||
Ranking.find_preset(player,tick)
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
verbose('Loading rank core...')
|
||||
require(module_path..'/src/core',{Ranking=Ranking})
|
||||
verbose('Loading rank configs...')
|
||||
require(module_path..'/src/config',{Ranking=Ranking})
|
||||
|
||||
function Ranking:on_init()
|
||||
if loaded_modules['ExpGamingCore.Server'] then verbose('ExpGamingCore.Server is installed; Loading server src') require(module_path..'/src/server',{Ranking=Ranking}) end
|
||||
if loaded_modules['ExpGamingCore.Command'] then verbose('ExpGamingCore.Server is installed; Loading commands src') require(module_path..'/src/commands',{Ranking=Ranking}) end
|
||||
end
|
||||
|
||||
function Ranking:on_post()
|
||||
-- other modules can creat ranks during init and this will then set up the meta data
|
||||
-- sets up the power system, the lower the power the closer to root, root is 0
|
||||
-- there must be a rank with is_root flag set and one rank with is_default flag set, if multiple found then first found is used
|
||||
local root = Ranking.get_rank(Ranking.meta.root)
|
||||
root:edit('power',0)
|
||||
-- asigning of children
|
||||
verbose('Creating Rank Tree')
|
||||
for name,rank in pairs(Ranking.ranks) do
|
||||
if rank ~= root then
|
||||
if not rank.parent then error('Rank has no parent: "'..name..'"') end
|
||||
if not Ranking.ranks[rank.parent] then error('Invalid parent rank: "'..rank.parent..'"') end
|
||||
table.insert(Ranking.ranks[rank.parent].children,name)
|
||||
Ranking.ranks[rank.parent]:edit('allow',rank.allow)
|
||||
rank:edit('disallow',Ranking.ranks[rank.parent].disallow)
|
||||
end
|
||||
end
|
||||
-- asigning of powers
|
||||
-- @todo need a better system for non liner rank trees
|
||||
verbose('Assigning Rank Powers')
|
||||
local power = 1
|
||||
local function set_powers(rank)
|
||||
for _,name in pairs(rank.children) do
|
||||
Ranking.ranks[name]:edit('power',power)
|
||||
power=power+1
|
||||
end
|
||||
for _,name in pairs(rank.children) do set_powers(Ranking.ranks[name]) end
|
||||
end
|
||||
set_powers(root)
|
||||
-- asigning group meta data
|
||||
verbose('Creating Rank-Group Relationship')
|
||||
for name,group in pairs(Ranking.groups) do
|
||||
if name ~= 'Root' then
|
||||
if not group.parent then error('Group has no parent: "'..name..'"') end
|
||||
if not Ranking.groups[group.parent] then error('Invalid parent rank: "'..group.parent..'"') end
|
||||
Ranking.groups[group.parent]:edit('allow',group.allow)
|
||||
group:edit('disallow',Ranking.groups[group.parent].disallow)
|
||||
end
|
||||
for _,name in pairs(group.ranks) do
|
||||
local rank = Ranking.ranks[name]
|
||||
rank:edit('disallow',group.disallow)
|
||||
rank:edit('allow',group.allow)
|
||||
if not group.highest or Ranking.ranks[group.highest].power > rank.power then group.highest = rank.name end
|
||||
if not group.lowest or Ranking.ranks[group.highest].power < rank.power then group.lowest = rank.name end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return Ranking
|
||||
@@ -1,7 +0,0 @@
|
||||
[ranking]
|
||||
all-rank-print=[Alle]: __1__
|
||||
rank-print=[__1__]: __2__
|
||||
rank-up=__1__ wurde befördert zu __2__ von __3__
|
||||
rank-down=__1__ wurde degradiert zu __2__ von __3__
|
||||
rank-given=Dir wurde der Rang __1__ zugeteilt!
|
||||
tag-reset=Dein Spitzname wurde aufgrund eines Rangwechsels zurückgesetzt.
|
||||
@@ -1,7 +0,0 @@
|
||||
[ranking]
|
||||
all-rank-print=[Everyone]: __1__
|
||||
rank-print=[__1__]: __2__
|
||||
rank-up=__1__ was promoted to __2__ by __3__
|
||||
rank-down=__1__ was demoted to __2__ by __3__
|
||||
rank-given=You have been given the __1__ Rank!
|
||||
tag-reset=Your Tag was reset due to a Rank change
|
||||
@@ -1,7 +0,0 @@
|
||||
[ranking]
|
||||
all-rank-print=[Everyone]: __1__
|
||||
rank-print=[__1__]: __2__
|
||||
rank-up=__1__ was promoted to __2__ by __3__
|
||||
rank-down=__1__ was demoted to __2__ by __3__
|
||||
rank-given=You have been given the __1__ Rank!
|
||||
tag-reset=Your Tag was reset due to a Rank change
|
||||
@@ -1,7 +0,0 @@
|
||||
[ranking]
|
||||
all-rank-print=[Everyone]: __1__
|
||||
rank-print=[__1__]: __2__
|
||||
rank-up=__1__ is gepromoot naar __2__ door __3__
|
||||
rank-down=__1__ is gedegradeerd naar __2__ door __3__
|
||||
rank-given=Je rank is veranderd naar __1__
|
||||
tag-reset=Je tag is gereset door een wijziging in je rank.
|
||||
@@ -1,7 +0,0 @@
|
||||
[ranking]
|
||||
all-rank-print=[Everyone]: __1__
|
||||
rank-print=[__1__]: __2__
|
||||
rank-up=__1__ blev befordrad till __2__ av __3__
|
||||
rank-down=__1__ blev degraderad till __2__ av __3__
|
||||
rank-given=Du har fått __1__ Rang!
|
||||
tag-reset=Din tag blev återställd på grund av rangförändrning.
|
||||
@@ -1,25 +0,0 @@
|
||||
{
|
||||
"name": "Ranking",
|
||||
"version": "4.0.0",
|
||||
"type": "Submodule",
|
||||
"description": "A full ranking system for factorio.",
|
||||
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/ExpGamingCore.Ranking_4.0.0.zip",
|
||||
"keywords": [
|
||||
"Library",
|
||||
"Lib",
|
||||
"ExpGaming",
|
||||
"Core",
|
||||
"Ranking",
|
||||
"Ranks",
|
||||
"Permissions",
|
||||
"Roles"
|
||||
],
|
||||
"dependencies": {
|
||||
"ExpGamingLib": "^4.0.0",
|
||||
"FactorioStdLib.Color": "^0.8.0",
|
||||
"FactorioStdLib.Table": "^0.8.0",
|
||||
"FactorioStdLib.Game": "^0.8.0",
|
||||
"ExpGamingCore.Server": "?^4.0.0"
|
||||
},
|
||||
"collection": "ExpGamingCore_4.0.0"
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
local Ranking = Ranking
|
||||
|
||||
commands.add_validation('player-rank',function(value,event)
|
||||
local player,err = commands.validate['player'](value)
|
||||
return err and commands.error(err)
|
||||
or Ranking.get_rank(player).power > Ranking.get_rank(event).power and player
|
||||
or commands.error{'commands.error-player-rank'}
|
||||
end)
|
||||
|
||||
commands.add_validation('player-rank-online',function(value,event)
|
||||
local player,err = commands.validate['player-online'](value)
|
||||
if err then return commands.error(err) end
|
||||
local player,err = commands.validate['player-rank'](player)
|
||||
if err then return commands.error(err) end
|
||||
return player
|
||||
end)
|
||||
|
||||
commands.add_validation('player-rank-alive',function(value,event)
|
||||
local player,err = commands.validate['player-alive'](value)
|
||||
if err then return commands.error(err) end
|
||||
local player,err = commands.validate['player-rank'](player)
|
||||
if err then return commands.error(err) end
|
||||
return player
|
||||
end)
|
||||
|
||||
commands.add_middleware(function(player_name,command_name,event)
|
||||
return Ranking.get_rank(player_name):allowed(command_name)
|
||||
end)
|
||||
@@ -1,112 +0,0 @@
|
||||
--[[
|
||||
How to use groups:
|
||||
name The name that you can use to reference it.
|
||||
disallow If present then all ranks in this group will have this added to their disallow.
|
||||
allow If present then all ranks in this group will have this added to their allow.
|
||||
highest Assigned by the script to show the highest rank in this group.
|
||||
lowest Assigned by the script to show the lowest rank in this group.
|
||||
How to add ranks:
|
||||
Name What will be used in the scripts and is often the best choice for display in text.
|
||||
short_hand What can be used when short on space but the rank still need to be displayed.
|
||||
tag The tag the player will gain when moved to the rank, it can be nil.
|
||||
time Used for auto-rank feature where you are moved to the rank after a certain play time in minutes.
|
||||
colour The RGB value that can be used to emphasise GUI elements based on rank.
|
||||
power Assigned by the script based on their index in ranks, you can insert new ranks between current ones.
|
||||
group Assigned by the script to show the group this rank is in.
|
||||
disallow A list containing input actions that the user can not perform.
|
||||
allow A list of custom commands and effects that that rank can use, all defined in the scripts.
|
||||
|
||||
For allow, add the allow as the key and the value as true
|
||||
Example: test for 'server-interface' => allow['server-interface'] = true
|
||||
|
||||
For disallow, add to the list the end part of the input action
|
||||
Example: defines.input_action.drop_item -> 'drop_item'
|
||||
http://lua-api.factorio.com/latest/defines.html#defines.input_action
|
||||
--]]
|
||||
|
||||
local groups = Ranking.groups
|
||||
local ranks = Ranking.ranks
|
||||
|
||||
groups['Root']:add_rank{
|
||||
name='Owner',
|
||||
short_hand='Owner',
|
||||
tag='[Owner]',
|
||||
parent='Root',
|
||||
time=nil,
|
||||
colour={r=170,g=0,b=0},
|
||||
is_admin = true,
|
||||
is_spectator=true,
|
||||
base_afk_time=false
|
||||
}
|
||||
groups['Root']:add_rank{
|
||||
name='Community Manager',
|
||||
short_hand='Com Mngr',
|
||||
tag='[Com Mngr]',
|
||||
parent='Root',
|
||||
colour={r=150,g=68,b=161},
|
||||
is_admin = true,
|
||||
is_spectator=true,
|
||||
base_afk_time=false
|
||||
}
|
||||
groups['Root']:add_rank{
|
||||
name='Developer',
|
||||
short_hand='Dev',
|
||||
tag='[Dev]',
|
||||
parent='Root',
|
||||
colour={r=179,g=125,b=46},
|
||||
is_admin = true,
|
||||
is_spectator=true,
|
||||
base_afk_time=false
|
||||
}
|
||||
|
||||
ranks['Admin']:edit('parent','Developer')
|
||||
groups['Admin']:add_rank{
|
||||
name='Mod',
|
||||
short_hand='Mod',
|
||||
tag='[Mod]',
|
||||
parent='Admin',
|
||||
colour={r=0,g=170,b=0},
|
||||
disallow={
|
||||
'server_command'
|
||||
},
|
||||
is_admin = true,
|
||||
is_spectator=true,
|
||||
base_afk_time=false
|
||||
}
|
||||
|
||||
groups['User']:add_rank{
|
||||
name='Donator',
|
||||
short_hand='P2W',
|
||||
tag='[P2W]',
|
||||
parent='Mod',
|
||||
colour={r=233,g=63,b=233},
|
||||
is_spectator=true,
|
||||
base_afk_time=120
|
||||
}
|
||||
groups['User']:add_rank{
|
||||
name='Veteran',
|
||||
short_hand='Vet',
|
||||
tag='[Veteran]',
|
||||
parent='Donator',
|
||||
time=600,
|
||||
colour={r=140,g=120,b=200},
|
||||
base_afk_time=60
|
||||
}
|
||||
ranks['Member']:edit('parent','Veteran')
|
||||
groups['User']:add_rank{
|
||||
name='Regular',
|
||||
short_hand='Reg',
|
||||
tag='[Regular]',
|
||||
parent='Member',
|
||||
time=180,
|
||||
colour={r=24,g=172,b=188},
|
||||
base_afk_time=30
|
||||
}
|
||||
ranks['Guest']:edit('parent','Regular')
|
||||
|
||||
Ranking._base_preset{
|
||||
['badgamernl']='Owner',
|
||||
['arty714']='Community Manager',
|
||||
['cooldude2606']='Developer',
|
||||
['mark9064']='Admin'
|
||||
}
|
||||
@@ -1,149 +0,0 @@
|
||||
--[[
|
||||
How to use groups:
|
||||
name the name that you can use to refence it.
|
||||
disallow if present then all ranks in this group will have this added to their disallow.
|
||||
allow if present then all ranks in this group will have this added to their allow.
|
||||
highest is asigned by the script to show the highest rank in this group.
|
||||
lowest is asigned by the script to show the lowest rank in this group.
|
||||
How to add ranks:
|
||||
Name is what will be used in the scripts and is often the best choice for display in text.
|
||||
short_hand is what can be used when short on space but the rank still need to be displayed.
|
||||
tag is the tag the player will gain when moved to the rank, it can be nil.
|
||||
time is used for auto-rank feature where you are moved to the rank after a certain play time in minutes.
|
||||
colour is the RGB value that can be used to emphasise GUI elements based on rank.
|
||||
power is asigned by the script based on their index in ranks, you can insert new ranks between current ones, lower is better
|
||||
group is asigned by the script to show the group this rank is in
|
||||
disallow is a list containing input actions that the user can not perform.
|
||||
allow is a list of custom commands and effects that that rank can use, all defined in the sctips.
|
||||
|
||||
For allow, add the allow as the key and the value as true
|
||||
Example: test for 'server-interface' => allow['server-interface'] = true
|
||||
|
||||
For disallow, add to the list the end part of the input action
|
||||
Example: defines.input_action.drop_item -> 'drop_item'
|
||||
http://lua-api.factorio.com/latest/defines.html#defines.input_action
|
||||
--]]
|
||||
|
||||
-- If you wish to add more groups please use src/config or add during your own module
|
||||
-- If you wish to add to these rank groups use src/config or add during your own module
|
||||
-- But groups do not inherite from each other
|
||||
-- DO NOT REMOVE ANY OF THESE GROUPS!!!
|
||||
|
||||
local root = Ranking._group:create{
|
||||
name='Root',
|
||||
allow={
|
||||
['interface'] = true
|
||||
},
|
||||
disallow={}
|
||||
}
|
||||
local admin = Ranking._group:create{
|
||||
name='Admin',
|
||||
parent='Root',
|
||||
allow={},
|
||||
disallow={
|
||||
'edit_permission_group',
|
||||
'delete_permission_group',
|
||||
'add_permission_group'
|
||||
}
|
||||
}
|
||||
local user = Ranking._group:create{
|
||||
name='User',
|
||||
parent='Admin',
|
||||
allow={},
|
||||
disallow={}
|
||||
}
|
||||
local jail = Ranking._group:create{
|
||||
name='Jail',
|
||||
parent='User',
|
||||
allow={},
|
||||
disallow={
|
||||
'open_character_gui',
|
||||
'begin_mining',
|
||||
'start_walking',
|
||||
'player_leave_game',
|
||||
'open_blueprint_library_gui',
|
||||
'build_item',
|
||||
'use_item',
|
||||
'select_item',
|
||||
'rotate_entity',
|
||||
'open_train_gui',
|
||||
'open_train_station_gui',
|
||||
'open_gui',
|
||||
'open_item',
|
||||
'deconstruct',
|
||||
'build_rail',
|
||||
'cancel_research',
|
||||
'start_research',
|
||||
'set_train_stopped',
|
||||
'select_gun',
|
||||
'open_technology_gui',
|
||||
'open_trains_gui',
|
||||
'edit_custom_tag',
|
||||
'craft',
|
||||
'setup_assembling_machine',
|
||||
}
|
||||
}
|
||||
|
||||
-- If you wish to add more ranks please use src/config or add during your own module
|
||||
-- If you wish to add to these rank use src/config or add during your own module
|
||||
root:add_rank{
|
||||
name='Root',
|
||||
short_hand='Root',
|
||||
tag='[Root]',
|
||||
colour={r=255,b=255,g=255},
|
||||
is_root=true,
|
||||
is_admin=true,
|
||||
is_spectator=true,
|
||||
base_afk_time=false
|
||||
}
|
||||
|
||||
admin:add_rank{
|
||||
name='Admin',
|
||||
short_hand='Admin',
|
||||
tag='[Admin]',
|
||||
parent='Root',
|
||||
colour={r=233,g=63,b=233},
|
||||
is_admin=true,
|
||||
is_spectator=true,
|
||||
base_afk_time=false
|
||||
}
|
||||
|
||||
user:add_rank{
|
||||
name='Member',
|
||||
short_hand='Mem',
|
||||
tag='[Member]',
|
||||
parent='Admin',
|
||||
colour={r=24,g=172,b=188},
|
||||
disallow={
|
||||
'set_auto_launch_rocket',
|
||||
'change_programmable_speaker_alert_parameters',
|
||||
'drop_item'
|
||||
},
|
||||
base_afk_time=60
|
||||
}
|
||||
user:add_rank{
|
||||
name='Guest',
|
||||
short_hand='',
|
||||
tag='',
|
||||
parent='Member',
|
||||
colour={r=255,g=159,b=27},
|
||||
is_default=true,
|
||||
disallow={
|
||||
'build_terrain',
|
||||
'remove_cables',
|
||||
'launch_rocket',
|
||||
'reset_assembling_machine',
|
||||
'cancel_research'
|
||||
},
|
||||
base_afk_time=10
|
||||
}
|
||||
|
||||
jail:add_rank{
|
||||
name='Jail',
|
||||
short_hand='Jail',
|
||||
tag='[Jail]',
|
||||
parent='Guest',
|
||||
colour={r=50,g=50,b=50},
|
||||
disallow={},
|
||||
base_afk_time=false
|
||||
}
|
||||
@@ -1,51 +0,0 @@
|
||||
--- A full ranking system for factorio.
|
||||
-- @submodule ExpGamingCore.Ranking
|
||||
-- @alias Ranking
|
||||
-- @author Cooldude2606
|
||||
-- @license https://github.com/explosivegaming/scenario/blob/master/LICENSE
|
||||
|
||||
--- This file will be loaded when ExpGamingCore.Server is present
|
||||
-- @function _comment
|
||||
|
||||
local Game = require('FactorioStdLib.Game')
|
||||
local Color = require('FactorioStdLib.Color')
|
||||
local Server = require('ExpGamingCore.Server')
|
||||
local Ranking = Ranking
|
||||
|
||||
--- Print a message to all players of this rank
|
||||
-- @usage rank:print('foo') -- prints to all members of this rank
|
||||
-- @param rtn any value you want to return
|
||||
-- @tparam[opt=defines.color.white] define.color colour the colour that will be used to print
|
||||
-- @tparam[opt=false] boolean show_default weather to use the default rank name for the print, used as a pass though
|
||||
function Ranking._rank:print(rtn,colour,show_default)
|
||||
local colour = colour or defines.color.white
|
||||
local default = Ranking.get_rank(Ranking.meta.default)
|
||||
Server.new_thread{
|
||||
data={rank=self,rtn=rtn,default=default.name,all=show_default}
|
||||
}:on_event('resolve',function(thread)
|
||||
return thread.data.rank:get_players(true)
|
||||
end):on_event('success',function(thread,players)
|
||||
for _,player in pairs(players) do
|
||||
if thread.data.rank.name == thread.data.default or thread.data.all then
|
||||
player_return({'ranking.all-rank-print',thread.data.rtn},colour,player)
|
||||
else
|
||||
player_return({'ranking.rank-print',thread.data.rank.name,thread.data.rtn},colour,player)
|
||||
end
|
||||
end
|
||||
end):queue()
|
||||
end
|
||||
|
||||
script.on_event('on_tick',function(event)
|
||||
if (((event.tick+10)/(3600*game.speed))+(15/2))% 15 == 0 then
|
||||
Server.new_thread{
|
||||
data={players=game.connected_players}
|
||||
}:on_event('tick',function(thread)
|
||||
if #thread.data.players == 0 then thread:close() return end
|
||||
local player = table.remove(thread.data.players,1)
|
||||
Ranking.find_preset(player,tick)
|
||||
end):open()
|
||||
end
|
||||
end)
|
||||
|
||||
Server.add_to_interface('rank',function() return Ranking.get_rank(game.player) end)
|
||||
Server.add_module_to_interface('Ranking','ExpGamingCore.Ranking')
|
||||
@@ -1,10 +1,13 @@
|
||||
Role.add_flag('is_default') -- this must be included in atleast one role
|
||||
Role.add_flag('is_root',function(player,state) player.character.destructible = not state end) -- not required but setting true will allow everythin for that role
|
||||
Role.add_flag('is_antiroot',function(player,state) player.character.destructible = not state end) -- not required but setting true will disallow everythin for that role
|
||||
Role.add_flag('is_admin',function(player,state) player.admin = state end) -- highly recomented but not required
|
||||
Role.add_flag('is_spectator',function(player,state) player.spectator = state end)
|
||||
Role.add_flag('is_jail',function(player,state) player.character.active = not state end)
|
||||
Role.add_flag('is_donator')
|
||||
Role.add_flag('is_timed')
|
||||
Role.add_flag('is_varified')
|
||||
Role.add_flag('not_reportable')
|
||||
|
||||
-- Root
|
||||
Role{
|
||||
@@ -16,6 +19,7 @@ Role{
|
||||
is_root=true,
|
||||
is_admin=true,
|
||||
is_spectator=true,
|
||||
not_reportable=true,
|
||||
allow={}
|
||||
}
|
||||
Role{
|
||||
@@ -53,6 +57,7 @@ Role{
|
||||
colour={r=233,g=63,b=233},
|
||||
is_admin=true,
|
||||
is_spectator=true,
|
||||
not_reportable=true,
|
||||
allow={
|
||||
['game-settings']=true,
|
||||
['always-warp']=true,
|
||||
@@ -67,6 +72,7 @@ Role{
|
||||
colour={r=0,g=170,b=0},
|
||||
is_admin=true,
|
||||
is_spectator=true,
|
||||
not_reportable=true,
|
||||
allow={
|
||||
['set-home']=true,
|
||||
['home']=true,
|
||||
@@ -82,6 +88,7 @@ Role{
|
||||
group='Admin',
|
||||
colour={r=0,g=196,b=137},
|
||||
is_spectator=true,
|
||||
not_reportable=true,
|
||||
allow={
|
||||
['go-to']=true,
|
||||
['bring']=true,
|
||||
@@ -153,6 +160,7 @@ Role{
|
||||
group='HiMember',
|
||||
colour={r=140,g=120,b=200},
|
||||
is_timed=true,
|
||||
is_varified=true,
|
||||
time=600, -- 10 hours
|
||||
allow={
|
||||
['global-chat']=true,
|
||||
@@ -169,6 +177,7 @@ Role{
|
||||
tag='[Member]',
|
||||
group='Member',
|
||||
colour={r=24,g=172,b=188},
|
||||
is_varified=true,
|
||||
allow={
|
||||
['edit-tasklist']=true,
|
||||
['make-warp']=true,
|
||||
@@ -223,6 +232,7 @@ Role{
|
||||
group='Jail',
|
||||
colour={r=50,g=50,b=50},
|
||||
is_jail=true,
|
||||
is_antiroot=true,
|
||||
allow={}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
--- Adds roles where a player can have more than one role
|
||||
-- @module ExpGamingCore.Role@4.0.0
|
||||
-- @author Cooldude2606
|
||||
-- @license https://github.com/explosivegaming/scenario/releases/download/v4.0-core/ExpGamingCore.Ranking_4.0.0.zip
|
||||
-- @license https://github.com/explosivegaming/scenario/releases/download/v4.0-core/ExpGamingCore.Role_4.0.0.zip
|
||||
-- @alais Role
|
||||
|
||||
-- Module Require
|
||||
@@ -18,7 +18,7 @@ local Role = {
|
||||
order={},
|
||||
flags={},
|
||||
actions={},
|
||||
meta={times={}},
|
||||
meta={times={},groups={}},
|
||||
roles=setmetatable({},{
|
||||
__index=table.autokey,
|
||||
__newindex=function(tbl,key,value)
|
||||
@@ -39,6 +39,9 @@ local Role = {
|
||||
if not role then error('Invalid role name in order listing: '..role_name) return end
|
||||
if role.is_default then self.meta.default = role end
|
||||
if role.is_timed then self.meta.times[role.name] = {index,role.time} end
|
||||
if not self.meta.groups[role.group.name] then self.meta.groups[role.group.name] = {lowest=index,highest=index} end
|
||||
if self.meta.groups[role.group.name].highest > index then self.meta.groups[role.group.name].highest = index end
|
||||
if self.meta.groups[role.group.name].lowest < index then self.meta.groups[role.group.name].lowest = index end
|
||||
if previous then setmetatable(previous.allow,{__index=role.allow}) end
|
||||
role.index = index
|
||||
previous = role
|
||||
@@ -52,6 +55,7 @@ local Role = {
|
||||
local global = global{
|
||||
change_chache_length=15,
|
||||
changes={},
|
||||
latest_change={},
|
||||
preassign={},
|
||||
players={},
|
||||
roles={}
|
||||
@@ -118,14 +122,14 @@ function Role.assign(player,role,by_player,no_log)
|
||||
if is_type(role,'table') and not role.name then
|
||||
local ctn = 0
|
||||
for _,_role in ipairs(role) do ctn=ctn+1 Role.assign(player,_role,by_player,true) end
|
||||
if ctn > 0 then if not no_log then table.insert(global.changes[player.index],{'assign',role}) end return end
|
||||
if ctn > 0 then if not no_log then table.insert(global.changes[player.index],{'assign',role}) global.latest_change = {player.index,'assign',role} end return end
|
||||
end
|
||||
local role = Role.get(role)
|
||||
if not role then error('Invalid role #2 given to Role.assign.',2) return end
|
||||
-- this acts as a way to provent the global table getting too full
|
||||
if not global.changes[player.index] then global.changes[player.index]={} end
|
||||
if #global.changes[player.index] > global.change_chache_length then table.remove(global.changes[player.index],1) end
|
||||
if not no_log then table.insert(global.changes[player.index],{'assign',role.name}) end
|
||||
if not no_log then table.insert(global.changes[player.index],{'assign',role.name}) global.latest_change = {player.index,'assign',role.name} end
|
||||
return role:add_player(player,by_player)
|
||||
end
|
||||
|
||||
@@ -143,14 +147,14 @@ function Role.unassign(player,role,by_player,no_log)
|
||||
if is_type(role,'table') and not role.name then
|
||||
local ctn = 0
|
||||
for _,_role in ipairs(role) do ctn=ctn+1 Role.unassign(player,_role,by_player,true) end
|
||||
if ctn > 0 then if not no_log then table.insert(global.changes[player.index],{'unassign',role}) end return end
|
||||
if ctn > 0 then if not no_log then table.insert(global.changes[player.index],{'unassign',role}) global.latest_change = {player.index,'unassign',role} end return end
|
||||
end
|
||||
local role = Role.get(role)
|
||||
if not role then error('Invalid role #2 given to Role.unassign.',2) return end
|
||||
if not global.changes[player.index] then global.changes[player.index]={} end
|
||||
-- this acts as a way to provent the global table getting too full
|
||||
if #global.changes[player.index] > global.change_chache_length then table.remove(global.changes[player.index],1) end
|
||||
if not no_log then table.insert(global.changes[player.index],{'unassign',role.name}) end
|
||||
if not no_log then table.insert(global.changes[player.index],{'unassign',role.name}) global.latest_change = {player.index,'unassign',role.name} end
|
||||
return role:remove_player(player,by_player)
|
||||
end
|
||||
|
||||
@@ -306,6 +310,7 @@ end
|
||||
function Role._prototype:allowed(action)
|
||||
if not self_test(self,'role','allowed') then return end
|
||||
if not type_error(action,'string','Invalid argument #1 to role:allowed, action is not a string.') then return end
|
||||
if self.is_antiroot then return false end
|
||||
return self.allow[action] or self.is_root or false -- still include is_root exception flag
|
||||
end
|
||||
|
||||
@@ -379,8 +384,7 @@ function Role._prototype:add_player(player,by_player)
|
||||
if not self_test(self,'role','add_player') then return end
|
||||
local player = Game.get_player(player)
|
||||
if not player then error('Invalid player #1 given to role:add_player.',2) return end
|
||||
local by_player = Game.get_player(by_player)
|
||||
if not by_player then by_player = {name='<server>',index=0} end
|
||||
local by_player = Game.get_player(by_player) or SERVER
|
||||
if not global.roles[self.name] then global.roles[self.name] = {} end
|
||||
if not global.players[player.index] then global.players[player.index] = {} end
|
||||
local highest = Role.get_highest(player) or Role.meta.default
|
||||
@@ -405,7 +409,7 @@ function Role._prototype:remove_player(player,by_player)
|
||||
if not self_test(self,'role','add_player') then return end
|
||||
local player = Game.get_player(player)
|
||||
if not player then error('Invalid player #1 given to role:remove_player.',2) return end
|
||||
local by_player = Game.get_player(by_player) or {name='<server>',index=0}
|
||||
local by_player = Game.get_player(by_player) or SERVER
|
||||
if not global.roles[self.name] then global.roles[self.name] = {} end
|
||||
if not global.players[player.index] then global.players[player.index] = {} end
|
||||
local highest = Role.get_highest(player) or Role.meta.default
|
||||
@@ -429,7 +433,7 @@ end
|
||||
script.on_event(role_change_event_id,function(event)
|
||||
-- varible init
|
||||
local player = Game.get_player(event)
|
||||
local by_player = Game.get_player(event.by_player_index) or {name='<server>',index=0}
|
||||
local by_player = Game.get_player(event.by_player_index) or SERVER
|
||||
local role = Role.get(event.role_name)
|
||||
local highest = Role.get_highest(player) or {__faild=true,tag='',name='None'}
|
||||
-- gets the falgs the player currently has
|
||||
@@ -437,7 +441,10 @@ script.on_event(role_change_event_id,function(event)
|
||||
-- assign new tag and group of highest role
|
||||
if highest.__faild then Group.get(player):remove_player(player)
|
||||
else Group.assign(player,highest.group) end
|
||||
if player.tag ~= highest.tag then player.tag = highest.tag player.print{'ExpGamingCore-Role.tag-reset'} end
|
||||
local old_highest_tag = Role.get(event.old_highest).tag or ''
|
||||
local start, _end = string.find(player.tag,old_highest_tag,1,true)
|
||||
if start and old_highest_tag ~= highest.tag then player.tag = string.sub(player.tag,0,start-1)..highest.tag..string.sub(player.tag,_end+1) end
|
||||
if not start then player.tag = highest.tag player_return({'ExpGamingCore-Role.tag-reset'},nil,player) end
|
||||
-- play a sound to the player
|
||||
if event.effect == 'assign' and not role.is_jail then player.play_sound{path='utility/achievement_unlocked'}
|
||||
else player.play_sound{path='utility/game_lost'} end
|
||||
@@ -454,6 +461,7 @@ script.on_event(role_change_event_id,function(event)
|
||||
by_player_name=by_player.name,
|
||||
role_name=role.name,
|
||||
highest_role_name=highest.name,
|
||||
old_highest=event.highest,
|
||||
effect=event.effect
|
||||
})..'\n'
|
||||
, true, 0)
|
||||
|
||||
@@ -177,24 +177,24 @@ function Sync.count_afk_times(time)
|
||||
return rtn
|
||||
end
|
||||
|
||||
--- Used to get the number of players in each rank and currently online; if ExpGamingCore/Ranking is present then it will give more than admin and user
|
||||
-- @usage Sync.count_ranks()
|
||||
--- Used to get the number of players in each rank and currently online; if ExpGamingCore/Role is present then it will give more than admin and user
|
||||
-- @usage Sync.count_roles()
|
||||
-- @treturn table contains the ranks and the players in that rank
|
||||
function Sync.count_ranks()
|
||||
function Sync.count_roles()
|
||||
if not game then return {'Offline'} end
|
||||
local _ranks = {admin={online={},players={}},user={online={},players={}}}
|
||||
local _roles = {admin={online={},players={}},user={online={},players={}}}
|
||||
for index,player in pairs(game.players) do
|
||||
if player.admin then
|
||||
table.insert(_ranks.admin.players,player.name)
|
||||
if player.connected then table.insert(_ranks.admin.online,player.name) end
|
||||
table.insert(_roles.admin.players,player.name)
|
||||
if player.connected then table.insert(_roles.admin.online,player.name) end
|
||||
else
|
||||
table.insert(_ranks.user.players,player.name)
|
||||
if player.connected then table.insert(_ranks.user.online,player.name) end
|
||||
table.insert(_roles.user.players,player.name)
|
||||
if player.connected then table.insert(_roles.user.online,player.name) end
|
||||
end
|
||||
end
|
||||
_ranks.admin.n_players,_ranks.admin.n_online=#_ranks.admin.players,#_ranks.admin.online
|
||||
_ranks.user.n_players,_ranks.user.n_online=#_ranks.user.players,#_ranks.user.online
|
||||
return _ranks
|
||||
_roles.admin.n_players,_roles.admin.n_online=#_roles.admin.players,#_roles.admin.online
|
||||
_roles.user.n_players,_roles.user.n_online=#_roles.user.players,#_roles.user.online
|
||||
return _roles
|
||||
end
|
||||
|
||||
--- Used to get a list of every player name with the option to limit to only online players
|
||||
@@ -255,7 +255,7 @@ function Sync.update()
|
||||
afk_players=Sync.count_afk_times(),
|
||||
times=Sync.count_player_times()
|
||||
}
|
||||
info.ranks = Sync.count_ranks()
|
||||
info.ranks = Sync.count_roles()
|
||||
info.rockets = game.forces['player'].get_item_launched('satellite')
|
||||
for key,callback in pairs(Sync_updates) do info[key] = callback() end
|
||||
return info
|
||||
@@ -310,7 +310,7 @@ script.on_event('on_rocket_launched',Sync.emit_update)
|
||||
|
||||
function Sync:on_init()
|
||||
if loaded_modules['ExpGamingCore.Gui'] then verbose('ExpGamingCore.Gui is installed; Loading gui src') require(module_path..'/src/gui',{Sync=Sync}) end
|
||||
if loaded_modules['ExpGamingCore.Ranking'] then verbose('ExpGamingCore.Ranking is installed; Loading ranking src') require(module_path..'/src/ranking',{Sync=Sync}) end
|
||||
if loaded_modules['ExpGamingCore.Role'] then verbose('ExpGamingCore.Role is installed; Loading role src') require(module_path..'/src/ranking',{Sync=Sync}) end
|
||||
if loaded_modules['ExpGamingCore.Server'] then require('ExpGamingCore.Server').add_module_to_interface('Sync','ExpGamingCore.Sync') end
|
||||
end
|
||||
|
||||
|
||||
@@ -4,55 +4,55 @@
|
||||
-- @author Cooldude2606
|
||||
-- @license https://github.com/explosivegaming/scenario/blob/master/LICENSE
|
||||
|
||||
--- This file will be loaded when ExpGamingCore.Ranking is present
|
||||
--- This file will be loaded when ExpGamingCore.Role is present
|
||||
-- @function _comment
|
||||
|
||||
local Game = require('FactorioStdLib.Game')
|
||||
local Color = require('FactorioStdLib.Color')
|
||||
local Ranking = require('ExpGamingCore.Ranking')
|
||||
local Role = require('ExpGamingCore.Role')
|
||||
|
||||
--- Used as a redirect to Ranking._base_preset that will set the rank given to a player apon joining
|
||||
-- @usage Sync.set_ranks{player_name=rank_name,...}
|
||||
function Sync.set_ranks(...)
|
||||
Ranking._base_preset(...)
|
||||
--- Used as a redirect to Role._base_preset that will set the rank given to a player apon joining
|
||||
-- @usage Sync.set_roles{player_name=rank_name,...}
|
||||
function Sync.set_roles(...)
|
||||
Role._base_preset(...)
|
||||
end
|
||||
|
||||
--- Used to get the number of players in each rank and currently online
|
||||
-- @usage Sync.count_ranks()
|
||||
-- @usage Sync.count_roles()
|
||||
-- @treturn table contains the ranks and the players in that rank
|
||||
function Sync.count_ranks()
|
||||
function Sync.count_roles()
|
||||
if not game then return {'Offline'} end
|
||||
local _ranks = {}
|
||||
for name,rank in pairs(Ranking.ranks) do
|
||||
local players = rank:get_players()
|
||||
local _roles = {}
|
||||
for name,role in pairs(Role.roles) do
|
||||
local players = role:get_players()
|
||||
for k,player in pairs(players) do players[k] = player.name end
|
||||
local online = rank:get_players(true)
|
||||
local online = role:get_players(true)
|
||||
for k,player in pairs(online) do online[k] = player.name end
|
||||
_ranks[rank.name] = {players=players,online=online,n_players=#players,n_online=#online}
|
||||
_roles[role.name] = {players=players,online=online,n_players=#players,n_online=#online}
|
||||
end
|
||||
return _ranks
|
||||
return _roles
|
||||
end
|
||||
|
||||
-- Adds a caption to the info gui that shows the rank given to the player
|
||||
if Sync.add_to_gui then
|
||||
Sync.add_to_gui(function(player,frame)
|
||||
return 'You have been assigned the rank \''..Ranking.get_rank(player).name..'\''
|
||||
return 'You have been assigned the rank \''..Role.get_highest(player).name..'\''
|
||||
end)
|
||||
end
|
||||
|
||||
-- adds a discord emit for rank chaning
|
||||
script.on_event('on_rank_change',function(event)
|
||||
local rank = Ranking.get_rank(event.new_rank)
|
||||
script.on_event('on_role_change',function(event)
|
||||
local role = Role.get(event.role_name)
|
||||
local player = Game.get_player(event)
|
||||
local by_player_name = Game.get_player(event.by_player_index) or '<server>'
|
||||
local global = global.Ranking
|
||||
if rank.group.name == 'Jail' and global.last_change ~= player.name then
|
||||
local by_player = Game.get_player(event.by_player_index) or SERVER
|
||||
local global = global['ExpGamingCore.Role^4.0.0']
|
||||
if role.is_jail == 'Jail' and global.last_change[1] ~= player.index then
|
||||
Sync.emit_embeded{
|
||||
title='Player Jail',
|
||||
color=Color.to_hex(defines.textcolor.med),
|
||||
description='There was a player jailed.',
|
||||
['Player:']='<<inline>>'..player.name,
|
||||
['By:']='<<inline>>'..by_player_name,
|
||||
['By:']='<<inline>>'..by_player.name,
|
||||
['Reason:']='No Reason'
|
||||
}
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user