FGD
本简体中文页面由大康翻译。部分内容由机器翻译。
FGD 代表 Forge Game Data。它是 Hammer 游戏定义文件的文件扩展名。它们定义了游戏的所有实体 ,因此地图作者可以从编辑器中选择它们。理解 FGD 只不过是一种参考,这是一个关键点。您不能通过编辑 FGD 来创建或修改实体,您只需向 Hammer 提供有关它在游戏中找到的内容的不同信息。有时编辑会显示隐藏或未使用的功能,甚至实体,但它们始终存在,即使没有更新的 FGD 也可以使用。要使自定义 FGD 文件在 Hammer 中工作,必须通过点击 Tools > Options 选项来添加它们。
@include "base.fgd"
并且它在 base.fgd 之前加载,您将遇到错误。历史
虽然 Hammer 最初被称为 Worldcraft ,但它是以 The Forge 的名义开发的(因此得名 Forge Game Data)。然而,由于商标问题,Forge 这个名字不能用于 Hammer 的最终版本。尽管如此,文件扩展名仍然存在。
文件格式
FGD 文件遵循相当简单的格式。它是一个脚本文件,用于为 Hammer 设置实体结构和关系。 Half-Life 2 FGD 的各个部分(可在您的 SDK 二进制目录中找到,例如:(Steam 的路径)/SteamApps/common/Source SDK Base 2013 Singleplayer/bin/
)解释如下。
//====== Copyright © 1996-2005, Valve Corporation, All rights reserved. ======= // // Purpose: Half-Life 2 game definition file (.fgd) // //=============================================================================
注释只是通过以 // 开始一行来定义的。它们前面可以有空格或制表符。
@include "base.fgd"
如果您正在编写 FGD 的游戏与另一款游戏(例如《半条命 2》和《反恐精英:起源》)有很多共同点,您可以包含文件,其中定义了所有通用结构。 《半条命 2》和《反恐精英:起源》的 FGD 都包含 base.fgd 文件;《半条命 2 死亡竞赛》的 FGD 包括 halflife2.fgd 文件。
@BaseClass base(BaseNPC) = TalkNPC [ UseSentence(string) : "Use Sentence" UnUseSentence(string) : "Un-Use Sentence" ]
BaseClass 用于设置由多个不同实体使用的结构。通过将 base(BaseClassName) 添加到结构的主定义行,可以在实体结构中引用它们。BaseClass 结构在所有方面都像普通实体一样定义。唯一的区别是它不会出现在 Hammer 的实体列表中。 (我们将在下面讨论完整的实体结构)。
@PointClass base(Targetname, Origin) studio("path/model.mdl") = example_entity : "example" [ spawnflags(flags) = [ 32 : "A flag" : 0 // 0 means the flag is not-ticked by default 64 : "Another flag" : 1 // 1 means the flag is ticked by default ] foobarname(string) : "Name" : : "Name of foobar" foobargroup(string) : "Group" : "Squad1" : "Name of foobar group" foo(float) "Floating point number" : "100.7" : "Decimal points = fun" something(integer) readonly: "first number" : 0 : "This is a number which can't be manually edited" something2(choices) : "second number" : 0 : "Your choice of numbers!" = [ 0 : "Default" 1 : "Something" 2 : "Another Thing" ] // Outputs output OnSomethingHappened(void) : "Fires when something happens" output OnSomethingElse(void) : "Fires when something else happens" // Inputs input DoSomething(void) : "Do something" ]
以上是 FGD 中定义的实体结构的通用示例。让我们一点一点地分解它,从第一行开始:
- @PointClass - 实体的类类型告诉 Hammer 如何放置该实体。
- @PointClass - 该实体存在于某个非任意点。它通常被称为“点实体”。使用实体工具 (Shift+E) 将实体放置在 Hammer 中。
- @NPCClass - 这是为 NPC(非玩家角色)实体量身定制的一种特殊形式的点实体。它与下面的 npcclass 属性类型结合使用很有用。
- @SolidClass - 该实体的区域由它所附着的实体(也称为画笔)定义。它通常被称为“画笔实体”或“实体实体”。
- @KeyFrameClass - 用于 move_rope 和 keyframe_rope 。这会导致在复制实体时链接 NextKey 属性。
- @MoveClass - 用于 path_track 和类似实体。这会导致在复制实体时链接目标属性。
- @FilterClass - 一个特殊的过滤器 类用于定义哪些实体能够以某种方式与另一个实体交互。这主要导致实体显示在具有 filterclass 类型的属性中。
- base(Targetname, Origin) - 类型声明和“=”字符之间的内容有助于定义实体的属性以及它在 Hammer 中的行为和显示方式。有许多不同的东西可以在这里使用。 (可以使用其中的多个,每个都用空格分隔。)
- base( BaseClass1, BaseClass2, ... ) - 这使您可以将先前定义的 BaseClass(见上文)附加到实体。您可以指定多个 BaseClass,以逗号分隔。
- bbox( min,max ) - 设置实体边界框的大小。
- obb( min,max ) - 与 bbox 相同,但面向实体的角度。
- color( rrr ggg bbb ) - 此设置将更改 Hammer 2D 视图中线框框的颜色。如果不存在,则颜色将默认为洋红色。这里指定的值是一种颜色的 RGB 值,每个数字的范围是 0 到 255。
- iconsprite( "path/sprite.vmt" ) - 如果使用此选项,则指定的 sprite 将显示在 Hammer 3D 视图中,而不是显示平面阴影的彩色框。这将与 studio() 或 studioprop() 命令一起工作。如果未设置 sprite 名称,请使用 model 属性。 scale, rendermode, _light 和 angles 属性影响 sprite。
- sidelist( sides ) - 突出显示给定属性中列出的画笔面(作为空格分隔的 ID 列表)。如果未指定,则属性为 sides。
- sphere( propertyname ) - 如果实体具有效果半径,例如声音,则在 Hammer 的 2D 和 3D 视图中将显示一个球体。您需要指定将控制球体大小的属性。如果未指定任何属性,它将查找 radius 属性。
- studioprop( "path/model.mdl" ) - 如果使用此选项,实体将作为指定模型显示在 3D 视图中。如果未指定模型,则将使用实体的“模型”属性值(如果可用)。可以定义多个模型。
注意:如果您有一个具有“angles”属性的实体,您希望能够使用鼠标在 Hammer 中旋转(而不是仅通过属性编辑),您可能需要添加此修饰符。注意:外观受 skin 和 rendercolor 属性影响,类似于 prop_dynamic 。
- studio( "path/model.mdl" ) - 与 studioprop() 相同,但实体周围的边界框将忽略此模型。这对于不渲染模型的实体很有用。
- lightprop( "path/model.mdl" ) - 与 studioprop() 相同,只是模型的音高被倒置。
- line( color, start_key, start_value, end_key, end_value ) - 在两个实体之间画一条线。此实体中的 value 属性给出了要在其他实体的 key 属性中查找的名称。 key 通常设置为 targetname。颜色设置未选择实体时线条的颜色。如果未设置,则第二个实体默认为该实体。
- cylinder( color, start_key, start_name, start_radius, end_key, end_value, end_radius ) - 在两个实体之间绘制一个圆柱体。这类似于 line(),但增加了两个在目标实体上查找的 radius 属性。这些定义了圆柱体的起点和终点的大小。
- lightcone( inner_fov, outer_fov, color, pitch_scale ) - 渲染用于 light_spot 实体的锥体。 inner_fov 是最里面圆锥部分的关键,outer_fov 是最外面的。 pitch_scale 允许在渲染锥体时反转俯仰角。如果未指定,则值分别取自 _inner_cone、_cone、_light。这会读取与 light_spot 属性对应的许多其他值。
- frustum( fov,near,far,color, pitch_scale ) - 创建从实体延伸的矩形圆锥体。 FOV 定义扩展角 (0-180)。 Near 和 far 定义将突出显示的距离。颜色值定义了锥体的显示颜色。 Pitch_scale 允许在渲染锥体时反转俯仰角。前四个值必须是属性名称,最后一个是文字。如果未指定,则值分别取自 _fov、_nearplane、_farplane 和 _light。 pitch_scale 设置为 -1。
- halfgridsnap - 移动此实体时,它将对齐到当前网格大小的一半。这有点特殊,因为它不需要参数或括号。
- wirebox( min,max ) - 为两个属性绘制一个边界框。 origin() 助手(helpers)也应该被定义以允许移动点。
- size( -x,-y,-z,+x,+y,+z ) - 定义未指定模型或 sprite 时使用的默认立方体的大小。
- origin( property ) - 允许在地图中定位矢量属性。
- vecline( property ) - 允许在地图中定位矢量属性。这也会从实体到位置画一条线。
- axis( property ) - 允许在地图中定位由一条线连接的两个点。属性值设置为“x1 y1 z1, x2 y2 z2”。
- worldtext() (仅存在于 中) Template:Also:zh-cn - 在 3D 视口中显示“消息”键值的内容。
以下助手(helpers)不带参数,并且是特定实体类型的特殊情况:
- decal() - 在附近的面上渲染 decals。这使用 texture 属性来设置要使用的材质。
- overlay() - 在一个面上渲染 overlays。(info_overlay )
- overlay_transition() - 在水和海岸之间的交叉点上渲染 overlays。(info_overlay_transition )
- light() - 出现在 light 上,用途不明。
待完善: 弄清楚这是做什么的。- sprite() - 渲染在“model”(模型)键值(env_sprite 以及变种)中指定的 sprite 材质。对于实体图标,请使用 iconsprite。
- sweptplayerhull() - 在两点(point0和point1)绘制“32x32x72”大小的矩形棱柱,然后链接角以显示一个矩形移动到另一个位置所需的空间。这也为这些属性添加了 origin() 助手。
- instance() - 渲染地图中的 实例 。它还生成与实例参数动态对应的附加属性。
- quadbounds() - 用于 func_breakable_surf 。保存时自动设置纹理面的 4 个角。
待完善: 这是否也控制“错误”键值?
- example_entity : "example" - 这是实体的名称后跟描述。当您单击实体属性对话框内的帮助按钮时,说明会显示在 Hammer 中。为了视觉上的方便,描述可以通过将“文本块”与加号 (+) 字符连接来跨越多行。例如:
@PointClass = example_entity :
- "This is an example description for"+
- "this example entity. It will appear"+
- " in the help dialog for this entity"
[
- entity properties go here
]
- entity properties - 主要 [ / ] 括号之间的所有内容都用于定义实体的属性,包括它们的输入和输出。各个属性结构由名称、类型声明、显示名称、默认值和描述组成。最常见的属性是:
- string - 这将创建一个字符串类型的属性。
- name(string) : "Display name" : "Default" : "Description"
- integer - 这将创建一个整数类型的属性。
- name(integer) : "Display name" : 1 : "Description"
- float - 这将创建一个 float 类型的属性。虽然它处理的是数字,但它的结构类似于字符串类型。默认值周围必须有引号。
- name(float) : "Display name" : "1.5" : "Description"
- boolean (存在于自 以来)Template:Also:zh-cn - 这将创建一个布尔类型的属性,带有是/否(Yes/No)的下拉列表。对于较旧版本的 Hammer,请改用选项。
- name(boolean) : "Display name" : 1 : "Description"
- 还有两种常见的特殊情况属性类型,选择和标志,它们遵循略有不同的格式。
- choices - 这种类型的属性允许您设置许多不同的选择。它们的格式类似于其他类型:
name(choices) : "Display name" : "1" =
[
- 0 : "something"
- 1 : "something else (default)"
- 2 : "something completely different"
]
- 您还可以使用字符串(或浮点数)作为值,而不是整数,如下所示:
name(choices) : "Display name" : "models/something02.mdl" =
[
- "models/something01.mdl" : "something"
- "models/something02.mdl" : "something else (default)"
- "models/something03.mdl" : "something completely different"
]
- flags - flags 属性类型允许您设置将出现在实体属性对话框的 Flags 部分中的内容。它的设置类似于选择属性类型。这些标志都是 2 - 20、21、22 等的幂,它们的值为 0(关闭)或1(开启)。如果没有为标志指定默认值,则将其视为关闭。
spawnflags(flags) =
[
- 1 : "something clever" : 1
- 2 : "something else" : 0
- 4 : "you said what now?" : 0
- 8 : "nothing" : 1
]
- 请注意,spawnflags 始终是该属性的名称。创建具有任何其他名称的标志类型属性将导致它显示为正常的整数键值。
- 还有许多特殊用途的属性类型可以修改实体属性对话框 UI,以便轻松浏览文件或更轻松地操作复杂属性(如颜色或角度)。
- axis - 添加一个相对的 2 点轴助手
- angle - 将此属性的角度小部件添加到实体对话框 UI。
- angle_negative_pitch - 与 angle 相同,除了音高是倒置的。
- color255 - 添加了一个按钮,用于调出颜色选择 UI,它将您选择的颜色转换为三个数字 RGB 值。允许额外的参数(即亮度)。
- color1 - 添加一个颜色按钮,但使用浮点数 [0,1] 来表示 RGB。允许额外的参数(即亮度)。
- filterclass - 将属性标记为要使用的过滤器的名称
- instance_file - 添加了一个打开文件浏览器的按钮,让您浏览实例文件。
- instance_parm - 在 func_instance_parms 中用于定义修正变量。
- instance_variable - 在 func_instance 中用于设置修正变量。
- material - 添加了一个用于打开材质浏览器的按钮。
- node_dest - 添加滴管以在三维视图中选择一个节点。
- node_id (存在于自 以来) - 在(多个)节点 上,这用于节点 ID 键值,以随着放置的每个连续节点自动增加它。在其他实体上使用时似乎不起作用。
- npcclass - 添加了一个由 NPCClass 类型的实体填充的下拉选择列表。
- origin - 原点
- particlesystem (存在于自 以来) - 添加了一个按钮,可以调出粒子浏览器,让您浏览粒子系统。
- pointentityclass - 添加一个由 PointClass 类型的实体填充的下拉选择列表。
- scene - 添加了一个按钮,可以调出声音浏览器,让您浏览场景文件。
- script (存在于自 以来) - 添加了一个打开文件浏览器的按钮,让您浏览 VScript 。
- scriptlist (存在于自 以来) - 添加一个显示 VScript 列表的按钮,以及用于添加/删除脚本和打开每个文件的按钮。
- sidelist - 添加了一个边选择滴管,允许您选择边(按住 Ctrl 键选择多个边)。
- sound - 添加了一个按钮,可以打开声音浏览器,让您浏览声音脚本或原始声音。
- sprite - 与 material 相同,除了它会在打开材质浏览器时自动用 sprites/ 替换您的搜索过滤器,并将 .vmt 添加到材质名称的末尾。
- decal - 与 material 相同,除了在打开材料浏览器时它会自动用 decals/ 替换您的搜索过滤器。
- studio - 添加了一个按钮,可以调出模型浏览器。
- target_destination - 将属性标记为另一个实体的目标名称。
- target_name_or_class - 将属性标记为另一个实体的目标名称或实体类别名称(Classname)。
- target_source - 将属性标记为其他实体可能定位的名称。
- vecline - 添加一个绝对 1 点轴帮助器,类似于原点标记。
- vector - 三维矢量。
其他文件部分
材料排除列表
这些列表定义了 Hammer 的材质浏览器在向您展示可供选择的纹理调色板时不会使用的路径。它应该对自定义地图实际可用的文件没有影响。
models/
的文件夹将始终被排除,无论此处设置什么。@MaterialExclusion [ // Names of the sub-directories we don't want to load materials from "debug" "engine" "hud" "vgui" ]
自定义自动可见组(Auto-visgroup)
这允许自定义过滤器控制工具栏 的自动可见组选项卡。第一个标题是“父级”的名字,接下来是“子级”的名字。最后是将放置在可视组中的实体类列表。如果父项已经存在,则新条目将与之前的条目合并(包括默认的组列表)。这允许创建具有多个分组级别的树。如果一个可见组完全为空,它将不会出现在列表中。
@AutoVisGroup = "Parent" [ "Child 1" [ "entity name 1" "entity name 2" ] "Child 2" [ "entity name 3" "entity name 4" ] ]
例如:
@AutoVisGroup = "Brushes" [ "Triggers" [ "trigger_once" "trigger_multiple" ] "Tool Brushes" [ "func_areaportal" "func_viscluster" ] ] @AutoVisGroup = "Tool Brushes" [ "Vis Clusters" [ "func_viscluster" ] ]
外部链接
- FGD 的下载 @ TheRaZZeRApp
- Forge Game Data Language .fgd 语法高亮可用于 textmate 格式(与 SublimeText 兼容)