From 847a3b62890fa0e1064874fdf2715d640f3486b0 Mon Sep 17 00:00:00 2001 From: liangtongchuan Date: Thu, 18 Feb 2021 16:17:46 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=BB=E5=AE=9D=EF=BC=9A=E5=B0=86=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E5=8C=B9=E9=85=8D=E5=92=8C=E5=88=A0=E9=99=A4=E5=8C=B9?= =?UTF-8?q?=E9=85=8D=E4=BF=A1=E6=81=AF=E5=88=86=E7=A6=BB=EF=BC=9B=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E9=83=A8=E5=88=86=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../battle/handler/comBattleHandler.ts | 4 +- game-server/app/services/redisService.ts | 67 ++++++++++++++----- 2 files changed, 55 insertions(+), 16 deletions(-) diff --git a/game-server/app/servers/battle/handler/comBattleHandler.ts b/game-server/app/servers/battle/handler/comBattleHandler.ts index 24f55a670..c809f71ea 100644 --- a/game-server/app/servers/battle/handler/comBattleHandler.ts +++ b/game-server/app/servers/battle/handler/comBattleHandler.ts @@ -140,6 +140,8 @@ export class ComBattleHandler { topFiveCe = reduceCe(topFiveCe); if (topFiveCe < ceLimit) continue; + rmRoleFromQueue(roleId, sid, COM_BTL_QUALITY, null); // 匹配成功后删除redis中该用户的匹配记录 + let isFrd = await getFrd(roleId, goodData.quality); const st = new RoleStatus(roleId, roleName, false, isFrd, headHid, sHid, topFiveCe, lv); @@ -663,7 +665,7 @@ export class ComBattleHandler { } /** - * 客户端给服务器的战斗结束通知-deprecated + * ! 客户端给服务器的战斗结束通知-deprecated * @param msg * @param session */ diff --git a/game-server/app/services/redisService.ts b/game-server/app/services/redisService.ts index 30bdca247..ec9c13fd6 100644 --- a/game-server/app/services/redisService.ts +++ b/game-server/app/services/redisService.ts @@ -218,20 +218,38 @@ export async function removeFromRank(key: string, serverId: number, myId: string /** * @description 拼接匹配分组的 key - * @param {number} quality - * @param {number} lvRange + * @param {number} quality 品质 + * @param {number} lvRange 等级范围 */ function getComTeamKey(quality: number, lvRange: number) { return `${REDIS_KEY.COM_TEAM_SEARCH_PRE}:${quality}_${lvRange}`; } -// 把寻宝的玩家信息存入 redis +/** + * @description 拼接匹配分组中 member 的值 + * @param {string} roleId + * @param {string} sid connector serverId + * @returns + */ +function getComTeamValue(roleId: string, sid: string) { + return `${roleId}:${sid}`; +} + +/** + * @description 把寻宝的玩家信息存入 redis + * @export + * @param {string} roleId + * @param {string} sid + * @param {Array} qualityArr + * @param {number} lvRange + * @returns + */ export async function setTeamSearchReq(roleId: string, sid: string, qualityArr: Array, lvRange: number) { const client: Redis.RedisClient = pinus.app.get('redis'); let cmds = []; qualityArr.forEach(quality => { if (quality) { - cmds.push(['sadd', getComTeamKey(quality, lvRange), `${roleId}:${sid}`]); + cmds.push(['sadd', getComTeamKey(quality, lvRange), getComTeamValue(roleId, sid)]); } }); const multiClient = client.multi(cmds) as Redis.Multi; @@ -241,17 +259,24 @@ export async function setTeamSearchReq(roleId: string, sid: string, qualityArr: return res; } -// 取出 0 - 2 个某品质的匹配中玩家,并在其它品质中删除此玩家信息 +/** + * @description 从匹配队列中删除某个用户 + * @export + * @param {string} roleId + * @param {string} sid + * @param {Array} qualityArr + * @param {number} lvRange + */ export async function rmRoleFromQueue(roleId: string, sid: string, qualityArr: Array, lvRange: number) { const client: Redis.RedisClient = pinus.app.get('redis'); let cmds = []; for (let q of qualityArr) { if (lvRange) { - cmds.push(['srem', getComTeamKey(q, lvRange), `${roleId}:${sid}`]); + cmds.push(['srem', getComTeamKey(q, lvRange), getComTeamValue(roleId, sid)]); } else { for (let range of comBtlRanges()) { - cmds.push(['srem', getComTeamKey(q, range), `${roleId}:${sid}`]); + cmds.push(['srem', getComTeamKey(q, range), getComTeamValue(roleId, sid)]); } } }; @@ -260,6 +285,13 @@ export async function rmRoleFromQueue(roleId: string, sid: string, qualityArr: A await newMulti.execAsync(); } +/** + * @description 在寻宝匹配队列中随机两个玩家 + * @export + * @param {number} quality 队伍品质 + * @param {number} lvRange 等级范围 + * @returns + */ export async function getTeamSearchByQuality(quality: number, lvRange: number) { const client: Redis.RedisClient = pinus.app.get('redis'); // TODO: 操作不具有原子性 @@ -267,24 +299,25 @@ export async function getTeamSearchByQuality(quality: number, lvRange: number) { console.log('getTeamSearchByQuality: ' + userInfos); if (!userInfos || !userInfos.length) return null; - let cmds = []; let res = []; for (let userInfo of userInfos) { const decodeData = `${userInfo}`.split(':'); if (decodeData.length !== 2) return null; - res.push({roleId: decodeData[0], sid: decodeData[1]}); - COM_BTL_QUALITY.forEach((q) => { - cmds.push(['srem', getComTeamKey(q, lvRange), userInfo]); - }) - const multiClient = client.multi(cmds) as Redis.Multi; - const newMulti = promisifyAll(multiClient) as Redis.Multi; - await newMulti.execAsync(); } console.log('getTeamSearchByQuality res: ', res); return res; } +/** + * @description 检查玩家是否在某个队列中等待寻宝匹配 + * @export + * @param {string} roleId + * @param {string} sid + * @param {Array} qualityArr + * @param {number} lvRange + * @returns + */ export async function checkRoleInQueue(roleId: string, sid: string, qualityArr: Array, lvRange: number) { const client: Redis.RedisClient = pinus.app.get('redis'); for (let quality of qualityArr) { @@ -296,6 +329,10 @@ export async function checkRoleInQueue(roleId: string, sid: string, qualityArr: return false; } +/** + * @description 清除所有的寻宝匹配队列 + * @export + */ export async function clearComBtlQueue() { const client: Redis.RedisClient = pinus.app.get('redis'); for (let q of COM_BTL_QUALITY) {