nyuuzyou/wikis huggingface dataset:
Zh/L4D2 Level Design/Weapon and Item Spawning

本简体中文页面由 Gloria 汉化，最后由大康更新于2022年8月5日。
__toc__
求生之路二代的武器生成机制有了很大的扩充和增强。虽然你还是可以像一代在地图中放置特定的武器、物品实体，但二代新的weapon_spawn实体让AI导演得以参与到武器生成的控制当中。另一个好处在于，它可以为对抗/清道夫模式提供对应的生成物。
相对于 ，安全室内的武器将被转移到下一张地图中。这意味着即将到来的地图中的所有武器生成都将被删除并替换为上一张地图末端安全室中可用的任何武器和物品。这允许你放置 实体以随机出现武器，并让相同的武器出现在下一个安全室中。
这也意味着你不必非常注意将枪支放在两个安全室的字面上完全相同的位置。因为唯一重要的部分是 info_landmark，它为你完成了复杂的工作。
== 放置武器生成实体 ==
点击并在Objects下拉框中选择实体
在3D视图中，找到你的关卡开始的地方，在桌子上点击来放置武器生成实体。示例地图中已经有了一个。把你的放在旁边就好了。
 
尽管为了方便摆放，在Hammer视图中显示的是M16步枪模型， 但游戏中实际生成的枪是各式各样的。
把武器生成列表限制为“一级主武器(tier 1 primary)”，这样我们可以在稍后的地图中放2级主武器。选中放置好的weapon_spawn实体之后，打开属性窗口，点击Selection属性。
在下拉框中，选择“Any tier 1 primary”。
 
正如下拉框中所展示的，你也可以限制它生成的武器类别，比如霰弹枪、手枪等等。
===直接的武器生成器===
如果您正在构建 和 不起作用的生还者地图，你可以使用以下实体确定始终在同一地点生成的特定武器：
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
===机枪===
游戏中还有机枪，使用时间过长会过热。它们通常被放置在要塞地点，例如结局或废弃的军事前哨。
转轮机枪在 20 秒后过热并冷却 3 秒。机枪过热需要 15 秒，冷却需要 60 秒。
*
*.
== 生成近战武器 ==
放置近战武器的方法和上面差不多，区别在于用的是实体。去放一个在地图里然后打开属性窗口吧。
 
把允许生成的近战武器种类写在Melee Weapon栏中。可选的武器名称有：
* golfclub (高尔夫球杆)
* fireaxe (消防斧)
* frying_pan (平底锅)
* machete (大砍刀)
* baseball_bat (棒球棍)
* crowbar (撬棍)
* cricket_bat (板球棒)
* tonfa (警棍)
* katana (武士刀)
* electric_guitar (电吉他)
* riotshield (防爆盾)
* Any (任意武器) – 导演随机放置不同的近战武器
你还可以自定义一个用逗号隔开的近战武器列表，导演会从中选取一种武器生成：
 crowbar,fireaxe,machete
注意：防爆盾在90 0 0角度才是平放的，而不像其它武器平放角度是90 0 0。
== 生成物品 ==
物品生成的方式几乎一样，使用的是weapon_item_spawn实体。我们来丰富一下桌子上的军火库吧。
 
在实体属性中，可以通过把它们的值设置成1来控制允许生成的物品。
类似的，可以用upgrade_spawn来生成激光瞄具和燃烧子弹升级包。
===预先确定的物品生成点===
对于预先确定的物品生成点，使用以下实体。
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
以下项目需要 FGD 文件编辑才能正确使用。如何执行此操作可以在此 Steam 指南上找到
* - 部署高爆弹药。
* - 部署燃烧弹药。
* - 激光瞄准器盒子。
==可携带物品==
尽管氧气罐、丙烷罐和烟花箱有自己的实体，但它们生成为 。
将 实体放入你的地图并使用以下任何模型生成可携带的对应物：
* models/props_junk/propanecanister001a.mdl
* models/props_junk/explosive_box001.mdl
* models/props_equipment/oxygentank01.mdl
汽油桶可以使用 生成
== 测试运行 ==
现在可以运行地图了。每次重新载入，都会生成不同的武器。示例地图中的一代霰弹枪是个例外，因为它是实体，因此每次生成的都一样。
Zh/L4D Level Design/Additional Finale Components

译者：joyo_a（百度ID）
== 创建一个复活房间 ==
复活房间可以放置在求生之路地图中的任何地方，而不仅仅是救援关地图。它基本上是一个带有关闭的门和里面带有3个info_survivor_rescue实体的房间。导航网格可以用RESCUE_CLOSET属性标记，但是当你分析导航时通常会自动发生。
首先创建房间。
房间不一定要有特定的尺寸或形状。它甚至可以有多个门口。在求生之路中大部分复活房间都是壁橱或浴室。
现在，在门口放置一个prop_door_rotating。打开其属性。
唯一需要注意的是Spawn Position应该是“Closed”。
在房间里面放置3个info_survivor_rescue实体。这表示该房间一次可以救出三名幸存者。
转到Entity Tool并从Objects下拉菜单中选择“info_survivor_rescue”。
放置3个到房间里面。
按保存并编译你的地图，然后在游戏中运行地图。
创建复活房间区域的导航网格。
选择复活房间内的导航网格（）并使用“mark RESCUE_CLOSET”将其标记为RESCUE_CLOSET属性。
== 添加一个机枪（Minigun） ==
转到Entity Tool并从Objects列表中选择“prop_minigun”。
在镜头视图中放置它。
完成。
可选的地堡模型是名叫“props_fortifications/fortification_indoor_01.mdl”的世界模型的prop_static。如果在过滤器中输入“fortifications”就可以找到它。
不要忘记在放置机枪的地方编辑导航网格。
Zh/L4D Level Design/Advanced Nav Editing

