5 保存打包的指令 alias - eLecCap1taL/CS2-CFG-Wiki GitHub Wiki

我们来制作一个这样的 cfg:

  • 按 1 切主武器,并在聊天栏发送消息:我切武器了
  • 按 2 切副武器,并在聊天栏发送消息:我切武器了
  • 按 3 切刀,并在聊天栏发送消息:我切武器了
  • 按 4 切道具,并在聊天栏发送消息:我切武器了
  • 按 5 切 C4,并在聊天栏发送消息:我切武器了

你可能会说:这太简单了!转人工!我会写!😡

bind 1 "slot1;say 我切武器了"
bind 2 "slot2;say 我切武器了"
bind 3 "slot3;say 我切武器了"
bind 4 "slot4;say 我切武器了"
bind 5 "slot5;say 我切武器了"

没有问题,但如果我要求你给更多键添加……😦

难道我们不得不把 say 我切武器了 在每个 bind 里都写一遍?😭

答案当然是否定的。我们来学习 alias 的用法。

在 cfg 文件夹内新建一个 cfg 文件。使用任何文本编辑器(比如记事本)打开它,输入以下内容:

alias saytext say 我切武器了
bind 1 "slot1;saytext"
bind 2 "slot2;saytext"
bind 3 "slot3;saytext"
bind 4 "slot4;saytext"
bind 5 "slot5;saytext"

游戏内 exec 就可以看到效果。

alias 打包名 要打包的指令:组合指令,生成一个新的指令

不同于 bindalias 不是永久性的,关闭游戏之后,打包的指令就不存在了,需要每次开游戏后重新读取 cfg。你可以通过上文提到的自动加载 cfg 来做到这一点。

alias 非常重要,是 cfg 的核心指令

alias 的名字不区分大小写

如果不填写要打包的指令,会创建一个空的指令打包。

你可能会说,这也没短多少嘛 😒 但 alias 的强大之处在于,它可以组合多个指令。

我们现在要求,不单在聊天栏中发送,也要在控制台中发送。使用如下 cfg 可以简洁地做到这一点:

alias saytext "say 我切武器了;echo 我切武器了"
bind 1 "slot1;saytext"
bind 2 "slot2;saytext"
bind 3 "slot3;saytext"
bind 4 "slot4;saytext"
bind 5 "slot5;saytext"

alias 也支持嵌套。我们可以写出如下 cfg,和上面的效果一样:

alias echotext echo 我切武器了
alias saytext "say 我切武器了;echotext"
bind 1 "slot1;saytext"
bind 2 "slot2;saytext"
bind 3 "slot3;saytext"
bind 4 "slot4;saytext"
bind 5 "slot5;saytext"

甚至,我们可以在 alias 中使用 alias

⚡⚡⚡ 现在要开始变得有趣起来了 ⚡⚡⚡ 我们来做这样一个的 cfg:

  • 第一次按 p,在队内聊天发送信息:哈喽
  • 第二次按 p,在队内聊天发送信息:怎么打
  • 第三次按 p,在队内聊天发送信息:OK
  • 第四次按 p,在队内聊天发送信息:哈喽
  • 第五次按 p,在队内聊天发送信息:怎么打
  • ……
  • 以此类推,重复,以三个消息为一个循环

新建一个 cfg 文件,输入以下指令:

alias hello_1 "say_team 哈喽;alias hello hello_2"
alias hello_2 "say_team 怎么打;alias hello hello_3"
alias hello_3 "say_team OK;alias hello hello_1"
alias hello hello_1
bind p hello

在游戏内 exec,看看效果!😎

有些复杂?我们来仔细分析一下过程。

过程分析:

刚刚加载完的时候:

  • hello_1 的内容是 say_team 哈喽;alias hello hello_2
  • hello_2 的内容是 say_team 怎么打;alias hello hello_3
  • hello_3 的内容是 say_team OK;alias hello hello_1
  • hello 的内容是 hello_1
  • p 键绑定了 hello

我们现在第 1 次按下 p 键,发生了什么?

  • 由于 bind p hello
    • hello 被触发了
  • 由于 hello 的内容是 hello_1
    • hello_1 被触发了
  • 由于 hello_1 的内容是 "say_team 哈喽;alias hello hello_2"
    • say_team 哈喽 左下角发送了 哈喽
    • alias hello hello_2 把 hello 的内容改为了 hello_2

于是现在的情况是:

  • hello_1 的内容是 say_team 哈喽;alias hello hello_2
  • hello_2 的内容是 say_team 怎么打;alias hello hello_3
  • hello_3 的内容是 say_team OK;alias hello hello_1
  • hello 的内容是 hello_2
  • p 键绑定了 hello

