nyuuzyou/wikis huggingface dataset:
Zh/L4D2 Custom Particle Effects Tutorial

自2011年3月11日起，求生之路2完全支持自定义粒子效果。本教程涵盖L4D2粒子编辑的独特内容。有关通用粒子编辑的信息，请参阅Particle System 分类。
== 概述 ==
粒子系统存储在PCF文件中，一个PCF文件通常包含多个相互关联的粒子系统（例如，blood_fx.pcf）。所有PCF文件必须注册到一个manifest文件中才能在游戏中识别。在L4D2中，可以选择以下两种manifest类型：
* particles\particles_manifest.txt 或者
* maps\<map name>_particles.txt（每地图）
此外，请注意以下几点：
* 官方粒子（PCF）文件可以从pak01_dir VPK中提取并放置到外部的particles目录中（VPK之外）。
* 粒子编辑器只会读取存储在外部的PCF文件。Hammer的Particle Browser需要particles_manifest.txt和PCF文件都存储在外部。
* 在游戏中，如果官方VPK中不存在相应PCF文件，则会读取外部PCF文件，这些文件必须始终注册到manifest中。
* particles\particles_manifest.txt需要通过加载到add-on VPK的方式打包并读取，或者简单地使用每地图manifest（maps\<map name>_particles.txt），无需打包。
== 设置 ==
目标是创建一个简单的自定义粒子效果，使其能够在游戏中以及Tools Mode下（位于《求生之路2》创作工具菜单中）显示。整个流程的核心是粒子编辑器。粒子编辑器是Tools Mode中的一个界面，用作粒子效果创作的统一工作区。除了粒子编辑器外，还将使用Hammer粒子浏览器和vpk.exe。
=== 在Hammer中预览粒子 ===
如果希望在Hammer中查看粒子，此部分是可选但强烈推荐的。有关如何提取现有粒子文件以进行预览的详细信息，请参阅粒子浏览器。
=== 创建一个简单的粒子 ===
由于粒子编辑器不依赖任何manifest，因此可以首先创建一个新的PCF文件以及新的粒子。建议从一个已知可以在游戏中正常显示的粒子开始。
请参阅粒子系统概述，了解如何创建一个从单点以径向方式喷射白色精灵的新粒子。
如果不想从头开始创建粒子，也可以尝试修改官方粒子。记得使用不同的名称保存PCF文件。默认情况下，PCF文件保存在particles文件夹的根目录中。
=== 创建manifest ===
为了在Hammer的粒子浏览器中查看新粒子，需要编辑外部的particles\particles_manifest.txt来注册新的PCF文件名。直接参考现有条目作为示例即可。最后，确保在刷新Hammer中的粒子浏览器之前保存文本文件。
要在游戏中查看新粒子，可以将particles_manifest.txt作为一个简单的VPK文件放入addons文件夹，或者创建一个每地图的粒子manifest（maps\<map name>_particles.txt）。有关VPK制作的详细信息，请参阅L4D2 Campaign Add-on Tutorial。
=== 将粒子添加到地图 ===
在地图中添加一个info_particle_system实体，该实体指向特定的粒子系统。在实体属性窗口中，通过键值Particle System Name可以方便地访问粒子浏览器。
在这种情况下，选择一个可靠的测试自定义粒子系统，让实体处于激活状态并编译地图。粒子应该会在游戏中显示。
现在，您可以在粒子编辑器中继续修改您的粒子了！设置cvar sv_lan 1，然后加载包含自定义粒子系统的测试地图。任何对自定义粒子的更改都应在已加载的地图中更新。这使得作者能够非常高效地迭代自定义粒子。如果在游戏内预览时遇到困难，请参阅故障排除部分。
=== 发布粒子 ===
当准备好在战役附加包中发布粒子时，只需将自定义PCF文件与修改后的particles_manifest.txt或每地图manifest一起打包到相应的目录中。有关更多详细信息，请参阅L4D2 Campaign Add-on Tutorial。确保VPK文件独立运行，无需任何外部存储的资源。恭喜您成功发布！
== 故障排除 ==
=== 粒子浏览器 ===
* 官方粒子或自定义粒子未显示为粒子浏览器中的选项。
* 特定粒子系统的预览窗口未显示任何活动内容。
=== 粒子编辑器 ===
* 在工具模式下很难消除“地图不可玩！”错误。
:一种快速的方法是使用命令cl_drawhud 0。更多相关问题的详细信息，请参阅常见L4D映射问题。
* 粒子效果未在地图中更新。
:如果粒子效果未能在游戏中更新，即使某个组件或属性发生了变化，可以通过一系列控制台命令重置世界中存在的info_particle_system实体：ent_fire info_particle_system stop;wait 120;ent_fire info_particle_system start
=== 游戏内 ===
* 粒子未能在游戏中显示。
:可能有多种原因导致粒子无法显示。通常可以通过逐一排除原因来解决。例如，检查粒子是否需要手动启动，或验证可靠的自定义粒子是否可以正常显示在游戏中。
== 参见 ==
* 粒子系统分类
* 动画粒子
* info_particle_system
* L4D2地图创建
* L4D2粒子列表
* 粒子
* 粒子编辑器
* particles_manifest.txt
* SpriteCard
== 外部链接 ==
* 粒子效果编辑器基础 (Interlopers.net)
* 粒子编辑器教程#1 (TF2maps.net)
* 粒子编辑器教程#2 (TF2maps.net)
Category:Left 4 Dead 2
Category:Particle System
Category:Tutorials
Zh/L4D2 Level Design

本简体中文页面由Gloria汉化，最后由墨染月更新于2024年9月2日。
 本页面概括了L4D2在地图设计中新增的特性。
