工作原理
Invisibility系统基于两种类型实现:
- InvisibilityType:定义不同类型的隐身效果
- StealthType:定义不同类型的潜行效果
系统通过Unit类中的m_invisibility和m_invisibilityDetect成员变量跟踪隐身和侦测状态。
实现逻辑
-
隐身类型(InvisibilityType)包括:
- 通用隐身(INVISIBILITY_GENERAL)
- 陷阱隐身(INVISIBILITY_TRAP)
- 醉酒隐身(INVISIBILITY_DRUNK)
- 任务特定隐身(INVISIBILITY_QUEST_ZONE_SPECIFIC_1-29)
-
潜行类型(StealthType)包括:
- 通用潜行(STEALTH_GENERAL)
- 陷阱潜行(STEALTH_TRAP)
-
核心处理函数:
HandleModInvisibility()
:处理隐身效果的添加和移除HandleModInvisibilityDetect()
:处理隐身侦测效果的添加和移除HandleModStealth()
:处理潜行效果的添加和移除HandleModStealthDetect()
:处理潜行侦测效果的添加和移除
-
隐身状态管理:
- 使用标志位跟踪当前激活的隐身类型
- 使用数值跟踪隐身强度
- 通过UNIT_VIS_FLAGS_INVISIBLE和UNIT_VIS_FLAGS_STEALTHED标志控制可见性
使用场景
- 潜行技能:盗贼、德鲁伊等职业的潜行能力
- 隐身法术:法师的隐形术等
- 任务机制:需要隐身或潜行完成的任务目标
- 怪物技能:某些怪物的隐身或潜行能力
- 物品效果:提供隐身或侦测能力的装备
各种隐身类型与Creature的交互效果
1. 通用隐身 (INVISIBILITY_GENERAL)
这是最常见的隐身类型,法师的"隐形术"就属于此类。
交互效果:
- 玩家/生物在通用隐身状态下,无法被未具备侦测能力的单位看见
- 需要具备相应侦测能力才能发现隐身单位
- 侦测能力不足时,无法攻击、施法或进行任何交互
- 可以通过范围攻击击中(如AOE技能),但无法精确选择为目标
2. 陷阱隐身 (INVISIBILITY_TRAP)
主要用于陷阱类物体。
交互效果:
- 通常只有特定单位(如猎人)可以侦测
- 普通玩家和生物无法看见,除非靠近触发
- 无法直接攻击或交互,但可能被范围攻击波及
3. 醉酒隐身 (INVISIBILITY_DRUNK)
用于醉酒状态相关效果。
交互效果:
- 特殊类型的隐身,通常与玩家状态相关
- 可能影响玩家的可见性,但不是完全隐身
4. 任务区域特定隐身 (INVISIBILITY_QUEST_ZONE_SPECIFIC_1-29)
这些隐身类型通常用于特定任务或区域效果。
交互效果:
- 通常需要特定任务状态或区域条件才能侦测
- 用于实现任务相关的隐藏机制
- 无法被普通侦测手段发现
实际交互效果总结
对于每种隐身类型,玩家与Creature的交互效果:
-
看不见但可以被范围攻击击中
- 当玩家或Creature处于隐身状态且未被侦测时,它们对其他单位是不可见的
- 但是范围攻击(如AOE技能)仍可能影响到它们
- 这是因为范围攻击不依赖视觉目标选择
-
无法直接攻击或交互
- 无法通过常规方式选中隐身单位为目标
- 无法进行右键点击交互
- 无法进行普通攻击
-
需要相应侦测能力
- 要能看见并攻击隐身单位,必须具备相应类型的侦测能力
- 侦测能力值必须大于或等于隐身值
- 有些NPC天生具备侦测特定类型隐身的能力
-
潜行单位的特殊性
- 潜行单位在背后无法被看见
- 距离过近可以直接被看见
- 等级差会影响侦测能力
注意事项
- 隐身和侦测是相互对抗的系统,侦测值需要高于隐身值才能发现目标
- 不同类型的隐身需要对应的侦测类型才能发现
- 隐身状态下仍然可以通过特定机制被发现,如范围攻击、特定法术等
- 玩家进入隐身状态时会中断多数施法和攻击动作
- 隐身状态下的玩家不能进行大多数交互操作