有些明白了吗?🤔我们再往下推


我们现在第 2 次按下 p 键,发生了什么?

  • 由于 bind p hello
    • hello 被触发了
  • 由于 hello 的内容是 hello_2
    • hello_2 被触发了
  • 由于 hello_2 的内容是 "say_team 怎么打;alias hello hello_3"
    • say_team 怎么打 左下角发送了 怎么打
    • alias hello hello_2 把 hello 的内容改为了 hello_3

于是现在的情况是:

  • hello_1 的内容是 say_team 哈喽;alias hello hello_2
  • hello_2 的内容是 say_team 怎么打;alias hello hello_3
  • hello_3 的内容是 say_team OK;alias hello hello_1
  • hello 的内容是 hello_3
  • p 键绑定了 hello

有点懂了?😦我们再往下推


我们现在第 3 次按下 p 键,发生了什么?

  • 由于 bind p hello
    • hello 被触发了
  • 由于 hello 的内容是 hello_3
    • hello_3 被触发了
  • 由于 hello_3 的内容是 "say_team OK;alias hello hello_1"
    • say_team OK 左下角发送了 OK
    • alias hello hello_1 把 hello 的内容改为了 hello_1

于是现在的情况是:

  • hello_1 的内容是 say_team 哈喽;alias hello hello_2
  • hello_2 的内容是 say_team 怎么打;alias hello hello_3
  • hello_3 的内容是 say_team OK;alias hello hello_1
  • hello 的内容是 hello_1
  • p 键绑定了 hello

发现了什么?和刚刚加载的情况一模一样!😦😦于是之后就是循环了😎😎

如果还是不懂,可以再仔细阅读一下,进行理解。这种 alias 内改变 alias 的情况将会非常多见。

这好像就是 EZ.cfg,现在你已经掌握了书写 EZ.cfg 所需要的全部知识!🤪🤪


关于 alias,还有一些事情必须知道。

alias 不能覆盖游戏自带的大部分指令。

例如说,下面这样的 cfg 不能生效,因为 say 是游戏自带的关键字

alias say "你的指令……"

引号不存在 "嵌套"

你可能会写这样的指令:

alias A "alias B "echo B1;echo B2";echo A1;echo A2"

你也许会想:

  • 执行 alias A "alias B "echo B1;echo B2";echo A1;echo A2"
    • 此时 A 被定义为 alias B "echo B1;echo B2";echo A1;echo A2
  • 再执行 A
    • 触发 alias B "echo B1;echo B2",此时 B 被定义为 "echo B1;echo B2"
    • 触发 echo A1,控制台输出 A1
    • 触发 echo A2,控制台输出 A2
  • 再执行 B
    • 触发 echo B1,控制台输出 B1
    • 触发 echo B2,控制台输出 B2

事实上完全不是这样,这条指令相当于:

alias A alias B echo B1
echo B2
echo A1
echo A2

实际上就是第一个和第二个引号搭配,第三个和第四个引号搭配。CS2 的 cfg 系统并没有你想象的那么聪明 🤡

那么该如何达到我们想要的效果呢?使用如下指令:

alias B1B2 "echo B1;echo B2"
alias A "alias B B1B2;echo A1;echo A2"

这就是完全可以的。请牢记引号不存在嵌套。

引号不会被保存进 alias

意思是,引号只在指令执行时判断是否结束指令,并不会被保存进 alias。CS2 的 cfg 系统并没有你想象的那么聪明 🤡

你可能会写出这样的指令:

alias A alias B "echo B1;echo B2"

你也许会想:

  • 执行 alias A alias B "echo B1;echo B2"
    • 此时 A 被定义为 alias B "echo B1;echo B2"
  • 再执行 A
    • 触发 alias B "echo B1;echo B2",此时 B 被定义为 "echo B1;echo B2"
  • 再执行 B
    • 触发 echo B1,控制台输出 B1
    • 触发 echo B2,控制台输出 B2

