前言
现在网上对于cs2指令的介绍大多局限于仅仅介绍指令本身,而没有对cs2对指令系统有较为深入的讲解,本文的目的是让读者更加深入地了解指令系统。
Valva开发文档
本文不可能将所有技术细节全部展示,例如,本文会介绍什么是实体,但不会将实体一一列出,对于想要进一步了解的读者,请在Valve的 开发者文档中进一步查找。
实体(Entity)
实体是存在于游戏中的对象,类似Unity中的GameObject。实体不一定是玩家可见的,例如,cs2中可以安放炸弹的区域实际上是一个 func_bomb_target
实体。在起源引擎的文档中,实体被分为很多类,我们主要关注下面几类:
- 逻辑实体(Logic Entity):用于控制游戏进程的实体,例如有一个叫做
vote_controller
的实体负责控制投票系统。 - 模型实体(Model Entity):模型实体就是有3D模型的实体,大多数有碰撞体积的东西都属于这类。
每个实体都有自己的 类名(classname) 来表示这个实体属于什么类型,例如,沙鹰的实体类名叫做weapon_deagle
。实体还有自己的 目标名(targetname) ,同一类的实体可以有不同的目标名来作区分。
特殊的目标名
游戏中有一些特殊的目标名来指代特定的实体,以方便书写指令:
- !picker:指代准星指向的实体。
- !caller:指代一个output的发送者,见下文
- !activator:指代一个input的接受者,见下文
- !player:第一个加入游戏的玩家
创建实体
我们可以用 ent_create
指令来创建一个实体。实体会在准星指向的位置被创建。这个指令的语法如下:
ent_create <实体名称> <参数1名称> <参数 1> <参数2名称> <参数 2>...<参数N名称> <参数 N>
这里的 参数
是指在创建实体时,可以进行配置的参数。这一项可以在文档中某个实体页面的 KeyValues
小节找到。例如,对于鸡🐔(chicken),可以设置的参数有 SetBodyGroup
(模型),那么我们可以用下面的指令来创建一个兔耳小鸡:
ent_create chicken SetBodyGroup 4
创建实体也可以用 give
指令实现,与 ent_create
不同,give
会将实体创建在玩家脚下,并且无法指定参数。由于cs中玩家会默认捡起地上的武器,因此这个指令可以达到给予玩家武器的效果。
IO系统
实体间的交互使用一个叫 IO
的机制来完成。每个实体都有自己的 Input 和 Output。有编程基础的读者可以理解为 Qt 中的信号槽。
其中,Input 可以理解为实体接受消息的接受器,外界可以向实体发送这些消息来改变实体的行为。例如,可以对门实体发送 use
这个input来开关它;而Output可以理解为实体发送信号的发送器,实体会在需要的时候发送这些信号,例如一个定时器实体会在时间到时发送“时间到”这个信号。
在CS2中,我们可以将实体的output与另一个实体的input相连,实现特定的逻辑效果。
查询可用的IO
我们可以使用 ent_info
来查找一个实体可用的Input和Output:
ent_info weapon
手动触发Input
使用 ent_fire
指令可以手动触发实体的Input,语法为:
ent_fire <实体的类型名/目标名> <input名称> <可选参数> <可选延迟>
这里的类型名或目标名支持 通配符 。这里的可选延迟指在多少秒后应用这个input。
连接input与output
连接input与output是使用实体的 "AddOutput" 这个Input实现的,语法为:
ent_fire <实体的类型名/目标名> AddOutput "<实体的output名> <接受者的目标名>:[接受者的input名]:[参数覆盖]:[延迟的秒数]:[可以执行的次数]"
其中,接受者指input被实体的output连接的另一个实体。例如:A的output连接到了B的input,那么B就是接受者。接受者的input可以不填,默认为 use
。
特殊用法:修改对象属性
由于AddOutput的实现方式,它也可以用于修改对象的属性,这里的属性和上面创建实体时的参数含义相同,语法为:
ent_fire <实体的类型名/目标名> AddOutput "<属性名> <属性值>
但并不是所有属性都能用这个方式修改成功。
Comments NOTHING