mirror of
https://github.com/PHIDIAS0303/ExpCluster.git
synced 2025-12-27 11:35:22 +09:00
feat: role deference in Roles module itself
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -115,7 +115,6 @@ 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 = {},
|
||||
@@ -125,7 +124,8 @@ local Roles = {
|
||||
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
|
||||
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
|
||||
assign_later[role] = 1
|
||||
end
|
||||
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
|
||||
@@ -413,12 +417,32 @@ function Roles.unassign_player(player, roles, by_player_name, skip_checks, silen
|
||||
if type(roles) ~= 'table' or roles.name then
|
||||
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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user