导图社区 战队
战队思维导图,包括战队赛、贡献值变化、加载排行榜、排行榜刷新、问题排查,战队奖励的注意点、奖励计算、问题排查等内容。
编辑于2021-10-28 17:42:16战队
战队赛
匹配
Team中的ROOM_NUMBER静态常量控制每个房间开始匹配的人数
通过Team.quickStart进行创建房间, 当玩家进入房间后触发roomObj.addPlayer,满员则会利用Msg触发匹配, 将等待列表的第一个和最后一个分配到一个battle中
Guild实体定时器每10秒检查战队匹配情况, 超过1分钟未匹配成功的战队会取消匹配
结算
在ModeBase.getGuildContribute中,以战斗时间和输赢为条件去计算玩家贡献值 , 触发Team.refreshContribute, 刷新战队贡献, 战队月贡献, 玩家贡献
排行榜
贡献值变化
战队赛结算后, 触发Team.refreshContribute, 刷新战队贡献, 战队月贡献, 玩家贡献 将贡献大于0的战队, 加入到rankDic和monthlyRankDic中
加载排行榜
从tbl_guild表中, 根据战队的totalContribute倒序加载战队, 在全部加载完战队后, 会重新将本周排行榜和本月排行榜进行排序
从tbl_guild_rank表中, 加载上周排行信息到内存中 从tbl_guild_monthly_rank表中, 加载上月排行信息到内存中
DBMgr控制加载语句
排行榜刷新
定时器每1小时将排行榜进行排序, 把rankDic和monthlyRankDic中的战队根据贡献进行排序, 替换成新的rankList和monthlyRankList, 更新排行(PS:notOnRankDic没啥用 )
问题排查
启服加载本周排行和本月排行时乱序: 入口DBMgr.GetRank, 本周排行是通过sql的order by totalContribute desc, 再搜索出来已经是排好序的, 可以直接加载到内存中即是有序的. 本月排行是在加载完全部战队后, 调用sortMonthlyRank进行手动排序
结算未保存上周排行到数据库中, 启服加载不到上周和上月排行榜: 数据来源, 在战队结算中的DBMgr.saveRank中, 遍历保存战队信息 未保存的可能性, 存库是内存中的值与sql的字段类型不匹配, 存库报错, 战队名称需要转换格式base64.b64encode(curTeam.name.encode("utf-8")).decode()
战队奖励
注意点
战队结算时机: 每天凌晨4点将战队存盘, 周五会额外进行奖励的发放 (在排行榜刷新时也会将战队存盘)
战队结算前提: 必须要有周冲, 否则结算不会发放奖励
战队结算利率: getRewardPoolRate, 周冲的1%并换算成点券作为奖池 如果总战队积分少, 利率35积分换1点券仍然无法瓜分完奖池,使用配置表的35利率; 如果总战队积分多, 利率35积分换1点券需要的点券超过奖池, 则根据总贡献和奖池重新调整以提高利率;
奖励计算
每周五根据本周排行进行结算, 在rank中调用refreshSeason清除上周和上月的排行榜, 计算本周奖励, 将本周和本月的排行进行存库
在内存中将上周排行清除掉; 在执行后续流程后, 将本周排行, 待排行字典,不在排行榜字典的内存值清空
在Team.seasonEnd中计算队长和队员的奖励 队员根据贡献值/利率计算奖励, 队长根据全部队员奖励的5%作为额外队长奖励 奖励状态: 0(无),1(未领取),2(已领取)十位表示队长奖励状态, 个位表示队员奖励状态
在DBMgr.saveRank中调用sql先将旧榜清除, 再遍历rankList, 结算完战队奖励后触发sql将战队排行保存到tbl_guild_rank
DBMgr逻辑, 在保存排行saveRank时, 先删除表tbl_guild_rank, 再遍历战队排行, 当发完奖励后依次将战队信息存入tbl_guild_rank中, 便于下次启服加载上周排行榜.最后也需要将该信息存入内存中
问题排查
定时器未触发导致的未结算: 表现: 战队周冲, 排行都没有被清空 出现场景: 周五凌晨关服超过4点, 定时器被清除 解决办法: KBEngine.globalData['Guild'].onTimer(3,3) 需要在周五执行, 否则只能手动调用各个函数才能结算
周冲未保存导致的未结算: 表现: 周冲, 排行都清空了, 但是没有奖励 出现场景: 周冲异常未保存,数据库结构变化导致部分字段缺失 解决办法: 拉取周四的mysql数据还原到本地, 导出表内容,计算玩家的奖励再手动补发 (周五的xb文件如果超过4点, 则需要拉取周四的内容再按照百分比进行增加玩家奖励)
战队头像
申请加入
搜索战队
在Guild.onSearchGuild调用sql模糊查询玩家输入的id或者战队名
可加入战队
在Guild.onGetCanJoinGuild查询三个可以加入的战队, 如果玩家查询距离上次加载没有超过10秒钟则不会重新刷新 Rank.updateJoinList更新搜寻战队逻辑
这部分可以迁移到Guild实体中
管理申请
玩家申请:Team.joinGuild, 如果方式是招募且需要队长同意, 则会加入到申请列表中.
队长审核:Team.dealApply, 先判断本队是否满足可加入的状态, 再查库去判断被审核玩家是否加入其他战队. 处理结果会发送邮件给被审核玩家
职位变化
职位设定: 0(队员,), 1(精英), 2(副队), 3(队长) 存储: CMember.save存储在tbl_guild_member的permissionLv字段
职位变动, 原先职位和变化后的职位都需做数量的修改 3(副队人数上限), 10(精英人数上限) 副队的职位变动需要伴随管理申请的权限和红点的增消