Zh/L4D2 Vscripts

From Valve Developer Community
< Zh
Revision as of 20:47, 13 January 2019 by Dazainerau (talk | contribs)
Jump to navigation Jump to search

Template:Otherlang2

Squirrel求生之路2 求生之路2 脚本 是可以在游戏中的虚拟机里被运行的服务器端的脚本。它们使用Squirrel语音编写, 这是一种类似于Lua的脚本编译语言.


用途

导演系统脚本

VScripts在求生之路2中的最通常的用处是用来指挥人工智能导演系统。 这些脚本的用途包括但不限于调整普通感染者的数量或者禁止BOSS感染者的产生, 或者用以自定义诸如onslaughts和gauntlets之类的游戏事件, 甚至是复杂的尸潮事件和完全定制的

自定义结局。 大多数官方活动也是通过这种方式制作的。导演脚本的主要工作是将导演系统所使用的各种变量的值覆盖写入DirectorOptions表.

一次只能运行一个导演脚本。执行新的导演脚本将终止先前运行的任何脚本并删除它在DirectorOptions表中设置的任何值。

实体脚本

另一个常见的用途是将脚本附加到实体上。 脚本提供了轻松便捷的途径以修改或读取大多数实体的属性,甚至可以写入新的KeyValues(键值)。这便使得在Hammer中不可能实现的对实体I/O系统的复杂控制成为了可能。

任何实体都能运行脚本,并且拥有以0.1秒运行一次think函数的能力,也可以将脚本代码作为实体输出以执行.

一些实体还拥有VScripts的专用功能,最显著的例子是point_script_use_target,它能将其他实体转换为完全可编程的定时按钮。

全局脚本

脚本也可以被设定成在地图加载时执行,基于特定的游戏模式或者可选的地图名。 这些脚本通常用于为突变模式创造剧本或者修改全局导演系统设置,当然也可以用于对地图的自定义。

全局脚本可以添加脚本钩子函数,这些函数会在游戏中的特定时间发生时被调用,比如当玩家/物件造成伤害。

这些脚本有许多实用功能和功能,包括资源和建造系统,以及产生自定义尸潮。请阅读EMS教程了解详情。

其他用途

总而言之,这些脚本拥有各种各样的超能力,包括从预编译的列表中或者程序性地产生实体产生感染者,自定义一个 HUD系统

跨层次地存储数据至硬盘,以及其他数不胜数的功能。

请阅读求生之路2 Vscript 范例了解详情。

脚本文件

脚本以文本文件的形式被读取, 脚本的扩展名为.nut.nuc , 其中 .nuc 是对纯文本形式的 .nut 的加密. 自定义脚本会从 \left 4 dead 2\left4dead2\scripts\vscripts\中被读取, 包括.vpk文件中的也是这样。

位置

官方的 .nuc 脚本文件位于 scripts/vscripts
Note.png注意:使用诸如GCFScape的第三方程序浏览和解包VPK
  • left 4 dead 2\left4dead2\pak01_dir.vpk
  • left 4 dead 2\left4dead2_dlc1\pak01_dir.vpk
April 22, 2010 The Passing update
  • left 4 dead 2\left4dead2_dlc2\pak01_dir.vpk
October 5, 2010 The Sacrifice update
  • left 4 dead 2\left4dead2_dlc3\pak01_dir.vpk
March 22, 2011 Cold Stream Beta / L4D1 Transition Project update
  • left 4 dead 2\update\pak01_dir.vpk
This is where mutations were updated/replaced bi-weekly.
  • left 4 dead 2\sdk_content\scripting\scripts\vscripts\
Plaintext versions of many of the scripts introduced in the EMS update.


解密NUC文件

.nuc files are ICE encrypted .nut files. The encryption key is SDhfi878. You can use VICE to decode them.

Packages with deciphered official scripts are also available.


Loading vscripts

VScripts are loaded in different ways depending on what they are used for. They can alos be manually loaded with the console command script filename

Director Scripts

Using the info_director entity using the following inputs
BeginScript <script name>
Executes a generic Director script, for example for onslaught events or changing spawning behavior.
EndScript
Ends the running script and resets the Director options to the map specific values.
BeginScriptedPanicEvent <script name>
Begins a Scripted Panic event.
Note.png注意:Scripts used with BeginScriptedPanicEvent will not work if they are in a subdirectory, even though you can use subdirectories in other script contexts. They must reside under the vscripts folder, or they will simply act as a 1 stage 1 second delay.
Finale scripts
The <map name>_finale.nut script is atumatically loaded when a finale map starts. The script is triggered when the trigger_finale is used, either manually by the player, or with the ForceFinaleStart input.
待完善: trigger_finale also has an option to specify a finale script, but it doesn't seem to work


All Director Scripts are placed in the script scope DirectorScript

Entity Scripts

Automatic loading at map start
Uses the script set in the Entity Scripts KeyValue of the entity.
Manual loading
Using the RunScriptFile input.

Entity Scripts are placed in the script scope _<unique ID>_<entity name>

Global Scripts

Mode Specific Scripts
Will automatically run the script with the same name as the game mode. For example, running a map map <map name> mutation12 will automatically load the Realism Versus script, mutation12.nuc.
They are placed in the script scope g_ModeScript
Note.png注意:Adding a script for a mode will enable Scripted Mode on it.
Map Specific Scripts (only available in Scripted Mode)
Per-map scripts can be created that run when the map is loaded in the specified game mode, using the syntax <map name>_<mode name>.nut, for example, c1m4_atrium_mutation12.nut.
They are placed in the script scope g_MapScript


Scripting environment

Please see List of L4D2 Script Functions for built in classes and functions.