译者：joyo_a（百度ID）
== 使用OBSCURED属性 ==
属性允许感染者出生在该区域，即使幸存者可以看到它。这主要用于遮蔽的地方，如树林内部。
在对抗地图中，特别有助于让玩家感染者出生在更多的地方。
同时也可以防止电脑幸存者透过浓密树丛发现到感染者。
要使用OBSCURED属性，请选择导航区域并在控制台中使用“mark OBSCURED”。
== 平铺绘制的导航网格到置换表层 ==
当你自行绘制导航区域时，你会注意到它们完全平坦，即使它们在不平坦的置换表层的表面上绘制。
你可以通过选择导航区域并使用nav_corner_place_on_ground或者使用默认导航编辑配置中的，将导航区域放置为符合置换表层的高度。
使用nav_split（）可以进一步划分区域，然后使用nav_corner_place_on_ground更加紧密地平铺到置换表层。
== 在两个现有的导航区域之间创建导航区域 ==
你可以使用nav_splice自动为你绘制一个导航区域，而不是在两个现有区域（宽度或长度相同）之间手动绘制导航区域。
选择其中一个要在其中间创建区域的导航区域，然后将光标移动到那个导航区域。
从控制台输入“nav_splice”或者按。
一个新区域就被创建在两个现有区域之间。
== 合并导航区域 ==
导航网格随着区域的增多而使文件大小越来越大。如果你发现导航网格文件太大，并且可以通过将某些区域合并在一起来优化，那么可以使用“nav_merge”来组合两个相同宽度或长度的相邻导航区域。
数字键盘上的是nav_merge的默认键。
选择其中一个导航区域，然后将光标移动到要与之合并的另一个区域上。
按执行“nav_merge”。
== 手动升高/降低导航区域 ==
有时候，有一些薄的笔刷或道具，导航系统很难在其上方生成或绘制。在这种情况下，你可以将导航绘制得稍低或稍高些，并在以后手动匹配。
命令“nav_corner_raise”或“nav_corner_lower”可用于调整所选导航区域的高度。
数字键盘上的和键可用于升高和降低导航。
=== 鼠标滚轮方式 ===
nav_edit.cfg还包含一些特殊的绑定，可以使用鼠标滚轮垂直移动导航区域。
# 按数字键盘上的（中心）键。
# 使用鼠标滚轮升高和降低导航区域。
# 再次按数字小键盘上的（中心）键离开此模式。
== 发现你的导航网格的问题所在 ==
在导航网格中有几个错误情况你不应该发生。这些错误可能会导致AI被卡住或不能正常行动。
这些情况可以通过控制台中的“nav_trouble_report”命令轻松找到。这将会选择有问题区域。你可以在穿墙（noclip）模式中放大地图来查看它们。
运行nav_trouble_report执行以下测试：
测试名称 	命令 	描述
Orphan check 	orphan 	没有连接到导航网格的其余部分的导航区域
Missing Battlefield check 	battlefield 	某些导航区域在BATTLEFIELD内缺少BATTLEFIELD属性
Missing Finale check 	finale 	某些导航区域在FINALE中缺少FINALE属性
Missing Checkpoint check 	checkpoint 	某些导航区域在CHECKPOINT中缺少CHECKPOINT属性
Overlap check 	overlapping_areas 	多个导航区域占据相同的空间
Corner-to-corner connection check 	corner-to-corner 	导航区域正在角落处连接
Climb links from stairs check 	climb_up_from_stairs 	导航区域在楼梯两旁有打开与关闭的双向连接
Connection to overlapping area check 	connection_to_overlapping_areas 	导航区域之间的连接存在重叠
Long horizontal connection check 	long_horizontal_connections 	导航区域之间的连接太长
Double connections check 	multiple_connections 	导航区域被多次连接
Floating/interpenetrating world check 	floating_or_interpenetrating_areas	导航区域太高或太低
Areas with non-walkable connections check	non-walkable_connections 	导航是说你能从某一区域走到下一区域，但此时你不能
Disconnected ladder check 	ladder_disconnected 	梯子没有连接到任何导航区域
Overlapping ladder check 	ladder_overlapping 	两个或更多梯子在彼此的顶部
Non-climbable ladder check 	ladder_not_climbable 	不能攀爬梯子（可能被道具或者笔刷阻挡了）
你还可以使用个别参数运行nav_trouble_report <test_name>以便在每个类别中都找到错误。例如：
 nav_trouble_report finale
 nav_trouble_report orphan
== 另见 ==
* 
* 
*
Zh/L4D Level Design/Breakable Walls

__TOC__
译者：joyo_a（百度ID）
在求生之路中有一些墙壁，感染者可以打破这些墙壁来给幸存者惊喜。例如，在医院里靠近电梯的地方，有几个墙壁用来被打破以便感染者进入该区域。
在tutorial_standards.vmf地图里也有一个示例。
== 创建一个func_breakable ==
首先在Block Tool中创建一个墙壁笔刷。
墙壁需要安装在现有的墙壁上。
用这些尺寸做墙：
* 128个单位长
* 16个单位宽
* 128个单位高
按+转换该笔刷为笔刷实体。
这将显示属性窗口。
更改Class为“”并点击Apply按钮。
更改Material Type为“Wood”。
更改Breakable by为“Infected”。
切换到Flags选项卡。
确保这些框没有被勾选，除非你希望墙壁在接收到世界上某些其他实体的输入时才被破坏。
切换到Outputs选项卡。
添加以下输出：
* My output：“OnBreak”
* Targets entities named：“breakwall_decal”
* Via this input：“Activate”
我们稍后会加上印花来打开，使得墙壁的边缘不会显得太直。
点击Apply关闭属性窗口。
将func_breakable墙放在你想要感染者出来的墙壁上的空间。
进入纹理应用模式（Texture Application Mode）。
在显示Face Edit Sheet窗口的情况下，在镜头视图中，+左键点击固体墙。这样就可以对该笔刷面的纹理及其纹理对齐进行采样。
继续按住键，然后右键单击紧贴固体墙的func_breakable墙面以正确对齐纹理。+右键单击会传输采样面的纹理和对齐方式。
== 添加易碎墙模型 ==
转到Entity Tool并从Objects列表中选择“”。
在镜头视图中放置prop_static到func_breakable墙的旁边。
打开其属性。
点击World Model行，然后点击右边的Browse按钮。
在过滤器（filter）中输入“breakwall”。
选择模型“props_interiors/breakwall_interior.mdl”
点击OK。
更改Disable Shadows为“Yes”。
点击Apply并关闭窗口。
将prop_static放在func_breakable里面。
当func_breakable笔刷实体被破坏时将显示该模型。
== 放置印花 ==
转到Entity Tool并从Objects列表中选择“”。
将其放在镜头视图中的在易碎墙的左侧的不会被破坏的墙上。
用+打开其属性。
更改Name为“breakwall_decal”。
点击纹理行，然后点击右侧的Browse按钮以弹出纹理浏览器。
在过滤器中键入“overlays”。
选择纹理“overlays/breakwall”。
双击纹理，使其成为infodecal的纹理。
点击Apply并关闭窗口。
定位infodecal，使其与设置func_breakable的墙壁共享相同的平面。
选择infodecal并复制它（+键）。
将它放在func_breakable的右侧。
打开其属性。
点击纹理行，然后点击右侧的Browse按钮。
在过滤器中键入“overlays”。
选择“overlays/breakwall_mirror”。
双击纹理将其设置在info_decal属性中。
点击Apply并关闭窗口。
这将覆盖墙的右侧的直边。
== 更新导航 ==
重建导航区域通过这个易碎墙，以便被感染者可以干净地穿过prop_static。
Zh/L4D Level Design/Checkpoint Rooms

