CS2 更新(2026年8月25日)
CS2 为脚本地图加入实验性自定义 HUD 系统,扩展了炸弹与摄像机的脚本 API,并更新官方 cs_script 的 zoo 示例地图来展示这些新工具。
快速摘要
- `custom_hud_layout` 实体与 CustomHudLayout API 允许脚本驱动带按钮、类与对话变量的简单 HUD。
- 围绕放置/拆除炸弹、C4 控制、移动类型以及基于 Promise 的 `Instance.Delay` 的新脚本钩子,增强自定义游戏逻辑。
- cs_script 的 zoo 示例地图增加了使用新 HUD 的欢迎对话,并将棋盘小游戏迁移到内置延迟辅助 `Instance.Delay`。
- 引擎 schema、用户消息与工具链更新以支持 CustomHudClicked 事件和按玩家的自定义 HUD 状态网络同步。
本次 CS2 更新悄然引入了一个面向地图脚本的实验性自定义 HUD 系统,同时扩展了围绕炸弹与玩家摄像机的脚本 API——官方 cs_script 的 “zoo” 示例地图已更新以演示这些新工具。
实验性自定义 HUD 布局(脚本地图)
- 新实体: Hammer 在
csgo.fgd中加入了一个点实体custom_hud_layout,允许地图制作者提供可由cs_script控制的 Panorama XML 布局。 - 支持的 UI 元素: 新的脚本 API 指明自定义布局可以包含基本面板元素:
Panel(带id、class、hittest)Label(带id、class、hittest、text)Image(带id、class、hittest、src、texturewidth、textureheight)Button(带id、class) 支持通过 CSS 进行样式化;但 HUD 内部不支持运行客户端侧的自定义 JS。
- 服务器驱动的可视状态: 脚本现在可以:
- 使用
CustomHudLayout.SetHasClass/SetHasClassForPlayer在全局或按玩家切换面板的 CSS 类。 - 使用
SetDialogVariableString/SetDialogVariableStringForPlayer在全局或按玩家设置面板的对话变量(文本占位符)。 这意味着创作者可以仅用服务器逻辑驱动诸如“任务提示”、计时器或状态指示等 UI 行为。
- 使用
- 从 HUD 捕获输入:
CustomHudLayout.SetInputCaptureEnabled(playerSlot, enabled)为地图提供了临时抓取玩家鼠标以用于 UI 交互的能力。IsInputCaptureEnabled可查询当前布局是否正在捕获输入。启用输入捕获时,玩家在所有捕获释放之前可能会失去正常的移动/鼠标控制。 - 点击事件通过用户消息上报: 新的用户消息
CS_UM_CustomHudClicked与脚本回调Instance.OnCustomHudClicked被添加。当玩家在CustomHudLayout中点击按钮时,服务器会收到哪个布局以及buttonId被点击的信息,使得菜单、对话框或小游戏的控制可以完全由服务端实现。 - 引擎侧的 HUD 布局文件: 两个新的 Panorama 布局文件(
hud/customhuds.xml和hud/infohudlayouts.xml)承担了引擎端的支撑作用。这些文件是内部骨架,玩家通常不会直接以默认 HUD 的形式看到它们,但它们为脚本化 HUD 功能提供了基础。 - 实验性说明: 该 API 明确带有
@experimental标注,可能会在未来发生破坏性修改。正在以其为基础开发重要项目的作者应预期对接口进行调整。
炸弹、摄像机与移动的脚本增强
对 content/csgo/maps/editor/zoo/scripts/point_script.d.ts 的更新扩展了 cs_script 在自定义或社区地图上的能力:
- 基于 Promise 的定时器:
- 新增内置异步延迟
Instance.Delay(delay: number): Promise<void>,可取代手写的 think 队列,简化长时间运行的脚本序列。
- 新增内置异步延迟
- 更细化的炸弹生命周期事件:
- 新的回调将炸弹交互拆分为开始/中止/完成阶段:
OnBombPlantStart、OnBombPlantAbort、OnBombPlantOnBombDefuseStart、OnBombDefuseAbort、OnBombDefuse,以及OnBombExplode
- 引入了
BombPlantEvent与BombDefuseEvent类型,其中部分字段被标记为已弃用以便未来清理。 这些调整让脚本地图或模组可以更精确地响应部分完成的放置/拆除动作,例如用于教学覆盖或自定义胜利条件。
- 新的回调将炸弹交互拆分为开始/中止/完成阶段:
- C4 武器脚本 API:
- 新的脚本类
C4(继承自CSWeaponBase)提供:GetPlantStartTime()/GetPlantFinishTime()AbortPlant()
CSPlayerPawn现在可以通过GetC4()获取玩家携带的 C4 武器,并通过GetDefuseTarget()访问正在拆除的已放置炸弹。 这些工具针对更高级的炸弹训练地图或游戏模式场景。
- 新的脚本类
- 玩家状态与 UI 钩子:
CSPlayerPawn.IsBuyMenuOpen()让脚本得知玩家是否处于购枪界面。CSPlayerPawn.GetCamera()暴露出每名玩家对应的CSPlayerCamera实体。
- 新的摄像机控制实体:
CSPlayerCamera是一个实验性的可脚本化实体,代表玩家的视角。- 脚本可以启用/禁用它并调用
SetIsControllingAngles(controlling: boolean);当不控制视角角度时,玩家可以在摄像机位置自由查看。 这有助于制作更精致的脚本摄像机,用于过场、回放或训练视角。
- 移动与插值辅助:
- 新增
CSMoveType枚举,脚本可通过GetMoveType()/SetMoveType()检查或改变实体的移动类型(行走、飞行、穿墙、梯子等)。 - 添加了
Move({...}),作为Teleport的并列方法,描述为在不重置客户端插值历史的情况下移动实体,从而可实现更平滑的视觉重定位。
- 新增
- 实用项与类型调整:
Instance.IsDedicatedServer()可让脚本在 listen 与 dedicated 服务器间分支。- 若干事件字段(如
OnPlayerChat、OnBulletImpact、ModifyPlayerDamageEvent.inflictor等)被放宽为可选(?),使脚本在不存在相关实体时更健壮。
这些脚本扩展通过官方提供给地图作者的类型定义暴露出来,旨在用于自定义内容中并可实际运行,而不仅限于 Valve 的内部示例。
Zoo 示例地图:脚本欢迎对话与更简洁的棋盘逻辑
Valve 的 editor/zoo cs_script 示例地图已扩展以展示新的 HUD 与定时 API。
- 新的欢迎弹窗 UI:
- 一个 Panorama 布局
welcome.xml与样式welcome.css定义了一个居中的简单对话框:- 文本:“Welcome to the cs_script zoo map!”
- 一个
Dismiss按钮 - 一个通过将不透明度设为 0 实现淡出效果的
DismissedCSS 类
- 当玩家生成(
OnPlayerActivate)时会调用ShowWelcome(playerSlot):- 为该玩家清除
Dismissed类以显示对话框。 - 使用
SetInputCaptureEnabled启用输入捕获,允许玩家点击对话按钮。
- 为该玩家清除
Instance.OnCustomHudClicked监听点击事件:- 若被点击的布局是
welcome_layout且buttonId为dismiss_button,HideWelcome会重新添加Dismissed并禁用输入捕获,将控制权还给玩家。
- 若被点击的布局是
- 一个调试/作弊命令
script_zoo_show_welcome会对所有玩家再次显示对话框,示范了地图作者如何按需重新触发自定义 HUD 流程。
- 一个 Panorama 布局
- 棋盘脚本迁移到
Instance.Delay:- 原先棋盘小游戏脚本中自实现的定时队列与基于
Instance.SetNextThink的Delay()辅助已被移除。 - 所有异步等待(例如
RunChess内、棋子滑动动画、棋子死亡动画与 AI 的 minimax 搜索限速)现在都使用await Instance.Delay(0)。 这展示了内置延迟 API 如何简化长期运行的异步游戏逻辑。
- 原先棋盘小游戏脚本中自实现的定时队列与基于
玩家在更新后的 zoo 地图中首次生成时应会看到一个小的欢迎窗口,直观演示自定义 HUD 布局的外观与行为。
支撑新 HUD 工具的引擎与协议改动
虽然这些改动多数对普通玩法不可见,但为新 HUD 功能提供了必要的引擎层与协议支持:
- 自定义 HUD 的网络结构:
- 新的 schema 类型(
CCSCustomHudLayout、CCSCustomHudLayoutState、HUDPanelHasClass_t、HUDPanelDialogVariableString_t与EHudPanelClassStatus_t)在客户端与服务器端出现,涵盖:- 布局资源名。
- 按玩家与全局的布局状态(哪些类与对话变量应用于哪些面板)。
- 布局是否对某个玩家捕获输入。
- 新的 schema 类型(
- 玩家摄像机实体:
- 客户端与服务器端新增
CCSPlayerCamera,包含与 pawn handle 的关联字段以及跟踪是否启用和是否控制玩家瞄准的布尔值。
- 客户端与服务器端新增
- 用户消息与枚举联动:
ECstrike15UserMessages枚举增加了CS_UM_CustomHudClicked = 390,将新的 HUD 点击通知接入现有的用户消息管线。- 对应的协议消息
CCSUsrMsg_CustomHudClicked将布局标识符与按钮 ID 传到服务器。
- 工具链与字符串更新:
- 多项内部工具与字符串表(服务端、客户端、Panorama、VScript、资源编译器等)被刷新,包含新的 HUD 相关字符串结构与更新的 V8 脚本支持。
- 这些更改大多是底层改进,玩家通常不会直接感知,但对新脚本功能的稳定运行至关重要。
总体影响
此次更新主要面向创作者与脚本作者,而非直接改变核心竞技体验:
- 地图作者获得了一种实验性且官方支持的方式来构建可由
cs_script驱动的简单交互式 HUD,支持按玩家状态、点击处理与输入捕获。 - 与炸弹相关的脚本钩子变得更为丰富,有利于训练地图、教学或以放置/拆除为核心的自定义模式。
- 新的
CSPlayerCamera、移动辅助与基于 Promise 的Instance.Delay可简化高级脚本体验(自定义摄像机、小游戏、更平滑的移动实体)的实现。
对于大多数在标准匹配中的玩家来说,短期内感受到的变化会比较细微。但随着时间推移,这些工具可能促成更精致的自定义地图、更好的训练工具以及社区创造的更多创意游戏模式。
