diff --git a/lua/core/engine.lua b/lua/core/engine.lua index 19c1aa712145a8195a1bc0fa9e7ae20dd15b09d3..52da8937b86fe0f099cd745770b40f96cd65c989 100644 --- a/lua/core/engine.lua +++ b/lua/core/engine.lua @@ -265,9 +265,28 @@ function Engine:loadDisabled() for mode_name, game_mode in pairs(self.game_modes) do local disabled_packages = {} for name, pkg in pairs(self.packages) do - if table.contains(game_mode.blacklist or Util.DummyTable, name) or - (game_mode.whitelist and not table.contains(game_mode.whitelist, name)) or - table.contains(pkg.game_modes_blacklist or Util.DummyTable, mode_name) or + --- GameMode对Package筛选 + if type(game_mode.whitelist) == "function" then + if not game_mode:whitelist(pkg) then + table.insert(disabled_packages, name) + end + elseif type(game_mode.whitelist) == "table" then + if not table.contains(game_mode.whitelist, name) then + table.insert(disabled_packages, name) + end + end + if type(game_mode.blacklist) == "function" then + if game_mode:blacklist(pkg) then + table.insert(disabled_packages, name) + end + elseif type(game_mode.blacklist) == "table" then + if table.contains(game_mode.blacklist, name) then + table.insert(disabled_packages, name) + end + end + + --- Package对GameMode筛选 + if table.contains(pkg.game_modes_blacklist or Util.DummyTable, mode_name) or (pkg.game_modes_whitelist and not table.contains(pkg.game_modes_whitelist, mode_name)) then table.insert(disabled_packages, name) end diff --git a/lua/core/game_mode.lua b/lua/core/game_mode.lua index 8229cf659b89e66416d134b1977dfa9c8e2325f1..c33cc6a72991f78ed4a5e67f4e3a92ed826ba00b 100644 --- a/lua/core/game_mode.lua +++ b/lua/core/game_mode.lua @@ -26,8 +26,8 @@ ---@field public maxPlayer integer @ 最大玩家数 ---@field public rule? TriggerSkill @ 规则(通过技能完成,通常用来为特定角色及特定时机提供触发事件) ---@field public logic? fun(): GameLogic @ 逻辑(通过function完成,通常用来初始化、分配身份及座次) ----@field public whitelist? string[] @ 白名单 ----@field public blacklist? string[] @ 黑名单 +---@field public whitelist? string[] | fun(self: GameMode, pkg: Package): bool @ 白名单 +---@field public blacklist? string[] | fun(self: GameMode, pkg: Package): bool @ 黑名单 ---@field public config_template? GameModeConfigEntry[] 游戏模式的配置页面,如此一个数组 local GameMode = class("GameMode") @@ -100,14 +100,4 @@ function GameMode:getAdjustedProperty (player) return list end ---- 向游戏模式中添加拓展包过滤。 ----@param whitelist string[] @ 白名单 ----@param blacklist string[] @ 黑名单 -function GameMode:addPackageFilter(whitelist, blacklist) - assert(type(whitelist) == "table") - assert(type(blacklist) == "table") - table.insertTable(self.whitelist, whitelist) - table.insertTable(self.blacklist, blacklist) -end - return GameMode diff --git a/lua/core/package.lua b/lua/core/package.lua index be6f4af7127be6aac0c7f139518f841b68bdaae6..04b1f73ac4b5f106bac03600bc8470a2f6f5b7c7 100644 --- a/lua/core/package.lua +++ b/lua/core/package.lua @@ -85,21 +85,4 @@ function Package:addGameMode(game_mode) table.insert(self.game_modes, game_mode) end ---- 向拓展包中设置游戏模式过滤。 ----@param whitelist string[] @ 白名单 ----@param blacklist string[] @ 黑名单 -function Package:setGameModeFilter(whitelist, blacklist) - self.game_modes_whitelist = whitelist - self.game_modes_blacklist = blacklist -end - ---- 向拓展包中添加游戏模式过滤。 ----@param whitelist string[] @ 白名单 ----@param blacklist string[] @ 黑名单 -function Package:addGameModeFilter(whitelist, blacklist) - assert(type(whitelist) == "table") - assert(type(blacklist) == "table") - table.insertTable(self.game_modes_whitelist, whitelist) - table.insertTable(self.game_modes_blacklist, blacklist) -end return Package