__TOC__
译者：joyo_a（百度ID）
== 创建一间安全室 ==
现在，我们来创建安全室。使用你在第一个教程中使用的笔刷复制的技术，在这些尺寸的安全门的另一侧创建一个房间：
* 256个单位宽
* 384个单位长
* 128个单位高
此外，请记住将一个灯光复制到这个新房间，以便它将被点亮。
现在，我们需要一个笔刷实体叫info_changelevel。
转到固体工具，然后绘制一个适合你新房间的笔刷。
点击Texture栏上的Browse按钮来显示纹理浏览器。
在Filter下拉框中输入“trigger”。
选择纹理“tools\toolstrigger”
双击纹理，使其成为当前纹理。
点击工具栏上的应用纹理将其应用到笔刷。
在笔刷仍然选中的情况下，选择Tools > Tie to Entity（或者按+）。
这将显示对象属性对话框。
在Class下拉菜单中，选择“info_changelevel”并点击Apply。
点击New Map Name行，然后在右边的字段中添加文字“tutorial05_part2”。
点击Apply，然后关闭对话框。
点击 Entity Tool，然后从Objects下拉菜单中选择“info_landmark”。
将它放在新房间的中间。确保你将实体捕捉到图中所示的中间。
打开info_landmark的Object Properties（+）。
更改Name为“landmark_tutorial”。点击Apply然后关闭对话框。
返回并单击你刚刚创建的info_changelevel笔刷，然后打开Object Properties（你需要在镜头视图中移动才能看到笔刷上的触发纹理来选择它）。
单击Landmark Name行，然后你会看到右侧的滴管图标，旁边是Mark和Mark+Add按钮。点击滴管图标。
在对话框仍然存在的情况下，你可以在镜头视图中导航以查看info_landmark。如果你在滴管打开的情况下点击info_landmark，它将获取info_landmark的名称并将其名称放在Landmark Name字段中。
== 创建出口 ==
只是为了让下一个安全区域在我们设置的将要转换到的地图，我们将放置另一个在下一张地图里作为出口的安全门。
复制你作为这张地图的安全入口放置的安全门并将其放在安全室的右侧墙壁。旋转它，以便通过该墙离开。
在我们切出洞之前，让我们把它的属性编辑为出口门。
点击World Model行，然后在右侧点击Browse按钮。找到模型“checkpoint_door_01_static.mdl”并点击OK按钮。
更改Class为prop_static，因为门不一定像真正的门一般起作用。
点击Apply并关闭对话框。
就像我们在第一个安全门所做的一样，使用剪辑工具为这个安全门切出一个孔，使其看起来像这个图。
注意门旁的连接的墙应该是48个单位的长度！
现在，我们有了自己的安全室，但是这个门外面还有一个漏洞。我们需要密封它。
复制固定好的门的墙壁，并将其移动到门后面，使其完全关闭这个门产生的洞。
在Texture栏里点击Browse按钮，然后在Filter下拉字段中输入“tools”。
找到纹理“tools/toolsblack”并双击它以关闭浏览器并使其成为当前纹理。
点击应用当前纹理图标让笔刷变黑。这样，玩家将无法在安全门口看到窗外。
通过+保存你的地图。
你现在已经创建了一个安全室，它将导向另一张叫“tutorial05_part2”地图。现在，我们需要制作那张地图以便我们可以测试其转换。
== 创建目的地地图 ==
首先，确保你已经通过选择File > Save或者按+将你的工作保存在tutorial05.vmf上。
接着，我们将根据当前的地图制作目标地图。
执行File > Save As...，然后更改文件名为“tutorial05_part2.vmf”。
在起点房间里选择info_survivor_position。
将他移动到安全室的中间。
滚动（鼠标滑轮）以便你可以在顶部视图中看到你的整个地图。
选择你在第一个教程中创建的走廊。你可以左键单击并拖过走廊的中心，然后按以选择那边的所有画笔。
移动走廊使其排列在地图右下方的安全门的外面。你可以使用箭头键或通过左键单击并将其拖动到你想要的画笔所在的位置来移动画笔。
然后，向上移动走廊，使地板与安全室的地板相匹配。
现在，让我们清除我们不需要的第一张地图的部分。
选择第一个房间然后按键。
选择第二个房间但不要包含与安全室共享的墙。如果你选多了，只需按住，然后单击任何对象即可取消选择。当你完成后，按键。
现在，我们需要移动我们用来密封第一张地图的黑色笔刷以便密封这张地图。
选择黑色笔刷。
移动它并塑造它覆盖安全室的另一个门口。
从走廊上复制墙壁、天花板和地板刷以便在终点处建立一个新的房间。
你需要为预生成的导航文件提供这些确切的尺寸：
* 宽度：512
* 长度：480
在房间的中间添加一个light实体。你可以在安全室中复制light实体并将其移动。
转到安全室，然后点击从上一张地图进入房间的门。
按+打开属性。
点击World Model行，然后点击Browse按钮。
选择模型"checkpoint_door_02_static.mdl"
点击OK。
修改Class为“prop_static”，因为这个门将不再需要打开或关闭。
点击Apply使更改出现。
选择安全室中的另一扇门——即将引导出来的那扇门。
按+以打开属性。
点击World Model行，然后点击Browse按钮。
选择模型“checkpoint_door_01.mdl”
点击OK。
修改Class为“prop_door_rotating_checkpoint”
点击Apply按钮以更新属性。
更改以下字段：
* Name：“checkpoint_exit”
* Body：“1”
* Disable Shadows：“Yes”
现在，点击Flags选项卡并选中“Use closes”框。
再次点击Apply并关闭属性框。
保持门被选中。
在顶部视图中，将门模型的原点移到与墙壁接触的底部。
这将使门在该轴上旋转。
在镜头视图中，移动到门内并返回到安全室，选择你从上一张地图剩下的info_changelevel。
按键删除它。
== 编译地图 ==
=== tutorial05_part2 ===
按打开Run Map，但这一次点击“Don't run the game after compiling”复选框。然后按OK。这将编译地图，但之后不会运行游戏。
=== tutorial05 ===
当地图完成编译，再次打开“tutorial05.vmf”。
按并取消选中“Don't run the game after compiling”复选框，然后按OK。这将在tutorial05地图中启动，并允许我们测试转换到tutorial05_part2地图。
Zh/L4D Level Design/Checkpoints