When a script is loaded, it is placed into a table, or Script Scope. Mode, map and Director Scripts are put into set scopes, while a unique scope is generated for each Entity Script. Please see Vscript Fundamentals for more information.

Table structure

DirectorScript = 			// Base Director Scope.
{
	DirectorOptions 		// Base DirectorOptions table.
	MapScript =  			// Map Script scope.
	{
		BaseScriptedDOTable 	// Hardcoded DirectorOptions.
		ChallengeScript = 	// Mode Script scope.
		{
			MutationState 	// Initial values for SessionState.
			MutationOptions // Initial values for SessionOptions.
		}
		LocalScript =		// Script Scope Director Scripts are placed in.
		{
			DirectorOptions // DirectorOptions for current Director Script (like onslaughts). Only availabe when a script is active.
		}
		MapOptions 		// Initial values for SessionOptions.
		MapState 		// Initial values for SessionState.
	}
}
g_MapScript 	// Global reference to the Map Script scope (DirectorScript.MapScript).
g_ModeScript 	// Global reference to the Mode Script scope (DirectorScript.MapScript.ChallengeScript).
g_rr		// Scope holding the Response Rule system.
g_RoundState	// TODO
SessionOptions 	//Global Director options (Scripted mode only).
SessionState  	//State variables for game modes (Scripted mode only).


Delegation

Some of the tables have delegation set up, so that if a key isn't present in it, it is read from its parent table instead.

The tables are delegated like this (parent tables on the right):

The Director Scope
(DirectorScript.MapScript.ChallengeScript; DirectorScript.MapScript.LocalScript) < DirectorScript.MapScript < DirectorScript < ::
DirectorOptions
DirectorScript.MapScript.LocalScript.DirectorOptions (When Director Script active) < DirectorScript.MapScript.ChallengeScript.DirectorOptions (Scripted mode only) < DirectorScript.DirectorOptions

Entity Scripts

Use script scope _<unique ID>_<entity name>

Adding a script to the Entity Scripts KeyValue of a server-side entity loads the script as an Entity Script. The script is executed when the entity spawns, and loads into a unique script scope made up of an unique identifier followed by the entity name or class name.

A think function can be set with the thinkfunction KeyValue, the specified script function every 0.1 seconds. While it has the potential to become expensive, a programmer is able to limit the amount of code executed. Functions can also be manually called through the I/O system with the input RunScriptCode function_name(argument, ...).

Entity Scripts have a self reference to their owning entity handle, allowing the script easy access to control the entity through its class methods. There are also hook functions available depending on the entity class. Both methods and hooks are documented here.

Some entities have additional script functionality:


The script can be reloaded with console command ent_fire <name of entity> runscriptfile <relative vscript path>. This is useful for quick script reloading.


I/O system interaction

Any script can use the EntFire() and DoEntFire() functions to fire outputs to map entities. Since the activator and caller arguments in DoEntFire() take a script handle, it can be used to fire an output to an entity using the "!self" or "!activator" keyword, even without having to know its name, as long as the entity handle is available.

EntFire( "church_bell_relay", "Trigger", 0 ); // Fires an output to the Trigger input of the named entity.

player <- null;
while(player = Entities.FindByClassname(player, "player"))   // Iterate through the script handles of the players.
{
    DoEntFire("!self", "speakresponseconcept", "PlayerLaugh", 0, null, player); // Make each player laugh.
}


Conversely, the CBaseEntity::ConnectOutput() and DisconnectOutput() functions can be used to call a script function when the specified entity output fires. In addition, arbitrary VScript code can be run from the I/O system, using the RunScriptCode input available in all entities. The code will run in the current entities script scope.

Warning.png警告:Never use double-quotation marks in any Hammer Output, since it will corrupt the map file. This means that strings cannot be passed with RunScriptCode.


Global Scripts

Naming a script file with a game mode name a mode specific script, and makes it execute every time a map is loaded in the specified mode. If a Mode Script exists, a map specific script with the map name followed by an underscore and the mode name can also be loaded.

待完善: Add information about the features and utility functions that get loaded into these.

Scripted Mode

Adding a Mode Script will enable Scripted Mode for the game mode. This works on the base game modes included in the game as well.

Scripted Mode loads utility functions into the g_ModeScript scope, disables the hardcoded setting of 2 on the MaxSpecials Director Option, and enables game event callbacks and script hook functions. It also seems to break the finale tank music in Dark Carnival.

待完善: Does enabling Scripted Mode have any other consequences?

Shared Tables

SessionState
A table for storing session specific variables. Not preserved across level transitions.
SessionOptions
Base Director Options for the game mode.

Available Functions

待完善: Document the available utility features.


Mode Scripts

Use script scope g_ModeScript

Tables

MutationState
Initial values for the SessionState table.
MutationOptions
Initial values for the SessionOptions table.


Map Scripts

Use script scope g_MapScript

Tables

MapState
Map specific values for the SessionState table.
MapOptions
Map specific values for the SessionOptions table.


Glossary

DirectorOptions
A table of named variables that override the AI Director behavior.
Entity handle
Also known as EHANDLE.
待完善: Looks like some sort of pointer reference to an entity.
Script handle
An entity instance with accessors and mutators to the C++ entity object. Also known as HScript.
Script scope
The table where the variables, functions and classes of a VScript are placed.


Director options

Please see L4D2 Director Scripts for a table of available options.


Third party tools

VSLib

VSLib (VScript Library) is a simple, lightweight library for L4D2's VScript mutation system. It greatly simplifies coding VScripts by taking care of a lot of tedious work for you. It is used in several popular mods like Rayman1103's Admin System and Stranded. Read more about VSLib.

See also

External links

Alternative Tool
Alternative Documentation
Deciphered Official Scripts
Squirrel+求生之路2 = Pnkhrt-16px.png