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

在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:控制施法后是否允许战斗移动
相关推荐
ClouGence5 小时前
PostgreSQL 同步到 Iceberg:开源、私有部署与 SaaS 方案对比
数据库·postgresql·开源
tedcloud1235 小时前
book-to-skill 怎么部署?把技术书和文档转换成可复用的 AI Skill
运维·服务器·人工智能·开源·ai编程
fthux6 小时前
不必下载整个仓库:GitZip Pro 让 GitHub 文件与文件夹批量下载更简单
前端·chrome·ai·edge·开源·github·firefox
Marco_Marco1357 小时前
开源地图API vs 商业地图API:选型全对比
经验分享·开源
ClouGence8 小时前
数据库管理工具 CloudDM 4.1.0 发布,支持达梦、Cloudberry
数据库·开源
云卷云舒___________8 小时前
【加急快讯】DeepSeek Harness 深夜开源!主打「一切皆插件」,由 Cordis 驱动
开源·aiagent·deepseek·ai日报·智能体框架·deepseekharness·cordis
zlinear数据采集卡8 小时前
ZLinear产品线全景对比:D223 vs DABL7606 vs DABL-G511选型指南
arm开发·嵌入式硬件·算法·fpga开发·开源
sibylyue11 小时前
工作流表单和流程设计前端
开发语言·javascript·开源
2401_8949155311 小时前
新手落地 Geo 优化:源码下载、依赖安装、数据库初始化完整步骤
运维·服务器·数据库·人工智能·缓存·开源
fthux12 小时前
装闭 RenoPit 源码解析(08):多模态AI调用、重试与文本降级
人工智能·ai·开源·github·open source·renopit