__TOC__
译者：joyo_a（百度ID）
在上一节中，你创建了一张地图需要的最简单的导航网格。导航区域从“PLAYER_START”到“FINALE”都已被标记。这允许导演计算路线以正确产生感染者。还有求生之路使用的其他类型的路线。每个战役由5张地图组成：
* 第一关：PLAYER START到CHECKPOINT
* 第二关：CHECKPOINT到CHECKPOINT
* 第三关：CHECKPOINT到CHECKPOINT
* 第四关：CHECKPOINT到CHECKPOINT
* 第五关：CHECKPOINT到FINALE
一间检查点房间是幸存者进入从一张地图过渡到另一张地图的“安全房间”。
== 安全室要求 ==
要制作一间安全室，你需要在你的地图中设置一组最小的部分。这包括：
* 一个安全门——玩家用来进入房间。
* 一个笔刷实体。
* 一个叫的实体。
* 在房间内分配有CHECKPOINT属性的导航区域。
* 转换到的目的地地图。
目的地地图还要求：
* 一个安全门——玩家用来离开房间。
* 一个与上一张地图名称相同的。
* 房间内标有CHECKPOINT属性的导航区域。
== 创建tutorial05.vmf ==
在sdk_content目录中，在Hammer中打开名为“tutorial03_complete.vmf”的地图。默认情况下，它应位于：
 C:\Program Files\Valve\Steam\SteamApps\common\left 4 dead\sdk_content\mapsrc\Your First L4D Level Tutorial
从File菜单中选择Save As...，然后重命名文件为“tutorial05.vmf”。回到上一级目录，并将其与你的其余的地图保存在你的标准mapsrc目录中：
 C:\Program Files\Valve\Steam\SteamApps\common\left 4 dead\sdk_content\mapsrc
== 创建一个安全门 ==
我们从安全门开始。
在3D镜头视图里，转到你创建的第二间房的上面一层楼区并看向你创建的平台上面的墙。
点击，然后从Objects下拉菜单中选择“”。
在镜头视图中，看向平台与墙壁相交的角落，然后左键单击以放置prop_door_rotating_checkpoint。
设置门的模型：
# 通过按+打开Object Properties对话框，或者进入选择模式并双击它。
# 点击World Model行并在右侧点击Browse按钮。在Filter中输入"checkpoint"，然后选择模型“checkpoint_door_02.mdl”。
# 点击OK按钮。
现在，更改以下属性：
* Name："checkpoint_entrance"
* Pitch Yaw Roll (Y Z X)："0 270 0"
* Disable Shadows："Yes"
* Spawn Position："Open counter-clockwise"
点击Apply然后关闭属性窗口。
你现在应该在镜头视图中看到一个安全门模型。
定位门以便它坐在平台的地板上并且在墙的厚度的中间的墙内。你可能需要调整网格大小才能将其移动到位。
现在我们在墙上有一个我们想为这个门打一个洞的地方。
== 剪辑工具 ==
我们将使用Clipping Tool来将我们的笔刷拆分成我们需要制作洞口的部分，而不是缩放和复制我们需要切开一个洞的墙刷。
选择安全门坐在里面的墙刷。（注意：你必须选择墙刷）
选择 剪辑工具进入剪辑模式（你也可以按+）。
在顶部视图中，左键单击并拖动到门的左边缘的位置。
放手后的两个点形成一条垂直线如上图所示。
你应该让笔刷通过剪辑工具的辅助节点沿着中间位置就位来分成白色轮廓和红色轮廓。白色轮廓表示将留下的画笔部分，红色轮廓显示将被删除的部分。
按一次+。这将翻转具有白色轮廓的一边和具有红色轮廓的一边。
再次按+。这将改变剪辑模式以保留分割的两边。
按进行拆分。你可以按退出该工具，而不进行任何更改。
现在我们做了一个剪辑，我们需要再做一个剪辑。选择墙壁笔刷（门仍然粘在其中）并再次进入剪切工具。
使用减小网格大小以便你可以沿着门的右边的边缘精确剪辑，然后左键单击并拖动以便在该边缘上形成垂直线。
按执行拆分。
选择门仍然卡在里面的笔刷并在侧面视图中抬高其底部以便将门排列在门模型的顶部。
我们现在有了我们安全门的洞口。
记住，现在我们已经在我们这个地图里创造了一个洞，我们需要密封它。我们将在安全室里密封这个洞。
现在再次选择安全门，你会发现在镜头视图中它有一个蓝色的球体，在另一个视图中其中间有一个圆圈。
在顶部视图中，左键单击并将空心圆拖到笔刷的左边缘，就像在此图中一样。
在模型的中心还应该有一个圆/球。将其拖动到顶部视图上的同一个位置，但也可以将其拖动到侧视图中，以使其在你拖动的第一个视图下。
你所做的是使prop_door_rotating_checkpoint使用这条线作为门旋转的枢轴，就像在真实门上的铰链一样。
Zh/L4D Level Design/Clip Brushes

