本帖最后由 吾奶常煽赵子龙 于 2025-7-30 12:46 AM 编辑
之前一篇文章介绍了一种不太完美的统计周围怪物数量的方法。里面我们判断sourceGUID/destGUID是怪物还是自己或队友的方法是遍历队伍/团队成员的GUID,这种方式是我们最容易想到的,但是很笨。
其实有更加简单的方法,就是通过sourceFlags/destFlags来判断(后面统称flags)。
注意:这里讲的标志位结构是基于3.3.5版本的。
注意:这里讲的标志位结构是基于3.3.5版本的。
注意:这里讲的标志位结构是基于3.3.5版本的。
战斗日志中的 flags 是一个位掩码值,包含单位和关系的多个信息。与队友判断相关的标志位如下:
| 标志位(十六进制) | 宏定义(常用) | 含义 | | 0x00000001 | COMBATLOG_OBJECT_AFFILIATION_MINE | 玩家自己 | | 0x00000002 | COMBATLOG_OBJECT_AFFILIATION_PARTY | 同小队成员(队友) | | 0x00000004 | COMBATLOG_OBJECT_AFFILIATION_RAID | 同团队成员(队友) | | 0x00000010 | COMBATLOG_OBJECT_REACTION_FRIENDLY | 友方单位(包括NPC) | (这里只列出了部分标志位)
每个flags由四种标志位组成:单位隶属关系、单位类型、单位阵营、单位控制者。
比如:
[Lua] 纯文本查看 复制代码
-- 是否是自己
local isSelf = bit.band(flags, 0x00000001) ~= 0;
-- 是否是宠物
local isPet = bit.band(flags, 0x00001000) ~= 0;
-- 是否是自己的宠物
local isMyPet = bit.band(flags, bit.bor(0x00000001, 0x00001000)) ~= 0;
下面是我整理的一份可以直接使用的标志位判断工具,如果错误欢迎指正。
CombatFlags.lua
这里只是做了一个简单介绍,详细的可以看API文档。
标志位的定义在 Blizzard_CombatLog.lua 也有详细的定义,感兴趣的可以去查看源码。
|