From 3f42681ddc1b8e6289fce243b37debf106f9887a Mon Sep 17 00:00:00 2001 From: oof2win2 Date: Sun, 13 Nov 2022 08:42:18 +0100 Subject: [PATCH] feat: role deference in Roles module itself --- config/expcore/roles.lua | 1 + expcore/roles.lua | 56 ++++++++++++++++++++++--------- modules/control/jail.lua | 26 ++------------ modules/control/jail_old_role.lua | 13 ------- 4 files changed, 44 insertions(+), 52 deletions(-) delete mode 100644 modules/control/jail_old_role.lua diff --git a/config/expcore/roles.lua b/config/expcore/roles.lua index 3f6dd512..20feeb14 100644 --- a/config/expcore/roles.lua +++ b/config/expcore/roles.lua @@ -267,6 +267,7 @@ Roles.new_role('Jail') :set_permission_group('Restricted') :set_custom_color{r=50,g=50,b=50} :set_block_auto_assign(true) +:set_flag("defer_role_changes") :disallow(default.allowed) --- System defaults which are required to be set diff --git a/expcore/roles.lua b/expcore/roles.lua index a7ec1a9e..acbf9b28 100644 --- a/expcore/roles.lua +++ b/expcore/roles.lua @@ -115,17 +115,17 @@ local Groups = require 'expcore.permission_groups' --- @dep expcore.permission_g local Async = require 'expcore.async' --- @dep expcore.async local Colours = require 'utils.color_presets' --- @dep utils.color_presets local write_json = _C.write_json --- @dep expcore.common -local JailOldRole = require 'modules.control.jail_old_role' --- @dep modules.control.jail local Roles = { - _prototype={}, - config={ - order = {}, -- Contains the order of the roles, lower index is better - roles = {}, -- Contains the raw info for the roles, indexed by role name - flags = {}, -- Contains functions that run when a flag is added/removed from a player - internal = {}, -- Contains all internally accessed roles, such as root, default - players = {}, -- Contains the roles that players have - auto_assign = {} -- Contains references to all roles which have auto assign conditions + _prototype = {}, + config = { + order = {}, -- Contains the order of the roles, lower index is better + roles = {}, -- Contains the raw info for the roles, indexed by role name + flags = {}, -- Contains functions that run when a flag is added/removed from a player + internal = {}, -- Contains all internally accessed roles, such as root, default + players = {}, -- Contains the roles that players have + auto_assign = {}, -- Contains references to all roles which have auto assign conditions + deferred_roles = {}, -- Contains the roles that are to be assigned to players when they are unjailed }, events = { on_role_assigned = script.generate_event_name(), @@ -137,6 +137,9 @@ local Roles = { Global.register(Roles.config.players, function(tbl) Roles.config.players = tbl end) +Global.register(Roles.config.deferred_roles, function(tbl) + Roles.config.deferred_roles = tbl +end) --- Getter. -- Functions which get roles @@ -371,16 +374,17 @@ function Roles.assign_player(player, roles, by_player_name, skip_checks, silent) if type(roles) ~= 'table' or roles.name then roles = { roles } end - if Roles.player_has_role(player, "Jail") then - local to_assign = JailOldRole.old_roles[valid_player.name] or {} + + -- if the player has a role that needs to defer the role changes, save the roles that need to be assigned later into a table + if valid_player and Roles.player_has_flag(player, "defer_role_changes") then + local assign_later = Roles.config.deferred_roles[valid_player.name] or {} for _, role in ipairs(roles) do - if not to_assign[role] then - to_assign[role] = 1 - end + assign_later[role] = 1 end - JailOldRole.old_roles[valid_player.name] = to_assign + Roles.config.deferred_roles[valid_player.name] = assign_later return end + for _, role in ipairs(roles) do role = Roles.get_role_from_any(role) if role then @@ -411,14 +415,34 @@ function Roles.unassign_player(player, roles, by_player_name, skip_checks, silen if not skip_checks and not valid_player then return end if not player then return end if type(roles) ~= 'table' or roles.name then - roles = {roles} + roles = { roles } end + + local had_deferred_changes = false + for _, role in ipairs(roles) do role = Roles.get_role_from_any(role) if role then + if role:has_flag("defer_role_changes") then + had_deferred_changes = true + end role:remove_player(valid_player or player, valid_player == nil, true) end end + + + -- if there are deferred role changes, apply them now + if had_deferred_changes then + local assign_later = Roles.config.deferred_roles[player.name] or {} + log(serpent.line(assign_later)) + for role_name, _ in pairs(assign_later) do + local role = Roles.get_role_from_any(role_name) + if role then + role:add_player(valid_player or player, valid_player == nil, true) + end + end + end + if valid_player then emit_player_roles_updated(valid_player, 'unassign', roles, by_player_name, silent) end diff --git a/modules/control/jail.lua b/modules/control/jail.lua index 120ad2c8..b5bf7df4 100644 --- a/modules/control/jail.lua +++ b/modules/control/jail.lua @@ -18,10 +18,9 @@ local Roles = require 'expcore.roles' --- @dep expcore.roles local Game = require 'utils.game' --- @dep utils.game -local JailOldRole = require 'modules.control.jail_old_role' --- @dep modules.control.jail_old_role local valid_player = Game.get_player_from_any -local assign_role = Roles.assign_player +local assign_roles = Roles.assign_player local unassign_roles = Roles.unassign_player local has_role = Roles.player_has_role local get_roles = Roles.get_player_roles @@ -83,11 +82,6 @@ function Jail.jail_player(player, by_player_name, reason) if has_role(player, 'Jail') then return end local roles = get_roles(player) - local old_roles = {} - for _, role in ipairs(roles) do - old_roles[role.name] = 1 - end - JailOldRole.old_roles[player.name] = old_roles player.walking_state = { walking = false } player.riding_state = { acceleration = defines.riding.acceleration.nothing, direction = player.riding_state.direction } @@ -96,8 +90,9 @@ function Jail.jail_player(player, by_player_name, reason) player.picking_state = false player.repair_state = { repairing = false } - assign_role(player, 'Jail', by_player_name, nil, true) unassign_roles(player, roles, by_player_name, nil, true) + assign_roles(player, 'Jail', by_player_name, nil, true) + assign_roles(player, roles, by_player_name, nil, true) event_emit(Jail.events.on_player_jailed, player, by_player_name, reason) @@ -114,27 +109,12 @@ function Jail.unjail_player(player, by_player_name) if not by_player_name then return end if not has_role(player, 'Jail') then return end - local roles = JailOldRole.old_roles[player.name] or {} unassign_roles(player, 'Jail', by_player_name, nil, true) - for role, _ in pairs(roles) do - assign_role(player, role, by_player_name, nil, true) - end event_emit(Jail.events.on_player_unjailed, player, by_player_name) return true end -function Jail.add_old_role(player, to_assign) - player = valid_player(player) - if not player then return end - - if not has_role(player, 'Jail') then return end - local roles = JailOldRole.old_roles[player.name] - if not roles then return end - - table.insert(roles, to_assign) -end - return Jail diff --git a/modules/control/jail_old_role.lua b/modules/control/jail_old_role.lua deleted file mode 100644 index 0bf5d836..00000000 --- a/modules/control/jail_old_role.lua +++ /dev/null @@ -1,13 +0,0 @@ -local Global = require 'utils.global' --- @dep utils.global - -local Jail = { - old_roles = {} -} - -local old_roles = Jail.old_roles -Global.register(old_roles, function(tbl) - Jail.old_roles = tbl - old_roles = tbl -end) - -return Jail