译者：joyo_a（百度ID）
围绕Hammer的tutorial_standards.vmf地图，你可能已经注意到，某些被放置的笔刷实际上不会在游戏版本的地图中呈现。
类似于在安全室教程中创建的trigger_changelevel笔刷，所有触发类笔刷实体在游戏中是不可见的。
这里还有可以阻挡幸存者和感染者的空气墙（clip）笔刷。
你可以使用这些来覆盖可以卡住玩家的几何物。在tutorial_standards.vmf中楼梯的栏杆就是一个很好的例子。
要制作一个空气墙笔刷，只需创建一个笔刷并附加tools/toolsclip纹理到该笔刷上。
使用这种纹理的笔刷将阻挡所有玩家，npc和物理对象。他们不会阻挡子弹。
你也可以通过使用tools/toolsplayerclip纹理来阻挡玩家。
这对于以下这种情况来说很方便：你想让感染者翻越上方的墙壁和栅栏，但你不希望玩家意外地被撞倒。
tutorial_standards.vmf中显示的外部区域是一个很好的例子。
== 导航阻挡器 ==
有时，你可能希望阻挡导航网格，而不需要添加空气墙笔刷。你甚至可能想只为幸存者或感染者阻挡导航。你可以使用称为func_nav_blocker的笔刷实体来阻挡导航。
在tutorial_standards地图中，已经使用了一个func_nav_blocker笔刷实体来阻止电脑幸存者在楼梯抬高之前尝试使用楼梯导航。
要创建func_nav_blocker：
# 使用固体工具沿着你想要阻挡导航的地板区域创建一个笔刷。
#: 
# 应用“tools/toolstrigger”纹理到该笔刷。
# 使用Tools > Tie to Entity将笔刷变成笔刷实体并打开该笔刷的属性。
# 设置Class为“func_nav_blocker”。
# 设置Name为唯一的名字。在该案例中，我使用了“ladder_nav_blocker”。
# 设置Team(s) to block为“Survivor”。如果你只想阻挡感染者，就设置其为“Infected”。
你还可以通过向其发送输入来解除阻挡func_nav_blocker阻挡的导航。
添加以下输出：
* My output named：“OnFullyClosed”（这是为升起的梯子设置的。）
* Target entities named：“ladder_nav_blocker”
* Via this input：“UnblockNav”
Zh/L4D Level Design/Elevators

__TOC__
译者：joyo_a（百度ID）
求生之路有一个创建电梯的独特系统，幸存者可以向上或者向下乘坐。导航网格需要从幸存者开始到需要到达的地方无缝连接。因此，电梯需要垂直连接导航网格区域。
用于电梯的笔刷实体被称为func_elevator。你也可以使用一个道具作为一个不可见的func_elevator，或者使用一个带有动画的道具来作为一个不可见的func_elevator。
一个纯粹用笔刷做的func_elevator的例子可以在tutorial_standards.vmf中找到。
== 创建笔刷电梯 ==
根据你所想的func_elevator创建一个或多个笔刷。
选择它们，然后按+将它们绑定到一个实体中。从下拉菜单中选择“func_elevator”。
将名字更改为唯一的名字。
将Top floor position下面的Bottom floor position中的第三个数字更改为任意数字（这将有助于移动辅助节点）。
设置Speed值（英寸/单位每秒）。
在Front或Side视图中，你可以看到代表顶层和底层位置的辅助节点。
通过在节点的圆圈内左键单击来移动Bottom floor position辅助节点，并向下拖动到希望电梯下降到的位置。
== 添加地板 ==
为了让你能够告诉电梯去某个楼层，你需要放置实体。
转到Entity Tool并在Objects下拉菜单中选择“info_elevator_floor”。
在镜头视图中放置两个到电梯下。
在侧面或正面视图中，移动它们，使得一个是在func_elevator的顶层位置（Top floor position），而另一个是在func_elevator的底层位置（Bottom floor position）。
按+打开底层的实体的属性。
更改Name为“bottom”。
打开顶层的实体并更改Name为“top”。
== 控制电梯 ==
现在，你需要发送一个输入到func_elevator来告诉它移动。
在tutorial_standards地图中，有一个幸存者可以按下的func_button。
要创建一个func_button，先创建一个笔刷，然后使用+将其绑定到一个实体。在下拉菜单中选择“func_button”。
这里有几个属性取决于你希望按钮如何工作，但现在除了更改Name为“button”之外，其他的只需全部保留默认值即可。
切换到Object Properties中的Flags标签，然后选择以下复选框：
* Don't move
* Use Activates
这意味着幸存者可以使用+use来按它，而当按下时按钮不会被移除。
现在切换到Outputs选项卡。
通过点击窗口底部附近的Add...按钮添加一个新的输出。
* 更改My output字段为“OnPressed”。
* 更改Target entities字段为“elevator_down_relay”。
* 更改Via this input字段为“Trigger”。
现在，我们需要创建一个elevator_down_relay实体，该实体在按下按钮时会传递我们想要发送的消息。
在Entity Tool中，从Objects下拉列表框中选择“logic_relay”。
在func_button附近放置一个logic_relay。
使用+打开其属性。
更改名字为“elevator_down_relay”以匹配我们从func_button发送的输出。
切换到Outputs选项卡并通过以下字段添加一个新的输出：
* My output named：OnTrigger
* Targets entities named：elevator
* Via this input：MoveToFloor
* With a parameter override of：bottom
* After a delay in seconds of：0
当幸存者按下按钮使relay被触发时将使电梯降落。
根据你的电梯的设置，你可能需要告诉电梯移动到另一个位置。可以看一下tutorial_standards.vmf中的func_elevator上的func_button示例。
== 添加导航 ==
编辑一个func_elevator的导航需要你把电梯放在每一个可能有的位置上，放置一个nav_mark_walkable（）并建立增加的导航（）。
电梯导航以后将需要进一步的处理。当你准备好这样做时，请根据整理导航路线来考虑并进行故障排除。
Zh/L4D Level Design/Finale Events Part 1