如果你对求生之路系列的地图制作还很陌生，请先前往。文章中所述的大部分基本内容在 L4D2 中同样适用；因此，以下内容将仅仅关注 L4D2 新增的特性。
对于已经制作好的求生之路一代地图，想移植到二代的作者们，你们来对地方了。你们的地图只需要做一点点改动就能够正常运行；另外还有一些更有用的功能，可以对其加以运用。
== 新增特性概述 ==
* 外部VMF引用/实例让你得以使用多个VMF文件搭建一张地图。 
* 新增更多实体，例如能够使武器、物品、武器升级配合或不配合AI导演进行生成。
* 能够让你的地图更好地适应不同的玩家。可以修改路径、改变地图外观、创造暴风雨等等，一切都取决于玩家表现得有多好，从而让导演有多“愤怒”。
* 新增的允许仅创建一个单独的BSP文件，使地图可以根据不同游戏模式而改变其外观、布局、物品放置等等。
* 提供了导演之外的良好控制，并能简化复杂任务的实现方式。
* 现在有一个新的水着色器，可以使它更真实地流动。
== 教程 ==
== 另见 ==
* 
* 
* 
* 
*
Zh/L4D2 Level Design/Add-on Notes

本页面总结了求生之路二代的变化。
== AppID / 应用 ID ==
L4D2 的 add-on 中的 addoninfo.txt 文件必须包含正确的应用程序ID：
 addonSteamAppID 550
如果没有这一行，或是设置成了求生之路一代的ID（500），当用户双击VPK文件时将无法安装到正确位置。
== VPK 安装 ==
如果用户在游戏没有运行时双击打开 .VPK 文件，它将会被复制到一个临时的位置：
 Steam\steamapps\SourceMods\addons
当求生之路一代或二代启动时，它们会在上述路径中搜索 add-on，并且复制到各自的正确路径下。
== 另见 ==
* 
*
Zh/L4D2 Level Design/Boss Prohibition

本简体中文页面由大康翻译于2021年9月20日。最后更新于2021年10月17日。
----
有多种方法可以禁用或控制求生之路2中终极感染者的生成，包括 Mission.txt 文件和 VScript(脚本)。
== 通过 禁用/控制 ==
“coop_boss_spawning”和“versus_boss_spawning”是在牺牲更新中新增的变量(参数)。已知变量包括：
 coop_boss_spawning 和 versus_boss_spawning
变量 	类型 	范围 	注释
spawn_pos_min 	float	[0,1]	被幸存者清除了的导航流(Flow)的百分比？(Percentage flow cleared by survivors?)
spawn_pos_max 	float	[0,1]	
tank_chance 	float	[0,1]	
witch_chance 	float	[0,1]	
witch_and_tank	int 	0/1 	
 
请参阅 (使用浏览器文本搜索) 了解其使用的完整示例。
== 通过 脚本禁用/控制 ==
如果使用此方法，脚本的范围更广。脚本文件应该放在你的 left4dead2/scripts/vscripts 文件夹中（你可能需要自己添加 vscripts 子文件夹）。
一个基本的脚本包括：
DirectorOptions <-
{
 ProhibitBosses = true
}
还可以使用 Director Options 里的DisallowThreatType = ZOMBIE_WITCH | ZOMBIE_TANK变量（如 c8m1_apartment.nut 中所示）。
将扩展名为 .nut 的文本文件保存在 vscripts 文件夹中。
在你的地图中，放置一个 logic_auto 实体并添加一个输出。请注意，logic_auto 仅在此处用作示例。输出的目标实体应该是的实体，并使用BeginScript输入让导演运行脚本。在参数字段中，输入你的脚本名称（不需要 .nut 扩展名，但不会导致任何问题）。如果导演被要求加载另一个脚本或由EndScript的输出触发，本脚本将停止运行。
== 另请参阅 ==
=== 介绍 ===
*
*
*
*
=== 文档 ===
*
*
*
*
*
* 包含所有原始结局脚本作为参考。
*
=== 其他 ===
*
*
*
*
Zh/L4D2 Level Design/Custom Finale

本页面由大康翻译于2022年1月2日。部分内容由机器翻译。
----
__toc__
 自定义会自动从包含阶段列表的中读取：<地图名称>_finale.nut。该系统具有在满足任意条件（即终极感染者、Aztec tomb puzzles、feats of strength 等）时增强结局阶段的能力。一旦所有阶段都完成， 会触发 FinaleEscapeStarted 输出。
自定义结局地图包括 c2m5_concert、c3m4_plantation、c4m5_milltown_escape、c7m3_port，假设求生之路1的结局也一样(毫不留情已被确认是使用自定义结局的)。官方地图不使用Standard(标准) 结局类型。
== 组成内容 ==
=== 地图 ===
最起码，所有需要改变的是 trigger_finale 的 Finale Type (结局类型)，从Standard到Custom。你还应该考虑其他选项和细节：
* 除非通过脚本 EntFire（直接或间接）或简单地在游戏中使用 I/O 为提供输入 EndCustomScriptedStage，否则猛攻(Onslaught)阶段类型不会结束。
* info_director: 在自定义结局事件时，OnCustomPanicStageFinished, OnPanicEventFinished (也许只是为了渐强事件)，和 OnUserDefinedScriptEvent(1-4) 输出可用，链接到 vscript 阶段状态或方法，如 .UserDefinedEvent1()-.UserDefinedEvent4().
* trigger_finale: AdvanceFinaleState 输入可用。
=== 脚本 ===
正如 L4D2 脚本文章中所讨论的，有四种阶段类型、附加的自定义结局特定导演选项和可用的特殊功能。
以下是带有附加注释的自定义结局脚本：
==== c2m5_concert_finale.nut ====
== 牺牲结局 ==
牺牲结局基于自定义结局，并在牺牲更新中引入了额外的硬编码修改。
===c7m3_port_finale.nut===
这比其他自定义结局更复杂，但本质上是为了自定义体验。该脚本表明牺牲结局类型主要取决于新的游戏内实体和实体功能。
==解密的官方结局脚本==
这是所有的结局脚本，于 2021 年 8 月 2 日解密。
这些尚未修改以提供任何附加信息，某些部分可能会造成混淆。
===c1m4_atrium_finale.nuc===
===c1m4_finale_wave_1.nuc===
===c1m4_delay.nuc===
===c2m5_concert_finale.nuc===
===c3m4_plantation_finale.nuc===
===c4m5_milltown_escape_finale.nuc===
===c6m3_port_finale.nuc===
===c7m3_port_finale.nuc===
===c8m5_rooftop_finale.nuc===
===c9m2_lots_finale.nuc===
===c10m5_houseboat_finale.nuc===
===c11m5_runway_finale.nuc===
===c12m5_cornfield_finale.nuc===
===c14m1_lighthouse_finale.nuc===
===c14m2_lighthouse_finale.nuc===
=== director_gauntlet.nuc (为所有长途救援结局共享) ===
== 另请参阅 ==
=== 介绍 ===
*
*
*
=== 文档 ===
*
*
*
*
=== 其他 ===
*
*
*
*
Zh/L4D2 Level Design/Director Queries