事实上是这样:

  • 执行 alias A alias B "echo B1;echo B2"
    • 此时 A 被定义为 alias B echo B1;echo B2(注意看这一行和上面的区别,仔细想这句话:引号不会被保存进alias
  • 再执行 A
    • 触发 alias B echo B1,此时 B 被定义为 echo B1
    • 触发 echo B2,控制台输出 B2
  • 再执行 B
    • 触发 echo B1,控制台输出 B1

可以反复阅读,自行理解,正确的写法应该是:

alias B1B2 "echo B1;echo B2"
alias A alias B B1B2

特殊的 alias

在 alias 的名字前面加上 +- 可以有特殊的效果。

在大部分时候,它们是正常的,不会有什么特殊效果。

但当它们与 bind 一起使用时就有特殊效果:按键时触发 + 的,松键时触发 - 的。

说的可能比较抽象,看实际的 cfg:

alias +A echo 我按下了按键
alias -A echo 我松开了按键
bind p +A

尝试一下,观察效果。

如果 bind 绑定到的第一个指令是以 + 开头的指令,它会在松键时尝试寻找相同名字的且以 - 开头的指令,并执行。

如果寻找不到,则不做任何事。

如果把 - 开头的指令绑给按键,也不会有特殊效果。

需要注意的是,绑定了多个指令时,只有第一个会尝试触发特殊效果。看以下 cfg:

alias +A echo +A
alias -A echo -A
alias +B echo +B
alias -B echo -B
bind p "+A;+B"

按下 p 时会控制台输出 +A+B,松开时会只输出 -A。正确写法为:

alias +A echo +A
alias -A echo -A
alias +B echo +B
alias -B echo -B
alias +C "+A;+B"
alias -C "-A;-B"
bind p +C

如果第一个指令不是以 + 开头,后面的也没有特殊效果。看以下 cfg:

alias +A echo +A
alias -A echo -A
alias B echo B
bind p "B;+A"

按下 p 时会控制台输出 B+A,松开时什么也不会输出。

只有第一个指令以 + 开头时会尝试寻找对应的以 - 开头的 cfg。


现在你可以了解更多的指令了 🤪🤪🤪 不过需要先看一个例子。

  • +attack:攻击指令计数+1
  • -attack:攻击指令计数-1

计数又是啥?😡

这是 CS2 自带指令的特性,只有自带的部分指令有这个特性,你自己定义的 alias 是没有的

这是 CS2 自带指令的特性,只有自带的部分指令有这个特性,你自己定义的 alias 是没有的

这是 CS2 自带指令的特性,只有自带的部分指令有这个特性,你自己定义的 alias 是没有的

这是 CS2 自带指令的特性,只有自带的部分指令有这个特性,你自己定义的 alias 是没有的

实际上是这样的:attack x 0 0 给攻击的指令计数 +x。例如 attack 5 0 0 将会给攻击指令计数 +5。attack -3 0 0 将会给攻击指令计数 -3。

当指令的指令计数大于 0 时,指令就会生效。对于 attack,就是会开火。

指令计数不能小于 0。小于 0 会强制变成 0。例如,假如此时的攻击指令计数为 1,你正在开火,执行 attack -9 0 0 不会让它变成 -8,而是变成 0

你可以理解为:

  • +attack 只是对于 attack 1 0 0 的一个 alias
  • -attack 只是对于 attack -1 0 0 的一个 alias

现在你可以了解更多的指令了 🤪🤪🤪 下面会省略对应的 - 指令

  • +forward:向前走
  • +back:向后走
  • +right:向右走
  • +left:向左走
  • +attack:第一开火
  • +attack2:第二开火,比如开镜
  • +use:使用,例如拆包,捡东西,开门
  • +sprint:静步
  • +duck:下蹲
  • +jump:跳跃
  • +voicerecord:开麦
  • +lookatweapon:检视
  • +radialradio:打开第一无线电轮盘
  • +radialradio1:打开第二无线电轮盘
  • +radialradio2:打开第三无线电轮盘
  • +quickgrenaderadial:道具快捷切换轮盘
  • +reload:换弹
  • +spray_menu:喷漆菜单

更多控制台指令可以在 官方控制台指令和变量列表 查看。

一个获取指令的小技巧:控制台输入 bind p 就可以知道 p 绑定的指令是什么。利用这个技巧,可以从设置中找到想要的功能,绑键之后通过控制台来查看其指令。

需要特别注意:+jump 似乎有问题。如果 +jump 后不 -jump+jump 会导致再也跳不起来,清空计数也不行。只能重进游戏。

attackjump 一起使用也有奇怪的问题。不要把他们定义在一个 alias 内。应该把他们放在一个独立的 cfg 里,通过 exec 来调用。


到目前为止,你已经基本学会了 cfg 所需要的一切。😎 是的,bindalias,和一些游戏内置的动作指令,就是这些。cfg 并没有什么复杂的语法,它是逻辑的盛宴。

假设 alias 的数量没有上限的话,cfg 就是图灵完备的。alias 给 cfg 带来了无限可能,非常重要。在后面的学习中,你还会经常见到它