译者：joyo_a（百度ID）
求生之路自带的每个战役的第五张地图都有一个结局，幸存者需要在电台上呼救，然后在一个位置上抵抗尸潮和坦克（Tank），并通过交通载具来逃生。tutorial_standards地图里也有这个案例。
== 救援事件元素 ==
制作一个救援需要几件东西才能正常工作：
* 一个——你用来呼救的电台。
* 一个标记为FINALE的导航网格的区域。
* 一个逃生载具用来带走生还者（通常是带动画的prop_dynamic）。
* 一个trigger_multiple用来检查所有的幸存者是否已经逃离到逃生载具。
* 四个info_survivor_positions，当他们成功逃脱时传送幸存者到那里。
你可以在救援关放置一些可选但标准的东西：
* 各种物资（弹药，武器，急救包）。
* 一个point_viewcontrol_multiplayer，这是一个用于结尾的摄像机。
* 一些env_fade实体在结尾中淡入/淡出摄像机。
* 一个名为“env_outtro_stats”的实体，用于在结尾部分滚动演员表。
* 一个幸存者可以用于防御的prop_minigun。
* 一个rescue closet——一个带门的小房间及其里面的三个info_survivor_rescue实体。
== 放置一个trigger_finale ==
转到Entity Tool并从Objects下拉菜单中选择“”。
在镜头视图中放置该实体并打开其属性。
点击World model行并点击右边的Browse按钮。
在Filter字段中输入“radio”。
选择模型“props\terror\hamradio.mdl”并点击OK。
更改Name为“radio”。
更改Disable Shadows字段为“Yes”。
这表示允许我们发送输入到“radio”或者但不允许阴影被绘制到桌上。
还有一个我们经常使用的Use Delay字段。这是在按下按钮之后救援开始之前的秒数。现在，只需把它保留为默认值0。
按保存和编译你的地图。
加载地图之后，按进入导航编辑模式。
使用“noclip”飞到trigger_finale的位置。
选择trigger_finale周围的导航区域，就像你在恐慌事件/小型救援中的增加BATTLEFIELD区域的选择一样。
在控制台中使用“mark FINALE”添加FINALE属性。
常用的导航属性：
* PLAYER_START
* EMPTY
* CHECKPOINT
* BATTLEFIELD
* BATTLESTATION
* FINALE
* NOT_CLEARABLE
* NO_MOBS
* OBSCURED
* RESCUE_CLOSET
* RESCUE_VEHICLE
Zh/L4D Level Design/Finale Events Part 3

译者：joyo_a（百度ID）
结尾（Outro）是在救援事件中幸存者成功逃脱时出现的。通常，镜头从第一人称视觉转到某处观看车辆驶出某个区域。
我们先来放置摄像机。
转到Entity Tool并从Objects列表中选择“point_viewcontrol_multiplayer”。
将镜头定位到你想要显示逃脱的地方。
打开其属性。
更改名字（Name）为“train_camera”。
你还可以更改Field of view字段。数字越小视野越狭窄，数字越大视野越宽广。
更改Seconds to reach FOV target为0。这是从正常的视野（FOV）（即90）转换到新的视野所花费的时间。
返回到Entity Tool并从Objects列表中选择“env_fade”。
打开其属性并更改：
* Name：“fade_outro_1”
* Duration (seconds)：“0.2”
*：这是屏幕淡入淡出的时间。
* Hold Fade (seconds)：“0.3”
*：这是保持淡入淡出的时间。
放置第二个env_fade（或者你可以复制fade_outro_1）更改其属性：
* Name：“fade_outro_2”。
* Duration：“0.2”
切换到Flags选项卡。
勾选Fade From复选框。
这将使游戏屏幕淡回到黑色。
返回到名为fade_outro_1的env_fade并切换到Outputs选项卡。
添加以下输出：
* My output named:“OnBeginFade”
* Targets entities named:“fade_outro_2”
* Via this input:“Fade”
* After a delay in seconds of:“0.30”
在“fade_outro_1”开始淡化后开始花费0.3秒将场景淡回成黑色。这两个env_fade实体只是淡化成黑色并且淡化的很快。
返回到“train_continue_relay”。打开它并切换到Outputs选项卡。
添加以下输出：
* My output named：“OnTrigger”
* Targets entities named：“train_camera”
* Via this input：“Enable”
* After a delay in seconds of：“0.30”
这会将玩家的视角改为“train_camera”的视角。
添加另一个输出：
* My output named：“OnTrigger”
* Targets entities named：“fade_outro_1”
* Via this input：“Fade”
这在结尾镜头启动之前使env_fade开始让屏幕淡化成黑色。
现在，我们需要在地铁离开时添加一个渐变成黑色的渐变（fade）。
放置另一个env_fade（或者复制“fade_outro_1”）并打开其属性。
更改以下内容：
* Name：“fade_outro_3”。
* Duration (seconds)：“0.3”
切换到Flags选项卡。
勾选Stay Out复选框。
这意味着一旦它淡出就会保持黑色。
一旦屏幕淡出，其中残留的效果让我们仍然会看到提示信息。让我们放置一个info_game_event_proxy来关闭提示信息。
转到Entity Tool并从Objects列表中选择“info_game_event_proxy”。
在镜头视图中放置它并打开其属性。
更改以下内容：
* Name：“gameinstructor_disable”。
* Name of the event to generate：“gameinstructor_nodraw”。
这是一个已经设置为不显示提示信息的字符串。
还有一个我们可以放置的实体叫“env_outtro_stats”，它用来显示战役结束后的统计信息。
转到Entity Tool并从Objects列表中选择“env_outtro_stats”。
在镜头视图中放置它并打开其属性。
更改Name为“outro”。
返回到“train_end_relay”并打开其属性。
切换到Outputs选项卡。
添加以下输出：
* My output named：“OnTrigger”
** Targets entities named：“gameinstructor_disable”
** Via this input：“GenerateGameEvent”
* My output named：“OnTrigger”
** Targets entities named：“fade_outro_3”
** Via this input：“Fade”
** After a delay in seconds of：“5”
* My output named：“OnTrigger”
** Targets entities named：“outro”
** Via this input：“RollStatsCrawl”
** After a delay in seconds of：“10”
点击Apply并关闭属性窗口。
按保存并编译以测试你的结尾。
Zh/L4D Level Design/Getting Started