本简体中文页面由 Gloria 汉化。
__toc__
 实体是L4D2新增的独有实体，当它被触发时，会返回一个指示A.I.导演当前有多“愤怒”的值。生还者表现得越好，导演就会越“生气”，游戏中感染者的生成也会越激进。
可以利用这一机制来让你的地图更动态化，根据玩家水平的不同做出响应。一个简单的例子是，在地图中分别创建几条长度/难度不同的路径，然后使用一个导演查询实体来控制某条路径的开闭。在对抗模式中，系统会在阵营互换时自动地重复第一局的选择，以保证游戏的公平性。
== 发起查询 ==
我们来瞧瞧它是怎样的运作机制。
导演会持续地更新自身内部的状态，但出于地图编辑考虑，你必须通过某种触发器来显式地查询导演的状态。查询事件能反馈当前导演的愤怒值，让我们得以根据这个值设置不同的游戏逻辑。
在这个例子中，我们在生还者到达地图的特定点时发起一次查询。来，我们把一个触发器(trigger)固实体放在走廊中。关卡一开始就进行导演查询通常并没有什么卵用，因为此时生还者都是满血的，而导演的愤怒值通常也是最大的。但对于学习地图制作来说，这也足够了。
放置一个固体，选中它并在菜单栏中点击 Tools -> Tie to entity 转换为固实体。将实体类型更改为"trigger_once"并给它应用"tools/toolstrigger"纹理。
 
我们当然希望这个触发器只对生还者做出反应，因此需要过滤它的输入。为了实现过滤，来放置一个"filter_activator_team"实体，命名为 "filter_survivor"。
 
选中触发器固实体，打开属性面板，将它的过滤器属性指定为"filter_survivor"。现在这个触发器就只能被生还者触发了，而感染者无法触发。
接下来，去走廊的另一头，找到通向安全屋的梯子。放置一个类型为"logic_director_query"的新实体，命名成"director_query_zombie"。
 
在属性面板中，将 Min Anger Range(最小愤怒值) 属性设置为 0，将 Max Anger Range(最大愤怒值) 属性设置为 9。导演自身真实的愤怒值在0~50之间，但我们将它分成10种情况。上述设置将会把导演查询的返回结果缩放到0~10之间。
愤怒值中的 Noise(噪声) 属性也是游戏体验重要的一环。一点点不确定性的加入能让玩家保持活跃。当然为了教学起见，我们先把 Noise 设置为"Pure"（无噪声）。它将关闭愤怒系统中内置的随机数。正常情况下不要这么做，因为这会消除流程中的惊喜元素，让游戏体验变得无趣，且可预测性太强。
现在选择地图开始位置的触发器固实体，添加一个"OnStartTouch"事件输出，输出到"director_query_zombie"实体的"HowAngry"事件上。
按下键运行地图。加载完成后，进入走廊以触发trigger固实体，同时马上打开控制台。导演查询会输出下面的内容：
 TRUE Anger: 50.00 Processed Anger: 50 Out Anger: 9
可以看到查询被成功发出了。在地图制作过程中，可以将 sv_cheats 始终设置为 1，这能让你手动从控制台发起导演查询，我们这个例子中的命令是：
 ent_fire director_query_zombie howangry
== 响应查询结果 ==
既然我们已经可以从导演获取信息了，下面可以用来做一些事情，在地图中弄出一些变化。先生成一只感染者，但它的类型根据愤怒值不同而不同。 
在 director_query 实体的正上方添加一个 commentary_zombie_spawner 实体。
接下来，创建一个新的 logic_case 实体并命名为"zombie_case"，为其中的每一种情况添加响应事件。我们的例子中，设置了10种不同情况下的响应。
属性(Properties)选项卡设置完成后，打开输出(Outputs)选项卡，根据条件分支的不同把丧尸生成器设置成不同的类型。
现在，回到 logic_query_director 实体的 Outputs 选项卡，触发事件选择 OutAnger，目标实体选择"zombie_case"，实体事件选择 InValue。这个输出会把 logic_query_director 查询转换后的愤怒值传递到 logic_case 实体上。logic_case 实体可以根据这个值做出相应的选择。
当条件分支与属性不匹配时，什么都不会发生。因此在我们的例子中，如果导演愤怒值在5以下，就不会触发事件。
而大于6时，logic_case实体会通知生成器强制刷出一只丧尸，至于是普通感染者，还是boomer、charger，甚至tank，都取决于愤怒值的大小。
== 其它用途 ==
当你在制作地图时，最好仔细地优化地图逻辑，让每个与导演状态相关的事件都能让玩家感到有趣。如果你设置得太死了，玩家就能预测某个事件的发生，这就不好玩了。如果事件有一些随机性，其发生的概率与玩家的表现不完全成正比，这样玩家就不会被驱使着去完成你的要求。
那需要多大的随机性呢？这点视不同情况而定。对于不同的剧情，兴趣区的设置也是不同的，不是随随便便就能做好的。建议有计划的循环地观察玩家状态，调整地图行为，再次观察，再次调整……
下面是一个兴许对你的地图制作与调试有用的示例：
打开下面的文件：
 sdk_content\mapsrc\Your_First_L4D_Level_Tutorial\tutorial07_complete.vmf
图中是一个逻辑定时器(logic_timer)，每隔固定时间触发一次 info_query。条件选择器(logic_case)计算愤怒值并启用对应笔刷的显示。这样就能将导演查询出的值就能以数字形式展现给玩家了。
当然，除了数字以外，你可以用它来做出更好玩的东西。人们通常会有“呈现出相关性的事物一定具有因果关系”的错觉，可以利用人们的这一心态来制造娱乐效果，或是拿来吓人。（甚至有可能实现盈利(profit)。）
下面是另一个值得学习的示例：
 sdk_content/Deadline2/mapsrc/l4d_deadline01.vmf
