搜撤类游戏全服装备防复制方案

ProLightsfx 2024-11-20 241 11/20
导语:分享一种搜撤游戏全服装备防复制方案(Tarkov-like games equipment anti-copying solution)

 

一、 背景:

在装备能被玩家从单局带出的游戏场景中(比如搜撤类游戏PVE或者PVPVE单局制玩法),如果战斗系统出现bug或者被外挂攻击导致装备被复制,并且玩家找到了复现的办法,会导致游戏经济系统失衡,会从各个方面对游戏体验造成很大的不良影响,尤其是珍稀装备(全服限量爆出的)的复制,格外严重。

因此很有必要设计一整套完善的的防止装备复制的策略,从更上层的角度在发生装备复制的时候进行告警和容错,比如在战斗结算的时候吞掉复制出来的装备并上报告警以便更快的修复bug。比如在添加装备的时候建防复制索引。

此处的“装备”泛指武器装备、消耗品、任务道具等游戏中的物品。

 

二、 简述

全服的防止装备复制目前没有一个适合所有场景的单一方案(主要是装备guid的全索引不好建不好维护),所以主要通过在装备流通的途径来分类讨论处理。目前的装备流通只有战斗(带出队友装备的邮件返还也视为战斗)和市场(交易行)这两个场景。那么通过限制战斗和市场(交易行)的全复制,然后限制个人内部系统的装备复制,就可以实现全装备防复制。所以装备防复制分成三个场景,即战斗、市场(交易行)、个人。

1. 装备在战斗场景防复制已经有一套闭环的策略。

2. 当装备在自己身上以及装备上架市场售卖的情况下的防复制策略,而本文主要讨论该场景下的装备防复制策略。

 

三、 前提

通过建索引的方式的防装备复制策略,解决不了没有guid的装备复制的问题。比如高级战斗药剂、钥匙等较高价值物品,是没有guid的。没guid的情况暂定依靠产出和消耗量来监控。

 

四、 单局战斗装备防复制策略

目前会发生装备带出的场景,仅PVE/PVPVE模式下的如下3个case:

1. 玩家角色找到撤离点(逃生门)并撤离(逃生)可带出身上和背包的全部装备

2. 死亡或者主动退出等撤离(逃生)失败的情况,会清空带入装备,但可以通过保险箱带出装备

3. 战斗服crash或其他异常的情况下,会自动返还玩家带入该单局的装备,这个时候需要剔除战斗异常前已经被其他人带出的装备

由于局内爆出的物品在局内的时候还无法生成全唯一guid,会在结算完成后统一分配唯一guid,所以在结算前局内爆出的物品是没有guid的。因此打算对于局内爆出的物品,在生成的时候分配一个单局唯一的局内uid。

故需要从物品的来源分类进行防复制处理:

1. 对于玩家带入的物品进行防复制的策略

同一个battle_room在塞人的时候记录好带入了哪些guid。带出的时候进行标记,结算的时候遇到已经被带出过的guid,则删除对应物品,并上报oss日志和告警。

这样通过局内bug刷的带入物品,最终也只能带出一份,先带出的那份生效,后带出的都无效。

2. 对于局内掉落的物品进行防复制的策略

局内loot的时候给个局内uid,带出的时候用来做去重,发现重复则丢弃掉重复部分,并上报oss日志和告警。

此外应当提供单独的开关来控制是否自动吞掉复制出来的重复物品,防止在未定义的情况下发生大量误杀。

 

五、 个人内部系统的装备复制策略

1. 策略描述

维护一个个人全局装备guid索引,并提供公共增删改查接口。以及各个模块需要向防复制索引模块注册一个回调,用来在触发复制的时候,删除对应的装备数据。

这么做的优点是各个功能模块不存储索引数据,不关心维护索引的细节。

2. 具体场景

联络人(系统商人)回购列表、邮件待领取装备、仓库里的装备、玩家身上以及背包内的装备、市场(交易行)里(玩家间非点对点装备交易)的过期装备/下架/购买未领取的装备。这些场景在发生装备转移的时候都需要去调防复制策略接口。

3. 关于调用防复制策略的时机的讨论

