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

在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:控制施法后是否允许战斗移动
相关推荐
code 小楊7 分钟前
Agent间如何高效协作?深度拆解A2A(Agent-to-Agent)协议
人工智能·架构·开源
code 小楊2 小时前
腾讯开源 WeKnora 深度解析:RAG 问答 + ReAct Agent 推理 + 自动 Wiki 图谱,三位一体的企业级知识中台
前端·人工智能·开源·知识图谱
微擎应用市场2 小时前
开源赋能丨微擎面板(W7Panel)产品介绍说明
开源
martindelophy2 小时前
开源 AI 视频编辑器实战:用 Manifest + Adapter 构建可扩展的生成插件系统
人工智能·开源·音视频
2601_958736993 小时前
2026年电视盒子选购指南:300元以内配置参数对比与TVBox/影视仓兼容性分析
智能手机·开源
m4Rk_3 小时前
【论文阅读】Agent 记忆机制(59):Synapse——让相关记忆沿情景—语义图被逐步激活
论文阅读·人工智能·学习·开源·github
分布式存储与RustFS3 小时前
用 RustFS 原生 CLI `rc` 管对象存储:从 alias 到 cp 的完整玩法
云原生·开源·对象存储·分布式存储·s3·rustfs·性能基准
分布式存储与RustFS4 小时前
用 RPM/DEB 包在 Linux 上安装 RustFS:生产落地第一步
云原生·开源·对象存储·分布式存储·s3·rustfs·性能基准
是Yu欸4 小时前
实测openPangu-2.0-Pro:昇腾原生, 505B大模型的开源答卷
人工智能·开源·大模型·昇腾·pangu
龙亘川5 小时前
免费开源丨统一决策分析系统 综合态势功能的实现机理与技术难度
人工智能·信息可视化·开源·智慧城市·#后台开发