这篇条目有关 Source引擎。如需详情,点击这里。

script

From Valve Developer Community
< Zh
Jump to navigation Jump to search
English (en)中文 (zh)Translate (Translate)

script是一个控制台命令(en),可在所有的 起源 起源 游戏,自从 求生之路2 求生之路2 以来中使用。

该命令在所有实现了含有使用Squirrel(en)语言的VScript(en)游戏中可用,具体包括这些游戏(en)

语法

script <代码>

描述

该命令从根表(root table)执行Squirrel代码。代码中可以包含空格,即使不使用引号"

限制

分号

分号;只有在引号内才能用于脚本需求,因为开发者控制台(en)会将其视为控制台命令的分隔符。

  • 第一种使用方式是将整个代码用引号包裹。这种情况下只能使用这两个引号符号,因为命令会寻找结束引号且无法在控制台中转义:
script "local a = 666; for(local i; i < 10; i++) { printl(i + a) }"
  • 另一种使用方式是当分号出现在字符串引号内时:
script printl("我可以打印 ; 但现在需要执行字符串的方法")
  • 使用compilestring将字符串编译为函数,可以在使用forlocal关键字的同时使用引号:
script compilestring("for(local i = 0; i < 10; i++) {printl(\"现在可以这样做: \" + i)} printl(\"现在唯一的限制是控制台提示最多255个字符,而且上箭头获取之前运行的命令只能得到253个字符!\")")()
  • 不使用分号分隔非语句时可以使用,逗号:
script printl("i = 0"), i<-666, printl("i = " + i)
  • 可以使用语句块来分隔语句:
script function f() { {i<-0} while(i++<10) printl(i) }

命令解析

当执行script命令时,从命令开头(包括空格)到结束分号的所有文本都会被获取,前6个字符被截去,其余部分作为脚本运行。这意味着如果在script命令前有任何空格,将导致错误。

以下示例展示了前面有3个空格的script命令。]表示控制台行首:

]   script printl(666)
上述命令将运行脚本ipt printl(666)导致错误。
同样适用于用;分隔的多个script命令。结束分号和下一个script命令开头之间不能有空格,即script printl("print1"); script printl("print2")会抛出脚本错误,而script printl("print1");script printl("print2")则不会。

查找命令发起者

  • activatorcaller在实体I/O(en)操作时自动创建,但在script命令上下文中没有意义也不会被创建。self也不会包含发起script命令的玩家。获取运行命令的玩家句柄没有"适用于所有情况"的单一方法,基于军团要塞2分支 军团要塞2分支的游戏只允许服务器使用script命令,客户端只能通过rcon发出。
  • 如果客户端连接到服务器并能发出此命令,可以通过status(en)检查并使用GetPlayerFromUserID(userid)函数(如果可用)找到自己的玩家实体。在求生之路2 求生之路2传送门2 传送门2中,可以使用特殊的目标名称(en),例如Entities.FindByName(null, "!bill")
  • 如果玩家是服务器主机,可以使用Entities.FindByName(null, "!player")找到自己。
  • 其他方法包括使用ent_fire(en)RunScriptCode输入,此时命令发起者被设为activator和caller。玩家可以用ent_fire !activator RunScriptCode "::storing_my_handle_as_global <- self"定位自己。另见:Inputs中的Vscript(en)

示例

script printl( GetMapName() )

在控制台打印当前地图名称。

script player <- Entities.FindByClassname(null, "player");
script player.SetMaxHealth( 200 )

使用变量找到最低实体索引(en)玩家(en),然后将其最大生命值设为200。

script { player <- Entities.FindByClassname(null, "player") } { player.SetMaxHealth(200) }

相同代码,但作为单个控制台命令,通过使用花括号绕过分号限制。注意此例中一对花括号就足够;如果没有嵌套,每隔一个语句用花括号包裹即可。另注意player <- ...语句尽管用了花括号,仍会在根表创建持久的表槽。如果player变量应为local变量,其赋值语句不能单独放在花括号内,因为其作用域会随右花括号结束。

当使用控制台的上箭头键重复执行多个复杂命令时,在命令中添加注释会很有用,例如:

script /* 设置最大生命200 */ { player <- Entities.FindByClassname(null, "player") } { player.SetMaxHealth(200) } // 设置最大生命200

Squirrel永远看不到以//开头的行注释,因为开发者控制台会先发现并移除它们。 块注释/* */也可以使用,因为Squirrel支持它们!

参见