法术施放选择目标逻辑概述

在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:控制施法后是否允许战斗移动
相关推荐
eguid_17 小时前
【开源项目分享】JNSM1.2.0,支持批量管理的jar包安装成Windows服务可视化工具,基于Java实现的支持批量管理已经安装服务的可视化工具
java·开源·jar·1024程序员节·windows服务·jar包安装成服务·exe安装成服务
周杰伦_Jay12 小时前
【常用设计模式全解析】创建型模式(聚焦对象创建机制)、结构型模式(优化类与对象的组合关系)、行为型模式(规范对象间的交互行为)
设计模式·架构·开源·交互·1024程序员节
周杰伦_Jay13 小时前
【Elasticsearch 全解析】分布式搜索引擎的原理、实践与优化
大数据·分布式·elasticsearch·架构·开源·1024程序员节
星空的资源小屋16 小时前
Antares SQL,一款跨平台开源 SQL 客户端
数据库·人工智能·pdf·开源·电脑·excel·1024程序员节
DisonTangor19 小时前
【2B篇】阿里通义 Qwen3-VL 新增 2B、32B 两个模型尺寸,手机也能轻松运行
人工智能·计算机视觉·语言模型·开源·aigc
Knight_AL20 小时前
Spring Boot 实现 DOCX 转 PDF(基于 docx4j 的轻量级开源方案)
spring boot·pdf·开源
CoderJia程序员甲1 天前
GitHub 热榜项目 - 日榜(2025-10-23)
ai·开源·大模型·github·ai教程
FlagOS智算系统软件栈1 天前
与创新者同频!与FlagOS共赴开源之约
人工智能·ai·开源