从知乎借来一张图
OW的ECS模式是,在entity_admin的地方,可以获取到游戏的所有实体。每一个实体都有不同的组件。从组件的地址可以读到相关内容。守望先锋的反作弊中,应用了动态加密,对组件的读取位置进行了加密保护,需要decrypt后才能获得。
对于常见的组件,例如健康/可见性 /技能CD/英雄名称/位置等等,全部都有对应的组件ID。我们需要在entity_admin处,首先获得到该实体的ComponentParent,和LinkParent,再将它和对应的组件ID传入相应的解密函数,即可获得读取信息的地址。
值得注意的是,某些内容是多重加密的,例如Visbility,Outline和Skill。例如我们在解密得到VisBase之后,通过读取+0xA0和+0x98两个位置的uint64_t值,可以获得用来解密Vis的两个key。传入decryptVis函数之后,即可获得是否可见的布尔值。
当然,我们在entity_admin获得到的实体,是包含玩家/可互动实体/场景(如地板)等等在内。对于不同种类的实体,所拥有的component当然也不同。借此我们可以进行筛选做一个filter,只挑选出玩家。这是非常简单的,如我们只选择具有health_component的实体,就可以过滤出玩家/炮台等。将这些Push进我们的entities Vector就可以了。