Move the scenario onto exp_roles and remove the legacy role system

Every call site of expcore.roles now uses exp_roles, and the legacy module,
its config, and the glue which refreshed guis on role events are deleted.
Where a file only renamed the require and the permission strings the change is
mechanical; the rest:

- Jail is now "give the Jail role" and unjail "take it away". The role has a
  higher priority than every other so holding it suppresses them, which is
  what stashing and restoring the roles was for.
- The command role authority derives exp_scenario.command.<name> from the
  command name, and the role parsers use player_outranks rather than comparing
  indexes with their own root check.
- The admin and spectator triggers, and the gui refresh on role changes, live
  in exp_scenario/control/roles.lua; the system commands trigger stays with
  the command authority.
- The player list warn button is keyed on create_warning, the permission
  the command behind it already required, and report on create_report. Both
  were keyed on names no role held, so only root ever saw them.
- The warps and tasks configs say exp_roles where they said expcore.roles.
- The role tables the readme and player list read are replaced by
  get_player_names and get_roles.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
bbassie
2026-08-19 11:36:58 +00:00
co-authored by Claude Fable 5
parent eb715cc176
commit 7034f17b5d
53 changed files with 204 additions and 1776 deletions
@@ -22,10 +22,8 @@ return {
--- GUI
"modules.gui.warp-list",
"modules.gui.vlayer",
"modules.gui._role_updates",
"modules.graftorio.require", -- graftorio
--- Config Files
"config.expcore.permission_groups", -- loads some predefined permission groups
"config.expcore.roles", -- loads some predefined roles
}
+3 -2
View File
@@ -1,4 +1,4 @@
local Roles = require("modules.exp_legacy.expcore.roles")
local Roles = require("modules/exp_roles")
return {
admin_as_active = true, --- @setting admin_as_active When true admins will be treated as active regardless of afk time
@@ -8,6 +8,7 @@ return {
trust_time = 3600 * 60 * 10, --- @setting trust_time The time in ticks that a player must be online for to count as trusted
update_time = 3600 * 30, --- @setting update_time How often in ticks the script checks for active players
custom_active_check = function(player)
return Roles.get_player_highest_role(player).index <= Roles.get_role_from_any("Veteran").index
local veteran = Roles.get_role("Veteran")
return veteran ~= nil and Roles.get_player_highest_role(player).index <= veteran.index
end,
}
+1 -1
View File
@@ -65,7 +65,7 @@ return {
},
allow_command_prefix_for_messages = true, --- @setting allow_command_prefix_for_messages when true any message trigger will print to all player when prefixed
command_admin_only = false, --- @setting command_admin_only when true will only allow chat commands for admins
command_permission = "command/chat-commands", --- @setting command_permission the permission used to allow command prefixes
command_permission = "exp_scenario.chat.commands", --- @setting command_permission the permission used to allow command prefixes
command_prefix = "!", --- @setting command_prefix prefix used for commands below and to print to all players (if enabled above)
--- @type table<string, LocalisedString | fun(player: LuaPlayer, is_command: boolean): LocalisedString>
commands = { --- @setting commands will trigger only when command prefix is given
-363
View File
@@ -1,363 +0,0 @@
--- This is the main config file for the role system; file includes defines for roles and role flags and default values
-- @config Roles
local Roles = require("modules.exp_legacy.expcore.roles") --- @dep expcore.roles
local PlayerData = require("modules.exp_legacy.expcore.player_data") --- @dep expcore.player_data
local Statistics = PlayerData.Statistics
--- Role flags that will run when a player changes roles
Roles.define_flag_trigger("is_admin", function(player, state)
player.admin = state
end)
Roles.define_flag_trigger("is_spectator", function(player, state)
player.spectator = state
end)
Roles.define_flag_trigger("is_jail", function(player, state)
if player.character then
player.character.disabled_by_script = not state
end
end)
--- Admin Roles
Roles.new_role("System", "SYS")
:set_permission_group("Default", true)
:set_flag("is_admin")
:set_flag("is_system")
:set_flag("is_spectator")
:set_flag("report-immune")
:set_flag("instant-respawn")
:set_allow_all()
Roles.new_role("Senior Administrator", "SAdmin")
:set_permission_group("Admin")
:set_custom_color{ r = 233, g = 63, b = 233 }
:set_flag("is_admin")
:set_flag("is_system")
:set_flag("is_spectator")
:set_flag("report-immune")
:set_flag("instant-respawn")
:set_parent("Administrator")
:allow{
"command/_rcon",
"command/debug",
"command/set-cheat-mode",
"command/research-all",
}
Roles.new_role("Administrator", "Admin")
:set_permission_group("Admin")
:set_custom_color{ r = 233, g = 63, b = 233 }
:set_flag("is_admin")
:set_flag("is_spectator")
:set_flag("report-immune")
:set_flag("instant-respawn")
:set_parent("Moderator")
:allow{
"gui/warp-list/bypass-proximity",
"gui/warp-list/bypass-cooldown",
"command/connect-all",
}
Roles.new_role("Moderator", "Mod")
:set_permission_group("Admin")
:set_custom_color{ r = 0, g = 170, b = 0 }
:set_flag("is_admin")
:set_flag("is_spectator")
:set_flag("report-immune")
:set_flag("instant-respawn")
:set_parent("Trainee")
:allow{
"command/assign-role",
"command/unassign-role",
"command/repair",
"command/kill/always",
"command/clear-tag/always",
"command/spawn/always",
"command/clear-reports",
"command/clear-warnings",
"command/clear-script-warnings",
"command/clear-last-warnings",
"command/clear-inventory",
"command/kill-enemies",
"command/remove-enemies",
"command/home",
"command/set-home",
"command/get-home",
"command/return",
"command/connect-player",
"command/set-bot-queue",
"command/set-game-speed",
"command/set-friendly-fire",
"command/set-always-day",
"command/set-pollution-enabled",
"command/clear-pollution",
"gui/rocket-info/toggle-active",
"gui/rocket-info/remote_launch",
"gui/bonus",
"fast-tree-decon",
}
Roles.new_role("Trainee", "TrMod")
:set_permission_group("Admin")
:set_custom_color{ r = 0, g = 170, b = 0 }
:set_flag("is_admin")
:set_flag("is_spectator")
:set_flag("report-immune")
:set_parent("Veteran")
:allow{
"command/admin-chat",
"command/goto",
"command/teleport",
"command/bring",
"command/create-warning",
"command/get-warnings",
"command/get-reports",
"command/protect-entity",
"command/protect-area",
"command/protect-tag",
"command/jail",
"command/unjail",
"command/kick",
"command/ban",
"command/spectate",
"command/follow",
"command/search",
"command/search-online",
"command/search-amount",
"command/search-recent",
"command/clear-blueprints-surface",
"gui/playerdata",
}
--- Trusted Roles
Roles.new_role("Board Member", "Board")
:set_permission_group("Trusted")
:set_custom_color{ r = 247, g = 246, b = 54 }
:set_flag("is_spectator")
:set_flag("report-immune")
:set_flag("instant-respawn")
:set_parent("Sponsor")
:allow{
"command/goto",
"command/repair",
"command/spectate",
"command/follow",
"gui/playerdata",
}
Roles.new_role("Senior Backer", "Backer")
:set_permission_group("Trusted")
:set_custom_color{ r = 238, g = 172, b = 44 }
:set_flag("is_spectator")
:set_flag("report-immune")
:set_flag("instant-respawn")
:set_parent("Sponsor")
:allow{
}
Roles.new_role("Sponsor", "Spon")
:set_permission_group("Trusted")
:set_custom_color{ r = 238, g = 172, b = 44 }
:set_flag("is_spectator")
:set_flag("report-immune")
:set_flag("instant-respawn")
:set_parent("Supporter")
:allow{
"gui/rocket-info/toggle-active",
"gui/rocket-info/remote_launch",
"gui/bonus",
"command/home",
"command/set-home",
"command/get-home",
"command/return",
"fast-tree-decon",
}
Roles.new_role("Supporter", "Sup")
:set_permission_group("Trusted")
:set_custom_color{ r = 230, g = 99, b = 34 }
:set_flag("is_spectator")
:set_parent("Veteran")
:allow{
"command/tag-color",
"command/jail",
"command/unjail",
"command/set-join-message",
"command/remove-join-message",
}
Roles.new_role("Partner", "Part")
:set_permission_group("Trusted")
:set_custom_color{ r = 140, g = 120, b = 200 }
:set_flag("is_spectator")
:set_parent("Veteran")
:allow{
"command/jail",
"command/unjail",
}
local hours10, hours250 = 10 * 216000, 250 * 60
Roles.new_role("Veteran", "Vet")
:set_permission_group("Trusted")
:set_custom_color{ r = 140, g = 120, b = 200 }
:set_parent("Member")
:allow{
"command/chat-commands",
"command/clear-ground-items",
"command/clear-blueprints",
"command/set-trains-to-automatic",
}
:set_auto_assign_condition(function(player)
if player.online_time >= hours10 then
return true
else
local stats = Statistics:get(player, {})
local playtime, afk_time, map_count = stats.Playtime or 0, stats.AfkTime or 0, stats.MapsPlayed or 0
return playtime - afk_time >= hours250 and map_count >= 25
end
end)
--- Standard User Roles
Roles.new_role("Member", "Mem")
:set_permission_group("Standard")
:set_custom_color{ r = 24, g = 172, b = 188 }
:set_flag("deconlog-bypass")
:set_parent("Regular")
:allow{
"gui/task-list/add",
"gui/task-list/edit",
"gui/warp-list/add",
"gui/warp-list/edit",
"gui/surveillance",
"gui/vlayer-edit",
"gui/tool",
"command/save-quickbar",
"command/vlayer-info",
"command/lawnmower",
"command/waterfill",
"command/artillery",
}
local hours3, hours15 = 3 * 216000, 15 * 60
Roles.new_role("Regular", "Reg")
:set_permission_group("Standard")
:set_custom_color{ r = 79, g = 155, b = 163 }
:set_parent("Guest")
:allow{
"command/kill",
"command/rainbow",
"command/spawn",
"command/me",
"standard-decon",
"bypass-entity-protection",
"bypass-nukeprotect",
}
:set_auto_assign_condition(function(player)
if player.online_time >= hours3 then
return true
else
local stats = Statistics:get(player, {})
local playtime, afk_time, map_count = stats.Playtime or 0, stats.AfkTime or 0, stats.MapsPlayed or 0
return playtime - afk_time >= hours15 and map_count >= 5
end
end)
--- Guest/Default role
local default = Roles.new_role("Guest", "")
:set_permission_group("Guest")
:set_custom_color{ r = 185, g = 187, b = 160 }
:allow{
"command/tag",
"command/tag-clear",
"command/commands",
"command/get-roles",
"command/locate",
"command/create-report",
"command/ratio",
"command/server-ups",
"command/save-data",
"command/data-preference",
"command/connect",
"gui/player-list",
"gui/rocket-info",
"gui/science-info",
"gui/task-list",
"gui/warp-list",
"gui/readme",
"gui/vlayer",
"gui/research",
"gui/autofill",
"gui/module",
"gui/production",
}
--- Jail role
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
Roles.set_root("System")
Roles.set_default("Guest")
Roles.define_role_order{
"System", -- Best to keep root at top
"Senior Administrator",
"Administrator",
"Moderator",
"Trainee",
"Board Member",
"Senior Backer",
"Sponsor",
"Supporter",
"Partner",
"Veteran",
"Member",
"Regular",
"Jail",
"Guest", -- Default must be last if you want to apply restrictions to other roles
}
Roles.override_player_roles{
["PHIDIAS0303"] = { "Moderator", "Board Member", "Member" },
["aldldl"] = { "Administrator", "Moderator", "Member" },
["arty714"] = { "Senior Administrator", "Moderator", "Member" },
["Cooldude2606"] = { "Senior Administrator", "Moderator", "Member" },
["Drahc_pro"] = { "Administrator", "Moderator", "Member" },
["mark9064"] = { "Administrator", "Moderator", "Member" },
["7h3w1z4rd"] = { "Moderator", "Member" },
["FlipHalfling90"] = { "Moderator", "Member" },
["hamsterbryan"] = { "Moderator", "Member" },
["HunterOfGames"] = { "Moderator", "Member" },
["NextIdea"] = { "Moderator", "Member" },
["TheKernel32"] = { "Moderator", "Member" },
["TheKernel64"] = { "Moderator", "Member" },
["tovernaar123"] = { "Moderator", "Member" },
["UUBlueFire"] = { "Moderator", "Member" },
["AssemblyStorm"] = { "Moderator", "Member" },
["banakeg"] = { "Moderator", "Member" },
["connormkii"] = { "Moderator", "Member" },
["cydes"] = { "Moderator", "Member" },
["darklich14"] = { "Moderator", "Member" },
["facere"] = { "Moderator", "Member" },
["freek18"] = { "Moderator", "Member" },
["Gizan"] = { "Moderator", "Member" },
["LoicB"] = { "Moderator", "Member" },
["M74132"] = { "Moderator", "Member" },
["mafisch3"] = { "Moderator", "Member" },
["maplesyrup01"] = { "Moderator", "Member" },
["ookl"] = { "Moderator", "Member" },
["Phoenix27833"] = { "Moderator", "Member" },
["porelos"] = { "Moderator", "Member" },
["Ruuyji"] = { "Moderator", "Member" },
["samy115"] = { "Moderator", "Member" },
["SilentLog"] = { "Moderator", "Member" },
["Tcheko"] = { "Moderator", "Member" },
["thadius856"] = { "Moderator", "Member" },
["whoami32"] = { "Moderator", "Member" },
["Windbomb"] = { "Moderator", "Member" },
["XenoCyber"] = { "Moderator", "Member" },
}
@@ -7,7 +7,7 @@
local ExpUtil = require("modules/exp_util")
local Gui = require("modules/exp_gui")
local Roles = require("modules.exp_legacy.expcore.roles") --- @dep expcore.roles
local Roles = require("modules/exp_roles")
local Reports = require("modules.exp_legacy.modules.control.reports") --- @dep modules.control.reports
local Warnings = require("modules.exp_legacy.modules.control.warnings") --- @dep modules.control.warnings
local Jail = require("modules.exp_legacy.modules.control.jail") --- @dep modules.control.jail
@@ -23,11 +23,7 @@ end
-- auth that will only allow when on player's of lower roles
local function auth_lower_role(player, selected_player_name)
local player_highest = Roles.get_player_highest_role(player)
local action_player_highest = Roles.get_player_highest_role(selected_player_name)
if player_highest.index < action_player_highest.index then
return true
end
return Roles.player_outranks(player, selected_player_name)
end
-- gets the action player and a coloured name for the action to be used on
@@ -94,7 +90,7 @@ local report_player = new_button("utility/spawn_flag", { "exp-gui_player-list.re
if Reports.is_reported(selected_player.name, player.name) then
player.print({ "exp-commands_report.already-reported" }, Colors.orange_red)
else
set_selected_action(player, "command/report")
set_selected_action(player, "exp_scenario.command.create_report")
end
end)
@@ -110,7 +106,7 @@ end
-- @element warn_player
local warn_player = new_button("utility/spawn_flag", { "exp-gui_player-list.warn-player" })
:on_click(function(def, player, element)
set_selected_action(player, "command/give-warning")
set_selected_action(player, "exp_scenario.command.create_warning")
end)
local function warn_player_callback(player, reason)
@@ -128,7 +124,7 @@ local jail_player = new_button("utility/multiplayer_waiting_icon", { "exp-gui_pl
if Jail.is_jailed(selected_player.name) then
player.print({ "exp-commands_jail.already-jailed", selected_player_color }, Colors.orange_red)
else
set_selected_action(player, "command/jail")
set_selected_action(player, "exp_scenario.command.jail")
end
end)
@@ -143,7 +139,7 @@ end
-- @element kick_player
local kick_player = new_button("utility/warning_icon", { "exp-gui_player-list.kick-player" })
:on_click(function(def, player, element)
set_selected_action(player, "command/kick")
set_selected_action(player, "exp_scenario.gui.player_list.kick")
end)
local function kick_player_callback(player, reason)
@@ -155,7 +151,7 @@ end
-- @element ban_player
local ban_player = new_button("utility/danger_icon", { "exp-gui_player-list.ban-player" })
:on_click(function(def, player, element)
set_selected_action(player, "command/ban")
set_selected_action(player, "exp_scenario.gui.player_list.ban")
end)
local function ban_player_callback(player, reason)
@@ -166,39 +162,39 @@ end
return {
set_accessors = set_accessors,
buttons = {
["command/teleport"] = {
["exp_scenario.command.teleport"] = {
auth = function(player, selected_player)
return player.name ~= selected_player.name
end, -- cant teleport to your self
goto_player,
bring_player,
},
["command/report"] = {
["exp_scenario.command.create_report"] = {
auth = function(player, selected_player)
if player == selected_player then return false end
if not Roles.player_allowed(player, "command/give-warning") then
return not Roles.player_has_flag(selected_player, "report-immune")
if not Roles.player_has_permission(player, "exp_scenario.command.create_warning") then
return not Roles.player_has_permission(selected_player, "exp_scenario.bypass.reports")
end
end, -- can report any player that isn't immune and you aren't able to give warnings
reason_callback = report_player_callback,
report_player,
},
["command/give-warning"] = {
["exp_scenario.command.create_warning"] = {
auth = auth_lower_role, -- warn a lower user, replaces report
reason_callback = warn_player_callback,
warn_player,
},
["command/jail"] = {
["exp_scenario.command.jail"] = {
auth = auth_lower_role,
reason_callback = jail_player_callback,
jail_player,
},
["command/kick"] = {
["exp_scenario.gui.player_list.kick"] = {
auth = auth_lower_role,
reason_callback = kick_player_callback,
kick_player,
},
["command/ban"] = {
["exp_scenario.gui.player_list.ban"] = {
auth = auth_lower_role,
reason_callback = ban_player_callback,
ban_player,
+2 -2
View File
@@ -39,9 +39,9 @@ return {
allow_zoom_to_map = true, --- @setting allow_zoom_to_map false will disable the zoom to map feature
allow_remote_launch = true, --- @setting allow_remote_launch false removes the remote launch button for all players
remote_launch_admins_only = false, --- @setting remote_launch_admins_only true will remove the remote launch button for all non (game) admins
remote_launch_role_permission = "gui/rocket-info/remote_launch", --- @setting remote_launch_role_permission value used by custom permission system to allow or disallow the button
remote_launch_role_permission = "exp_scenario.gui.rocket_info.remote_launch", --- @setting remote_launch_role_permission value used by custom permission system to allow or disallow the button
allow_toggle_active = true, --- @setting allow_toggle_active false removes the remote toggle auto launch button for all players
toggle_active_admins_only = false, --- @setting toggle_active_admins_only true will remove the toggle auto launch button for all non (game) admins
toggle_active_role_permission = "gui/rocket-info/toggle-active", --- @setting toggle_active_role_permission value used by custom permission system to allow or disallow the button
toggle_active_role_permission = "exp_scenario.gui.rocket_info.toggle_active", --- @setting toggle_active_role_permission value used by custom permission system to allow or disallow the button
},
}
+4 -4
View File
@@ -3,11 +3,11 @@
return {
-- Adding tasks
allow_add_task = "all", --- @setting allow_add_task dictates who is allowed to add new tasks; values: all, admin, expcore.roles, none
expcore_roles_allow_add_task = "gui/task-list/add", --- @setting expcore_roles_allow_add_task if expcore.roles is used then this is the required permission
allow_add_task = "all", --- @setting allow_add_task dictates who is allowed to add new tasks; values: all, admin, exp_roles, none
exp_roles_allow_add_task = "exp_scenario.gui.task_list.add", --- @setting exp_roles_allow_add_task if exp_roles is used then this is the required permission
-- Editing tasks
allow_edit_task = "expcore.roles", --- @setting allow_edit_task dictates who is allowed to edit existing tasks; values: all, admin, expcore.roles, none
expcore_roles_allow_edit_task = "gui/task-list/edit", --- @setting expcore_roles_allow_edit_task if expcore.roles is used then this is the required permission
allow_edit_task = "exp_roles", --- @setting allow_edit_task dictates who is allowed to edit existing tasks; values: all, admin, exp_roles, none
exp_roles_allow_edit_task = "exp_scenario.gui.task_list.edit", --- @setting exp_roles_allow_edit_task if exp_roles is used then this is the required permission
user_can_edit_own_tasks = true, --- @settings if true then the user who made the task can edit it regardless of the allow_edit_task setting
}
+8 -8
View File
@@ -8,23 +8,23 @@ return {
default_icon = { type = "item", name = "discharge-defense-equipment" }, --- @setting default_icon the default icon that will be used for warps
-- Warp cooldowns
bypass_warp_cooldown = "expcore.roles", --- @setting bypass_warp_cooldown dictates who the warp cooldown is applied to; values: all, admin, expcore.roles, none
expcore_roles_bypass_warp_cooldown = "gui/warp-list/bypass-cooldown", --- @setting expcore_roles_bypass_warp_cooldown if expcore.roles is used then this is the required permission
bypass_warp_cooldown = "exp_roles", --- @setting bypass_warp_cooldown dictates who the warp cooldown is applied to; values: all, admin, exp_roles, none
exp_roles_bypass_warp_cooldown = "exp_scenario.gui.warp_list.bypass_cooldown", --- @setting exp_roles_bypass_warp_cooldown if exp_roles is used then this is the required permission
cooldown_duration = 60, --- @setting cooldown_duration the duration of the warp cooldown in seconds
-- Warp proximity
bypass_warp_proximity = "expcore.roles", --- @setting bypass_warp_proximity dictates who the warp proximity is applied to; values: all, admin, expcore.roles, none
expcore_roles_bypass_warp_proximity = "gui/warp-list/bypass-proximity", --- @setting expcore_roles_bypass_warp_proximity if expcore.roles is used then this is the required permission
bypass_warp_proximity = "exp_roles", --- @setting bypass_warp_proximity dictates who the warp proximity is applied to; values: all, admin, exp_roles, none
exp_roles_bypass_warp_proximity = "exp_scenario.gui.warp_list.bypass_proximity", --- @setting exp_roles_bypass_warp_proximity if exp_roles is used then this is the required permission
standard_proximity_radius = 4, --- @setting standard_proximity_radius the minimum distance a player is allowed to be to a warp in order to use it
spawn_proximity_radius = 20, --- @setting spawn_proximity_radius the minimum distance a player is allowed to be from they spawn point to use warps
-- Adding warps
allow_add_warp = "expcore.roles", --- @setting allow_add_warp dictates who is allowed to add warps; values: all, admin, expcore.roles, none
expcore_roles_allow_add_warp = "gui/warp-list/add", --- @setting expcore_roles_allow_add_warp if expcore.roles is used then this is the required permission
allow_add_warp = "exp_roles", --- @setting allow_add_warp dictates who is allowed to add warps; values: all, admin, exp_roles, none
exp_roles_allow_add_warp = "exp_scenario.gui.warp_list.add", --- @setting exp_roles_allow_add_warp if exp_roles is used then this is the required permission
-- Editing warps
allow_edit_warp = "expcore.roles", --- @setting allow_edit_warp dictates who is allowed to edit warps; values: all, admin, expcore.roles, none
expcore_roles_allow_edit_warp = "gui/warp-list/edit", --- @setting expcore_roles_allow_edit_warp if expcore.roles is used then this is the required permission
allow_edit_warp = "exp_roles", --- @setting allow_edit_warp dictates who is allowed to edit warps; values: all, admin, exp_roles, none
exp_roles_allow_edit_warp = "exp_scenario.gui.warp_list.edit", --- @setting exp_roles_allow_edit_warp if exp_roles is used then this is the required permission
user_can_edit_own_warps = false, --- @settings user_can_edit_own_warps if true then the user who made the warp can edit it regardless of the allow_edit_warp setting
-- Warp area generation
+1 -1
View File
@@ -25,6 +25,6 @@ return {
},
},
},
ignore_permission = "bypass-nukeprotect", -- @setting ignore_permission The permission that nukeprotect will ignore
ignore_permission = "exp_scenario.bypass.nuke_protection", -- @setting ignore_permission The permission that nukeprotect will ignore
ignore_admins = true, -- @setting ignore_admins Ignore admins, true by default. Allows usage outside of the roles module
}
+1 -1
View File
@@ -1,6 +1,6 @@
return {
ignore_admins = true, --- @setting ignore_admins If admins are ignored by the protection filter
ignore_permission = "bypass-entity-protection", --- @setting ignore_permission Players with this permission will be ignored by the protection filter, leave nil if expcore.roles is not used
ignore_permission = "exp_scenario.bypass.entity_protection", --- @setting ignore_permission Players with this permission will be ignored by the protection filter, leave nil to protect against every player
repeat_count = 5, --- @setting repeat_count Number of protected entities that must be removed within repeat_lifetime in order to trigger repeated removal protection
repeat_lifetime = 3600 * 20, --- @setting repeat_lifetime The length of time, in ticks, that protected removals will be remembered for
refresh_rate = 3600 * 5, --- @setting refresh_rate How often the age of protected removals are checked against repeat_lifetime
File diff suppressed because it is too large Load Diff
-8
View File
@@ -1,11 +1,3 @@
[expcore-roles]
error-log-format-flag=[ERROR] roleFlag/__1__ :: __2__
error-log-format-assign=[ERROR] rolePromote/__1__ :: __2__
game-message-assign=__1__ has been assigned to __2__ by __3__
game-message-unassign=__1__ has been unassigned from __2__ by __3__
reject-role=Invalid Role Name.
reject-player-role=Player has a higher role.
[expcore-data]
description-preference=Allows you to set/get your data saving preference.
description-data=Writes all your player data to a file on your computer.
@@ -1,11 +1,3 @@
[expcore-roles]
error-log-format-flag=[ERROR] roleFlag/__1__ :: __2__
error-log-format-assign=[ERROR] rolePromote/__1__ :: __2__
game-message-assign=__1__ 已被 __3__ 指派到身分組 __2__
game-message-unassign=__1__ 已被 __3__ 取消指派到身分組 __2__
reject-role=無效的身分組。
reject-player-role=用戶已有更高的身分組。
[expcore-data]
description-preference=允許寫入資料。
description-data=把用戶資料寫入電腦
@@ -1,11 +1,3 @@
[expcore-roles]
error-log-format-flag=[ERROR] roleFlag/__1__ :: __2__
error-log-format-assign=[ERROR] rolePromote/__1__ :: __2__
game-message-assign=__1__ 已被 __3__ 指派到身分組 __2__
game-message-unassign=__1__ 已被 __3__ 取消指派到身分組 __2__
reject-role=無效的身分組。
reject-player-role=用戶已有更高的身分組。
[expcore-data]
description-preference=允許寫入資料。
description-data=把用戶資料寫入電腦
+1
View File
@@ -8,6 +8,7 @@
"dependencies": {
"clusterio": "*",
"exp_util": "*",
"exp_roles": "*",
"exp_gui": "*"
}
}
+13 -18
View File
@@ -7,25 +7,23 @@
-- import the module from the control modules
local Jail = require("modules.exp_legacy.modules.control.jail") --- @dep modules.control.jail
-- This will move 'MrBiter' to the jail role and remove all other roles from them
-- This will give 'MrBiter' the jail role, which suppresses all of their other roles
-- the player name and reason are only so they can be included in the event for user feedback
Jail.jail_player('MrBiter', 'Cooldude2606', 'Likes biters too much')
-- This will give 'MrBiter' all his roles back and remove him from jail
-- This will remove the jail role from 'MrBiter', restoring their other roles
-- again as above the player name is only used in the event for user feedback
Jail.unjail_player('MrBiter', 'Cooldude2606')
]]
local Roles = require("modules.exp_legacy.expcore.roles")
local Roles = require("modules/exp_roles")
local valid_player = function(p) return type(p) == "userdata" and p or game.get_player(p) end
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
--- The role which is given to jailed players, it has a higher priority than every other role
local jail_role = "Jail"
local Jail = {
old_roles = {},
events = {
--- When a player is assigned to jail
-- @event on_player_jailed
@@ -64,10 +62,10 @@ end
-- @tparam LuaPlayer player the player to check if they are in jail
-- @treturn boolean whether the player is currently in jail
function Jail.is_jailed(player)
return has_role(valid_player(player), "Jail")
return Roles.player_has_role(valid_player(player), jail_role)
end
--- Moves a player to jail and removes all other roles
--- Moves a player to jail, which suppresses all of their other roles
-- @tparam LuaPlayer player the player who will be jailed
-- @tparam string by_player_name the name of the player who is doing the jailing
-- @tparam[opt='Non given.'] string reason the reason that the player is being jailed
@@ -79,8 +77,7 @@ function Jail.jail_player(player, by_player_name, reason)
reason = reason or "Non given."
if has_role(player, "Jail") then return end
local roles = get_roles(player)
if Roles.player_has_role(player, jail_role) then return end
player.walking_state = { walking = false, direction = player.walking_state.direction }
player.riding_state = { acceleration = defines.riding.acceleration.nothing, direction = player.riding_state.direction }
@@ -89,16 +86,14 @@ function Jail.jail_player(player, by_player_name, reason)
player.picking_state = false
player.repair_state = { repairing = false, position = player.repair_state.position }
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)
Roles.assign_player(player, jail_role, by_player_name, true)
event_emit(Jail.events.on_player_jailed, player, by_player_name, reason)
return true
end
--- Moves a player out of jail and restores all roles previously removed
--- Moves a player out of jail, which restores all of their other roles
-- @tparam LuaPlayer player the player that will be unjailed
-- @tparam string by_player_name the name of the player that is doing the unjail
-- @treturn boolean whether the player was unjailed successfully
@@ -107,9 +102,9 @@ function Jail.unjail_player(player, by_player_name)
if not player then return end
if not by_player_name then return end
if not has_role(player, "Jail") then return end
if not Roles.player_has_role(player, jail_role) then return end
unassign_roles(player, "Jail", by_player_name, nil, true)
Roles.unassign_player(player, jail_role, by_player_name, true)
event_emit(Jail.events.on_player_unjailed, player, by_player_name)
@@ -33,11 +33,7 @@ for _, config_key in ipairs{ "always_protected_names", "always_protected_types",
end
end
-- Require roles if a permission is assigned in the config
local Roles --- @type table<string, any>
if config.ignore_permission then
Roles = require("modules.exp_legacy.expcore.roles") --- @dep expcore.roles
end
local Roles = require("modules/exp_roles")
----- Storage Variables -----
--- Variables stored in the global table
@@ -159,7 +155,7 @@ Event.add(defines.events.on_pre_player_mined_item, function(event)
-- Check if the player should be ignored
if config.ignore_admins and player.admin then return end
if entity.last_user == nil or entity.last_user.index == player.index then return end
if config.ignore_permission and Roles.player_allowed(player, config.ignore_permission) then return end
if config.ignore_permission and Roles.player_has_permission(player, config.ignore_permission) then return end
-- Check if the entity is protected
if EntityProtection.is_entity_protected(entity)
+1 -1
View File
@@ -8,7 +8,7 @@ local Commands = require("modules/exp_commands")
local PlayerData = require("modules.exp_legacy.expcore.player_data") --- @dep expcore.player_data
local CustomMessages = PlayerData.Settings:combine("JoinMessage")
CustomMessages:set_metadata{
permission = "command/join-message",
permission = "exp_scenario.command.set_join_message",
}
--- When a players data loads show their message
+1 -1
View File
@@ -10,7 +10,7 @@ local config = require("modules.exp_legacy.config.preset_player_quickbar") --- @
local PlayerData = require("modules.exp_legacy.expcore.player_data") --- @dep expcore.player_data
local PlayerFilters = PlayerData.Settings:combine("QuickbarFilters")
PlayerFilters:set_metadata{
permission = "command/save-quickbar",
permission = "exp_scenario.command.save_quickbar",
stringify = function(value)
if not value then return "No filters set" end
local count = 0
+4 -4
View File
@@ -4,17 +4,17 @@
]]
local Commands = require("modules/exp_commands")
local Roles = require("modules.exp_legacy.expcore.roles") --- @dep expcore.roles
local Roles = require("modules/exp_roles")
--- Stores the tag for a player
local PlayerData = require("modules.exp_legacy.expcore.player_data") --- @dep expcore.player_data
local PlayerTags = PlayerData.Settings:combine("Tag")
local PlayerTagColors = PlayerData.Settings:combine("TagColor")
PlayerTags:set_metadata{
permission = "command/tag",
permission = "exp_scenario.command.tag",
}
PlayerTagColors:set_metadata{
permission = "command/tag-color",
permission = "exp_scenario.command.tag_color",
}
local set_tag = function(player, tag, color)
@@ -72,7 +72,7 @@ Commands.new("tag-clear", "Clears your tag. Or another player if you are admin."
if other_player == player then
-- No player given so removes your tag
PlayerTags:remove(other_player)
elseif Roles.player_allowed(player, "command/clear-tag/always") then
elseif Roles.player_has_permission(player, "exp_scenario.command.tag_clear.always") then
-- Player given and user is admin so clears that player's tag
PlayerTags:remove(other_player)
else
@@ -1,7 +0,0 @@
local Gui = require("modules/exp_gui")
local Roles = require("modules.exp_legacy.expcore.roles")
local Event = require("modules/exp_legacy/utils/event")
--- @diagnostic disable: access-invisible
Event.add(Roles.events.on_role_assigned, Gui._ensure_consistency)
Event.add(Roles.events.on_role_unassigned, Gui._ensure_consistency)
+5 -6
View File
@@ -5,7 +5,7 @@
]]
local Gui = require("modules/exp_gui")
local Roles = require("modules.exp_legacy.expcore.roles") --- @dep expcore.roles
local Roles = require("modules/exp_roles")
local Event = require("modules/exp_legacy/utils/event") --- @dep utils.event
local format_number = require("util").format_number --- @dep util
local config = require("modules.exp_legacy.config.vlayer") --- @dep config.vlayer
@@ -457,7 +457,7 @@ local vlayer_control_set = Gui.define("vlayer_control_set")
vlayer_gui_control_see(disp)
local b = vlayer_gui_control_build(disp)
local r = vlayer_gui_control_remove(disp)
local v = Roles.player_allowed(player, "gui/vlayer-edit")
local v = Roles.player_has_permission(player, "exp_scenario.gui.vlayer_edit")
b.visible = v
r.visible = v
@@ -484,22 +484,21 @@ Gui.toolbar.create_button{
sprite = "entity/solar-panel",
tooltip = { "vlayer.main-tooltip" },
visible = function(player, element)
return Roles.player_allowed(player, "gui/vlayer")
return Roles.player_has_permission(player, "exp_scenario.gui.vlayer")
end
}
--- Update the visibly of the buttons based on a players roles
local function role_update_event(event)
local player = game.players[event.player_index]
local visible = Roles.player_allowed(player, "gui/vlayer-edit")
local visible = Roles.player_has_permission(player, "exp_scenario.gui.vlayer_edit")
local container = Gui.get_left_element(vlayer_container, player)
local disp = container.frame["vlayer_st_2"].disp.table
disp[vlayer_gui_control_build.name].visible = visible
disp[vlayer_gui_control_remove.name].visible = visible
end
Event.add(Roles.events.on_role_assigned, role_update_event)
Event.add(Roles.events.on_role_unassigned, role_update_event)
Event.add(Roles.events.on_player_roles_changed, role_update_event)
Event.on_nth_tick(config.update_tick_gui, function(_)
local stats = vlayer.get_statistics()
+5 -6
View File
@@ -9,7 +9,7 @@ local Gui = require("modules/exp_gui")
local Datastore = require("modules.exp_legacy.expcore.datastore") --- @dep expcore.datastore
local Storage = require("modules/exp_util/storage")
local Event = require("modules/exp_legacy/utils/event") --- @dep utils.event
local Roles = require("modules.exp_legacy.expcore.roles") --- @dep expcore.roles
local Roles = require("modules/exp_roles")
local Colors = require("modules/exp_util/include/color")
local config = require("modules.exp_legacy.config.gui.warps") --- @dep config.gui.warps
local Warps = require("modules.exp_legacy.modules.control.warps") --- @dep modules.control.warps
@@ -68,8 +68,8 @@ local function check_player_permissions(player, action, warp)
return true
elseif action_config == "admin" then
return player.admin
elseif action_config == "expcore.roles" then
return Roles.player_allowed(player, config["expcore_roles_" .. action])
elseif action_config == "exp_roles" then
return Roles.player_has_permission(player, config["exp_roles_" .. action])
end
-- Return false as all other conditions have not been met
@@ -708,7 +708,7 @@ Gui.toolbar.create_button{
sprite = config.default_icon.type .. "/" .. config.default_icon.name,
tooltip = { "warp-list.main-tooltip" },
visible = function(player, element)
return Roles.player_allowed(player, "gui/warp-list")
return Roles.player_has_permission(player, "exp_scenario.gui.warp_list")
end
}:on_click(function(def, player, element)
-- Set gui keep open state for player that clicked the button: true if visible, false if invisible
@@ -885,8 +885,7 @@ local function role_update_event(event)
add_new_warp_element.visible = allow_add_warp
end
Event.add(Roles.events.on_role_assigned, role_update_event)
Event.add(Roles.events.on_role_unassigned, role_update_event)
Event.add(Roles.events.on_player_roles_changed, role_update_event)
--- When a chart tag is removed or edited make sure it is not one that belongs to a warp
local function maintain_tag(event)
@@ -1,26 +1,28 @@
--[[-- Command Authorities - Roles
Adds a permission authority for exp roles
Adds a permission authority which checks the clusterio permission for a command
]]
local Commands = require("modules/exp_commands")
local add, allow, deny = Commands.add_permission_authority, Commands.status.success, Commands.status.unauthorised
local Roles = require("modules/exp_legacy/expcore/roles")
local player_allowed = Roles.player_allowed
local Roles = require("modules/exp_roles")
local player_has_permission = Roles.player_has_permission
local authorities = {}
--- If a command has the flag "character_only" then the command can only be used outside of remote view
--- Every command requires the permission `exp_scenario.command.<name>`, with
--- hyphens replaced by underscores, see permissions.ts for their definitions
authorities.exp_permission =
add(function(player, command)
if not player_allowed(player, command.flags.exp_permission or ("command/" .. command.name)) then
local permission = "exp_scenario.command." .. command.name:gsub("%-", "_")
if not player_has_permission(player, permission) then
return deny{ "exp-commands-authorities_role.deny" }
else
return allow()
end
end)
Roles.define_flag_trigger("is_system", function(player, state)
Roles.define_permission_trigger("exp_scenario.player.system_commands", function(player, state)
if state then
Commands.unlock_system_commands(player.name)
else
+1 -1
View File
@@ -8,6 +8,6 @@ local add_static, add_dynamic = Commands.add_rcon_static, Commands.add_rcon_dyna
add_static("Gui", require("modules/exp_gui"))
add_static("Group", require("modules.exp_legacy.expcore.permission_groups"))
add_static("Roles", require("modules.exp_legacy.expcore.roles"))
add_static("Roles", require("modules/exp_roles"))
add_static("Datastore", require("modules.exp_legacy.expcore.datastore"))
add_static("External", require("modules.exp_legacy.expcore.external"))
+25 -21
View File
@@ -1,4 +1,3 @@
--[[-- Command Types - Roles
The data types that are used with exp_roles
A lower role index indicates it is more privileged
@@ -11,28 +10,42 @@ Adds parsers for:
lower_role_player_alive
]]
local ExpUtil = require("modules/exp_util")
local auto_complete = ExpUtil.auto_complete
local Commands = require("modules/exp_commands")
local add, parse = Commands.add_data_type, Commands.parse_input
local valid, invalid = Commands.status.success, Commands.status.invalid_input
local Roles = require("modules.exp_legacy.expcore.roles")
local highest_role = Roles.get_player_highest_role
local Roles = require("modules/exp_roles")
local player_outranks = Roles.player_outranks
local types = {} --- @class (partial) Commands.types
--- A role defined by exp roles
types.role = add("role", Commands.types.key_of(Roles.config.roles))
--- A role known to exp roles, matched on its name
types.role =
add("role", function(input)
local names = {}
for index, role in ipairs(Roles.get_roles()) do
names[index] = role.name
end
local name = auto_complete(names, input)
if name == nil then
return invalid{ "exp-commands-parse.string-options", table.concat(names, ", ") }
else
return valid(Roles.get_role(name))
end
end)
--- A role which is lower than the players highest role
types.lower_role =
add("lower_role", function(input, player)
local success, status, result = parse(input, player, types.role)
if not success then return status, result end
--- @cast result any TODO role is not a defined type
--- @cast result ExpRoles.Role
local player_highest = highest_role(player)
local is_root = Roles.config.internal.root == player_highest.name
if not is_root and player_highest.index >= result.index then
if not Roles.player_outranks_role(player, result) then
return invalid{ "exp-commands-parse_role.lower-role" }
else
return valid(result)
@@ -46,10 +59,7 @@ types.lower_role_player =
if not success then return status, result end
--- @cast result LuaPlayer
local other_highest = highest_role(result)
local player_highest = highest_role(player)
local is_root = Roles.config.internal.root == player_highest.name
if not is_root and player_highest.index >= other_highest.index then
if not player_outranks(player, result) then
return invalid{ "exp-commands-parse_role.lower-role-player" }
else
return valid(result)
@@ -63,10 +73,7 @@ types.lower_role_player_online =
if not success then return status, result end
--- @cast result LuaPlayer
local other_highest = highest_role(result)
local player_highest = highest_role(player)
local is_root = Roles.config.internal.root == player_highest.name
if not is_root and player_highest.index >= other_highest.index then
if not player_outranks(player, result) then
return invalid{ "exp-commands-parse_role.lower-role-player" }
else
return valid(result)
@@ -80,10 +87,7 @@ types.lower_role_player_alive =
if not success then return status, result end
--- @cast result LuaPlayer
local other_highest = highest_role(result)
local player_highest = highest_role(player)
local is_root = Roles.config.internal.root == player_highest.name
if not is_root and player_highest.index >= other_highest.index then
if not player_outranks(player, result) then
return invalid{ "exp-commands-parse_role.lower-role-player" }
else
return valid(result)
+3 -3
View File
@@ -4,8 +4,8 @@ Adds a command that allows players to kill themselves and others
local Commands = require("modules/exp_commands")
local Roles = require("modules.exp_legacy.expcore.roles") --- @dep expcore.roles
local highest_role = Roles.get_player_highest_role
local Roles = require("modules/exp_roles")
local player_outranks = Roles.player_outranks
--- Kills yourself or another player.
Commands.new("kill", { "exp-commands_kill.description" })
@@ -20,7 +20,7 @@ Commands.new("kill", { "exp-commands_kill.description" })
if other_player == nil then
-- Can only be nil if the target is the player and they are already dead
return Commands.status.error{ "exp-commands_kill.already-dead" }
elseif (other_player == player) or (highest_role(player).index < highest_role(other_player).index) then
elseif other_player == player or player_outranks(player, other_player) then
-- You can always kill yourself or can kill lower role players
if script.active_mods["space-age"] then
other_player.surface.create_entity{ name = "lightning", position = { other_player.position.x, other_player.position.y - 16 }, target = other_player.character }
@@ -11,7 +11,7 @@ local expand_area = AABB.expand
local Commands = require("modules/exp_commands")
local format_player_name = Commands.format_player_name_locale
local Roles = require("modules.exp_legacy.expcore.roles") --- @dep expcore.roles
local Roles = require("modules/exp_roles")
local EntityProtection = require("modules.exp_legacy.modules.control.protection") --- @dep modules.control.protection
local format_string = string.format
+3 -3
View File
@@ -6,8 +6,8 @@ local Commands = require("modules/exp_commands")
local format_player_name = Commands.format_player_name_locale
local parse_input = Commands.parse_input
local Roles = require("modules.exp_legacy.expcore.roles")
local player_has_flag = Roles.player_has_flag
local Roles = require("modules/exp_roles")
local player_has_permission = Roles.player_has_permission
local Reports = require("modules.exp_legacy.modules.control.reports") --- @dep modules.control.reports
@@ -20,7 +20,7 @@ local function reportable_player(input, player)
if not success then return status, result end
--- @cast result LuaPlayer
if player_has_flag(input, "report-immune") then
if player_has_permission(input, "exp_scenario.bypass.reports") then
return Commands.status.invalid_input{ "exp-commands_reports.player-immune" }
elseif player == input then
return Commands.status.invalid_input{ "exp-commands_reports.self-report" }
+6 -6
View File
@@ -6,8 +6,8 @@ local Commands = require("modules/exp_commands")
local format_player_name = Commands.format_player_name_locale
local format_text = Commands.format_rich_text_color_locale
local Roles = require("modules.exp_legacy.expcore.roles") --- @dep expcore.roles
local get_roles_ordered = Roles.get_roles_ordered
local Roles = require("modules/exp_roles")
local get_roles = Roles.get_roles
local get_player_roles = Roles.get_player_roles
--- Assigns a role to a player
@@ -18,7 +18,7 @@ Commands.new("assign-role", { "exp-commands_roles.description-assign" })
:add_flags{ "admin_only" }
:register(function(player, other_player, role)
--- @cast other_player LuaPlayer
--- @cast role any -- TODO
--- @cast role ExpRoles.Role
Roles.assign_player(other_player, role, player.name)
end)
@@ -30,7 +30,7 @@ Commands.new("unassign-role", { "exp-commands_roles.description-unassign" })
:add_flags{ "admin_only" }
:register(function(player, other_player, role)
--- @cast other_player LuaPlayer
--- @cast role any -- TODO
--- @cast role ExpRoles.Role
Roles.unassign_player(other_player, role, player.name)
end)
@@ -40,7 +40,7 @@ Commands.new("get-roles", { "exp-commands_roles.description-get" })
:add_aliases{ "roles" }
:register(function(player, other_player)
--- @cast other_player LuaPlayer?
local roles = get_roles_ordered()
local roles = get_roles()
local roles_formatted = { "" } --- @type LocalisedString
local response = { "exp-commands_roles.list-roles", roles_formatted } --[[@as LocalisedString]]
if other_player then
@@ -50,7 +50,7 @@ Commands.new("get-roles", { "exp-commands_roles.description-get" })
end
for index, role in ipairs(roles) do
local role_name = format_text(role.name, role.custom_color or Commands.color.white)
local role_name = format_text(role.name, role.color or Commands.color.white)
roles_formatted[index + 1] = { "exp-commands_roles.list-element", role_name }
end
+3 -3
View File
@@ -7,8 +7,8 @@ local teleport_player = ExpUtil.teleport_player
local Commands = require("modules/exp_commands")
local Roles = require("modules.exp_legacy.expcore.roles") --- @dep expcore.roles
local player_allowed = Roles.player_allowed
local Roles = require("modules/exp_roles")
local player_has_permission = Roles.player_has_permission
--- @class ExpCommands_Teleport.commands
local commands = {}
@@ -85,7 +85,7 @@ commands.spawn = Commands.new("spawn", { "exp-commands_teleport.description-spaw
if not teleport_player(player, game.surfaces.nauvis, { 0, 0 }, "dismount") then
return Commands.status.error{ "exp-commands_teleport.unavailable" }
end
elseif player_allowed(player, "command/spawn/always") then
elseif player_has_permission(player, "exp_scenario.command.spawn.always") then
if not teleport_player(other_player, game.surfaces.nauvis, { 0, 0 }, "dismount") then
return Commands.status.error{ "exp-commands_teleport.unavailable" }
end
+1
View File
@@ -63,6 +63,7 @@ add(require("modules/exp_scenario/control/pollution_grading"))
add(require("modules/exp_scenario/control/protection_jail"))
add(require("modules/exp_scenario/control/report_jail"))
add(require("modules/exp_scenario/control/research"))
add(require("modules/exp_scenario/control/roles"))
add(require("modules/exp_scenario/control/spawn_area"))
add(require("modules/exp_scenario/control/station_auto_name"))
+2 -2
View File
@@ -4,7 +4,7 @@ Various bonus related event handlers
TODO Refactor this fully, this is temp to get it out of the player bonus gui file
]]
local Roles = require("modules/exp_legacy/expcore/roles")
local Roles = require("modules/exp_roles")
local config = require("modules/exp_legacy/config/bonus")
--- @param event EventData.on_force_created
@@ -26,7 +26,7 @@ end
--- @param event EventData.on_player_died
local function fast_respawn(event)
local player = assert(game.get_player(event.player_index))
if Roles.player_has_flag(player, "instant-respawn") then
if Roles.player_has_permission(player, "exp_scenario.player.instant_respawn") then
player.ticks_to_respawn = 120
end
end
@@ -2,7 +2,7 @@
Adds auto replies to chat messages, as well as chat commands
]]
local Roles = require("modules.exp_legacy.expcore.roles")
local Roles = require("modules/exp_roles")
local config = require("modules.exp_legacy.config.chat_reply")
local prefix = config.command_prefix
local prefix_len = string.len(prefix)
@@ -20,7 +20,7 @@ local function on_console_chat(event)
-- Check if the player can chat commands
local commands_allowed = true
if config.command_admin_only and not player.admin then commands_allowed = false end
if config.command_permission and not Roles.player_allowed(player, config.command_permission) then commands_allowed = false end
if config.command_permission and not Roles.player_has_permission(player, config.command_permission) then commands_allowed = false end
-- Check if a key word appears in the message
for key_word, reply in pairs(config.messages) do
@@ -3,7 +3,7 @@ Log certain actions into a file when events are triggered
]]
local ExpUtil = require("modules/exp_util")
local Roles = require("modules.exp_legacy.expcore.roles")
local Roles = require("modules/exp_roles")
local config = require("modules.exp_legacy.config.deconlog")
local seconds_time_format = ExpUtil.format_time_factory{ format = "short", hours = true, minutes = true, seconds = true }
@@ -79,7 +79,7 @@ end
local function get_log_player(event)
local player = assert(game.get_player(event.player_index))
if Roles.player_has_flag(player, "deconlog-bypass") then
if Roles.player_has_permission(player, "exp_scenario.bypass.deconstruction_log") then
return nil
end
@@ -4,7 +4,7 @@ Makes trees which are marked for decon "decay" quickly to allow faster building
local Gui = require("modules/exp_gui")
local Async = require("modules/exp_util/async")
local Roles = require("modules.exp_legacy.expcore.roles")
local Roles = require("modules/exp_roles")
local PlayerData = require("modules.exp_legacy.expcore.player_data")
local HasEnabledDecon = PlayerData.Settings:combine("HasEnabledDecon")
@@ -57,9 +57,9 @@ local remove_trees_async =
--- @param player LuaPlayer
--- @return "fast" | "allow" | "disallow"
local function get_permission(player)
if Roles.player_allowed(player, "fast-tree-decon") then
if Roles.player_has_permission(player, "exp_scenario.decon.fast_trees") then
return HasEnabledDecon:get(player) and "fast" or "allow"
elseif Roles.player_allowed(player, "standard-decon") then
elseif Roles.player_has_permission(player, "exp_scenario.decon.standard") then
return "allow"
else
return "disallow"
@@ -101,7 +101,7 @@ Gui.toolbar.create_button{
tooltip = { "exp_fast-decon.tooltip-main" },
auto_toggle = true,
visible = function(player, _)
return Roles.player_allowed(player, "fast-tree-decon")
return Roles.player_has_permission(player, "exp_scenario.decon.fast_trees")
end
}:on_click(function(def, player, element)
local state = Gui.toolbar.get_button_toggled_state(def, player)
@@ -3,7 +3,7 @@ Disable new players from having certain items in their inventory, most commonly
]]
local ExpUtil = require("modules/exp_util")
local Roles = require("modules.exp_legacy.expcore.roles")
local Roles = require("modules/exp_roles")
local config = require("modules.exp_legacy.config.nukeprotect")
--- Check all items in the given inventory
@@ -12,7 +12,7 @@ local config = require("modules.exp_legacy.config.nukeprotect")
--- @param banned_items string[]
local function check_items(player, type, banned_items)
-- If the player has perms to be ignored, then they should be
if config.ignore_permission and Roles.player_allowed(player, config.ignore_permission) then return end
if config.ignore_permission and Roles.player_has_permission(player, config.ignore_permission) then return end
if config.ignore_admins and player.admin then return end
local items = {} --- @type LuaItemStack[]
+21
View File
@@ -0,0 +1,21 @@
--[[-- Control - Roles
Applies the in game effects of the player permissions defined by the scenario
]]
local Gui = require("modules/exp_gui")
local Roles = require("modules/exp_roles")
Roles.define_permission_trigger("exp_scenario.player.admin", function(player, state)
player.admin = state
end)
Roles.define_permission_trigger("exp_scenario.player.spectator", function(player, state)
player.spectator = state
end)
return {
events = {
--- @diagnostic disable-next-line: access-invisible
[Roles.events.on_player_roles_changed] = Gui._ensure_consistency,
}
}
+2 -2
View File
@@ -3,7 +3,7 @@ Adds a config menu for setting autofill of placed entities
]]
local Gui = require("modules/exp_gui")
local Roles = require("modules.exp_legacy.expcore.roles")
local Roles = require("modules/exp_roles")
local config = require("modules.exp_legacy.config.gui.autofill")
local FlyingText = require("modules/exp_util/flying_text")
@@ -330,7 +330,7 @@ Gui.toolbar.create_button{
sprite = config.icon,
tooltip = { "exp-gui_autofill.tooltip-main" },
visible = function(player, element)
return Roles.player_allowed(player, "gui/autofill")
return Roles.player_has_permission(player, "exp_scenario.gui.autofill")
end
}
+2 -2
View File
@@ -4,7 +4,7 @@ Adds a Gui which creates an selection planner to insert modules into buildings
local Gui = require("modules/exp_gui")
local AABB = require("modules/exp_util/aabb")
local Roles = require("modules/exp_legacy/expcore/roles")
local Roles = require("modules/exp_roles")
local Selection = require("modules/exp_util/selection")
local SelectArea = Selection.connect("ModuleArea")
@@ -259,7 +259,7 @@ Gui.toolbar.create_button{
sprite = "item/productivity-module-3",
tooltip = { "exp-gui_module-inserter.tooltip-main" },
visible = function(player, element)
return Roles.player_allowed(player, "gui/module")
return Roles.player_has_permission(player, "exp_scenario.gui.module")
end
}
+8 -8
View File
@@ -3,7 +3,7 @@ Adds a gui that allows players to apply various bonuses
]]
local Gui = require("modules/exp_gui")
local Roles = require("modules/exp_legacy/expcore/roles")
local Roles = require("modules/exp_roles")
local config = require("modules/exp_legacy/config/bonus")
local vlayer = require("modules/exp_legacy/modules/control/vlayer")
local format_number = require("util").format_number
@@ -68,7 +68,8 @@ do local _points_limit = {} --- @type table<number, number>
--- @param player LuaPlayer
--- @return number
function Elements.bonus_used._calculate_points_limit(player)
local role_diff = Roles.get_role_by_name(config.points.role_name).index - Roles.get_player_highest_role(player).index
local role = assert(Roles.get_role(config.points.role_name), "Bonus points role does not exist")
local role_diff = role.index - Roles.get_player_highest_role(player).index
local points_limit = math.floor(config.points.base * (1 + config.points.increase_percentage_per_role_level * role_diff))
_points_limit[player.index] = points_limit
return points_limit
@@ -458,19 +459,19 @@ Gui.toolbar.create_button{
sprite = "item/exoskeleton-equipment",
tooltip = { "exp-gui_player-bonus.tooltip-main" },
visible = function(player, element)
return Roles.player_allowed(player, "gui/bonus")
return Roles.player_has_permission(player, "exp_scenario.gui.bonus")
end
}
--- Recalculate and apply the bonus for a player
local function recalculate_bonus(event)
local player = Gui.get_player(event)
if event.name == Roles.events.on_role_assigned or event.name == Roles.events.on_role_unassigned then
if event.name == Roles.events.on_player_roles_changed then
-- If the player's roles changed then we will need to recalculate their limit
Elements.bonus_used._clear_points_limit_cache(player)
local bonus_cost = Elements.container.calculate_cost(player)
local within_limit = Elements.bonus_used.refresh_player(player, bonus_cost)
if not within_limit or not Roles.player_allowed(player, "gui/bonus") then
if not within_limit or not Roles.player_has_permission(player, "exp_scenario.gui.bonus") then
Elements.container.clear_player_bonus(player)
return
end
@@ -512,7 +513,7 @@ end
--- Apply the periodic bonus to all players
local function apply_periodic_bonus_online()
for _, player in pairs(game.connected_players) do
if player.character and Roles.player_allowed(player, "gui/bonus") then
if player.character and Roles.player_has_permission(player, "exp_scenario.gui.bonus") then
apply_personal_battery_recharge(player)
end
end
@@ -524,8 +525,7 @@ return {
elements = Elements,
events = {
[e.on_player_respawned] = recalculate_bonus,
[Roles.events.on_role_assigned] = recalculate_bonus,
[Roles.events.on_role_unassigned] = recalculate_bonus,
[Roles.events.on_player_roles_changed] = recalculate_bonus,
},
on_nth_tick = {
[config.periodic_bonus_rate] = apply_periodic_bonus_online,
+6 -6
View File
@@ -4,7 +4,7 @@ Adds a player list to show names and play time; also includes action buttons whi
local ExpUtil = require("modules/exp_util")
local Gui = require("modules/exp_gui")
local Roles = require("modules/exp_legacy/expcore/roles")
local Roles = require("modules/exp_roles")
local config = require("modules/exp_legacy/config/gui/player_list_actions")
--- @class ExpGui_PlayerList.elements
@@ -203,7 +203,8 @@ function Elements.player_table.calculate_row_data()
-- Flatten the roles into a single ordered list
local count = 0
local row_data = {}
for _, role_name in pairs(Roles.config.order) do
for _, role in ipairs(Roles.get_roles()) do
local role_name = role.name
if players[role_name] then
for _, player in pairs(players[role_name]) do
count = count + 1
@@ -360,7 +361,7 @@ function Elements.action_bar.refresh(action_bar, player, selected_player)
if buttons.auth and not buttons.auth(player, selected_player) then
flow.visible = false
else
flow.visible = Roles.player_allowed(player, action_name)
flow.visible = Roles.player_has_permission(player, action_name)
end
end
end
@@ -492,7 +493,7 @@ Gui.toolbar.create_button{
sprite = "entity/character",
tooltip = { "exp-gui_player-list.main-tooltip" },
visible = function(player, element)
return Roles.player_allowed(player, "gui/player-list")
return Roles.player_has_permission(player, "exp_scenario.gui.player_list")
end
}
@@ -534,8 +535,7 @@ return {
events = {
[e.on_player_joined_game] = redraw_player_list,
[e.on_player_left_game] = on_player_left_game,
[Roles.events.on_role_assigned] = redraw_player_list,
[Roles.events.on_role_unassigned] = redraw_player_list,
[Roles.events.on_player_roles_changed] = redraw_player_list,
},
on_nth_tick = {
[1800] = refresh_player_times,
+2 -2
View File
@@ -5,7 +5,7 @@ Displays the player data for a player
local ExpUtil = require("modules/exp_util")
local Gui = require("modules/exp_gui")
local ElementsExtra = require("modules/exp_scenario/gui/elements")
local Roles = require("modules/exp_legacy/expcore/roles")
local Roles = require("modules/exp_roles")
require("modules/exp_legacy/modules/data/statistics")
local PlayerData = require("modules/exp_legacy/expcore/player_data")
@@ -214,7 +214,7 @@ Gui.toolbar.create_button{
tooltip = { "exp-gui_player-stats.tooltip-main" },
left_element = Elements.container,
visible = function(player, element)
return Roles.player_allowed(player, "gui/playerdata")
return Roles.player_has_permission(player, "exp_scenario.gui.playerdata")
end
}
+2 -2
View File
@@ -3,7 +3,7 @@ Adds a Gui for displaying item production stats
]]
local Gui = require("modules/exp_gui")
local Roles = require("modules/exp_legacy/expcore/roles")
local Roles = require("modules/exp_roles")
--- @class ExpGui_ProductionStats.elements
local Elements = {}
@@ -250,7 +250,7 @@ Gui.toolbar.create_button{
sprite = "entity/assembling-machine-3",
tooltip = { "exp-gui_production-stats.tooltip-main" },
visible = function(player, element)
return Roles.player_allowed(player, "gui/production")
return Roles.player_has_permission(player, "exp_scenario.gui.production")
end
}
+3 -4
View File
@@ -4,7 +4,7 @@ Adds a few buttons for common actions
local Gui = require("modules/exp_gui")
local Commands = require("modules/exp_commands")
local Roles = require("modules/exp_legacy/expcore/roles")
local Roles = require("modules/exp_roles")
local addon_artillery = require("modules/exp_scenario/commands/artillery")
local addon_trains = require("modules/exp_scenario/commands/trains")
@@ -116,7 +116,7 @@ Gui.toolbar.create_button{
sprite = "item/repair-pack",
tooltip = { "exp-gui_quick-actions.tooltip-main" },
visible = function(player, element)
return Roles.player_allowed(player, "gui/tool")
return Roles.player_has_permission(player, "exp_scenario.gui.tool")
end
}
@@ -129,7 +129,6 @@ end
return {
elements = Elements,
events = {
[Roles.events.on_role_assigned] = on_role_changed,
[Roles.events.on_role_unassigned] = on_role_changed,
[Roles.events.on_player_roles_changed] = on_role_changed,
}
}
+11 -9
View File
@@ -4,7 +4,7 @@ Adds a main gui that contains important information about the server.
local ExpUtil = require("modules/exp_util")
local Gui = require("modules/exp_gui")
local Roles = require("modules.exp_legacy.expcore.roles")
local Roles = require("modules/exp_roles")
local Commands = require("modules/exp_commands")
local PlayerData = require("modules.exp_legacy.expcore.player_data")
local External = require("modules.exp_legacy.expcore.external")
@@ -392,14 +392,16 @@ define_tab(
local done = {}
-- Fill groups from configured roles
for player_name, player_roles in pairs(Roles.config.players) do
for _, group in ipairs(groups) do
for _, role_name in ipairs(group.roles) do
if table.contains(player_roles, role_name) then
-- Fill groups from the players who hold the roles, a player can be in more than one group
for _, group in ipairs(groups) do
local seen = {}
for _, role_name in ipairs(group.roles) do
local role = Roles.get_role(role_name)
for _, player_name in ipairs(role and role:get_player_names() or {}) do
if not seen[player_name] then
seen[player_name] = true
done[player_name] = true
group.players[#group.players + 1] = player_name
break
end
end
end
@@ -463,7 +465,7 @@ local function render_data_category(opts)
for name, child in pairs(opts.children) do
local metadata = child.metadata
if not metadata.permission or Roles.player_allowed(opts.player, metadata.permission) then
if not metadata.permission or Roles.player_has_permission(opts.player, metadata.permission) then
local value = child:get(opts.player_name)
if value ~= nil or metadata.show_always then
@@ -663,7 +665,7 @@ Elements.toggle_button = Gui.toolbar.create_button{
sprite = "virtual-signal/signal-info",
tooltip = { "exp-gui_readme.main-tooltip" },
visible = function(player)
return Roles.player_allowed(player, "gui/readme")
return Roles.player_has_permission(player, "exp_scenario.gui.readme")
end,
}
:on_click(function(_, player)
@@ -4,7 +4,7 @@ Adds a gui for tracking research milestones
local ExpUtil = require("modules/exp_util")
local Gui = require("modules/exp_gui")
local Roles = require("modules/exp_legacy/expcore/roles")
local Roles = require("modules/exp_roles")
local config = require("modules/exp_legacy/config/research")
local table_to_json = helpers.table_to_json
@@ -339,7 +339,7 @@ Gui.toolbar.create_button{
sprite = "item/space-science-pack",
tooltip = { "exp-gui_research-milestones.tooltip-main" },
visible = function(player, element)
return Roles.player_allowed(player, "gui/research")
return Roles.player_has_permission(player, "exp_scenario.gui.research")
end
}
+2 -2
View File
@@ -4,7 +4,7 @@ Adds a rocket information gui which shows general stats, milestones and build pr
local ExpUtil = require("modules/exp_util")
local Gui = require("modules/exp_gui")
local Roles = require("modules/exp_legacy/expcore/roles")
local Roles = require("modules/exp_roles")
local config = require("modules/exp_legacy/config/gui/rockets")
--- @class ExpGui_RocketInfo.elements
@@ -651,7 +651,7 @@ Gui.toolbar.create_button{
sprite = "item/rocket-silo",
tooltip = { "exp-gui_rocket-info.tooltip-main" },
visible = function(player, element)
return Roles.player_allowed(player, "gui/rocket-info")
return Roles.player_has_permission(player, "exp_scenario.gui.rocket_info")
end
}
@@ -5,7 +5,7 @@ Adds a science info gui that shows production usage and net for the different sc
local ExpUtil = require("modules/exp_util")
local Gui = require("modules/exp_gui")
local Colors = require("modules/exp_util/include/color")
local Roles = require("modules/exp_legacy/expcore/roles")
local Roles = require("modules/exp_roles")
local config = require("modules/exp_legacy/config/gui/science")
local _format_number = require("util").format_number
@@ -571,7 +571,7 @@ Gui.toolbar.create_button{
sprite = "entity/lab",
tooltip = { "exp-gui_science-production.tooltip-main" },
visible = function(player, element)
return Roles.player_allowed(player, "gui/science-info")
return Roles.player_has_permission(player, "exp_scenario.gui.science_info")
end
}
+2 -2
View File
@@ -4,7 +4,7 @@ Adds cameras which can be used to view players and locations
local Gui = require("modules/exp_gui")
local ElementsExtra = require("modules/exp_scenario/gui/elements")
local Roles = require("modules/exp_legacy/expcore/roles")
local Roles = require("modules/exp_roles")
--- @class ExpGui_Surveillance.elements
local Elements = {}
@@ -234,7 +234,7 @@ Gui.toolbar.create_button{
sprite = "entity/radar",
tooltip = { "exp-gui_surveillance.tooltip-main" },
visible = function(player, element)
return Roles.player_allowed(player, "gui/surveillance")
return Roles.player_has_permission(player, "exp_scenario.gui.surveillance")
end
}:on_click(function(def, player, element, event)
Elements.container(player.gui.screen)
+7 -8
View File
@@ -3,7 +3,7 @@ Adds a task list to the game which players can add, remove and edit items on
]]
local Gui = require("modules/exp_gui")
local Roles = require("modules.exp_legacy.expcore.roles")
local Roles = require("modules/exp_roles")
local config = require("modules.exp_legacy.config.gui.tasks")
local ExpUtil = require("modules/exp_util")
@@ -43,8 +43,8 @@ local function has_permission_create_task(player)
return true
elseif allow_add_task == "admin" then
return player.admin
elseif allow_add_task == "expcore.roles" then
return Roles.player_allowed(player, config.expcore_roles_allow_add_task)
elseif allow_add_task == "exp_roles" then
return Roles.player_has_permission(player, config.exp_roles_allow_add_task)
end
return false
@@ -67,8 +67,8 @@ local function has_permission_edit_task(player, task)
return true
elseif allow_edit_task == "admin" then
return player.admin
elseif allow_edit_task == "expcore.roles" then
return Roles.player_allowed(player, config.expcore_roles_allow_edit_task)
elseif allow_edit_task == "exp_roles" then
return Roles.player_has_permission(player, config.exp_roles_allow_edit_task)
end
return false
@@ -922,7 +922,7 @@ Gui.toolbar.create_button{
sprite = "utility/not_enough_repair_packs_icon",
tooltip = { "exp-gui_task-list.tooltip-main" },
visible = function(player, element)
return Roles.player_allowed(player, "gui/task-list")
return Roles.player_has_permission(player, "exp_scenario.gui.task_list")
end
}
@@ -950,7 +950,6 @@ return {
events = {
[e.on_player_joined_game] = refresh_player_tasks,
[e.on_player_changed_force] = refresh_player_tasks,
[Roles.events.on_role_assigned] = refresh_player_permissions,
[Roles.events.on_role_unassigned] = refresh_player_permissions,
[Roles.events.on_player_roles_changed] = refresh_player_permissions,
}
}
+1
View File
@@ -8,6 +8,7 @@
"dependencies": {
"clusterio": "*",
"exp_util": "*",
"exp_roles": "*",
"exp_gui": "*",
"exp_commands": "*"
}
+1 -1
View File
@@ -14,7 +14,7 @@ local PlayerData = require("modules/exp_legacy/expcore/player_data")
local UsesServerUps = PlayerData.Settings:combine("UsesServerUps")
UsesServerUps:set_default(false)
UsesServerUps:set_metadata{
permission = "command/server-ups",
permission = "exp_scenario.command.server_ups",
stringify = function(value) return value and "Visible" or "Hidden" end,
}