死亡二号线示例的第一张地图使用了这一技术来实现路线选择，一条路短而直，另一条则较为曲折蜿蜒。还有一个放在生还者必经之路上的刷怪器，根据导演愤怒值的不同，会生成一只Boomer或是Witch，在这种狭窄的空间里，不论刷出哪个都够让玩家好受的了。
Zh/L4D2 Level Design/Gauntlet Finale

本简体中文页面由大康翻译。更新于2022年4月17日。
----
 在《教区》战役中引入了长途救援终局。该结局要求玩家逃到关卡的尽头，而救援车辆已经在等待他们，而不是让玩家在封闭的区域中待命。在教区中，玩家必须穿过一座桥才能到达救援直升机。
你可能希望遵循本文基于 c5m5_bridge.vmf 的。
== 概述 ==
本结局（长途救援结局）主要由组成，并进行了一些新的添加和修改：
* 使用“Gauntlet”作为结局类型(Finale Type)设置。
*一个 ，在地图末端靠近救援车辆的地方命名为“nav_flow_target”，但不在标有 RESCUE_VEHICLE 的导航网格上。否则它将被阻止并且不会生成导航流。
*通常没有救援房间，但如果添加了救援房间，则应该可以使用。如果在到达终局区域之前发生了战斗，请考虑添加一个。
*默认情况下，结局取决于 director_gauntlet.nuc 脚本，即使没有设置“脚本文件”字段。
长途救援结局结构不是很灵活，应考虑解决方法。在准备逃生车辆之前，只允许生成一只 Tank。"director_debug 1"显示，在 trigger_finale 第二次触发 GauntletStopPanic 时，它被认为是一个转义序列。
== director_gauntlet.nuc ==
这是原始的 Gauntlet Finale 脚本，如果你想根据自己的目的对其进行调整。
Msg("Initiating Gauntlet\n");
DirectorOptions <-
{
	PanicForever = true
	PausePanicWhenRelaxing = true
	IntensityRelaxThreshold = 0.99
	RelaxMinInterval = 25
	RelaxMaxInterval = 35
	RelaxMaxFlowTravel = 400
	LockTempo = 0
	SpecialRespawnInterval = 20
	PreTankMobMax = 20
	ZombieSpawnRange = 3000
	ZombieSpawnInFog = true
	MobSpawnSize = 5
	CommonLimit = 5
	GauntletMovementThreshold = 500.0
	GauntletMovementTimerLength = 5.0
	GauntletMovementBonus = 2.0
	GauntletMovementBonusMax = 30.0
	// 测试进度的桥梁长度。
	BridgeSpan = 20000
	MobSpawnMinTime = 5
	MobSpawnMaxTime = 5
	MobSpawnSizeMin = 5
	MobSpawnSizeMax = 20
	minSpeed = 50
	maxSpeed = 200
	speedPenaltyZAdds = 15
	CommonLimitMax = 30
	function RecalculateLimits()
	{
	// 根据进度增加共同限制
	 local progressPct = ( Director.GetFurthestSurvivorFlow() / BridgeSpan )
	 
	 if ( progressPct < 0.0 ) progressPct = 0.0;
	 if ( progressPct > 1.0 ) progressPct = 1.0;
	 
	 MobSpawnSize = MobSpawnSizeMin + progressPct * ( MobSpawnSizeMax - MobSpawnSizeMin )
	// 根据速度增加共同限制 
	 local speedPct = ( Director.GetAveragedSurvivorSpeed() - minSpeed ) / ( maxSpeed - minSpeed );
	 if ( speedPct < 0.0 ) speedPct = 0.0;
	 if ( speedPct > 1.0 ) speedPct = 1.0;
	 MobSpawnSize = MobSpawnSize + speedPct * ( speedPenaltyZAdds );
	 
	 CommonLimit = MobSpawnSize * 1.5
	 
	 if ( CommonLimit > CommonLimitMax ) CommonLimit = CommonLimitMax;
	 
	}
}
function Update()
{
	DirectorOptions.RecalculateLimits();
}
=== 提示 ===
==== Bridge Span Value (大桥跨度值) ==== 
该脚本有一个“BridgeSpan”设置，用于确定 Gauntlet 区域的长度，以便计算对抗游戏的进度。
此值以 Hammer 单位为单位，只需在 一侧创建一个固实体，而另一侧是救援车辆所在的位置，就可以轻松地在 中获取该值。
如下图所示，这个画笔实体的宽度为 20096.0 个单位。所以脚本设置为 20000 单位以使数字四舍五入。
== 另请参阅 ==
Zh/L4D2 Level Design/Hard Rain

