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

在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:控制施法后是否允许战斗移动
相关推荐
openEuler社区20 分钟前
2026年度openEuler社区贡献之星评选启动!
开源·openeuler
qq_401700411 小时前
CAN 开源库大全(嵌入式/上位机,适配STM32、Linux、Qt,附带Github地址)
linux·stm32·开源
自律懒人1 小时前
REA 从零上手:81K Star 逆向工具,5 步接进 AI 编程 Agent
开源
java_logo1 小时前
Docker 部署 Halo:轻松搭建开源个人博客
docker·容器·开源·博客·开源博客·halo·轩辕镜像
一次旅行1 小时前
2026.10.13 AI产业深度解读|硬件互联标准更新;Agent工程启示;开源社区AI政策转向;游戏与科研AI双线突破
人工智能·游戏·开源
SL_staff1 小时前
OKR落地难?技术团队如何用五层联动链打通执行断层
java·开源·全栈
用户117910488332 小时前
每个会话一个子进程:多会话真并行的架构取舍
开源·harmonyos
TTATTC2 小时前
定时增量每 5 秒全表扫一遍?我用 DBSyncer 跑了三组对照实验才找到原因
docker·开源
shandianchengzi2 小时前
【开源自制工具】为演唱会做了一个取景器:提前算清放大倍数、裁切像素和手机镜头选择
智能手机·开源·手机·摄影·镜头·增距镜·望远镜
TTATTC2 小时前
42 个 OpenClaw 落地案例按权限分五档:先从哪一档搭起最不容易翻车
docker·开源