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 --- GUI
"modules.gui.warp-list", "modules.gui.warp-list",
"modules.gui.vlayer", "modules.gui.vlayer",
"modules.gui._role_updates",
"modules.graftorio.require", -- graftorio "modules.graftorio.require", -- graftorio
--- Config Files --- Config Files
"config.expcore.permission_groups", -- loads some predefined permission groups "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 { return {
admin_as_active = true, --- @setting admin_as_active When true admins will be treated as active regardless of afk time 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 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 update_time = 3600 * 30, --- @setting update_time How often in ticks the script checks for active players
custom_active_check = function(player) 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, 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 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_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) 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> --- @type table<string, LocalisedString | fun(player: LuaPlayer, is_command: boolean): LocalisedString>
commands = { --- @setting commands will trigger only when command prefix is given 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 ExpUtil = require("modules/exp_util")
local Gui = require("modules/exp_gui") 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 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 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 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 -- auth that will only allow when on player's of lower roles
local function auth_lower_role(player, selected_player_name) local function auth_lower_role(player, selected_player_name)
local player_highest = Roles.get_player_highest_role(player) return Roles.player_outranks(player, selected_player_name)
local action_player_highest = Roles.get_player_highest_role(selected_player_name)
if player_highest.index < action_player_highest.index then
return true
end
end end
-- gets the action player and a coloured name for the action to be used on -- 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 if Reports.is_reported(selected_player.name, player.name) then
player.print({ "exp-commands_report.already-reported" }, Colors.orange_red) player.print({ "exp-commands_report.already-reported" }, Colors.orange_red)
else else
set_selected_action(player, "command/report") set_selected_action(player, "exp_scenario.command.create_report")
end end
end) end)
@@ -110,7 +106,7 @@ end
-- @element warn_player -- @element warn_player
local warn_player = new_button("utility/spawn_flag", { "exp-gui_player-list.warn-player" }) local warn_player = new_button("utility/spawn_flag", { "exp-gui_player-list.warn-player" })
:on_click(function(def, player, element) :on_click(function(def, player, element)
set_selected_action(player, "command/give-warning") set_selected_action(player, "exp_scenario.command.create_warning")
end) end)
local function warn_player_callback(player, reason) 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 if Jail.is_jailed(selected_player.name) then
player.print({ "exp-commands_jail.already-jailed", selected_player_color }, Colors.orange_red) player.print({ "exp-commands_jail.already-jailed", selected_player_color }, Colors.orange_red)
else else
set_selected_action(player, "command/jail") set_selected_action(player, "exp_scenario.command.jail")
end end
end) end)
@@ -143,7 +139,7 @@ end
-- @element kick_player -- @element kick_player
local kick_player = new_button("utility/warning_icon", { "exp-gui_player-list.kick-player" }) local kick_player = new_button("utility/warning_icon", { "exp-gui_player-list.kick-player" })
:on_click(function(def, player, element) :on_click(function(def, player, element)
set_selected_action(player, "command/kick") set_selected_action(player, "exp_scenario.gui.player_list.kick")
end) end)
local function kick_player_callback(player, reason) local function kick_player_callback(player, reason)
@@ -155,7 +151,7 @@ end
-- @element ban_player -- @element ban_player
local ban_player = new_button("utility/danger_icon", { "exp-gui_player-list.ban-player" }) local ban_player = new_button("utility/danger_icon", { "exp-gui_player-list.ban-player" })
:on_click(function(def, player, element) :on_click(function(def, player, element)
set_selected_action(player, "command/ban") set_selected_action(player, "exp_scenario.gui.player_list.ban")
end) end)
local function ban_player_callback(player, reason) local function ban_player_callback(player, reason)
@@ -166,39 +162,39 @@ end
return { return {
set_accessors = set_accessors, set_accessors = set_accessors,
buttons = { buttons = {
["command/teleport"] = { ["exp_scenario.command.teleport"] = {
auth = function(player, selected_player) auth = function(player, selected_player)
return player.name ~= selected_player.name return player.name ~= selected_player.name
end, -- cant teleport to your self end, -- cant teleport to your self
goto_player, goto_player,
bring_player, bring_player,
}, },
["command/report"] = { ["exp_scenario.command.create_report"] = {
auth = function(player, selected_player) auth = function(player, selected_player)
if player == selected_player then return false end if player == selected_player then return false end
if not Roles.player_allowed(player, "command/give-warning") then if not Roles.player_has_permission(player, "exp_scenario.command.create_warning") then
return not Roles.player_has_flag(selected_player, "report-immune") return not Roles.player_has_permission(selected_player, "exp_scenario.bypass.reports")
end end
end, -- can report any player that isn't immune and you aren't able to give warnings end, -- can report any player that isn't immune and you aren't able to give warnings
reason_callback = report_player_callback, reason_callback = report_player_callback,
report_player, report_player,
}, },
["command/give-warning"] = { ["exp_scenario.command.create_warning"] = {
auth = auth_lower_role, -- warn a lower user, replaces report auth = auth_lower_role, -- warn a lower user, replaces report
reason_callback = warn_player_callback, reason_callback = warn_player_callback,
warn_player, warn_player,
}, },
["command/jail"] = { ["exp_scenario.command.jail"] = {
auth = auth_lower_role, auth = auth_lower_role,
reason_callback = jail_player_callback, reason_callback = jail_player_callback,
jail_player, jail_player,
}, },
["command/kick"] = { ["exp_scenario.gui.player_list.kick"] = {
auth = auth_lower_role, auth = auth_lower_role,
reason_callback = kick_player_callback, reason_callback = kick_player_callback,
kick_player, kick_player,
}, },
["command/ban"] = { ["exp_scenario.gui.player_list.ban"] = {
auth = auth_lower_role, auth = auth_lower_role,
reason_callback = ban_player_callback, reason_callback = ban_player_callback,
ban_player, 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_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 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_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 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_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 { return {
-- Adding tasks -- Adding tasks
allow_add_task = "all", --- @setting allow_add_task dictates who is allowed to add new tasks; values: all, admin, expcore.roles, none allow_add_task = "all", --- @setting allow_add_task dictates who is allowed to add new tasks; values: all, admin, exp_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 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 -- 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 allow_edit_task = "exp_roles", --- @setting allow_edit_task dictates who is allowed to edit existing tasks; values: all, admin, exp_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 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 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 default_icon = { type = "item", name = "discharge-defense-equipment" }, --- @setting default_icon the default icon that will be used for warps
-- Warp cooldowns -- 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 bypass_warp_cooldown = "exp_roles", --- @setting bypass_warp_cooldown dictates who the warp cooldown is applied to; values: all, admin, exp_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 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 cooldown_duration = 60, --- @setting cooldown_duration the duration of the warp cooldown in seconds
-- Warp proximity -- 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 bypass_warp_proximity = "exp_roles", --- @setting bypass_warp_proximity dictates who the warp proximity is applied to; values: all, admin, exp_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 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 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 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 -- Adding warps
allow_add_warp = "expcore.roles", --- @setting allow_add_warp dictates who is allowed to add warps; values: all, admin, expcore.roles, none allow_add_warp = "exp_roles", --- @setting allow_add_warp dictates who is allowed to add warps; values: all, admin, exp_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 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 -- Editing warps
allow_edit_warp = "expcore.roles", --- @setting allow_edit_warp dictates who is allowed to edit warps; values: all, admin, expcore.roles, none allow_edit_warp = "exp_roles", --- @setting allow_edit_warp dictates who is allowed to edit warps; values: all, admin, exp_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 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 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 -- 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 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 { return {
ignore_admins = true, --- @setting ignore_admins If admins are ignored by the protection filter 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_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 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 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] [expcore-data]
description-preference=Allows you to set/get your data saving preference. description-preference=Allows you to set/get your data saving preference.
description-data=Writes all your player data to a file on your computer. 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] [expcore-data]
description-preference=允許寫入資料。 description-preference=允許寫入資料。
description-data=把用戶資料寫入電腦 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] [expcore-data]
description-preference=允許寫入資料。 description-preference=允許寫入資料。
description-data=把用戶資料寫入電腦 description-data=把用戶資料寫入電腦
+1
View File
@@ -8,6 +8,7 @@
"dependencies": { "dependencies": {
"clusterio": "*", "clusterio": "*",
"exp_util": "*", "exp_util": "*",
"exp_roles": "*",
"exp_gui": "*" "exp_gui": "*"
} }
} }
+13 -18
View File
@@ -7,25 +7,23 @@
-- import the module from the control modules -- import the module from the control modules
local Jail = require("modules.exp_legacy.modules.control.jail") --- @dep modules.control.jail 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 -- 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') 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 -- again as above the player name is only used in the event for user feedback
Jail.unjail_player('MrBiter', 'Cooldude2606') 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 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 --- The role which is given to jailed players, it has a higher priority than every other role
local has_role = Roles.player_has_role local jail_role = "Jail"
local get_roles = Roles.get_player_roles
local Jail = { local Jail = {
old_roles = {},
events = { events = {
--- When a player is assigned to jail --- When a player is assigned to jail
-- @event on_player_jailed -- @event on_player_jailed
@@ -64,10 +62,10 @@ end
-- @tparam LuaPlayer player the player to check if they are in jail -- @tparam LuaPlayer player the player to check if they are in jail
-- @treturn boolean whether the player is currently in jail -- @treturn boolean whether the player is currently in jail
function Jail.is_jailed(player) function Jail.is_jailed(player)
return has_role(valid_player(player), "Jail") return Roles.player_has_role(valid_player(player), jail_role)
end 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 LuaPlayer player the player who will be jailed
-- @tparam string by_player_name the name of the player who is doing the jailing -- @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 -- @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." reason = reason or "Non given."
if has_role(player, "Jail") then return end if Roles.player_has_role(player, jail_role) then return end
local roles = get_roles(player)
player.walking_state = { walking = false, direction = player.walking_state.direction } player.walking_state = { walking = false, direction = player.walking_state.direction }
player.riding_state = { acceleration = defines.riding.acceleration.nothing, direction = player.riding_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.picking_state = false
player.repair_state = { repairing = false, position = player.repair_state.position } player.repair_state = { repairing = false, position = player.repair_state.position }
unassign_roles(player, roles, by_player_name, nil, true) Roles.assign_player(player, jail_role, by_player_name, 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) event_emit(Jail.events.on_player_jailed, player, by_player_name, reason)
return true return true
end 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 LuaPlayer player the player that will be unjailed
-- @tparam string by_player_name the name of the player that is doing the unjail -- @tparam string by_player_name the name of the player that is doing the unjail
-- @treturn boolean whether the player was unjailed successfully -- @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 player then return end
if not by_player_name 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) 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
end end
-- Require roles if a permission is assigned in the config local Roles = require("modules/exp_roles")
local Roles --- @type table<string, any>
if config.ignore_permission then
Roles = require("modules.exp_legacy.expcore.roles") --- @dep expcore.roles
end
----- Storage Variables ----- ----- Storage Variables -----
--- Variables stored in the global table --- 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 -- Check if the player should be ignored
if config.ignore_admins and player.admin then return end 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 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 -- Check if the entity is protected
if EntityProtection.is_entity_protected(entity) 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 PlayerData = require("modules.exp_legacy.expcore.player_data") --- @dep expcore.player_data
local CustomMessages = PlayerData.Settings:combine("JoinMessage") local CustomMessages = PlayerData.Settings:combine("JoinMessage")
CustomMessages:set_metadata{ CustomMessages:set_metadata{
permission = "command/join-message", permission = "exp_scenario.command.set_join_message",
} }
--- When a players data loads show their 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 PlayerData = require("modules.exp_legacy.expcore.player_data") --- @dep expcore.player_data
local PlayerFilters = PlayerData.Settings:combine("QuickbarFilters") local PlayerFilters = PlayerData.Settings:combine("QuickbarFilters")
PlayerFilters:set_metadata{ PlayerFilters:set_metadata{
permission = "command/save-quickbar", permission = "exp_scenario.command.save_quickbar",
stringify = function(value) stringify = function(value)
if not value then return "No filters set" end if not value then return "No filters set" end
local count = 0 local count = 0
+4 -4
View File
@@ -4,17 +4,17 @@
]] ]]
local Commands = require("modules/exp_commands") 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 --- Stores the tag for a player
local PlayerData = require("modules.exp_legacy.expcore.player_data") --- @dep expcore.player_data local PlayerData = require("modules.exp_legacy.expcore.player_data") --- @dep expcore.player_data
local PlayerTags = PlayerData.Settings:combine("Tag") local PlayerTags = PlayerData.Settings:combine("Tag")
local PlayerTagColors = PlayerData.Settings:combine("TagColor") local PlayerTagColors = PlayerData.Settings:combine("TagColor")
PlayerTags:set_metadata{ PlayerTags:set_metadata{
permission = "command/tag", permission = "exp_scenario.command.tag",
} }
PlayerTagColors:set_metadata{ PlayerTagColors:set_metadata{
permission = "command/tag-color", permission = "exp_scenario.command.tag_color",
} }
local set_tag = function(player, 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 if other_player == player then
-- No player given so removes your tag -- No player given so removes your tag
PlayerTags:remove(other_player) 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 -- Player given and user is admin so clears that player's tag
PlayerTags:remove(other_player) PlayerTags:remove(other_player)
else 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 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 Event = require("modules/exp_legacy/utils/event") --- @dep utils.event
local format_number = require("util").format_number --- @dep util local format_number = require("util").format_number --- @dep util
local config = require("modules.exp_legacy.config.vlayer") --- @dep config.vlayer 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) vlayer_gui_control_see(disp)
local b = vlayer_gui_control_build(disp) local b = vlayer_gui_control_build(disp)
local r = vlayer_gui_control_remove(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 b.visible = v
r.visible = v r.visible = v
@@ -484,22 +484,21 @@ Gui.toolbar.create_button{
sprite = "entity/solar-panel", sprite = "entity/solar-panel",
tooltip = { "vlayer.main-tooltip" }, tooltip = { "vlayer.main-tooltip" },
visible = function(player, element) visible = function(player, element)
return Roles.player_allowed(player, "gui/vlayer") return Roles.player_has_permission(player, "exp_scenario.gui.vlayer")
end end
} }
--- Update the visibly of the buttons based on a players roles --- Update the visibly of the buttons based on a players roles
local function role_update_event(event) local function role_update_event(event)
local player = game.players[event.player_index] 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 container = Gui.get_left_element(vlayer_container, player)
local disp = container.frame["vlayer_st_2"].disp.table local disp = container.frame["vlayer_st_2"].disp.table
disp[vlayer_gui_control_build.name].visible = visible disp[vlayer_gui_control_build.name].visible = visible
disp[vlayer_gui_control_remove.name].visible = visible disp[vlayer_gui_control_remove.name].visible = visible
end end
Event.add(Roles.events.on_role_assigned, role_update_event) Event.add(Roles.events.on_player_roles_changed, role_update_event)
Event.add(Roles.events.on_role_unassigned, role_update_event)
Event.on_nth_tick(config.update_tick_gui, function(_) Event.on_nth_tick(config.update_tick_gui, function(_)
local stats = vlayer.get_statistics() 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 Datastore = require("modules.exp_legacy.expcore.datastore") --- @dep expcore.datastore
local Storage = require("modules/exp_util/storage") local Storage = require("modules/exp_util/storage")
local Event = require("modules/exp_legacy/utils/event") --- @dep utils.event 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 Colors = require("modules/exp_util/include/color")
local config = require("modules.exp_legacy.config.gui.warps") --- @dep config.gui.warps 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 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 return true
elseif action_config == "admin" then elseif action_config == "admin" then
return player.admin return player.admin
elseif action_config == "expcore.roles" then elseif action_config == "exp_roles" then
return Roles.player_allowed(player, config["expcore_roles_" .. action]) return Roles.player_has_permission(player, config["exp_roles_" .. action])
end end
-- Return false as all other conditions have not been met -- 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, sprite = config.default_icon.type .. "/" .. config.default_icon.name,
tooltip = { "warp-list.main-tooltip" }, tooltip = { "warp-list.main-tooltip" },
visible = function(player, element) visible = function(player, element)
return Roles.player_allowed(player, "gui/warp-list") return Roles.player_has_permission(player, "exp_scenario.gui.warp_list")
end end
}:on_click(function(def, player, element) }:on_click(function(def, player, element)
-- Set gui keep open state for player that clicked the button: true if visible, false if invisible -- 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 add_new_warp_element.visible = allow_add_warp
end end
Event.add(Roles.events.on_role_assigned, role_update_event) Event.add(Roles.events.on_player_roles_changed, role_update_event)
Event.add(Roles.events.on_role_unassigned, role_update_event)
--- When a chart tag is removed or edited make sure it is not one that belongs to a warp --- When a chart tag is removed or edited make sure it is not one that belongs to a warp
local function maintain_tag(event) local function maintain_tag(event)
@@ -1,26 +1,28 @@
--[[-- Command Authorities - Roles --[[-- 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 Commands = require("modules/exp_commands")
local add, allow, deny = Commands.add_permission_authority, Commands.status.success, Commands.status.unauthorised local add, allow, deny = Commands.add_permission_authority, Commands.status.success, Commands.status.unauthorised
local Roles = require("modules/exp_legacy/expcore/roles") local Roles = require("modules/exp_roles")
local player_allowed = Roles.player_allowed local player_has_permission = Roles.player_has_permission
local authorities = {} 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 = authorities.exp_permission =
add(function(player, command) 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" } return deny{ "exp-commands-authorities_role.deny" }
else else
return allow() return allow()
end end
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 if state then
Commands.unlock_system_commands(player.name) Commands.unlock_system_commands(player.name)
else 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("Gui", require("modules/exp_gui"))
add_static("Group", require("modules.exp_legacy.expcore.permission_groups")) 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("Datastore", require("modules.exp_legacy.expcore.datastore"))
add_static("External", require("modules.exp_legacy.expcore.external")) add_static("External", require("modules.exp_legacy.expcore.external"))
+25 -21
View File
@@ -1,4 +1,3 @@
--[[-- Command Types - Roles --[[-- Command Types - Roles
The data types that are used with exp_roles The data types that are used with exp_roles
A lower role index indicates it is more privileged A lower role index indicates it is more privileged
@@ -11,28 +10,42 @@ Adds parsers for:
lower_role_player_alive lower_role_player_alive
]] ]]
local ExpUtil = require("modules/exp_util")
local auto_complete = ExpUtil.auto_complete
local Commands = require("modules/exp_commands") local Commands = require("modules/exp_commands")
local add, parse = Commands.add_data_type, Commands.parse_input local add, parse = Commands.add_data_type, Commands.parse_input
local valid, invalid = Commands.status.success, Commands.status.invalid_input local valid, invalid = Commands.status.success, Commands.status.invalid_input
local Roles = require("modules.exp_legacy.expcore.roles") local Roles = require("modules/exp_roles")
local highest_role = Roles.get_player_highest_role local player_outranks = Roles.player_outranks
local types = {} --- @class (partial) Commands.types local types = {} --- @class (partial) Commands.types
--- A role defined by exp roles --- A role known to exp roles, matched on its name
types.role = add("role", Commands.types.key_of(Roles.config.roles)) 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 --- A role which is lower than the players highest role
types.lower_role = types.lower_role =
add("lower_role", function(input, player) add("lower_role", function(input, player)
local success, status, result = parse(input, player, types.role) local success, status, result = parse(input, player, types.role)
if not success then return status, result end 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) if not Roles.player_outranks_role(player, result) then
local is_root = Roles.config.internal.root == player_highest.name
if not is_root and player_highest.index >= result.index then
return invalid{ "exp-commands-parse_role.lower-role" } return invalid{ "exp-commands-parse_role.lower-role" }
else else
return valid(result) return valid(result)
@@ -46,10 +59,7 @@ types.lower_role_player =
if not success then return status, result end if not success then return status, result end
--- @cast result LuaPlayer --- @cast result LuaPlayer
local other_highest = highest_role(result) if not player_outranks(player, result) then
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
return invalid{ "exp-commands-parse_role.lower-role-player" } return invalid{ "exp-commands-parse_role.lower-role-player" }
else else
return valid(result) return valid(result)
@@ -63,10 +73,7 @@ types.lower_role_player_online =
if not success then return status, result end if not success then return status, result end
--- @cast result LuaPlayer --- @cast result LuaPlayer
local other_highest = highest_role(result) if not player_outranks(player, result) then
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
return invalid{ "exp-commands-parse_role.lower-role-player" } return invalid{ "exp-commands-parse_role.lower-role-player" }
else else
return valid(result) return valid(result)
@@ -80,10 +87,7 @@ types.lower_role_player_alive =
if not success then return status, result end if not success then return status, result end
--- @cast result LuaPlayer --- @cast result LuaPlayer
local other_highest = highest_role(result) if not player_outranks(player, result) then
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
return invalid{ "exp-commands-parse_role.lower-role-player" } return invalid{ "exp-commands-parse_role.lower-role-player" }
else else
return valid(result) 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 Commands = require("modules/exp_commands")
local Roles = require("modules.exp_legacy.expcore.roles") --- @dep expcore.roles local Roles = require("modules/exp_roles")
local highest_role = Roles.get_player_highest_role local player_outranks = Roles.player_outranks
--- Kills yourself or another player. --- Kills yourself or another player.
Commands.new("kill", { "exp-commands_kill.description" }) Commands.new("kill", { "exp-commands_kill.description" })
@@ -20,7 +20,7 @@ Commands.new("kill", { "exp-commands_kill.description" })
if other_player == nil then if other_player == nil then
-- Can only be nil if the target is the player and they are already dead -- Can only be nil if the target is the player and they are already dead
return Commands.status.error{ "exp-commands_kill.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 -- You can always kill yourself or can kill lower role players
if script.active_mods["space-age"] then 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 } 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 Commands = require("modules/exp_commands")
local format_player_name = Commands.format_player_name_locale 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 EntityProtection = require("modules.exp_legacy.modules.control.protection") --- @dep modules.control.protection
local format_string = string.format 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 format_player_name = Commands.format_player_name_locale
local parse_input = Commands.parse_input local parse_input = Commands.parse_input
local Roles = require("modules.exp_legacy.expcore.roles") local Roles = require("modules/exp_roles")
local player_has_flag = Roles.player_has_flag local player_has_permission = Roles.player_has_permission
local Reports = require("modules.exp_legacy.modules.control.reports") --- @dep modules.control.reports 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 if not success then return status, result end
--- @cast result LuaPlayer --- @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" } return Commands.status.invalid_input{ "exp-commands_reports.player-immune" }
elseif player == input then elseif player == input then
return Commands.status.invalid_input{ "exp-commands_reports.self-report" } 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_player_name = Commands.format_player_name_locale
local format_text = Commands.format_rich_text_color_locale local format_text = Commands.format_rich_text_color_locale
local Roles = require("modules.exp_legacy.expcore.roles") --- @dep expcore.roles local Roles = require("modules/exp_roles")
local get_roles_ordered = Roles.get_roles_ordered local get_roles = Roles.get_roles
local get_player_roles = Roles.get_player_roles local get_player_roles = Roles.get_player_roles
--- Assigns a role to a player --- Assigns a role to a player
@@ -18,7 +18,7 @@ Commands.new("assign-role", { "exp-commands_roles.description-assign" })
:add_flags{ "admin_only" } :add_flags{ "admin_only" }
:register(function(player, other_player, role) :register(function(player, other_player, role)
--- @cast other_player LuaPlayer --- @cast other_player LuaPlayer
--- @cast role any -- TODO --- @cast role ExpRoles.Role
Roles.assign_player(other_player, role, player.name) Roles.assign_player(other_player, role, player.name)
end) end)
@@ -30,7 +30,7 @@ Commands.new("unassign-role", { "exp-commands_roles.description-unassign" })
:add_flags{ "admin_only" } :add_flags{ "admin_only" }
:register(function(player, other_player, role) :register(function(player, other_player, role)
--- @cast other_player LuaPlayer --- @cast other_player LuaPlayer
--- @cast role any -- TODO --- @cast role ExpRoles.Role
Roles.unassign_player(other_player, role, player.name) Roles.unassign_player(other_player, role, player.name)
end) end)
@@ -40,7 +40,7 @@ Commands.new("get-roles", { "exp-commands_roles.description-get" })
:add_aliases{ "roles" } :add_aliases{ "roles" }
:register(function(player, other_player) :register(function(player, other_player)
--- @cast other_player LuaPlayer? --- @cast other_player LuaPlayer?
local roles = get_roles_ordered() local roles = get_roles()
local roles_formatted = { "" } --- @type LocalisedString local roles_formatted = { "" } --- @type LocalisedString
local response = { "exp-commands_roles.list-roles", roles_formatted } --[[@as LocalisedString]] local response = { "exp-commands_roles.list-roles", roles_formatted } --[[@as LocalisedString]]
if other_player then if other_player then
@@ -50,7 +50,7 @@ Commands.new("get-roles", { "exp-commands_roles.description-get" })
end end
for index, role in ipairs(roles) do 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 } roles_formatted[index + 1] = { "exp-commands_roles.list-element", role_name }
end end
+3 -3
View File
@@ -7,8 +7,8 @@ local teleport_player = ExpUtil.teleport_player
local Commands = require("modules/exp_commands") local Commands = require("modules/exp_commands")
local Roles = require("modules.exp_legacy.expcore.roles") --- @dep expcore.roles local Roles = require("modules/exp_roles")
local player_allowed = Roles.player_allowed local player_has_permission = Roles.player_has_permission
--- @class ExpCommands_Teleport.commands --- @class ExpCommands_Teleport.commands
local 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 if not teleport_player(player, game.surfaces.nauvis, { 0, 0 }, "dismount") then
return Commands.status.error{ "exp-commands_teleport.unavailable" } return Commands.status.error{ "exp-commands_teleport.unavailable" }
end 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 if not teleport_player(other_player, game.surfaces.nauvis, { 0, 0 }, "dismount") then
return Commands.status.error{ "exp-commands_teleport.unavailable" } return Commands.status.error{ "exp-commands_teleport.unavailable" }
end 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/protection_jail"))
add(require("modules/exp_scenario/control/report_jail")) add(require("modules/exp_scenario/control/report_jail"))
add(require("modules/exp_scenario/control/research")) 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/spawn_area"))
add(require("modules/exp_scenario/control/station_auto_name")) 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 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") local config = require("modules/exp_legacy/config/bonus")
--- @param event EventData.on_force_created --- @param event EventData.on_force_created
@@ -26,7 +26,7 @@ end
--- @param event EventData.on_player_died --- @param event EventData.on_player_died
local function fast_respawn(event) local function fast_respawn(event)
local player = assert(game.get_player(event.player_index)) 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 player.ticks_to_respawn = 120
end end
end end
@@ -2,7 +2,7 @@
Adds auto replies to chat messages, as well as chat commands 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 config = require("modules.exp_legacy.config.chat_reply")
local prefix = config.command_prefix local prefix = config.command_prefix
local prefix_len = string.len(prefix) local prefix_len = string.len(prefix)
@@ -20,7 +20,7 @@ local function on_console_chat(event)
-- Check if the player can chat commands -- Check if the player can chat commands
local commands_allowed = true local commands_allowed = true
if config.command_admin_only and not player.admin then commands_allowed = false end 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 -- Check if a key word appears in the message
for key_word, reply in pairs(config.messages) do 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 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 config = require("modules.exp_legacy.config.deconlog")
local seconds_time_format = ExpUtil.format_time_factory{ format = "short", hours = true, minutes = true, seconds = true } 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 function get_log_player(event)
local player = assert(game.get_player(event.player_index)) 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 return nil
end 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 Gui = require("modules/exp_gui")
local Async = require("modules/exp_util/async") 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 PlayerData = require("modules.exp_legacy.expcore.player_data")
local HasEnabledDecon = PlayerData.Settings:combine("HasEnabledDecon") local HasEnabledDecon = PlayerData.Settings:combine("HasEnabledDecon")
@@ -57,9 +57,9 @@ local remove_trees_async =
--- @param player LuaPlayer --- @param player LuaPlayer
--- @return "fast" | "allow" | "disallow" --- @return "fast" | "allow" | "disallow"
local function get_permission(player) 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" 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" return "allow"
else else
return "disallow" return "disallow"
@@ -101,7 +101,7 @@ Gui.toolbar.create_button{
tooltip = { "exp_fast-decon.tooltip-main" }, tooltip = { "exp_fast-decon.tooltip-main" },
auto_toggle = true, auto_toggle = true,
visible = function(player, _) visible = function(player, _)
return Roles.player_allowed(player, "fast-tree-decon") return Roles.player_has_permission(player, "exp_scenario.decon.fast_trees")
end end
}:on_click(function(def, player, element) }:on_click(function(def, player, element)
local state = Gui.toolbar.get_button_toggled_state(def, player) 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 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") local config = require("modules.exp_legacy.config.nukeprotect")
--- Check all items in the given inventory --- Check all items in the given inventory
@@ -12,7 +12,7 @@ local config = require("modules.exp_legacy.config.nukeprotect")
--- @param banned_items string[] --- @param banned_items string[]
local function check_items(player, type, banned_items) local function check_items(player, type, banned_items)
-- If the player has perms to be ignored, then they should be -- 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 if config.ignore_admins and player.admin then return end
local items = {} --- @type LuaItemStack[] 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 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 config = require("modules.exp_legacy.config.gui.autofill")
local FlyingText = require("modules/exp_util/flying_text") local FlyingText = require("modules/exp_util/flying_text")
@@ -330,7 +330,7 @@ Gui.toolbar.create_button{
sprite = config.icon, sprite = config.icon,
tooltip = { "exp-gui_autofill.tooltip-main" }, tooltip = { "exp-gui_autofill.tooltip-main" },
visible = function(player, element) visible = function(player, element)
return Roles.player_allowed(player, "gui/autofill") return Roles.player_has_permission(player, "exp_scenario.gui.autofill")
end 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 Gui = require("modules/exp_gui")
local AABB = require("modules/exp_util/aabb") 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 Selection = require("modules/exp_util/selection")
local SelectArea = Selection.connect("ModuleArea") local SelectArea = Selection.connect("ModuleArea")
@@ -259,7 +259,7 @@ Gui.toolbar.create_button{
sprite = "item/productivity-module-3", sprite = "item/productivity-module-3",
tooltip = { "exp-gui_module-inserter.tooltip-main" }, tooltip = { "exp-gui_module-inserter.tooltip-main" },
visible = function(player, element) visible = function(player, element)
return Roles.player_allowed(player, "gui/module") return Roles.player_has_permission(player, "exp_scenario.gui.module")
end 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 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 config = require("modules/exp_legacy/config/bonus")
local vlayer = require("modules/exp_legacy/modules/control/vlayer") local vlayer = require("modules/exp_legacy/modules/control/vlayer")
local format_number = require("util").format_number local format_number = require("util").format_number
@@ -68,7 +68,8 @@ do local _points_limit = {} --- @type table<number, number>
--- @param player LuaPlayer --- @param player LuaPlayer
--- @return number --- @return number
function Elements.bonus_used._calculate_points_limit(player) 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)) local points_limit = math.floor(config.points.base * (1 + config.points.increase_percentage_per_role_level * role_diff))
_points_limit[player.index] = points_limit _points_limit[player.index] = points_limit
return points_limit return points_limit
@@ -458,19 +459,19 @@ Gui.toolbar.create_button{
sprite = "item/exoskeleton-equipment", sprite = "item/exoskeleton-equipment",
tooltip = { "exp-gui_player-bonus.tooltip-main" }, tooltip = { "exp-gui_player-bonus.tooltip-main" },
visible = function(player, element) visible = function(player, element)
return Roles.player_allowed(player, "gui/bonus") return Roles.player_has_permission(player, "exp_scenario.gui.bonus")
end end
} }
--- Recalculate and apply the bonus for a player --- Recalculate and apply the bonus for a player
local function recalculate_bonus(event) local function recalculate_bonus(event)
local player = Gui.get_player(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 -- If the player's roles changed then we will need to recalculate their limit
Elements.bonus_used._clear_points_limit_cache(player) Elements.bonus_used._clear_points_limit_cache(player)
local bonus_cost = Elements.container.calculate_cost(player) local bonus_cost = Elements.container.calculate_cost(player)
local within_limit = Elements.bonus_used.refresh_player(player, bonus_cost) 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) Elements.container.clear_player_bonus(player)
return return
end end
@@ -512,7 +513,7 @@ end
--- Apply the periodic bonus to all players --- Apply the periodic bonus to all players
local function apply_periodic_bonus_online() local function apply_periodic_bonus_online()
for _, player in pairs(game.connected_players) do 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) apply_personal_battery_recharge(player)
end end
end end
@@ -524,8 +525,7 @@ return {
elements = Elements, elements = Elements,
events = { events = {
[e.on_player_respawned] = recalculate_bonus, [e.on_player_respawned] = recalculate_bonus,
[Roles.events.on_role_assigned] = recalculate_bonus, [Roles.events.on_player_roles_changed] = recalculate_bonus,
[Roles.events.on_role_unassigned] = recalculate_bonus,
}, },
on_nth_tick = { on_nth_tick = {
[config.periodic_bonus_rate] = apply_periodic_bonus_online, [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 ExpUtil = require("modules/exp_util")
local Gui = require("modules/exp_gui") 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") local config = require("modules/exp_legacy/config/gui/player_list_actions")
--- @class ExpGui_PlayerList.elements --- @class ExpGui_PlayerList.elements
@@ -203,7 +203,8 @@ function Elements.player_table.calculate_row_data()
-- Flatten the roles into a single ordered list -- Flatten the roles into a single ordered list
local count = 0 local count = 0
local row_data = {} 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 if players[role_name] then
for _, player in pairs(players[role_name]) do for _, player in pairs(players[role_name]) do
count = count + 1 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 if buttons.auth and not buttons.auth(player, selected_player) then
flow.visible = false flow.visible = false
else else
flow.visible = Roles.player_allowed(player, action_name) flow.visible = Roles.player_has_permission(player, action_name)
end end
end end
end end
@@ -492,7 +493,7 @@ Gui.toolbar.create_button{
sprite = "entity/character", sprite = "entity/character",
tooltip = { "exp-gui_player-list.main-tooltip" }, tooltip = { "exp-gui_player-list.main-tooltip" },
visible = function(player, element) visible = function(player, element)
return Roles.player_allowed(player, "gui/player-list") return Roles.player_has_permission(player, "exp_scenario.gui.player_list")
end end
} }
@@ -534,8 +535,7 @@ return {
events = { events = {
[e.on_player_joined_game] = redraw_player_list, [e.on_player_joined_game] = redraw_player_list,
[e.on_player_left_game] = on_player_left_game, [e.on_player_left_game] = on_player_left_game,
[Roles.events.on_role_assigned] = redraw_player_list, [Roles.events.on_player_roles_changed] = redraw_player_list,
[Roles.events.on_role_unassigned] = redraw_player_list,
}, },
on_nth_tick = { on_nth_tick = {
[1800] = refresh_player_times, [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 ExpUtil = require("modules/exp_util")
local Gui = require("modules/exp_gui") local Gui = require("modules/exp_gui")
local ElementsExtra = require("modules/exp_scenario/gui/elements") 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") require("modules/exp_legacy/modules/data/statistics")
local PlayerData = require("modules/exp_legacy/expcore/player_data") local PlayerData = require("modules/exp_legacy/expcore/player_data")
@@ -214,7 +214,7 @@ Gui.toolbar.create_button{
tooltip = { "exp-gui_player-stats.tooltip-main" }, tooltip = { "exp-gui_player-stats.tooltip-main" },
left_element = Elements.container, left_element = Elements.container,
visible = function(player, element) visible = function(player, element)
return Roles.player_allowed(player, "gui/playerdata") return Roles.player_has_permission(player, "exp_scenario.gui.playerdata")
end end
} }
+2 -2
View File
@@ -3,7 +3,7 @@ Adds a Gui for displaying item production stats
]] ]]
local Gui = require("modules/exp_gui") local Gui = require("modules/exp_gui")
local Roles = require("modules/exp_legacy/expcore/roles") local Roles = require("modules/exp_roles")
--- @class ExpGui_ProductionStats.elements --- @class ExpGui_ProductionStats.elements
local Elements = {} local Elements = {}
@@ -250,7 +250,7 @@ Gui.toolbar.create_button{
sprite = "entity/assembling-machine-3", sprite = "entity/assembling-machine-3",
tooltip = { "exp-gui_production-stats.tooltip-main" }, tooltip = { "exp-gui_production-stats.tooltip-main" },
visible = function(player, element) visible = function(player, element)
return Roles.player_allowed(player, "gui/production") return Roles.player_has_permission(player, "exp_scenario.gui.production")
end end
} }
+3 -4
View File
@@ -4,7 +4,7 @@ Adds a few buttons for common actions
local Gui = require("modules/exp_gui") local Gui = require("modules/exp_gui")
local Commands = require("modules/exp_commands") 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_artillery = require("modules/exp_scenario/commands/artillery")
local addon_trains = require("modules/exp_scenario/commands/trains") local addon_trains = require("modules/exp_scenario/commands/trains")
@@ -116,7 +116,7 @@ Gui.toolbar.create_button{
sprite = "item/repair-pack", sprite = "item/repair-pack",
tooltip = { "exp-gui_quick-actions.tooltip-main" }, tooltip = { "exp-gui_quick-actions.tooltip-main" },
visible = function(player, element) visible = function(player, element)
return Roles.player_allowed(player, "gui/tool") return Roles.player_has_permission(player, "exp_scenario.gui.tool")
end end
} }
@@ -129,7 +129,6 @@ end
return { return {
elements = Elements, elements = Elements,
events = { events = {
[Roles.events.on_role_assigned] = on_role_changed, [Roles.events.on_player_roles_changed] = on_role_changed,
[Roles.events.on_role_unassigned] = on_role_changed,
} }
} }
+9 -7
View File
@@ -4,7 +4,7 @@ Adds a main gui that contains important information about the server.
local ExpUtil = require("modules/exp_util") local ExpUtil = require("modules/exp_util")
local Gui = require("modules/exp_gui") 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 Commands = require("modules/exp_commands")
local PlayerData = require("modules.exp_legacy.expcore.player_data") local PlayerData = require("modules.exp_legacy.expcore.player_data")
local External = require("modules.exp_legacy.expcore.external") local External = require("modules.exp_legacy.expcore.external")
@@ -392,14 +392,16 @@ define_tab(
local done = {} local done = {}
-- Fill groups from configured roles -- Fill groups from the players who hold the roles, a player can be in more than one group
for player_name, player_roles in pairs(Roles.config.players) do
for _, group in ipairs(groups) do for _, group in ipairs(groups) do
local seen = {}
for _, role_name in ipairs(group.roles) do for _, role_name in ipairs(group.roles) do
if table.contains(player_roles, role_name) then 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 done[player_name] = true
group.players[#group.players + 1] = player_name group.players[#group.players + 1] = player_name
break
end end
end end
end end
@@ -463,7 +465,7 @@ local function render_data_category(opts)
for name, child in pairs(opts.children) do for name, child in pairs(opts.children) do
local metadata = child.metadata 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) local value = child:get(opts.player_name)
if value ~= nil or metadata.show_always then if value ~= nil or metadata.show_always then
@@ -663,7 +665,7 @@ Elements.toggle_button = Gui.toolbar.create_button{
sprite = "virtual-signal/signal-info", sprite = "virtual-signal/signal-info",
tooltip = { "exp-gui_readme.main-tooltip" }, tooltip = { "exp-gui_readme.main-tooltip" },
visible = function(player) visible = function(player)
return Roles.player_allowed(player, "gui/readme") return Roles.player_has_permission(player, "exp_scenario.gui.readme")
end, end,
} }
:on_click(function(_, player) :on_click(function(_, player)
@@ -4,7 +4,7 @@ Adds a gui for tracking research milestones
local ExpUtil = require("modules/exp_util") local ExpUtil = require("modules/exp_util")
local Gui = require("modules/exp_gui") 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 config = require("modules/exp_legacy/config/research")
local table_to_json = helpers.table_to_json local table_to_json = helpers.table_to_json
@@ -339,7 +339,7 @@ Gui.toolbar.create_button{
sprite = "item/space-science-pack", sprite = "item/space-science-pack",
tooltip = { "exp-gui_research-milestones.tooltip-main" }, tooltip = { "exp-gui_research-milestones.tooltip-main" },
visible = function(player, element) visible = function(player, element)
return Roles.player_allowed(player, "gui/research") return Roles.player_has_permission(player, "exp_scenario.gui.research")
end 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 ExpUtil = require("modules/exp_util")
local Gui = require("modules/exp_gui") 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") local config = require("modules/exp_legacy/config/gui/rockets")
--- @class ExpGui_RocketInfo.elements --- @class ExpGui_RocketInfo.elements
@@ -651,7 +651,7 @@ Gui.toolbar.create_button{
sprite = "item/rocket-silo", sprite = "item/rocket-silo",
tooltip = { "exp-gui_rocket-info.tooltip-main" }, tooltip = { "exp-gui_rocket-info.tooltip-main" },
visible = function(player, element) visible = function(player, element)
return Roles.player_allowed(player, "gui/rocket-info") return Roles.player_has_permission(player, "exp_scenario.gui.rocket_info")
end 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 ExpUtil = require("modules/exp_util")
local Gui = require("modules/exp_gui") local Gui = require("modules/exp_gui")
local Colors = require("modules/exp_util/include/color") 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 config = require("modules/exp_legacy/config/gui/science")
local _format_number = require("util").format_number local _format_number = require("util").format_number
@@ -571,7 +571,7 @@ Gui.toolbar.create_button{
sprite = "entity/lab", sprite = "entity/lab",
tooltip = { "exp-gui_science-production.tooltip-main" }, tooltip = { "exp-gui_science-production.tooltip-main" },
visible = function(player, element) visible = function(player, element)
return Roles.player_allowed(player, "gui/science-info") return Roles.player_has_permission(player, "exp_scenario.gui.science_info")
end 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 Gui = require("modules/exp_gui")
local ElementsExtra = require("modules/exp_scenario/gui/elements") 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 --- @class ExpGui_Surveillance.elements
local Elements = {} local Elements = {}
@@ -234,7 +234,7 @@ Gui.toolbar.create_button{
sprite = "entity/radar", sprite = "entity/radar",
tooltip = { "exp-gui_surveillance.tooltip-main" }, tooltip = { "exp-gui_surveillance.tooltip-main" },
visible = function(player, element) visible = function(player, element)
return Roles.player_allowed(player, "gui/surveillance") return Roles.player_has_permission(player, "exp_scenario.gui.surveillance")
end end
}:on_click(function(def, player, element, event) }:on_click(function(def, player, element, event)
Elements.container(player.gui.screen) 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 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 config = require("modules.exp_legacy.config.gui.tasks")
local ExpUtil = require("modules/exp_util") local ExpUtil = require("modules/exp_util")
@@ -43,8 +43,8 @@ local function has_permission_create_task(player)
return true return true
elseif allow_add_task == "admin" then elseif allow_add_task == "admin" then
return player.admin return player.admin
elseif allow_add_task == "expcore.roles" then elseif allow_add_task == "exp_roles" then
return Roles.player_allowed(player, config.expcore_roles_allow_add_task) return Roles.player_has_permission(player, config.exp_roles_allow_add_task)
end end
return false return false
@@ -67,8 +67,8 @@ local function has_permission_edit_task(player, task)
return true return true
elseif allow_edit_task == "admin" then elseif allow_edit_task == "admin" then
return player.admin return player.admin
elseif allow_edit_task == "expcore.roles" then elseif allow_edit_task == "exp_roles" then
return Roles.player_allowed(player, config.expcore_roles_allow_edit_task) return Roles.player_has_permission(player, config.exp_roles_allow_edit_task)
end end
return false return false
@@ -922,7 +922,7 @@ Gui.toolbar.create_button{
sprite = "utility/not_enough_repair_packs_icon", sprite = "utility/not_enough_repair_packs_icon",
tooltip = { "exp-gui_task-list.tooltip-main" }, tooltip = { "exp-gui_task-list.tooltip-main" },
visible = function(player, element) visible = function(player, element)
return Roles.player_allowed(player, "gui/task-list") return Roles.player_has_permission(player, "exp_scenario.gui.task_list")
end end
} }
@@ -950,7 +950,6 @@ return {
events = { events = {
[e.on_player_joined_game] = refresh_player_tasks, [e.on_player_joined_game] = refresh_player_tasks,
[e.on_player_changed_force] = refresh_player_tasks, [e.on_player_changed_force] = refresh_player_tasks,
[Roles.events.on_role_assigned] = refresh_player_permissions, [Roles.events.on_player_roles_changed] = refresh_player_permissions,
[Roles.events.on_role_unassigned] = refresh_player_permissions,
} }
} }
+1
View File
@@ -8,6 +8,7 @@
"dependencies": { "dependencies": {
"clusterio": "*", "clusterio": "*",
"exp_util": "*", "exp_util": "*",
"exp_roles": "*",
"exp_gui": "*", "exp_gui": "*",
"exp_commands": "*" "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") local UsesServerUps = PlayerData.Settings:combine("UsesServerUps")
UsesServerUps:set_default(false) UsesServerUps:set_default(false)
UsesServerUps:set_metadata{ UsesServerUps:set_metadata{
permission = "command/server-ups", permission = "exp_scenario.command.server_ups",
stringify = function(value) return value and "Visible" or "Hidden" end, stringify = function(value) return value and "Visible" or "Hidden" end,
} }