法术施放选择目标逻辑概述
在TrinityCore中,法术目标选择分为显式目标选择(Explicit Target Selection)和隐式目标选择(Implicit Target Selection)两种方式。
显式目标选择(Explicit Target Selection)
显式目标选择是指通过SpellCastTargets类指定的目标,这些目标通常来自客户端发送的施法请求,或者是脚本明确指定的目标。
实现细节
SpellCastTargets类
- 该类存储施法时的所有目标信息,包括单位目标、物品目标、地面目标等
- 使用位标志(targetMask)来标识目标类型(TARGET_FLAG_UNIT、TARGET_FLAG_GAMEOBJECT等)
SelectExplicitTargets方法
- 在Spell::SelectSpellTargets方法中首先被调用
- 主要处理显式目标的重定向,例如当目标被嘲讽或有其他减益效果时
- 支持魔法和物理攻击的目标重定向(如接地图腾可以重定向魔法攻击)
隐式目标选择(Implicit Target Selection)
隐式目标选择是指根据法术效果的隐式目标类型自动选择目标的过程。这是法术系统中最复杂的部分。
实现细节
SelectSpellTargets方法
- 这是整个目标选择过程的入口点
- 首先调用SelectExplicitTargets处理显式目标
- 然后遍历所有法术效果,为每个效果选择隐式目标
SelectEffectImplicitTargets方法
- 根据目标类型分类处理不同类型的目标选择:
- TARGET_SELECT_CATEGORY_CHANNEL:处理频道法术目标
- TARGET_SELECT_CATEGORY_NEARBY:处理附近目标
- TARGET_SELECT_CATEGORY_CONE:处理扇形区域目标
- TARGET_SELECT_CATEGORY_AREA:处理区域目标
- TARGET_SELECT_CATEGORY_TRAJ:处理轨迹目标
- TARGET_SELECT_CATEGORY_LINE:处理线性目标
- 根据目标类型分类处理不同类型的目标选择:
各种目标选择方法
- SelectImplicitChannelTargets:处理频道法术目标
- SelectImplicitNearbyTargets:处理附近目标选择
- SelectImplicitConeTargets:处理扇形区域目标
- SelectImplicitAreaTargets:处理区域目标
- SelectImplicitTrajTargets:处理轨迹目标
- SelectImplicitLineTargets:处理线性目标
目标类型系统
TrinityCore使用一个复杂的目标类型系统来定义法术效果的目标:
SpellImplicitTargetInfo类
- 定义了所有可能的目标类型(TARGET_UNIT_CASTER、TARGET_UNIT_NEARBY_ENEMY等)
- 每个目标类型都有相关的属性,如选择类别、参考类型、对象类型、检查类型等
目标类型分类
- TARGET_SELECT_CATEGORY_DEFAULT:默认选择
- TARGET_SELECT_CATEGORY_NEARBY:附近目标
- TARGET_SELECT_CATEGORY_CONE:扇形区域
- TARGET_SELECT_CATEGORY_AREA:区域目标
- TARGET_SELECT_CATEGORY_TRAJ:轨迹目标
- TARGET_SELECT_CATEGORY_LINE:线性目标
SmartAI中的法术施放目标选择
在SmartAI系统中,法术施放目标选择更加灵活,可以通过SMART_ACTION_CAST,SMART_ACTION_SELF_CAST,SMART_ACTION_CROSS_CAST,SMART_ACTION_INVOKER_CAST等动作配合SMARTAI_TARGETS来控制:
targetsLimit参数
- 可以限制施法时选择的目标数量
- 使用Trinity::Containers::RandomResize方法随机选择目标
自定义最大目标数量(还未实现)
- 可以通过unitRange.maxSize或unitDistance.maxSize来覆盖法术默认的MaxAffectedTargets
- 使用CastSpellExtraArgs::AddSpellMod方法设置SPELLVALUE_MAX_TARGETS
SMARTCAST标志
- SMARTCAST_AURA_NOT_PRESENT:只对没有特定光环的目标施法
- SMARTCAST_INTERRUPT_PREVIOUS:施法前打断当前施法
- SMARTCAST_COMBAT_MOVE:控制施法后是否允许战斗移动