前提:目前服务器框架使用的单线程多线程模型,故不考虑多线程情况:

描述

优点

缺点

方案一:

模块存入装备之前,先查防复制索引,没有问题,再存入装备,然后插入索引 (过程中不可RPC调用)。

感觉不好用。

方案二:

模块存入装备之前,先插索引,没有问题,再存入数据,如果插入装备失败需要回退索引,相当于插索引和插数据得放到同一个事物里。

逻辑完整

需要确保同一个事物,不大好用

方案三:

先存入装备,然后插入索引。然后遇到需要吞装备的时候,直接调注册的回调去吞数据。

使用简单,代码优美。

但先存入数据然后吞,可能会导致吞装备前已经被自动使用或者自动触发了什么逻辑(比如直接完成了获得n个x装备任务)。

最终我们通过另外的方式确保模块存入装备的流程严格分成check阶段和do阶段。在check完成之后,在do开始的时候直接掉装备防复制接口。如果成功了就插入索引,如果失败了就吞掉装备。

4. 关于个人战斗交叉场景处理

首先战斗时候由于装备属于自己不能删除复制索引玩家还在局内战斗时候队友帮他带出一部分带入装备这个时候通过邮件返回玩家。此时该玩家还在局内没有撤离,对于物品索引此时收到邮件判断装备复制然后吞掉邮件附件

搜撤类游戏全服装备防复制方案

解决这个问题笔者引用如上图状态玩家进入战斗时候身上背包装备状态“背包/身上”改成"战斗"然后允许战斗中收到邮件时候如果原始状态战斗”那么允许防复制索引guid状态”战斗切换邮件”

借助状态机如果玩家收到邮件然后出了bug自己带出物品那么战斗带出物品会被复制系统吞掉

如果玩家局内逃出来然后之后收到邮件里队友帮带出装备收到邮件时候guid状态仓库/背包/身上”无法switch邮件”所以判断装备复制正常吞掉邮件装备

这里有个前提设定是玩家在局内战斗的时候,无法从邮件领取物品到身上。)

 

六、除了上述策略之后,还需要通过优化匹配战斗流程来确保装备的全服唯一性

如果是没有装备损失和装备带出的场景,那么匹配成功的时候,先把角色和装备塞给战斗服,战斗服把角色和装备塞给ds/battle_core(battlesvr会管理很多ds或者battle_core),然后下发匹配成功(如果ds/battle_core拉起失败或者塞角色和装备失败,则继续匹配)。玩家收到匹配成功后连战斗。这样玩家的体验是很好的,比如有队友掉线了,也不影响匹配过程,只需要队友尽快上线加入战斗即可。但如果玩家匹配成功前掉线,然后在匹配服发现玩家心跳超时前,凑满人后匹配成功,则装备已经塞进战斗了,但是玩家之后重新登陆只会发现匹配过期,但拿不到战斗id,因为掉线的时候还没有匹配成功,故也不会清带入装备。这样对应这场战斗以及全服,就额外多出一套装备。

搜撤类游戏全服装备防复制方案

但在装备损失和装备可带出的场景里面,为了确保装备装备的全服唯一性,需要匹配成功先往battlesvr塞人,然后下发匹配成功。等玩家连上battlesvr,再塞装备,之后战斗结算的时候该装备就清装备。但在偶发情况下,等待室的人是无法塞满人开局的,因为匹配塞了这个人,然后掉线了,大伙儿只能静等他上线或者等待室倒计时结束。

 

 

七、后记

可能方案还有遗漏后续发现优化如果想法欢迎一起交流。

 

本博所有文章均为博主原创,未经许可不得转载。

https://www.prolightsfxjh.com/article/tarkov-like-games-item-anti-copying/

Thank you!

                                                                                                                                             ------from ProLightsfx

 

如果对笔者的文章感兴趣的话,欢迎关注公众号。

搜撤类游戏全服装备防复制方案

- THE END -

ProLightsfx

11月24日20:41

最后修改:2024年11月24日
1

非特殊说明,本博所有文章均为博主原创,未经许可不得转载。

共有 0 条评论