全文翻译：求生的兔。
= 暴风骤雨战役雷暴实例创建教程 =
(以下下载均已失效，而在你的目录Left 4 Dead 2\sdk_content\mapsrc\instance下已拥有c4m4_storm_ents.vmf文件了。）
雷暴天气是一个非常酷的效果, 而且事实上它比你想象中的容易制作。教程参考自 这儿。（此处开始可以不用往下看，请直接看准备工作。）然而，我们还得为此先做一些准备工作。这是一个.zip文件，包含了已更新的文件内容，以方便您自己编辑您的雷暴天气。
StormEnts.zip
当你下载完storm_ents.zip这个文件时。前往你的 Left 4 Dead 2 \mapsrc\ 文件夹。创建一个新的文件夹叫\myinstances\ 或者和这个类似的名字（不能是中文）。并且解压 the storm_ents.zip 文件到你创建的文件夹内。这是为了确保你的游戏工具在更新时不会被官方覆盖文件！
== 准备工作 ==
首先，你的地图需要拥有一个（天空盒子）。当你已经创建或者拥有天空盒子的时候，点击软件中的“map”找到“Map Properties”，并且设置“Map Properties”为sky_l4d_c4m4_hdr。这是V社暴风骤雨官方的天空贴图（当然你也可以选择你喜欢的）。 
== 创建雷 ==
强烈建议不使用“func_instance”实体而是打开以下所有vmf进行复制里面的实体，不然有少许bug！
我们将使用func_instance实体来设置雷，首先进入你地图的可玩区域，创建一个实体“func_instance”。
将func_instance实体按照以下内容进行设置属性:
* 设置 Fix Up Name 为 "c4m4_storm_logic"
* 设置 VMF Filename 为 "instance/c4m4_storm_logic.vmf" 
* 设置 Entity Name Fix Up 为 "None"
下一步, 创建第二个 func_instance 实体在第一个附件某处，并且按照以下内容进行设置属性:
* 设置 Fix Up Name 为 "c4m4_environment_ents"
* 设置 VMF Filename 为 "instance/c4m4_environment_ents.vmf" 
* 设置 Entity Name Fix Up 为 "None"
第三步也是最后一步，将 func_instance 实体设置在sky_camera实体的3dskybox空间（即在远景盒子内，没有需要创建）。 把这个新创建的 func_instance实体放在和sky_camera完全一致的位置上（即重叠2个实体），并且按照以下内容进行设置属性
 
* 设置 Fix Up Name 为 "c4m4_storm_ents"
* 设置 VMF Filename 为 "instance/c4m4_storm_ents.vmf" 
* 设置 Entity Name Fix Up 为 "None"
== 创建暴雨 ==
现在我们只需要添加一些雨天气效果到地图内。方法是，创建一个能够覆盖住整个游戏区域（远景盒子不要）的固体（笔刷），并且将其应用于tools/toolstrigger材质，并且转换这个固体为func_precipitation（转换方式，选中这个固体，ctrl+t变成固实体，并且修改class为func_precipitation）。设置Precipitation Type为"Particle Rain Storm"，并且将它的Name设置为 "rain"。
下一步,我们将暴雨带来的雾挡在我们的建筑外面。方法是创建一个固体（笔刷），并且将其应用于tools/fogvolume材质。转换为fog_volume实体，然后调整其位置和大小，以覆盖你需要覆盖的建筑区域。如果有多个区域就设置多个此实体（指如上雨水屏蔽一样）将fog_volume实体按照以下内容进行设置属性:
* 设置 Fog Name 为 to "foginteriorcontroller"
* 设置 Postprocess Name 为 "fx_settings_interior"
最后，我们只需要添加雨的声音效果了。方法是，回到你放置的前两个func_instance实体位置。在它们的附近创建一个叫env_soundscape_triggerable的实体，并且按照以下内容进行设置属性:
* 设置 Name 为 "rain_interior"
* 设置 Radius 为 "0"
* 设置 Soundscape 为 "rain.interior.med"
再创建第二个 env_soundscape_triggerable 实体并且按照以下内容进行设置属性:
* 设置 Name 为 "rain_exterior"
* 设置 Radius 为 "0"
* 设置 Soundscape 为 "rain.water.med"
现在要做的就是触发这些雨的声音。方法是，进入到你建筑的出口处（门）。
放置一个能够和门一样大的固体（笔刷）。这个固体需要应用tools/toolstrigger材质。并且转换为trigger_soundscape实体，然后设置Soundscape为"rain_exterior"。
现在，再放置第二个同样的固体（笔刷）于门的入口处（门前）。同样是应用tools/toolstrigger材质，并且转换为trigger_soundscape实体。设置Soundscape为"rain_interior"。
这两个实体的作用是，当玩家进门或者出门的时候。室内与室外会让雨声听起来不一样。然后复制一份内部的雨声固实体（指Soundscape为"rain_interior"的固实体）将其完全覆盖住你的出生点房间（如果是室外则换成另一个Soundscape为"rain_exterior"的固实体）。如果你不这么做，那么玩家出生时则听不到雨声直到玩家出去或者进入场景（指你已经为所有的出入口放置了声音触发实体）。
== 测试你的雷暴天气 ==
就是这么多！你需要设置一个按钮，来给你的地图效果进行测试。方法是，放置一个按钮，设置它的输出，输出到的目标实体为"relay_storm_start"，输出方式为"Trigger"。
第二种测试方式是打开控制台(确保sv_cheats 参数是 "1") 并且按照一下内容进行输入指令:
ent_fire relay_storm_start trigger
这是一个雷暴效果的测试样本地图（文件链接已失效，我将会在以后做一份我自己的上传。），安全室外的按钮会引发暴风雨，而更远处的按钮只会引发一场尸潮恐慌时间。安全室门边上有个梯子，以至于能够让你到达屋顶。
L4D2_StormSampleMap.zip
= 参考 =
* 
* 
* 
*
Zh/L4D2 Level Design/Instructor Hints

本简体中文界面由大康翻译。部分内容由机器翻译。(早期翻译作品可能不太好，请见谅)
----
尽管您应该努力通过使用照明和地图设计来使玩家知道目标，但您常常会发现在屏幕上提供进度信息会很有帮助。如果您需要自定义活动或想要将其告知玩家的意外事件，则尤其如此。《求生之路》中使用的提示则是固定的，但《求生之路2》中则允许创建您自己的提示。有两种方法可以将提示添加到您的地图中：您可以使用 插入现有提示，也可以使用 创建自定义提示。
== 使用预定义的提示 ==
要使用中已经存在的提示，请将 info_game_event_proxy 放入您要显示提示的关卡中。要选择您想要显示的提示，请将提示名称复制到“要生成的事件的名称”(Name of the event to generate)框中，并将“范围”（Range）更改为所需的值。如果要在玩家看到它时触发它，则需要转到Flags选项卡，然后选中“首次看到时自动启用”（Fire Automatically When First Seen。 
你可以在此处查看所有可用的预定义提示。
范例:
Name of the event to generate: L4D2_Instructor_explain_perimeter1
Range: 500
== 创建一个自定义提示 ==
首先，放置一个新的 。这使您可以控制和指定提示参数。
此外，提示还需要在地图中显示3D位置并控制可见性。我们可以通过创建要指向的客户端实体来做到这一点。完成此操作的最简单方法是放置一个命名的 实体，并启用"transmit to client (respect PVS)"选项。选择 info_target 时，可以在属性对话框的“Flags”选项卡下找到它。将 info_target 设置为 env_instructor_hint 的目标实体后，您应该会在游戏中看到提示。
您指定的字幕文本现在应该在游戏中显示给玩家。
==另请参阅==
* 
*
Zh/L4D2 Level Design/Multi-Gamemode Support

本简体中文页面由大康翻译于2021年9月11日。部分翻译摘自『定时子弹』的翻译版本（在此有改动）。
----
在求生之路2中，你能用新的实体 根据不同游戏模式来触发不同事件。包括多样地图的外观，路径安排，项目的布置，或者别的什么。
最直接的好处就是不需要把同一关卡弄出多个版本。单独一个 .BSP 就能支持所有游戏模式，从而很显著的减小了地图文件的体积。
如果硬要说缺点，那就是提高了地图文件的复杂度。然而，正如我们将看到的，实现简单管理只需要使用“可见组”功能和新的“实例”功能。
== 从案例学习 ==
让我们看看如何使用 info_gamemode 在现有地图中添加清道夫模式，在本例中是来自死亡班车（Deadline）附加战役的地图。
首先，打开死亡班车 2 第二张地图的源文件：
 Steam\steamapps\common\left 4 dead 2\sdk_content\DeadLine2\mapsrc\deadline02.vmf
== 整体结构 ==
此地图的特点是中间的电梯必定会被触发。扯淡，这“噪音”会引来一大群尸潮啊。这用于划分地图为两半并限定游戏性到各个区域。当线性地图部分在合作模式下是不错的，清道夫的游戏性是更多偏向竞技。那么我们要让地图以清道夫模式启动会表现得与众不同。
让我们看看这是如何做的：
在可见组面板中，单击“+SCAVENGE”可视组旁边的复选框以显示和隐藏它。你会看到所有特定于清道夫的内容被激活和停用。这个 visgroup 中只有一个 func_instance，它引用了以下文件：
 "instance/l4d_deadline02_scavenge.vmf"
这里的原理是在主地图源文件中引用所有游戏模式通用的所有元素：“deadline02.vmf”，并使特定于游戏模式的元素分别存在于各自独立的 .VMF 文件，并将它们作为实例引用到主地图中。求生之路2的关卡设计师发现以这种方式管理所有内容更容易，并且根据地图的复杂性，你可能会发现它会让管理更容易。
［这段大概是这样的：这里的原理是将其他游戏模式的内容引用到当前地图，引用的是"deadline02.vmf" 即实例。用这个方法比较容易管理。(此处省略不少字啊，但意思表达清晰完整)］
== 检查实例 ==
使用选择工具点击包含清道夫地图元素的实例并打开其属性对话框。在左下角，单击 Edit Instance (编辑实例)按钮。
 
Hammer 将打开实例引用的清道夫地图元素的 VMF 文件进行编辑。现在我们只能看到与清道夫地图元素相关的物品：起始区域、发电机、武器和一些改变地图和导航的障碍物。
不过，有点复杂。一些元素只需要在清道夫模式下生成，如果地图运行任何非清道夫模式，则必须移除其他元素。请记住，在 Hammer 中，可视组和实例是唯一的意义所在。一旦你编译你的地图， 进程会读取所有的实例并编译到地图中，就意味着所有模式的元素都集中到了一块，并且被隐藏的可见组将被 VBSP 忽略。所以我们需要一种在游戏中控制地图中的游戏元素的机制。这就是 info_gamemode 实体的用武之地。
== info_gamemode 的设置 ==
该图标看起来像一副扑克牌。
选择它并单击 Properties (属性)按钮(译者注：或者双击实体)。键值非常少，但让我们看看 Outputs 选项卡。这就是操作所有的地方。
在这里你可以看到，如果地图在任何游戏模式下加载，而不是清道夫模式，它会触发一个名为“relay_kill_scavenge”的 ，移除该地图中所有特定于清道夫模式的物品。
通过这个简单的输出，它将负责删除所有内容。但是，添加内容需要分阶段完成，因此我们将内容分组为它们各自的logic_relay实体。
当地图刚刚以清道夫模式加载时，它会触发“OnScavenge”事件。此时，导演仍在初始化中，重要的是在完成初始化之前不要生成或杀死实体。
地图加载好并初始化导演后，它会触发“OnScavengePostIO”。我们在此刻进行一些操作：
# 首先，我们根据需要做一些 。案例中包含用于清道夫的特定武器、物品和带有填充点的发电机的模板(point_template)。
# 它还可以自动启动电梯，从而升起梯子并解除呼叫按钮。
# 我们在 post IO 中做的最后一件事是调整导航。我们已经封锁了一些路径来平衡地图，并且通过导航拦截器来封锁导航网格。
“OnScavengeMatchStart”，是……我确定你已经猜到了，在清道夫模式的第一次地图加载时触发。不会在回合重新开始时触发。（译者注：原句为“fired off for each match”,由于含糊，此处的翻译是摘自对于该输出的描述的翻译）
info_gamemode的优点之一是你可以在一张地图中放置几个 info_gamemode。死亡班车 2 地图不是依靠一个 info_gamemode 来执行所有操作，而是在每个游戏模式的实例文件中使用 info_gamemode。每个人都负责单独生成和杀死与特定游戏模式相关的物件。这需要努力来完成，但它有助于在你制作时使制作变得更简单。当你继续编辑你有一段时间没有接触过的地图时，让事物都有规划的呆在自己的地盘真的能帮我们不少忙。
== 使用 info_director ==
在某些情况下，你将无法完全划分游戏模式。例如，清道夫地图要求 位于主地图中，因为它被所有游戏模式使用，并且具有如右图所示地图的某些输出。
 
你会注意到生存模式也有它自己的实例，合作模式和对抗模式是被组合在一起的2种模式。当然，你可以根据需要组织地图并添加支持的游戏模式，无论是否有实例。
Zh/L4D2 Level Design/Scavenge Maps

本页面由大康翻译，翻译最后更新于2021年9月11日。此页面的原文最后是2017年更新的。
----
无论你是在现有地图中添加"清道夫模式"支持还是在制作仅限清道夫模式的地图，你都需要包括以下每个元素：
 
# 一个安全的开始区域
# 具有计分点和状态指示的浇注点的发电机（或其他耗油设备）
# 将清道夫的油桶、武器和物品放置在地图中
# 具有清道夫输出的 实体
让我们更详细地介绍：
	
== 开始区域 == 
	
幸存者开始在 实体指示的位置进行清道夫匹配，因此你需要放置 4 个 info_survivor_position 实体，并在游戏模式（Game Mode）键值中指定scavenge。
开始区域需要在地图导航网格中表示，它保存在 .NAV 文件。最简单的方法是在 .VMF 放置一个 笔刷实体。这将在分析时将适当的 CHECKPOINT 属性应用于导航网格。你需要确保你的导航网格被细分得足够好，以便它能准确地反映这个区域的边界。
接下来，你需要在每一轮开始时设置生还者能够看到的可见边界标记。首先创建一个覆盖开始区域的实体，指定它为无绘制材质（nodraw），并让它空置：Tools > Make Hollow。这让固体的数量变成了六个。之后删去顶部和底部的固体，留下四堵矮墙。
在四个内表面上，应用"effects/scavenge_boundary"材质。边界现在应该是可见的，但我们也需要使它非固体。选择 4 个边边界画笔并使它们成为 实体。
在属性下，将 Solidity 设置为“Never Solid”。这指定它们不会影响游戏中的碰撞。因为我们需要在回合开始时删除边界，所以我们需要给它一个目标名称。 Valve 的地图的标准(目标名称)是“brush_scavenge_boundary”
现在唯一剩下的就是添加一个 设置来生成一个名为“explain_scavenge_leave_area”的提示。
== 发电机 ==
	
	
接下来，让我们放置发电机及其相关逻辑。
	
新的实例功能使得这变得非常简单。只需创建一个新的 实体并将其指向
 
 Steam\steamapps\common\left 4 dead 2\sdk_content\mapsrc\instance\scavenge_generator.vmf
 
你可以在求生之路2的创作工具中找到，包含一个功能齐全的发电机，包括发光的浇注目标，以及根据剩余时间闪烁绿色、黄色和红色的灯。
 
当然，它不一定是在一个实例中，你可以根据需要复制和粘贴或制作预制件。
 
	
== 油桶、武器和物品 ==
 
	
	
标准的清道夫地图有 16 个油桶散布在地图周围。你可以通过放置 实体来指定这些位置。
	
清道夫地图的标准是每个回合的武器和物品都一致，所以最好用特定的武器实体生成武器。如果你的地图支持其他游戏模式，你将需要使用 生成你的清道夫武器和物品，当 实体检测到地图已在清道夫模式下启动时，通过输出，就会激活该 。
同时，用于其他游戏模式的任何 和 可能无法正常工作。最好在使用info_gamemode在清道夫模式中加载地图时杀死它们。
== info_director ==
	
最后一点是从 添加一些输出。
	
由于地图中只有一个导演实体，而其他游戏模式依赖于它，因此你可能需要放入主 .VMF 中，而不是清道夫实例中。
== 回合开始的相机 ==
	
一个不错的方法是在回合开始时添加一个移动的相机。这可以通过创建几个 实体并将它们与 协调来完成。查看示例地图：
	
 Steam\steamapps\common\left 4 dead 2\sdk_content\DeadLine2\mapsrc\l4d_deadline02_scavenge.vmf
	
== 测试清道夫模式地图 ==
	
要在清道夫模式下加载地图，请使用以下控制台命令：
	
 mp_gamemode scavenge (在 L4D2 中没有效果)
	
 map <你的 .BSP 地图文件名称> scavenge (这是正确的用法)
这是一个有用的快捷方式，可以避免每次都必须浏览主菜单，或者如果你尚未设置加载项。你可以类似地将游戏模式更改为“coop”、“versus”和“survival”，如果你正在测试具有多游戏模式支持的地图。
 
在正常游戏过程中，如果没有足够的人类玩家，清道夫服务器将在短时间内关闭。当你开发和测试你的清道夫地图时，你需要使用控制台禁用它：
 sv_cheats 1
	
 sb_all_bot_game 1（原文为 sb_all_bot_team 1）
	
 jointeam infected
	
 z_spawn charger
如果团队只有机器人，sb_all_bot_team可防止超时发生。
	
如果你正在大厅中测试你的地图，并且想开始只有一个玩家的游戏，请使用以下命令：
 
ui_lobby_start_enabled 1
	
即使只有一个人类玩家，这也会启用多人游戏大厅（清道夫模式和对抗模式）中的“开始游戏”按钮。
Zh/L4D2 Level Design/VMF Instances

本简体中文界面由大康翻译。最后更新于2021年8月27日。本页面部分内容由机器翻译。(早期翻译作品可能不太好，请见谅)
----
__toc__
 地图实例是用于地图编辑的简单但功能强大的新工具。基本上，它们使你可以将一个 .VMF 引用到另一个。对文件的任何更改都将反映在所有实例中。
== 好处 ==
=== 预制的 .VMF 文件 ===
需要重复放置的地图数据可以方便地作为实例保存和编辑。这与预制文件的工作原理类似。基本上，你要一起工作的实体收集至一个文件中，然后将该文件引用到地图中的任意多个位置。每个实例都有自己的“name fixup”(名称修正)，因此当文件被引用到另一个地图中时，所有的逻辑仍然有效。《教区》战役中的警报车停车场就是这样做的。另外，《暴风骤雨》 中的城镇也被引用到地图的前后版本版本中，从而使单个更改都可以反映在这两个版本中。
=== 分割 ===
实例还可以用于将大型笨拙的地图分为几个较小的、更易于管理的 VMF 文件。当多个地图作者同时在一张地图上工作时，这也简化了工作流程。
=== 脱离网格工作 ===
如果地图的一部分需要成非正交的角度，你可以将其保留在的单独文件的网格上。如果随后你将文件实例化至主地图中，然后旋转该实例，则可以继续享受在网格上为每个文件进行编辑的好处。
=== 将一个地图升级至《求生之路2》 ===
如果你要升级一个《求生之路》地图以便与《求生之路2》一起运行，并且同时与《求生之路》保持兼容，则实例是最好的选择。你可以保持一个新版本，但是由于需要在两个地方进行常见的修复或更改，因此该“分支”可能会变得难以支持。或者，你可以简单地将新内容添加到“L4D2”可见组中，但是这种方法的可伸缩性不是很高。这很容易出错，丝毫的复杂性会使它变得笨拙。
相反，你现在可以将公共资产保留在一个与 L4D1 兼容的文件中，将 L4D2 的“增量”保留在另一个文件中。要进行设置，你将需要创建一个新的 L4D2 VMF 文件地图，然后将一个实例实体引用其中的现有 L4D1 地图，从而在每次编译之前自动导入旧地图的内容。只需将新的仅L4D2实体添加到L4D2 的VMF文件，就可以从一组非重复的源数据中为两个游戏提供一个地图版本。这样做的好处是，你在较旧的 L4D1 地图中进行的任何更新都会自动反映在新的 L4D2 VMF 版本中。
让我们使用入门教程之一的实例进行操作。
== 添加一个新实例 ==
首先，从 Hammer 中创建一个新地图：
# 从菜单上点击选项卡 File；
# 点击 New。
另存为：
 sdk_content\mapsrc\Your_First_L4D_Level_Tutorial\tutorial07.vmf
我们将引用同一文件夹中的另一个文件，因此将其保存在正确的位置很重要。
接下来，我们需要放置一个称为“func_instance”的实体，该实体将表示你希望引用的地图数据。
点击实体工具，然后从 Hammer 窗口右侧的“对象”下拉菜单中选择“func_instance”。
 
左键单击在顶部（右上）视口中深青色线相交的位置，将其放置在世界中心点（坐标0、0、0)。你可以从状态栏的右侧验证其位置。
由于它是一个点实体，因此你可以将 func_instance 放置在任何位置，但是将其放置在世界中心点且没有旋转的情况下，你可以非常精确地在基础地图和实例之间剪切然后粘贴特殊对象。在地图之间进行紧密协调时，这非常方便，你会发现自己在做很多事情。
接下来，使用箭头选择工具选择 func_instance 并通过按 + 打开其属性。
 
