创建类Dota地图
首先我们创建一张最基础的单路Dota地图来熟悉原版地图里的一些游戏内容。完成本章教程之后,你将创建出一张与 simple_dota_map_example.vmap一模一样的dota_PVP自定义地图。如无法完成本章练习,或许你应该先进行 Hammer:入门指南 的学习。
Contents
启动创意工坊工具
启动创意工坊工具后,选择 dota_pvp 选项,点击 Create New Addon From Existing Addon(在已有地图基础上创建自定义地图)。 这样就可以以 dota_pvp 原图为基础,创建一张可进行修改的副本地图。每张 dota_pvp 地图都带有一份名为 addon_game_mode.lua 的脚本文档,地址位于 .../[your_addon_name]/scripts/vscripts 。该文档中存有关于防御塔是否可被攻击的状态信息,这些我们在后面都会用到。
打开示例地图
在自己创建地图之前,首先在 dota_addons/[your_addon_name]/maps 文件夹中打开名为 simple_dota_map_example.vmap 的示例地图。这是一张简单的单路地图,包含泉水、遗迹、兵营、防御塔、商店、两个神符刷新点、肉山刷新点、肉山相关的各种实体以及一个野怪刷新点。如果你在接下来的教程中遇到了任何问题,你可以查看这张实例地图中的实体以及它们的属性和位置,并与你创建的地图进行对比。
创建你的地图
在Hammer中创建一张新的地图,按下 ⇧ Shift+C 切换至地形编辑工具以生成地形网格。保存生成好的地图,同时牢记在练习过程中要定期进行保存。图中大部分内容为预设实体,只要较少的地方会用到点实体和网格实体。
基础实体
在 资源(Assets) 面板中点击 预设(Prefabs) 选项卡。 并将 basic_entities_radiant(天辉基础实体) 和 basic_entities_dire(夜魇基础实体) 两个预设实体拖拽至地形网格中。天辉/夜魇实体中自带包括玩家出生点在内的多项核心游戏实体,后续无需使用基础实体对其进行更多预设。
这么做的好处在于天辉/夜魇方玩家的出生地点被限制在了完全不同的两块预设区域内,无需对任何预设进行分解处理即可让两个阵营的玩家在其各自基地内进行重生。
![Note.png](/w/images/thumb/c/cc/Note.png/10px-Note.png)
遗迹
在 预设(prefab)选项卡中将 structure_ancient_radiant 拖拽至屏幕中临近 basic_entities_radiant 预设的位置,从而使其靠近天辉玩家出生点。打开 structure_ancient_radiant 的属性 (Alt+↵ Enter),可以看到该预设 名称(Name) 已被设为 "dota_goodguys_fort" ,这是它在Dota2游戏中的字符串。
将 Target Name 设为 "ancient_radiant",这相当于它在系统中的“代号”。将 Vulnerable On Creep Spawn 设为 "No" ,这样我们就能后面通过状态转移功能来移除建筑物的无敌状态。最后,将 Invulnerability Link Count 设为1。
下面用同样的方法来设置夜魇遗迹:将 structure_ancient_dire 拖拽至地图上临近 basic_entities_dire 的位置、将其 Target Name 修改为 "ancient_dire"、将 Vulnerable On Creep Spawn 设为 "No" ,然后把 Invulnerability Link Count 数值改为1。
![Note.png](/w/images/thumb/c/cc/Note.png/10px-Note.png)
防御塔
这次我们要创建的是一张只有一条兵线、天辉/夜魇各2座防御塔的地图。首先,我们来创建天辉防御一塔。在正式版DOTA地图中,各条兵线上位置最靠外的防御塔被成为防御一塔,而靠近基地的防御塔则被成为高地塔。
天辉防御一塔
将 structure_tower_radiant 预设拖拽至地图中,同时对其进行下列设置:
- Target Name = "tower_radiant_mid_1"
- TowerLocation = "middle_tier_1"
Target Name 是我们运用状态转移(i/o)来对不同建筑进行“牵线”的关键。而 TowerLocation = "middle_tier_1" 则代表该防御塔是我们在中路的第一座防御塔。 TowerLocation's 相当于不同防御塔在后台中的代码,方便游戏来进行逻辑处理(此处我们设为: npc_dota_goodguys_tower1_mid)。
天辉防御二塔
将 structure_tower_radiant 预设再次拖动到地图中,同时对其进行下列设置:
- Target Name = "tower_radiant_mid_2"
- Vulnerable On Creep Spawn = "No"
- Invulnerability Link Count = "1"
- TowerLocation = "middle_tier_2"
Vulnerable On Creep Spawn = "No" (即防御塔在实体状态触发之前不可被攻击。在配置防御一塔属性时,该选项应选作“Yes”) 这样,天辉防御二塔就设置好了。
夜魇防御一塔
将 structure_tower_dire 预设拖入地图,同时对其进行下列设置:
- Target Name = "tower_dire_mid_1"
- TowerLocation = "middle_tier_1"
夜魇防御二塔
同之前的操作一样,再次拖动 structure_tower_dire 预设来创建夜魇防御二塔:
- Target Name = "tower_dire_mid_2"
- Vulnerable On Creep Spawn = "No"
- Invulnerability Link Count = "1"
- TowerLocation = "middle_tier_2"
状态转移(Entity I/O) - 第一部分
下面我们来设置之前提到过的“状态转移”,这样防御二塔的无敌状态就会在一塔被破之后正确移除。
天辉防御一塔Output(输出状态)设置
具体操作为:选择天辉防御一塔、打开属性菜单、在Output面板中选择“add”(新增)一个输出。 该输出属性分别为:
- My output named: "OnTowerKilled"
- Target entities named: "tower_radiant_mid_2"
- Via this input: "ReduceInvulnCount"
一旦防御一塔被摧毁 (OnTowerKilled),系统就会将 ReduceInvulnCount 指令发送至防御二塔 ("tower_radiant_mid_2")以移除其无敌状态。
(如减少 "Invulnerability Link Count" 从1到0。)
夜魇防御一塔Output(状态输出)设置
选择夜魇防御一塔并对其进行下列设置:
- My output named: "OnTowerKilled"
- Target entities named: "tower_dire_mid_2"
- Via this input: "ReduceInvulnCount"
兵营
天辉中路兵营
将 structure_barracks_melee_radiant 预设拖入地图,并将其固定在天辉二塔的后方。确定好位置后,对该预设属性进行下列修改:
- Target Name = "barracks_melee_radiant_middle"
- Vulnerable On Creep Spawn = "No"
- Invulnerability Link Count = "1"
- Barracks Location = "middle"
夜魇中路兵营
同天辉一样,将 structure_barracks_melee_dire 预设拖入地图并对其进行下列设置:
- Target Name = "barracks_melee_dire_middle"
- Vulnerable On Creep Spawn = "No"
- Invulnerability Link Count = "1"
- Barracks Location = "middle"
小兵出生点及行进路线
按下 ⇧ Shift+E 切换至Entity Tool(实体工具面板)
天辉小兵
首先我们要对天辉方小兵进行创建。我们将确定天辉小兵的刷新位置,指引他们向 第一路径点(First Waypoint)前进,进而指引其往 第二路径点(Second Waypoint) 行进。
将下列实体拖至地图中靠近天辉近战兵营的地方,同时对其进行相应设置。
小兵刷新点
将 npc_dota_spawner_good_mid 实体拖入地图,游戏中小兵就将在这个区域内进行刷新。现在,对该实体进行下列设置:
- Name = "lane_mid_goodguys_melee_spawner"
- First Waypoint = "lane_mid_pathcorner_goodguys_1"
值得一提的是,由于我们尚未创建First Waypoin(第一路径点),所以First Waypoint选项中所填写的名字将暂时显现为红色(实体系统无法识别)。待我们完成下一步创建“第一路径点”操作之后,该选项就会恢复为白色。
第一路径点
将 path_corner 实体拖入地图。Path类型的实体代表着小兵的行进路线。由于我们在创建小兵刷新点时已进行过相关设置,所以它将对path_corner路径进行自动识别。
- Name = "lane_mid_pathcorner_goodguys_1"
- Next stop target = "lane_mid_pathcorner_goodguys_2"
第二路径点
用移动工具 T 按住 ⇧ Shift+来将另一个path_corner实体拖入地图中靠近夜魇遗迹的地方,这样一条简化的、直线型的中路兵线就被设计好了。第二路径点的终点—夜魇遗迹—就是天辉小兵们最终的目的地。如果想要让路径变的更加曲折,试着在地图中多设置一些path_corners。
由于重复放置了path_corner实体,Hammer将自动把第二路径点的名字在属性中设置为“lane_mid_pathcorner_goodguys_2”。 刷新之后的天辉小兵将首先朝向第一路径点前进("lane_mid_pathcorner_goodguys_1"),抵达后则会继续向后一个路径点的方向前进("lane_mid_pathcorner_goodguys_2")。
分段节点
放置一个 info_target 一个info_target实体,这个实体是一个中途点,可以让小兵的移动速度随着时间变化。这个实体的唯一目的就是在让天辉和夜魇刷兵时(间隔:00 和:30秒),能够减少小兵之间的牵扯。你也不用考虑需要在哪儿放置这些分段节点,因为小兵不会受到影响,直到npc_dota_spawner_good_mid对刷新的小兵产生作用。
- Name = "npc_dota_spawner_good_mid_staging"
夜魇小兵
现在我们来创建夜魇小兵:
小兵刷新点
- Name = "lane_mid_badguys_melee_spawner"
- First Waypoint = "lane_mid_pathcorner_badguys_1"
第一路径点
- Name = "lane_mid_pathcorner_badguys_1"
- Next stop target = "lane_mid_pathcorner_badguys_2"
第二路径点
- Name = "lane_mid_pathcorner_badguys_2"
分段节点
- Name = "npc_dota_spawner_bad_mid_staging"
状态转移(Entity I/O) - 第二部分
下面我们来为实体设置逻辑,这样当防御二塔被摧毁之后,系统就会移除兵营和遗迹的无敌状态——就和DOTA2正规地图中一样。
天辉防御二塔Outputs(状态输出)设置
选择天辉防御二塔,打开Output面板,添加以下2个输出:
- My output named: OnTowerKilled
- Target entities named: "barracks_melee_radiant_middle"
- Via this input: "ReduceInvulnCount"
- My output named: OnTowerKilled
- Target entities named: "ancient_radiant"
- Via this input: "ReduceInvulnCount"
这样当天辉防御二塔被摧毁之后,系统就会移除天辉兵营和天辉遗迹的无敌状态。
夜魇防御二塔Outputs(状态输出)设置
按照同样的方法,对天灾防御二塔的状态输出进行设置:
- My output named: OnTowerKilled
- Target entities named: "barracks_melee_dire_middle"
- Via this input: "ReduceInvulnCount"
- My output named: OnTowerKilled
- Target entities named: "ancient_dire"
- Via this input: "ReduceInvulnCount"
![Note.png](/w/images/thumb/c/cc/Note.png/10px-Note.png)
泉水
将 structure_fountain_radiant 预设拖入地图,并将其安置在靠近 basic_entities_radiant 预设的地方,这就是我们的天辉泉水。该泉水 Team Number 已被预设为“Good Guys”,Unit Name也已被预设为“dota_fountain”,因此可以正常工作,无须我们对其属性进行额外设置。完成后,用同样的方法将 structure_fountain_dire 预设拖入地图中靠近 basic_entities_dire 预设的区域内。
商店
商店预设有三种Shop Type(类型)可供选择,分别为“Home(基地内)”、“Side(边路)”以及“Secret(神秘商店)”。将shop_" prefabs预设拖至地图中靠近天辉泉水的区域内,同时将其Shop Type设为“Home”。完成后,按同样的方法设置夜魇方商店。
然后是野外商店。分别将两个 shop_keeper_radiant 预设拖至地图中靠近天辉/夜魇方的任意区域内,同时将其 Shop Type 类型设置为“Secret”。它们就是我们在游戏中经常会光顾的“野外商人”。
![Note.png](/w/images/thumb/c/cc/Note.png/10px-Note.png)
神符
分别将两个神符预设拖到地图中的任意位置。值得一提的是,你可以再地图中设置任意数量的神符刷新点。
野点
将 neutral_camp 预设拖入地图中,其中包含有野怪刷新点以及相关的触发器网格。触发器网格的大小决定着玩家、守卫以及其他单位组织野怪刷新的范围大小。
- 将预设中野怪刷新点以及触发器的Volume Name都设为“neutral_camp_01”(触发器中的Volume Name会因系统运行的原因而变红,但不会影响该功能的正常运行)。由于刷新点和触发器被设置为了相同的名字,因此该野点位置的野怪刷新状态能够交由触发器网格来进行判断。
- Camp Type(野怪类型)共有四种可供选择,分别为“Easy(小)”、“Moderate(中)”、“Hard(大)”以及“Ancient(远古)”。
这样野点功能就设置好了,接下来就需要用 Tile Editor 为其添加“模型”。
![Note.png](/w/images/thumb/c/cc/Note.png/10px-Note.png)
肉山
肉山刷新点
想要将肉山添加到地图中,首先按下 ⇧ Shift+E 切换至Entity Tool,然后将 npc_dota_roshan_spawner 实体拖至地图内。肉山的刷新正是由这一实体所控制的。
设定肉山可被攻击的范围
首先要明确的是,英雄只能站在特定区域内才能对肉山进行物理攻击(该设定只限于普通攻击,不包括技能的释放。你可以站在任意位置对肉山释放技能)。
要设定肉山可被攻击的区域,首先按下 ⇧ Shift+B 切换至模块工具(Block Tool),创建出一个带有trigger材质的网格,然后选中网格按下 Ctrl+T以将其转换成实体网格。将它改成 trigger_boss_attackable(可攻击触发器)实体。然后按下区域旁边+号打开它的Spawnflag(也可以双击Spawnflag那一行)。之后勾选上Everything (not including physics debris)旁边的选框,留空Clients和Correctly account for object mass....。
调整 trigger_boss_attackable 网格的边缘,用来限定玩家只能在这些区域能右键物理攻击Roshan。
肉山区域视野隔断
想要阻止玩家从肉山区域外查看区域内的视野,我们就需要用到视野阻隔器。按下 ⇧ Shift+E 切换至Entity Tool,将 ent_fow_blocker_node 实体拖拽至 npc_dota_roshan_spawner 实体附近。
按下 Ctrl+Q 激活导航网格,切换至移动工具并将 ent_fow_blocker_node 移至导航方块区域的中心位置。此时你需要将grid-snap设置为32个单位。
把你的grid-snap切换到64个单位,然后用 ⇧ Shift 和方向键复制ent_fow_blocker_node。让这些实体在肉山刷新点周围围成一个圈,保证每个导航方块里都有一个node节点。这将人为地在肉山范围内创造出战争迷雾—只有走进去你才能知道里面有些什么。
为了保证可视效果,在转到下一个部分前按 Ctrl+Q 关闭导航网格。
![Note.png](/w/images/thumb/c/cc/Note.png/10px-Note.png)
禁止安放守卫
我们可以使用特殊触发器网格来阻止玩家在某片区域内安插守卫。DOTA正规地图中正是通过这一功能来阻止玩家在悬崖边缘、各种模型内部(例如商店模型等)以及肉山区域内安插守卫。
按下快捷键 ⇧ Shift+B 切换至Block Tool,创建一块与ent_fow_blocker_node实体大小相仿的地图网格,然后按下 Ctrl+T 来对该区域进行 trigger_no_wards 实体网格的填充。打开SpawnFlags,然后在 Everything (not including physics debris) 选项前的方框内打勾,同时取消Clients和Correctly account for object mass两项内容前的对勾。
地图的编辑和运行
完成上述操作后,你已经创建好标准DOTA PVP地图中所有该有的元素了。如果想要创建更多条分路,你可以打开dota_pvp_tiled.vmap文件来查看上路和下路防御塔、兵营以及小兵实体所对应的游戏内名称。
保存地图后,按 F9 打开建图对话框,勾选所有,然后点击Build。如果游戏内小地图无法正常加载,尝试在控制台中输入“map [这张地图的名字]”以及“jointeam good”,然后重现加载地图。
![Note.png](/w/images/thumb/c/cc/Note.png/10px-Note.png)