Gameplay State(面向模组作者的 CET 工具)

为模组提供玩家是否处于实际游戏操作状态的实时检测,可通过事件监听器在状态变化时更新,不依赖 onDraw 循环。覆盖游戏中、暂停、模糊菜单、手机菜单、过场、死亡和未加载等状态,并提供调试 HUD。需要 Cyber Engine Tweaks。

0浏览
0下载点击
0点赞
0收藏

关于这个 Mod

在研究模组时,我发现检测玩家是否处于实际游戏操作状态并不简单,因此制作了这个工具,为模组提供实时状态检测,避免编写繁重的帧循环或观察器。它会跟踪状态,并通过事件监听系统通知依赖它的模组;无需重复调用,也不依赖 onDraw。

用途示例

  • 在特定情况下或玩家不处于实际游戏状态时,隐藏模组的 UI 元素。
  • 在工具覆盖的特定状态下触发操作。

状态返回值

工具会同时返回两个值:布尔值 isPlayerInControl 和字符串 currentControlState。

**说明:**此工具用于检测较高层级的宏观状态,判断游戏是否暂停,不提供细粒度的 UI 跟踪。例如,它不会识别具体打开的是哪个菜单或物品栏分页。

检测的状态

  • In Gameplay(游戏中,Control: true):玩家可以完整控制 V,处于正常游戏状态;游戏会话加载后通常为此状态。
  • Paused(暂停,Control: false):涵盖全屏菜单(物品栏、地图、任务等)、暂停/Esc 菜单、照片模式、游戏内旅行或加载画面,以及破解协议小游戏。
  • Blur Menus(模糊菜单,Control: false):涵盖武器/快捷栏轮盘、呼叫载具和电台覆盖界面等菜单。
  • Phone Menu(手机菜单,Control: false):涵盖手机和联系人通话列表。由于 GameSession 无法正确检测此状态,此处使用了单独的检测器。
  • In Cutscene(过场中,Control: false):涵盖第一人称脚本过场、过山车和超梦播放,以及玩家部分失去 V 控制的场景,例如抚摸宠物、洗澡等。
  • Player Dead(玩家死亡,Control: false)。
  • Not Loaded(未加载,Control: false):游戏启动阶段、游戏会话或玩家尚未开始时。

例外情况

  • 使用电脑不算作玩家失去控制,工具会返回 In Gameplay。
  • 使用特殊变通方案而非游戏系统的模组(例如 Fast Travel Anywhere 类型模组),若未触发默认加载画面,则不受支持,工具会显示 In Gameplay。

使用方法

前置要求

在使用此工具的模组页面将 GameplayState 列为硬性前置。

代码示例

模组只需通过 GameplayState.OnStateChange 监听器调用一次即可。无需自行处理观察器,不要在 onDraw 中声明监听器。

请始终仅在原生 onInit 事件钩子中使用,示例如下:

local GameplayState = nil -- GameplayState 模组引用

local isPlayerInControl = false -- 在本地保存状态

local currentControlState = "Unknown"

registerForEvent('onInit', function()

    GameplayState = GetMod('GameplayState') -- 使用 CET 标准方法获取 GameplayState 模组引用

    -- 仅在模组初始化时添加监听器。GameplayState 会在状态变化时更新变量。

    if GameplayState then

        GameplayState.OnStateChange(function(inControl, stateName)

            isPlayerInControl = inControl

            currentControlState = stateName

        end, 'Your Mod Name') -- 可选参数:用于在日志中标识你的模组

    else

        print('[Your Mod Name] ERROR: GameplayState mod not found, make sure you have it installed!')

    end

    -- 此后可在任何位置(包括 onDraw)使用本地变量;它们会随游戏状态更新。

    if GameplayState then

        if isPlayerInControl then

            -- 玩家可控制且正在游戏中时执行的代码

        else

            if currentControlState == "In Cutscene" then

                -- 隐藏自定义 HUD 控件,以增强剧情沉浸感

            elseif currentControlState == "Paused" then

                -- 保持 UI 覆盖层开启,同时安全暂停生存/状态机制

            end

        end

    end

end)

如确有需要,也可以手动调用公开方法 GameplayState.isPlayerInControl(),它会返回当前的 inControl 和 stateName 值。

调试功能

工具内置 HUD,可实时测试集成效果并确认返回值:

  • **监听器检测:**模组初始化且正确调用 OnStateChange 后,工具会在 CET 控制台输出 INFO 信息。
  • **配置菜单:**打开 CET,勾选或取消跟踪 HUD 选项。
  • **调试 HUD:**启用后会一直显示,无需打开 CET 覆盖层;实时显示当前状态及 Is Player In Control(Yes/No)。调试模式开启时,每次状态变化也会在 CET 控制台输出记录。
  • **HUD 位置/关闭:**可拖动到任意位置;重新启用时会自动水平居中并置于屏幕顶部。关闭 HUD 会自动停用调试模式,无需进入 CET 覆盖层的模组设置。
  • **持久化设置:**开关选项会自动保存到本地 config.json,并在游戏重启后保留。CET 执行“Reload all mods”后也会保留,便于模组开发测试。

致谢

特别感谢 psiberx 提供开源 CET KIT。此工具特别依赖其中的 GameSession,用于处理大部分底层检测。

作者的其他模组

作者:flepgg。前置:Cyber Engine Tweaks。

来源与文件

文件说明

v1.01 - Small bug fix to stop writting log error on edge case. No functionality changes.

来源列出的依赖与关系

  • 作者列出的前置:Cyber Engine Tweaks

前往 N 网打开所选文件。安装与下载要求以原作者及平台说明为准。

<!-- aoe-mods-source:nexusmods:cyberpunk2077:30315 -->