Converted Modules To Use Roles

This commit is contained in:
Cooldude2606
2018-09-29 17:28:07 +01:00
parent 96784009b6
commit e50bd509f8
48 changed files with 277 additions and 1146 deletions

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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.

View File

@@ -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

View File

@@ -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

View File

@@ -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.

View File

@@ -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.

View File

@@ -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"
}

View File

@@ -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)

View File

@@ -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'
}

View File

@@ -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
}

View File

@@ -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')

View File

@@ -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={}
}

View File

@@ -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)

View File

@@ -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

View File

@@ -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