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

在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:控制施法后是否允许战斗移动
相关推荐
仿生狮子1 小时前
怎么给CC上下文窗口免费扩容?
开源·claude·vibecoding
lularible3 小时前
从沙子到车辙(7.4):《兰亭集序》的启示
开源·嵌入式·汽车电子
Soari4 小时前
开源项目解析 openmed —— 面向医疗智能应用的 OpenMed 开源平台
开源
DisonTangor6 小时前
谷歌开源首个扩散大语言模型——DiffusionGemma
人工智能·语言模型·自然语言处理·开源·aigc·transformer
冬奇Lab7 小时前
每日一个开源项目(第129篇):OpenMed - 永不离开设备的医疗 NLP
人工智能·开源·资讯
设计师小聂!7 小时前
宝塔 Linux 面板保姆级教程
linux·mysql·开源·运维开发
一拳小和尚LXY10 小时前
用户反馈管理系统横向对比:Canny vs Featurebase vs Fider vs FeedLog(2026 开源选型指南)
开源
咖啡星人k12 小时前
MonkeyCode 开源协作指南:如何让分布式团队高效使用AI编程
分布式·开源·ai编程·monkeycode
AndrewHZ13 小时前
【LLM技术全景】开源大模型生态:如何选择适合你的基座模型?
人工智能·深度学习·语言模型·开源·llm·transformer·基座模型
江湖有缘14 小时前
Docker部署开源LinkAI大模型安全接入网关服务平台
安全·docker·开源