单击 VMF Filename 字段，然后单击 Browse... 按钮。继续并在同一文件夹中选择完成的教程文件之一：
 sdk_content\mapsrc\Your_First_L4D_Level_Tutorial\tutorial05_complete.vmf
如果没有出现该名称，请确保你正在编辑的 VMF 文件保存到同一文件夹中。你也可以尝试手动输入文件名。
现在，“tutorial05”的内容已在新地图中引用，并用淡黄色橙色表示以将引用的内容与当前打开的 VMF 文件中的其他内容区分开。
即使当前打开的 VMF 文件从技术上讲仅包含一个 func_instance 实体，当你编译地图时，所有实例都会被暂时“展平”并包含在地图中。它们出现在最终的 BSP 文件中，就像它们已经在地图本身中一样。
尽管现在你需要两个 VMF 源文件来创建关卡，但是你可以为自己提供更大的编辑灵活性，因为你可以将内容保存在单独的存储桶(separate buckets)中。正如我们将在接下来的几篇教程中看到的那样，当你添加对多种游戏模式的支持或执行其他使你的地图更加复杂的事情时，这将变得非常方便。
== 修正名称和查看选项 ==
再次查看属性对话框。
将文本放在 Fix Up Name（修复名称）字段中，可以为可命名实体指定前缀或后缀。如果你要让多个 func_instances 在分别定位实体的同时引用同一文件，这将非常方便。实际上，如果你未指定修正名称，则会自动提供一个修正名称，从而使你可以放置​​多个实例，同时仍然能够单独触发内部实体。
在本教程中，让我们将修复程序保留为空白，但是在 Deadline2 附加组件的警报车示例中可以找到一个很好的示例。
== 编辑 ==
继续并选择实例化的几何图形，然后再次打开属性窗口。
在底部，你会注意到一个名为 Edit Instance（编辑实例）的按钮。
这将打开实例 VMF 文件进行编辑（如果尚未编辑)，同时在两个文件之间保持完全相同的相对摄像机坐标。你进行的任何更改都会在你在新地图中切换时反映出来。
但是，出于我们的目的，我们希望“升级”旧版地图，并希望保留新文件中的更改，同时避免尽可能多地编辑实例。我们稍后会再次谈到这一点，尤其是在遍历多个游戏模式支持实体 info_gamemode 时。让我们继续进行 L4D2 特有的武器生成实体。
Zh/L4D2 Level Design/Wandering Witch