__NOTOC__ 
译者：joyo_a（百度ID）
第一步 启动Hammer，一个求生之路和其他起源游戏的地图编辑器。
打开“Steam”窗口，点击“Tools”选项并双击“Left 4 Dead Authoring Tools”。
如果你第一次启动创作工具，它会花一段时间来下载并安装。
 
双击“Hammer World Editor”以启动Hammer编辑器。
 
加载完Hammer后，你可以通过“File”菜单里的“New”项来创作一个新的地图。
 
出现一个有四个编辑区域的窗口。 
 
 
 
== Hammer编辑器界面布局 ==
 
这是关于Hammer界面的基本描述。您将学习如何在本教程中使用这些工具，所以完全不用担心学习它们是如何运作的。
=== 地图视野和操作 ===
在窗口上方的栏包括在地图里控制对象视野的各种按钮，包括网格和捕捉工具。
=== 工具 ===
工具栏允许你切换不同的模式以便在你的地图里选择、创建、替换、组织和操作不同的对象。
=== 选择模式 ===
在地图里通过“选择模式”栏来切换选择对象的模式：
* “组” — 你将选择所有被组合在一起的对象。
* “对象” — 你将选择单个对象无论它是否由多个固体构成的。
* “固体” — 你将选择单个固体无论它是否和其它一起整合为一个对象。
=== 纹理 ===
纹理栏允许你看见当前选择的纹理以及通过“浏览...”按钮来浏览其它纹理。
=== 对象 ===
在你的地图里用来放置的物品并非是简单的几何图形。而“笔刷”是关卡的基本构件，几乎所有的“实体”都放置在“对象”栏里。你可以通过“对象”栏来放置灯光、道具和物品。 
=== 可见组 ===
可见组是管理你的地图的一个方法。你可以放置任何类型的对象到可见组并标记它们，这样你就能作为一个组隐藏或者显示它们。它允许你以一个更简洁的方式而不是让一切可见来工作。
=== 状态 ===
位于界面底部的状态条提供你在制作时一些有价值的信息，例如被选择的对象的大小和当前网格的信息。
Zh/L4D Level Design/Ladders

__TOC__
译者：joyo_a（百度ID）
接下来我们将返回Hammer来添加一个梯子到我们的地图。
== 创建tutorial02.vmf ==
我们要做的第一件事是我们为在上一节中使用的地图创建一个新版本的地图。
在Hammer里，打开你先前创建的地图文件tutorial01.vmf（如果你还没有打开）。默认情况下，它应位于mapsrc文件夹中：
 C:\Program Files\Steam\steamapps\common\left 4 dead\sdk_content\mapsrc\
现在我们将建立一个新版本来工作并完成它：
* 转到文件File，然后选择Save As...。
* 更改名字为tutorial02.vmf。
== 建造房间 ==
首先，选择在第一个房间教程中创建的第二个房间的天花板。
将笔刷向上移动128个单位。
在第二个房间中选择墙壁笔刷并复制它们使新的墙壁搁置在旧的墙上。
你修改的房间应该看起来像这样：
你现在将看到一个我们包含的房间和走廊之外的黑色的洞。如果有一个洞或“”到地图的外部，地图将无法正确编译或正确运行。我们来修复它。
选择墙的上面部分到洞的一侧。
通过拖动拐角手柄来扩大其大小以覆盖开口。
== 创建一个窗台 ==
现在在3D视图中单击第二个房间中后墙的下部。
使用顶部视图，将墙扩大到房间，使其宽128个单位，形成一个窗台。
通过按键取消选择画笔。
== 纹理一个笔刷面 ==
只是为了说明如何改变笔刷面的纹理，让我们改变所有的地板和天花板的纹理为dev/dev_measuregeneric01b纹理。
编辑笔刷的各个面，在Tool栏中单击Texture application mode按钮。
你将看到Face Edit Sheet对话框。
你可以浏览纹理，就像当你使用Texture栏的Browse来查找纹理，或者你可以从现有的面“提升”。
要从现有的面提升，只需在您看到灰色显影剂纹理的地板上左键单击。
你会注意到这会将Face Edit面板上的缩略图替换为measuregeneric纹理。
要将它应用到另一个面，只需在要接收纹理的面上右键单击。
在你创建的窗台的顶部右键单击以给它与地板相同的灰色纹理。
== 放置一个梯子模型 ==
切换到 Entity Tool，并从Entity栏的Objects下拉菜单中选择“”，如果它还没有设置为这个。
通过点击你刚刚扩大的后墙以放置prop_static。
按键取消选择prop_static，然后双击它以显示其属性。
单击World Model行。
单击Object Properties对话框右侧的Browse。
在Filter字段中输入“ladder”。
选择“props_c17/metalladder002.mdl”然后单击OK。
单击Object Properties对话框里的Apply。
你现在应该有个梯子在你放置你的prop_static的地方。
切换回Selection tool，然后旋转并移动你的梯子，这样它就在这个后壁的中间，并且底部接触地板。
== 创建一个func_ladder ==
现在你有了显示梯子位置的模型，你需要放置允许玩家和其他角色爬上去的实体。
点击Texture栏上的Browse按钮。
在过滤器中键入“nodraw”。
双击纹理“tools/toolsnodraw”以选择它，然后关闭浏览器。
 
