nyuuzyou/wikis huggingface dataset:
Zh/Dota 2 Workshop Tools/Panorama/Localization

为了让Panorama支持多语言，大多数UI都会使用本地化标识而不是简单的给用户看的字符。这些标识让程序根据用户的语言选择，正确地应用对应的语言环境。
In order to support multiple languages, most Panorama UIs are built with references to "localization tokens" instead of literal user-facing strings. These tokens are then dynamically replaced with the correct localized string depending on the user's language selection.
在XML文件中，方言标识标有“#”前缀，并可以按以下的标准文本被使用:
<Label text="#hello_message" />
当UI被加载完成后，这些带标识的文本会自动被替换成方言文件中对应的字符：
 "hello_message" "Hello, world!"
注意: 和大多数Panorama的文件不同，方言文件放在game/ 下而不是content。
在dotaAddon中，方言文件在：game/dota_addons/ADDON_NAME/panorama/localization/addon_LANGUAGE_NAME.txt
在很多情况下，你需要方言字符中包含一些动态的内容。这可以通过使用“会话变量”来实现。这些设置在板上的变量可以被本地化文件引用。
 XML:
 <Label id="msg" text="#MessageText" />
 
 Javascript:
 $("#msg").SetDialogVariable( "adjective", "favorite" );
 $("#msg").SetDialogVariableInt( "number", 2 );
 
 Localization file:
 "MessageText" "My {s:adjective} number is {d:number}."
{{注意|如果你在Javascript中动态地设置了一个标签的文本，它是不会自动使用方言的。如果要同样动态地给这个标签分派一个方言标识，你需要在Javascript中把这个字符也进行方言翻译（这种方法只能给会话变量有限的支持）。
 $( "#PanelID" ).text = $.Localize( "#LocalizationToken" );
Category:Dota 2 Workshop Tools
Category:Panorama
Zh/Dota 2 Workshop Tools/Particles

Category:Dota 2 Workshop Tools Category:AMHC 汉化
== 入门 ==
* 
* 
== 教程 ==
* 
== 功能 ==
* 
* 以及 
* 以及 
* 
* 
* 
== 其他主题 ==
* 
* 
*
Zh/Dota 2 Workshop Tools/Particles/Particle Effect Tutorial 1

== 简单的子画面效果 ==
在这里，我们将通过几个步骤在中创建简单的特效.
# 如果你还没有在创意工坊工具里创建一个 , 马上创建一个.
# 点击粒子编辑器工具(PET)图标来打开粒子编辑器: 
# 文件菜单File menu->新New创建一个空的新效果.
# 在功能窗口 (这应该在中间列里面) 点击渲染'Renderer旁边的加号(+) .
# 在渲染器列表, 选择 渲染精灵贴图: Render sprites.
# 在功能窗口, 点击 操作器 Operator旁边的加号.
# 在操作器列表, 选择 寿命衰减: Lifespan Decay.
# 在功能窗口, 点击 操作器旁边的加号.
# 在操作器列表, 选择 基本运动:Movement Basic.
# 在功能窗口, 点击 初始化 Initializer旁的加号.
# 在初始化列表, 选择 位置随机任意球面:Position Within Sphere Random.
# 在功能窗口, 点击 发射器 Emitter旁的加号.
# 在发射器列表, 选择 不断放出:Emit continuously.
# 你现在应该在预览面板的栅格的中心处看到一个小粒子: 
# 在功能窗口, 通过点击它选择在球面随机初始化的位置. 你可以看到他的属性出现在PET的属性面板.
# 在“'最大速度'”属性字段中，输入200然后按Enter键. 在预览面板中，您现在应该看到发光的精灵从网格的中心不断地往外发射: 
# 继续并保存: 文件菜单->保存作为. 将文件保存到 [你的地图]/particles/test_sprite.vpcf.
# 你现在可以自由摆弄你的效果并且修改属性，看看它们是如何影响粒子的行为. 一些好的候选包括:
::*基础属性Base Properties->颜色color
::*基础属性Base Properties->寿命lifetime
::*渲染精灵Render sprites->质地texture
::*基本运动Movement Base->重力gravity (尝试围绕"z"值中的-200, 或者第三格, 领域, 它定义了向上/向下力)
::*基本运动Movement Base->拖动drag (超过0.5的值不会有太大的乐趣，除非你在位置初始化中提高你的最大速度'“属性...)
::*位置随机任意球面Position Within Sphere Random->距离最大distance max (提示：地面栅格是128×128单位)
::*不断放出Emit continuously->发射率emission rate
::*不断放出Emit continuously->发射时间emission duration
::*不断放出Emit continuously->发射开始时间emission start time
== 简单的子画面效果:深入 ==
现在，让我们来看看我们所做的事情,为什么我们做到了，和为什么它产生了这样的结果.
1. 文件菜单File menu->新建New创建一个空的新效果.
::
2. 在功能窗口 (这应该在中间列里面) 点击渲染'Renderer旁边的加号(+).
3. 在渲染器列表, 选择 渲染精灵贴图: Render sprites.
::
4. 在功能窗口, 点击 操作器 Operator旁边的加号.
5. 在操作器列表, 选择 寿命衰减: Lifespan Decay.
::
6. 在功能窗口, 点击 操作器 Operator旁边的加号.
7. 在操作器列表, 选择 基本运动:Movement Basic.
::
8. 在功能窗口, 点击 初始化 Initializer旁的加号.
9. 在初始化列表, 选择 位置随机任意球面:Position Within Sphere Random.
::
10.在功能窗口, 点击 发射器 Emitter旁的加号.
11. 在发射器列表, 选择 不断放出:Emit continuously.
::
12. 在功能窗口, 通过点击它选择在球面随机初始化的位置. 你可以看到他的属性出现在PET的属性面板.
13. 在“'最大速度'”属性字段中，输入200然后按Enter键. 在预览面板中，您现在应该看到发光的精灵从网格的中心不断地往外发射.
::
== 动作属性默认值 ==
这种特效可以用几个功能就生成结果是因为它依赖的默认属性是很多重要的事情:半径，色彩，寿命，旋转，纹理，发射率，以及大量在引擎罩特性.
但是，如果你想为你的插件制作特效，你可能会想改变其中的一些默认设置。您甚至可能希望指定其中一些更复杂的行为。.
在中,我们将着眼于覆盖基础属性的默认值与功能。.
Category:Dota 2 Workshop Tools
Category:AMHC 汉化
Zh/Dota 2 Workshop Tools/Particles/Particle Performance

== 最大粒子数 ==
: 默认情况下每个系统的最大粒子数设为1004。无论系统使用与否都会被分配到这么大的内存。所以在你设定完系统之后，你应该看看计数器来观察你有多少粒子被使用，并将最大粒子数设为这个值。这将有利于将内存占用量保持在一个理智的数量。
== 线程 ==
: 粒子被系统设为了多线程。因此如果你有多个系统，他们会分布到尽可能多的线程里。所以从这点看，将复杂系统分割成多个系统来利用这个特性是一个不错的方式。这即是说，每个系统都有它们的开销，所以这个有效的方法的益处也是有限的，尤其在更简单的系统上。将一个只有少量粒子的系统分割开来几乎肯定是一种损失。然而，如果你的系统有1000+的粒子，那么你值得将粒子分成小份并分布到多线程中去。系统和其子系统总在同一个线程里因为父系统与子系统可以相互传递数据并且非常需要被组合在一起。
== SIMD（单指令多数据流） ==
: 现在，大多数粒子操纵器、初始化器等工作在SIMD中。这意味着他们通常同时在硬件上做四个粒子的组的所有数学运算。理论上来讲未来在不同种类的硬件上这将增长至更广阔的数字。需要指出的是如果你注意四的倍数，你将会更好地利用系统。将系统缩放至最接近四的倍数可以使它变得稍稍更加理想。这虽然没有巨大的收获但也是应该被注意到的事。
== 共享数据 ==
: 在父系统与子系统有许多方法可以共享数据。一些更复杂的初始化器或者操纵器可以通过向一个控制点写出他们的结果来最小化它们的表现效果，随后子系统可以读到这些结果并且不用计算便可得到相同数据。
== 碰撞 ==
: 通常，碰撞是一项昂贵的操作。默认模式0在每一帧描绘每一个粒子的轨迹。这很昂贵并且无法良好地缩放。然而，碰撞约束允许一些不同的碰撞模式，他们能够用精确度换来速度以取得更快的碰撞碰撞模式3可以当粒子在不可预知的位置或动作时为动态碰撞最好地权衡精确度与性能。
Category:Dota 2 Workshop Tools
Category:AMHC 汉化
Zh/Dota 2 Workshop Tools/Particles/Particle System Overview

粒子系统 是一些创造3D视觉特效的小对象的集合，例如浮云, 光线, 和全屏幕 后处理(?) 的特效。
一个粒子系统通常包括一些嵌套的子效果,每一种都是由插件，来控制系统的行为。这允许每个粒子特效是根据需要而变的简单或是复杂的。
== 剖析 ==
=== 基础属性 ===
:在基础状态，一个粒子系统没有任何组件，只有一些基本属性。这些是每个系统都具备的通用属性。它们包括影响整个系统的对象，但它们并不会被一个独立粒子改变，并且不适用于构成系统的其他端口。对于少数的底层引擎设置，最好是保留默认值。
:你可能最常需要修改的基础属性：
::initial_particles(初始粒子)
::bounding_box_min and bounding_box_max(界限范围的最大值和最小值)
::fallback replacement definition(回退的替代定义)
::screen space effect(屏幕空间效果)
::max_particles(最大粒子)
:此外，有些属性可以提供一个简单的机制来定义系统的基本属性，这些属性可以在必要的时候通过操作器覆盖。这些属性包括：
::color(颜色)
::radius(半径)
::rotation(旋转)
::rotation_speed(旋转速度)
::lifetime(寿命)
::sequence_number(序号)
::sequence_number 1(序号一)
请看获得更多信息。
=== 功能 ===
:除了基本属性，粒子系统是由组件构成的。在一般情况下，你可以任意增加任何个目录下的组件，在合理情况下甚至可多次增加同一组件。这些设置或修改会因应每个粒子的属性领域进行。
==== ====
::渲染会决定如何绘制你的粒子。这些包括灵体，绳索，条痕等。每个粒子可以以多种方式被多次渲染(如果你想这么做的话)。请注意，在最新版本的粒子引擎中，大部分渲染都会参考"vtex"文档，但投影和缆索粒子渲染是例外的，它们会参考"vmat"文档。 (Vmat文档可以在Workshop Tools的中创建)).
==== ====
::发射器定义有多少粒子在哪一个时间内被创建。一个系统可以有多个不同类型的发射器，从而形成的粒子的总体图案。
==== ====
::初始化器设置每个粒子的初始状态，以及每个粒子的属性领域。例如，一个粒子的初始位置，颜色，大小及透明度。初始化器只在每个粒子创建时对其进行初始化，之后他们对每个粒子再没有影响。
==== ====
::一旦一个粒子经初始化后，操作器便会接管每个粒子在每一帧的执行和功能。
==== ====
::力操作器是操作器的变种，可以影响粒子的动作。
==== ====
::约束器定义粒子运动的限制，例如一个控制点的碰撞或最大距离。
==== ====
::子系统是被连接到当前系统的其他粒子系统。一些数据比如控制点，可以传给子系统，并可以建筑起多个层级。
=== ===
:挂点（CP）是一个粒子系统的基本外部输入机制，每个粒子系统最多可以有64个。挂点有其位置，方向，和一个可供参考的实体。默认情况下，挂点"0"是粒子系统的起源和方向定位。
:如果一个CP联系着一个实体，这个CP与此实体或连接点形成父子关系。在这同时，每一个额外的挂点在一个系统中可以分配他自己的空间位置，方向，和一个实体。这允许如《军团要塞》中的治疗光束穿梭在玩家角色和医疗兵的武器之间。
:这可以令系统在必要的情况下从多个点或模型发射粒子，例如一个不断燃烧的火。
:系统的各要素可以访问CP数据，这可以允许多个动态因素影响系统。挂点除了作为默认的空间位置也可以存储其他数据，这允许外部代码或实体传送通用数据到系统，然后被映射到系统的属性。
==另见==
*
*
*
Category:Dota 2 创意工坊工具集
Category:AMHC 汉化
Zh/Dota 2 Workshop Tools/Script Filters

脚本过滤器允许自定义游戏作者拦截和修改未实行的动作。每个脚本过滤器传递一个描述将要发生事件的消息的表。修改表中的值会改变即将发生的动作的行为。从过滤器函数中返回true将继续动作，返回false则放弃。最好的查看每个过滤器中的值的方式是当过滤器被调用时打印表中的内容。
* ExecuteOrders - 通过这里改变所有玩家发出和强制的动作。
* RuneSpawn - 在指定spawner处一个神符即将出生。
* Damage - 即将造成伤害（税后）。
* ModifyGold - 一个玩家正因特定原因修改金钱数量。
* ModifyExperience - 一个玩家正因特定原因修改经验值。
Category:Dota 2 创意工坊工具集
Category:AMHC 汉化
Zh/Dota 2 Workshop Tools/Scripting

Category:Dota 2 Workshop Tools Category:AMHC 汉化
在Dota2中，脚本由Lua编程语言处理，Lua将在dota2加载你的插件时被执行，并且它可以操作游戏的方方面面。脚本可以控制在游戏模式，游戏规则，技能，英雄交互，中立生物，AI等内容中发生的一切事件。
== 入门指南 ==
这里的文档都假定你已经有Lua的基本知识。如果你是Lua的初学者，页面最下的 Lua 资源 可以帮助你。
* 
== 技能脚本 ==
* 
* 
* 
== 常见技术 ==
* 
* 
* 
== 脚本参考 ==
* 
* 
* 
* 
* 
* 
* 
* 
== 范例 ==
* 
* 
* 
* 
== Lua 资源 ==
* Lua中文学习教程和Lua代码编辑器下载 - 中文作者仅需看这一条，下面的全tm是英文！
* 官方Lua站点
* 《Lua编程》 - 很好的Lua学习资源，推荐初学者从这开始学起。
* 《Lua编程》网络版 - 《Lua编程》第一版，并且是免费网络版。
* Sublime Text的Dota2函数补全插件
Zh/Dota 2 Workshop Tools/Scripting/Abilities Scripted

在技能中调用Lua中的函数是可能的，你能够顾使用这种方法来创造更有趣的技能。
"OnSpellStart"
{
	"RunScript"
	{
		"ScriptFile"		"custom_scripted_abilities.lua"
		"Function"		"Punch"
		"Target"		"POINT"
	}
}
* ScriptFile - 包含着你想要引用的函数的lua文件路径 + 文件名
* Function - 你要引用的函数名称
所有需要的参数，例如施法者将会通过keys（这是一个table类型的数据）传递进lua文件：
function Punch(keys)
 for k,v in pairs(keys) do
 print(k,v)
 end
end
具体传递的参数将会根据 "Target" 字段的不同而不同，一般常用的Key有：
keys.caster --施法者
keys.target_entities -- 目标表
keys.ability --技能
等等。
Category:Dota 2 创意工坊工具集
Category:AMHC 汉化
Zh/Dota 2 Workshop Tools/Scripting/Data Driven Motion Controller Example

示例视频
既然你的注意到我,那么我们来讨论一下。数据驱动的能力系统非常牛逼,我们可以用它实现好多好玩的东西。在官方给出的例子和文档中有一些数据驱动效果没有列出来。其中一个就是"ApplyMotionController"。
ApplyMotionController 是干什么的呢？我到处找不到这个的参考内容，所以我决定自己找出来。首先，我们用一种方式打开它。这种方式参考下面代码：
"ApplyMotionController"
 {
 "TARGET" "TARGET"
 "ScriptFile"	 "scripts/vscripts/your_script_here.lua"
 "HorizontalControlFunction"	"TestGravityFunc"
 "VerticalControlFunction" "TestGravityFunc"			
 }
当然不止这些参数, 但这足以令其工作起来. 经过一些测试后,我发现 ApplyMotionController 每秒调用控制水平和垂直的方法好几次 . 返回的值貌似对显示没有作用. 如同下面方法:
function TestGravityFunc(args)
 local targetPos = args.target:GetAbsOrigin()
 local casterPos = args.caster:GetAbsOrigin()
 local direction = targetPos - casterPos
 local vec = direction:Normalized() * 3.0
	
 args.caster:SetAbsOrigin(casterPos + vec)
 end
这是一个非常简单的方法。这个方法得到施法者到目标的方向并且使施法者在这个方向上前进3个单位。如此频繁调用这个方法的目的是通过仿照引力的计算将施法者拉向目标。
然而，我相信我所做的效果不代表全部。作为新手，我找不出HorizontalControlFunction的参数和VerticalControlFunction的参数之间的区别。我猜会有一些方法能使这些方法返回一系列不同指向目标的移动指令，但目前我还未研究出来。CDOTA_BaseNPC:InterruptMotionControllers(bool) 这个方法我也尝试过，但是它貌似不起明显作用。
Category:AMHC 汉化
Zh/Dota 2 Workshop Tools/Scripting/Dedicated VConsole Log Viewer

有些用户发觉分离所有在VConsole里的Vscript信息到它特定的表中是很有用的。这使你的测试工作变得简单并且减少错过发现错误和重要信息的机会。
做法是在VConsole中右键VScript信道的前端, 然后选择 “Open In New Log Viewer” . 这会在VConsole中打开一个仅显示发送到VScript信道中的信息的新窗口。
Category:Dota 2 Workshop Tools
Category:AMHC 汉化
Zh/Dota 2 Workshop Tools/Scripting/Getting Started

__TOC__ 
DOTA2创意工坊工具 的程序使用的是LUA编程语言，如果你对于编写其他语言比较熟悉的话，那么编写LUA也会是一件很容易的事。
== 所需要的文件 ==
如果你想要运行一些程序，以下的文件将会是必须的，这些文件必须放置在/game目录内对应的插件文件夹，这样在插件被载入的时候，他们就能被执行。
../game/dota_addons/your_addon/scripts/vscripts/addon_game_mode.lua
这个文件并不是可选的，而且必须使用这个名字，其他文件能够在/vscripts文件夹里面创建，你能够在你任何想要引用他们的地方来引用。
== 运行程序文本 ==
当插件被载入的时候，addon_game_mode.lua 文件将会被立即执行，其他的文件你能够在addon_game_mode.lua中使用
require( "lua_filename_here" )
来载入他们。
== 程序函数 ==
以下是一些默认的程序函数，在你的插件中应该保留他们。
=== Precache（预载入） ===
Precache （预载入）函数将会在游戏之前预先载入一些资源文件，以下的示例包含了三种不同资源的载入方式，一个粒子特效.vpcf文件，一个粒子特效文件夹，还有一个物品。
function Precache( context )
	PrecacheResource( "particle", "particles/items2_fx/veil_of_discord.vpcf", context )	
	PrecacheResource( "particle_folder", "particles/frostivus_gameplay", context )
	PrecacheItemByNameSync( "item_bag_of_gold", context )
end
=== Activate（激活） ===
Activate （激活）函数用来在程序第一次运行的时候设置游戏模式相关参数，他在文件被载入之后执行。
function Activate()
	GameRules.holdOut = CHoldoutGameMode()
	GameRules.holdOut:InitGameMode()
end
Category:Dota 2 创意工坊工具集
Category:AMHC 汉化
Zh/Dota 2 Workshop Tools/Scripting/Heroes internal names

这些都是游戏引用的英雄名字：
 npc_dota_hero_abaddon
 npc_dota_hero_alchemist
 npc_dota_hero_ancient_apparition
 npc_dota_hero_antimage
 npc_dota_hero_axe
 npc_dota_hero_bane
 npc_dota_hero_batrider
 npc_dota_hero_beastmaster
 npc_dota_hero_bloodseeker
 npc_dota_hero_bounty_hunter
 npc_dota_hero_brewmaster
 npc_dota_hero_bristleback
 npc_dota_hero_broodmother
 npc_dota_hero_centaur
 npc_dota_hero_chaos_knight
 npc_dota_hero_chen
 npc_dota_hero_clinkz
 npc_dota_hero_crystal_maiden
 npc_dota_hero_dark_seer
 npc_dota_hero_dazzle
 npc_dota_hero_death_prophet
 npc_dota_hero_disruptor
 npc_dota_hero_doom_bringer
 npc_dota_hero_dragon_knight
 npc_dota_hero_drow_ranger
 npc_dota_hero_earth_spirit
 npc_dota_hero_earthshaker
 npc_dota_hero_elder_titan
 npc_dota_hero_ember_spirit
 npc_dota_hero_enchantress
 npc_dota_hero_enigma
 npc_dota_hero_faceless_void
 npc_dota_hero_furion
 npc_dota_hero_gyrocopter
 npc_dota_hero_huskar
 npc_dota_hero_invoker
 npc_dota_hero_jakiro
 npc_dota_hero_juggernaut
 npc_dota_hero_keeper_of_the_light
 npc_dota_hero_kunkka
 npc_dota_hero_legion_commander
 npc_dota_hero_leshrac
 npc_dota_hero_lich
 npc_dota_hero_life_stealer
 npc_dota_hero_lina
 npc_dota_hero_lion
 npc_dota_hero_lone_druid
 npc_dota_hero_luna
 npc_dota_hero_lycan
 npc_dota_hero_magnataur
 npc_dota_hero_medusa
 npc_dota_hero_meepo
 npc_dota_hero_mirana
 npc_dota_hero_morphling
 npc_dota_hero_naga_siren
 npc_dota_hero_necrolyte
 npc_dota_hero_nevermore
 npc_dota_hero_night_stalker
 npc_dota_hero_nyx_assassin
 npc_dota_hero_obsidian_destroyer
 npc_dota_hero_ogre_magi
 npc_dota_hero_omniknight
 npc_dota_hero_phantom_assassin
 npc_dota_hero_phantom_lancer
 npc_dota_hero_phoenix
 npc_dota_hero_puck
 npc_dota_hero_pudge
 npc_dota_hero_pugna
 npc_dota_hero_queenofpain
 npc_dota_hero_rattletrap
 npc_dota_hero_razor
 npc_dota_hero_riki
 npc_dota_hero_rubick
 npc_dota_hero_sand_king
 npc_dota_hero_shadow_demon
 npc_dota_hero_shadow_shaman
 npc_dota_hero_shredder
 npc_dota_hero_silencer
 npc_dota_hero_skeleton_king
 npc_dota_hero_skywrath_mage
 npc_dota_hero_slardar
 npc_dota_hero_slark
 npc_dota_hero_sniper
 npc_dota_hero_spectre
 npc_dota_hero_spirit_breaker
 npc_dota_hero_storm_spirit
 npc_dota_hero_sven
 npc_dota_hero_templar_assassin
 npc_dota_hero_terrorblade
 npc_dota_hero_tidehunter
 npc_dota_hero_tinker
 npc_dota_hero_tiny
 npc_dota_hero_treant
 npc_dota_hero_troll_warlord
 npc_dota_hero_tusk
 npc_dota_hero_undying
 npc_dota_hero_ursa
 npc_dota_hero_vengefulspirit
 npc_dota_hero_venomancer
 npc_dota_hero_viper
 npc_dota_hero_visage
 npc_dota_hero_warlock
 npc_dota_hero_weaver
 npc_dota_hero_windrunner
 npc_dota_hero_wisp
 npc_dota_hero_witch_doctor
 npc_dota_hero_zuus
Category:AMHC 汉化
Zh/Dota 2 Workshop Tools/Scripting/Simple Trigger that calls Lua

* 步骤 1: 在确认你选择了"toolstrigger.vmat"材质之后，使用方块工具(+)创建一个方块，这个方块将会成为一个触发区域。
* 步骤 2: 选择你所创建的方块，并点击 Tools(工具) > Tie To Entity(绑定到实体) (+). 这将会将你所创建的方块转换为触发实体。
* 步骤 3: 选择触发实体，将它的类（class）改为"trigger_hero"，这个触发实体意味着它将会在一个玩家进入或者离开触发区域的时候被触发，当然，还有很多触发类型，不过在本例中我们尽量做得简单一些。
* 步骤 4: 为你的触发实体设置一个名字，同时设置它所指向的Lua程序文件，里面包含着你实体所要调用的函数。例如：如果你想从scripts/vscripts/my_file.lua 调用一个函数，你需要设置为Entity Scripts: my_file.lua
:
* 步骤 5: 在选中了触发实体之后，按 + 键来打开实体属性面板，然后选择输出(Output)选项卡。
* 步骤 6: 点击 "Add" （添加）按钮，添加一个名为 "OnStartTouch"（当开始接触）的输出，将这个触发实体设置为目标（Target），输入（Input）设置为 "CallScriptFunction",参数（parameter）为你所要调用的lua文件中的函数名。
::
	My Output 	Target Entity	Target Input 	Parameter 	Delay	Only Once
	OnStartTouch	trigger_name 	CallScriptFunction	MyFunction	0.00 	No
* Step 7: 添加一个同样的输出，将名称改为 "OnEndTouch"（当结束接触），将参数（parameter）改为另一个函数。
在Lua中的函数实例:
function OnStartTouch(trigger)
	print(trigger.activator)
	print(trigger.caller)
	
end
function OnEndTouch(trigger)
	print(trigger.activator)
	print(trigger.caller)
	
end
Category:Dota 2 创意工坊工具集
Category:AMHC 汉化
Zh/Dota 2 Workshop Tools/Scripting/ThinkerFunctions

可以随时通过SetThink来注册。多个think函数可以同时在一个实体上同时运行，但是为了避免覆盖这需要think函数各自命名.
== 使用方法 ==
SetThink( "ThinkerFunction", self, "thinkerNameString", 1 )
* ThinkerFunction - 这可以是一个要调用的方法的字符串, 或者是一个方法对象。
以下参数是可选的：
* ThinkerFunctionScope - 这可以是一个表，使在这对象上为ThinkerFunction附以索引。类似think的调回，这样可以得到成员方法。
* thinkerNameString - thinker的名字。使用这个可以控制多个thinker。
* 1 - 在thinker开始计时之前设定延迟多少秒的数字。
返回nil的话可以注销thinker并且使它停止。返回一个数字来设定下一次think的时间。
Category:Dota 2 Workshop Tools
Category:AMHC 汉化
Zh/Dota 2 Workshop Tools/VMDL/Attachments

附着点由关节产生，并被偏移和旋转定义。在游戏里它们可以被用来做粒子发射，且物品附着点还有其他作用。附着点被储存在附着点列表中，并且他们可以有多个源（influence）。
== 显示 ==
* 开关附着点显示： 视窗(Display) > 附着点(Attachments)
* 开关附着点名显示： 视窗(Display) > 附着点名(Attachment Names)
== 创建 ==
* 在大纲(outliner)中右键单击一个关节项，并选择 增加附着点(Add Attachment)。
* 用 菜单选项。
== 编辑 ==
* 当一个附着点通过视窗或大纲项被选择，gizmo便可以使用了。用gizmo来转移和旋转附着点。
* 当附着点被选择时，其可编辑的属性可以通过属性编辑器编辑。
== 数据结构(Data Structures) ==
VMDL附着点的数据结构如下：
CVattachmentListReference[] m_pAttachmentLists = 
[
	CVattachmentListReference
	{
		CVattachmentList* m_pObject = &CVattachmentList_0
		string m_sFileName = ""
	}
]
=== m_pAttachmentLists ===
CVattachmentListReference中元素的列表。
=== CVattachmentListReference ===
对内部或外部CVattachmentList的参考：
Attribute 	Friendly Name	Description 	Type 	Default Value
属性 	易记名称 	描述 	类型 	默认值
m_pObject 	 	内部CVattachmentList的指针 	CVattachmentList*	
m_sFileName	 	外部CVattachmentList的有关路径 	string 	
CVattachmentList配置列表如下：
CVattachmentList CVattachmentList_0
{
	string m_name = ""
	CVattachment[] m_attachments = 
	[
		CVattachment
		{
			string m_name = "test"
			CVattachmentInfluence[] m_influences = 
			[
				CVattachmentInfluence
				{
					string m_influenceName = "spine1"
					float(3) m_vTranslationOffset = ( 0.000000, 0.000000, 0.000000 )
					float(3) m_vRotationOffset = ( 0.000000, 0.000000, 0.000000 )
					float m_flWeight = 1.000000
					bool m_bRoot = false
				}
			]
		}
	]
}
=== CVattachmentList===
Attribute 	Friendly Name	Description 	Type 	Default Value
属性 	易记名称 	描述 	类型 	默认值
m_name 	Name 	附着点列表名称 	string 	
m_attachments	Attachments 	CVattachment元素的列表 	CVattachment[]	
=== CVattachment ===
附着点数据的解释：
Attribute 	Friendly Name	Description 	Type 	Default Value
属性 	易记名称 	描述 	类型 	默认值
m_name 	Name 	附着点列表的名称 	string 	
m_influences	Influences 	CVattachmentInfluence元素的列表 	CVattachmentInfluence[]	
=== CVattachmentInfluence ===
对influence数据的解释：
Attribute 	Friendly Name 	Description 	Type 	Default Value
属性 	易记名称 	描述 	类型 	默认值
m_influenceName 	Influence Name	influence的名称 	string 	
m_vTranslationOffset	Translation 	influnce的平移 	float(3)	( 0.000000, 0.000000, 0.000000 )
m_vRotationOffset 	Rotation 	influnce的旋转 	float(3)	( 0.000000, 0.000000, 0.000000 )
m_flWeight 	Weight 	influence的weight 	float 	1.0
m_bRoot 	Is Root 	是否是模型的root 	bool 	true
Category:VMDL
Category:Dota 2 Workshop Tools
Category:AMHC 汉化
Zh/Dota 2 Workshop Tools/VMDL/Hitboxes

Hitboxes是和关节的母骨架匹配的有边界的盒子。他们被游戏中许多系统使用，包括但不限于 击中检测，[译存疑]角色/特性 选择(character selection)和粒子发射。
== 显示 ==
* 开关hitbox显示： Display > Hit Boxes。
* 开关hitbox名称显示： Display->Hit Box Names。
* 如果存在多个设置， Display->Sets 允许通过名字来开关是否显示。
== 创建 ==
* 右键单击一个大纲(outliner)中的关节项并选择Add Hitbox。
* 使用 菜单选项。
== 编辑 ==
* 当一个hitbox在视窗或大纲中被选择时，gizmo便可以使用了。使用gizmo来调整hitbox的尺寸。有两种可使用的模式：调整和box调整。
* 当hitbox被选择时，其可编辑的属性可以通过属性编辑器编辑。
== 数据结构(Data Structures) ==
VMDL hitbox的数据结构如下：
CVhitBoxSetListReference[] m_pHitBoxSetLists = 
[
	CVhitBoxSetListReference
	{
		CVhitBoxSetList* m_pObject = &CVhitBoxSetList_0
		string m_sFileName = ""
	}
]
=== m_pHitBoxSetLists ===
CVhitBoxSetListReference中元素的列表。
=== CVhitBoxSetListReference ===
对内部或外部CVhitBoxSetList的参考：
Attribute 	Friendly Name	Description 	Type 	Default Value
属性 	易记名称 	描述 	类型 	默认值
m_pObject 	 	内部CVhitBoxSetList的指针 	CVhitBoxSetList*	
m_sFileName	 	外部CVhitBoxSetList的有关路径 	string 	
hitbox配置列表如下：
CVhitBoxSetList CVhitBoxSetList_0
{
	CVhitBoxSet[] m_HitBoxSets = 
	[
		CVhitBoxSet
		{
			string m_name = "default"
			CVhitBox[] m_HitBoxes = 
			[
				CVhitBox
				{
					string m_name = "spine_0"
					string m_sSurfaceProperty = ""
					int m_nGroupId = 0
					string m_sBoneName = "spine_0"
					float(3) m_vMinBounds = ( -3.769234, -4.263324, -6.618944 )
					float(3) m_vMaxBounds = ( 5.111142, 5.840798, 6.613623 )
					uint(4) m_cRenderColor = ( 0, 0, 0, 0 )
				},
				CVhitBox
				{
					string m_name = "head_0"
					string m_sSurfaceProperty = ""
					int m_nGroupId = 0
					string m_sBoneName = "head_0"
					float(3) m_vMinBounds = ( -3.821239, -3.392044, -3.581856 )
					float(3) m_vMaxBounds = ( 6.065765, 5.141216, 3.582397 )
					uint(4) m_cRenderColor = ( 0, 0, 0, 0 )
				}
			]
		}
	]
}
=== CVhitBoxSetList===
包含CVhitBoxSet中元素的列表。
=== CVhitBoxSet ===
包含CVhitBox中元素的列表：
Attribute	Friendly Name	Description 	Type 	Default Value
属性 	易记名称 	描述 	类型 	默认值
m_name 	Name 	hitbox的名称 	string	
=== CVhitBox ===
hitbox数据的解释：
Attribute 	Friendly Name 	Description 	Type 	Default Value
属性 	易记名称 	描述 	类型 	默认值
m_name 	Name 	hitbox的名称 	string 	
m_sSurfaceProperty	Surface Property	表面属性属于hitbox 	string 	
m_nGroupId 	Group ID 	组ID，被游戏代码用于查询 	int 	0
m_sBoneName 	Parent Bone 	母关节的名称 	string 	
m_vMinBounds 	Min 	hitbox的最小边界 	float(3)	< 0, 0, 0 >
m_vMaxBounds 	Max 	hitbox的最大边界 	float(3)	< 0, 0, 0 >
Category:VMDL
Category:Dota 2 Workshop Tools
Category:AMHC 汉化
Zh/Dota 2 Workshop Tools/VMDL/Internal External References

VMDL文件可以在其 内部(internally) 和 外部(externally) 存储数据。
内部引用被写入VMDL文件，与此同时外部引用就是一个联系外部文件的关联通道。
当你想要在模型间分享数据时，使数据外部化就很有用。例如，如果有字符带有分享的附着点，则每个特征VMDL文件可以联系到一个外部的附着点列表。当那个附着点列表被编辑后，所有有联系的VMDL文件都会得到更新。
== 利用模型编辑器 ==
在的大纲(Outliner)中，右键点击一个项目，在菜单中选择“外部化(made external)”，数据就被写出为一个分离的文件，然后VMDL文件会引用那个新的文件。
Category:VMDL
Category:Dota 2 Workshop Tools
Category:AMHC 汉化
Zh/Dota 2 Workshop Tools/VMDL/LodGroup

LOD（细节等级）群组是一种网格形状(模型)的组合，并且根据显示在屏幕上的近远设置他们的显示。使用LOD群组的主要原因是用于提升性能，当摄像头离模型越来越远，高精度的模型 将会切换成 更低精度的模型。
== 显示 ==
* LOD群组在大纲中的LOD群组列表(LOD Group List)下。选择一个LOD项目会切换到那个处于视窗里的LOD。
* LOD菜单也提供了切换到LOD's的入口。
** 设置成 AutoLod 可以模拟引擎 根据摄像头的远近切换LOD。
== 创建 ==
* 使用 来创建LOD群组。
== 编辑 ==
* LOD群组在大纲中的 LOD群组列表(LOD Group List) 下。
* 在属性编辑器中，选择 LOD群组列表(LOD Group List) 中的绿色 + 按钮来添加新的群组。
* 在属性编辑器中，选择一个LOD项目来编辑。
== 数据结构(Data Structures) ==
VMDL的LOD群组数据如下：
CVLODGroupListReference m_pLodGroupList = CVLODGroupListReference
{
	LODGroupList_t* m_pObject = &LODGroupList_t_0
	string m_sFileName = ""
}
=== m_pLodGroupList === 
VMDL中LODGroupList_t的参考：
Attribute 	Friendly Name	Description 	Type 	Default Value
属性 	易记名称 	描述 	类型 	默认值
m_pObject 	 	LODGroupList_t的指针 	LODGroupList_t*	
m_sFileName	 	外部lod group list的有关路径 	string 	
=== LODGroupList_t ===
在VMDL中LODGroup_t的元素列表如下：
LODGroupList_t LODGroupList_t_0
{
	LODGroup_t[] m_lodGroups = 
	[
		LODGroup_t
		{
			int m_flSwitchDistance = 0
			string[] m_meshList = 
			[
				
			]
		},
		LODGroup_t
		{
			int m_flSwitchDistance = 0
			string[] m_meshList = 
			[
				
			]
		}
	]
}
=== LODGroup_t ===
Attribute 	Friendly Name 	Description 	Type 	Default Value
属性 	易记名称 	描述 	类型 	默认值
m_flSwitchDistance	Switch Distance	当LOD激活后转变的距离 	int 	0
m_meshList 	Mesh List 	与此组相关联的网格名称列表 	string[]	
Category:VMDL
Category:Dota 2 Workshop Tools
Category:AMHC 汉化
Zh/Dota 2 Workshop Tools/VMDL/MaterialGroups

材质群组(Material Groups)提供了一种方式来对你的模型建立不同的材质，这些通常被称之为皮肤。
== 显示 ==
* 材质群组(Material Groups) 在大纲(outliner)中的 "材质群组列表(Material Group List)" 菜单下。 
* 选择材质组选项将切换到该材质组所在的视窗。
== 创建 ==
* 使用 菜单选项。
== 编辑 ==
* 添加材质群组：选择“材质群组列表(Material Group List)”项，在属性编辑器中按下绿色“+”按钮。
* 编辑材质群组：在大纲(outliner)中选择。
== 数据结构(Data Structures) ==
VMDL中LOD群组数据如下：
CVNodeMaterialGroupListReference m_pMaterialGroupList = CVNodeMaterialGroupListReference
{
	NodeMaterialGroupList_t* m_pObject = &NodeMaterialGroupList_t_0
	string m_sFileName = ""
}
=== m_pMaterialGroupList === 
VMDL中CVNodeMaterialGroupListReference的参考：
Attribute 	Friendly Name	Description 	Type 	Default Value
属性 	易记名称 	描述 	类型 	默认值
m_pObject 	 	指向 NodeMaterialGroupList_t 	NodeMaterialGroupList_t*	
m_sFileName	 	包含外部材质群组列表的相对路径 	string 	
=== NodeMaterialGroupList_t ===
一个NodeMaterialGroup_t元素列表。在VMDL中如下所示：
NodeMaterialGroupList_t NodeMaterialGroupList_t_0
{
	NodeMaterialGroup_t[] m_materialGroups = 
	[
		NodeMaterialGroup_t
		{
			string m_name = "default"
			string[] m_materialList = 
			[
				"models/sdk_character/materials/base.vmat",
 "models/sdk_character/materials/hair.vmat"
			]
		},
		NodeMaterialGroup_t
		{
			string m_name = "hair_green"
			string[] m_materialList = 
			[
				"models/sdk_character/materials/base.vmat",
 "models/sdk_character/materials/hair_green.vmat"
			]
		}
	]
}
=== NodeMaterialGroup_t ===
Attribute 	Friendly Name	Description 	Type 	Default Value
属性 	易记名称 	描述 	类型 	默认值
m_name 	Name 	材质群组名称 	string 	
m_materialList	Materials 	一个与该组关联的材质组路径（相对路径）列表 	string[]	
Category:VMDL
Category:Dota 2 Workshop Tools
Category:AMHC 汉化
Zh/Dota 2 Workshop Tools/VMDL/MaterialRemap

材质映射(Material Remap) 能够重置材质。
== 显示 ==
* 材质映射(Material Remap) 在大纲(outliner)中的"材质映射列表(Material Remap List)" 菜单下。
== 创建 ==
* 使用 菜单选项。
== 编辑 ==
* 添加材质映射：选择“材质映射列表(Material Remap List)”并在属性编辑中按下绿色的“+”按钮。
* 编辑材质映射：在大纲(outliner)中选择。
== 数据结构(Data Structures) ==
VMDL材质映射列表数据结构如下：
CVMaterialRemapList* m_pMaterialRemapList = &CVMaterialRemapList_0
=== m_pMaterialRemapList === 
VMDL的CVMaterialRemapList的指针。
=== CVMaterialRemapList ===
CVMaterialRemap的元素列表，如下：
CVMaterialRemapList CVMaterialRemapList_0
{
	CVMaterialRemap[] m_vMaterialRemapList = 
	[
		CVMaterialRemap
		{
			string m_sSearchMaterial = ""
			string m_sReplaceMaterial = ""
		}
	]
}
=== NodeMaterialGroup_t ===
Attribute 	Friendly Name	Description 	Type 	Default Value
属性 	易记名称 	描述 	类型 	默认值
m_name 	Name 	材质组的名字 	string 	
m_materialList	Materials 	与该组相关的材质列表路径（相对路径） 	string[]	
Category:VMDL
Category:Dota 2 Workshop Tools
Category:AMHC 汉化