本简体中文页面由大康翻译于2021年9月11日。
----
在求生之路2中，我们发现 Witch 只在晚上坐着摇晃自己。如果有阳光，它们就会四处游荡。你可以通过 Map > Map properties… 菜单项在地图中控制此设置。
 
如果你将 Time of day 更改为一天中太阳出现的任何时间，包括“Dawn”(黎明)、“Morning”(上午)和“Afternoon”(下午)，由导演生成的 Witch 会四处游荡。
==在运行时改变行走方式==
如果你想同时拥有站立和坐着的 Witch ，或者随机选择使用哪个，你可以使用脚本来实现。
创建一个名为 Witch_behaviour.nut（或任何有意义的名称）的文本文件，并将其放入 scripts/vscripts 文件夹。 
该脚本应包含以下内容：
 function WitchWalk(){
 worldspawn_timeofday <- [
 "3"
 ]
 
 	worldspawn <- Entities.FindByClassname (null, "worldspawn");
 	local i = RandomInt(0,worldspawn_timeofday.len()-1);
 	worldspawn.__KeyValueFromString("timeofday",worldspawn_timeofday[i]);
 }
 
 function WitchSit(){
 worldspawn_timeofday <- [
 "0"
 ]
 
 	worldspawn <- Entities.FindByClassname (null, "worldspawn");
 	local i = RandomInt(0,worldspawn_timeofday.len()-1); 
 	worldspawn.__KeyValueFromString("timeofday",worldspawn_timeofday[i]);
 }
接下来，将一个 实体放入你的地图中，并在“Entity Scripts”字段中输入“Witch_behaviour”。
任何能够触发的实体，例如 、、、 等可以使用以下输出来改变下一个生成的 Witch 的行为，直到再次改变：
坐着的 Witch
	输出条件取决于实体 	<logic_script 实体名称> 	RunScriptCode	WitchSit()	0.00	No
游荡的 Witch
	输出条件取决于实体 	<logic_script 实体名称> 	RunScriptCode	WitchWalk()	0.00	No
你还可以使用 在 Witch 行走行为之间随机选择并一个接一个地生成它们，并进行复杂的设置，你就有了诸如糖厂(c4m2)之类的地图，但同时包含坐着和游荡的 Witch。