按下键两次，将网格大小减小为2个单位，以更好地适应梯子。
点击固体工具然后在顶部视图里的梯子前面创建一个笔刷。
笔刷应该是大约32单位宽，128单位高，和2单位厚。如有必要，通过拖动拐角手柄并拖动到梯子模型前面的位置来调整画笔大小，如图所示。
现在，你将需要使笔刷的一个面（从梯子指出的面）涂上梯子工具纹理。要编辑画笔的单个面，点击纹理应用模式按钮。
你将看到Face Edit Sheet对话框再次出现。
在此对话框仍然出现的情况下，通过使用鼠标左键单击，在镜头视图里选择指向远离梯子的面。
点击Face Edit Sheet对话框中的Browse按钮，您将看到Texture浏览器窗口再次出现。
在Filter过滤器中键入“ladder”。
双击纹理“tools/toolsinvisibleladder”。
你应该会看到LADDER纹理现在占据了Face Edit Sheet里的缩略图。
现在点击Apply按钮，然后你选择的面应该换成LADDER纹理。
关闭Face Edit Sheet对话框以退出纹理应用模式。
选择一个面上带有LADDER纹理的笔刷。
转到Tools菜单并选择Tie to Entity。
这将使笔刷变为一个“”。这将我们之前创建的几何固体块改变为一个特殊笔刷，这个特殊笔刷具有可以改变以影响游戏的属性。
默认的笔刷实体是一个，我们稍后会谈到。
我们想让这个笔刷实体变为。拉下下拉菜单选项并选择“func_ladder”。
然后单击Apply按钮确认更改并关闭Object Properties对话框。
== 编译地图 ==
现在通过按键，然后点击OK按钮来编译地图。
你的梯子在游戏中看起来像这样的。
你应该能够移动到你的梯子并向上移动爬上到窗台上。如果不能，那么有可能没有正确创建。尝试返回到Hammer，删除你的梯子并再次创建它。
== 参见 ==
* 感染者用的梯子
Zh/L4D Level Design/Level Organization

__TOC__
译者：joyo_a（百度ID）
到目前为止，你可能已经注意到本教程中包含的一个名为“tutorial_standards.vmf”的vmf文件。打开Hammer并打开此文件。
这个文件包含很多例子用来说明Valve在原来的求生之路地图中是如何做到的。
确保你的left4dead\mapsrc\standards目录中有“tutorial_standards.bsp”和“tutorial_standards.nav”，然后加载它以查看其中的一些示例。
== 复制/粘贴 ==
复制/粘贴与其他程序类似。使用+复制笔刷或实体和+来进行粘贴。
Hammer的一个很好的功能是你可以将地图中的一部分从一个文件复制并粘贴到另一个文件。例如，你可以将tutorial_standards.vmf中的楼梯复制到您自己的地图。
在这里找到的金属楼梯：
通过左键单击来选择它。
通过按+或使用Edit > Copy来复制它。
打开要粘贴的地图。
将鼠标放在窗口和要粘贴的位置。
通过按+或使用Edit > Paste来粘贴它。
你现在可以将其移动或编辑，就像在你的地图中创建的一样。
你也可以特殊粘贴。尝试使用++或使用Edit > Paste Special。
Paste Special Dialog窗口将出现：
如果你保留默认设置字段并单击OK，则楼梯将被粘贴到你的地图中位于你将其复制的地图中的准确位置。
== 组/对象/固体 ==
Hammer允许你将对象组合在一起，使编辑更容易。例如，你可以组合灯实体，光源的prop_static和env_sprite来表示光的发光。
在tutorial_standards.vmf中，在起始房间中找到灯光组：
通过左键单击属于该组的任何实体来选择它。
然后你可以复制此组或将其整个复制/粘贴到你的地图。
要将对象组合在一起，只需选择要组合的所有对象，然后按+或使用Tools > Group。
类似地，你可以选择一个组并通过按+或使用Tools > Ungroup取消组合形成的对象。
=== 选择模式 ===
你会注意到Hammer的Selection Mode面板，有三种选择方法：
你刚刚发现了一个组（Groups）是什么——你将不同类型的对象组合在一起的地方。对象（Objects）是地图的单个组件，例如世界笔刷或func_detail。它也可以是一个实体，如灯，一个prop_static，或者一个门。
切换到对象模式，现在只选择刚刚选择的灯光组下方的灯。即使灯在较大的组中，由于我们处于对象模式，所以只选择灯。
这些组件中的一些东西（func_detail，func_brush等）可以由多个固体（solids）组成，它们是被创建的笔刷，然后组合成单个对象。
例如，你可以将在tutorial_standards.vmf里的楼梯示例中的所有楼梯作为单个func_detail。如果要删除一些梯级，可以切换到固体模式然后选择要删除的梯级。
现在切换到固体模式并选择楼梯的两个梯级。即使这些梯级是整个func_detail对象的一部分，我们仍然可以选择单个梯级，因为我们处于固体模式。
然后你可以删除这些固体或者复制它们以制作更多的楼梯。
== 可见组 ==
Hammer还允许你将对象放入可见组。可见组是一组对象，你可显示/隐藏它以帮助你组织你的地图，并帮助你编辑你的地图而无需一次查看其中的所有内容。
在对象模式中，再次选择楼梯，但这次也选择连接到楼梯的栏杆和伸展台。
现在，点击顶部工具栏上的点线的红色立方体。
这将显示可见组对话框。
你可以通过点击“Place object in existing visgroup”旁边的按钮将对象放入现有的组中并选择要添加到的组。你还可以通过在框中键入新名称并单击确定来创建新的可见组。
在这个例子中，新的可见组被称为“Stairs”。
当你点击OK时，你会发现楼梯，栏杆和伸展台从你的视野中消失。这意味着他们现在被隐藏在可见组“Stairs”中。
通过点击VisGroups面板中“Stairs”左侧的复选框，你可以显示和隐藏楼梯，栏杆和伸展台。
当你想继续编辑时，你现在可以隐藏这些对象，并可能有助于更好地查看东西。
自动可见组也是非常有帮助的。
点击VisGroups面板中的Auto选项卡，你会看到Hammer自动创建的可见组。
通过点击每个类别旁边的框，您可以隐藏或显示任何这些类别的对象。
例如，在所有自动可见组打开的情况下，在tutorial_standards地图的镜头视图中移动。然后，关掉Brush Entities和Clips，看看它有什么区别。