diff --git a/game-server/app/servers/battle/handler/comBattleHandler.ts b/game-server/app/servers/battle/handler/comBattleHandler.ts index 8ece66b3f..1b6e46db5 100644 --- a/game-server/app/servers/battle/handler/comBattleHandler.ts +++ b/game-server/app/servers/battle/handler/comBattleHandler.ts @@ -101,10 +101,10 @@ export class ComBattleHandler { * @returns * @memberof ComBattleHandler */ - async searchTeam(msg: { lv: number }, session: BackendSession) { + async searchTeam(msg: { lv: number[] }, session: BackendSession) { let roleId = session.get('roleId'); let sid = session.get('sid'); - const { lv = 1 } = msg; + const { lv: lvs = [] } = msg; const roleInfo = await RoleModel.findByRoleId(roleId, null, true); const { lv: playerLv } = roleInfo; let { topLineupCe = 1000 } = roleInfo; @@ -113,30 +113,26 @@ export class ComBattleHandler { return resResult(STATUS.COM_BATTLE_IS_RUNNING); } - if (comBtlLvInvalid(playerLv, lv)) { + if (comBtlLvInvalid(playerLv, lvs)) { return resResult(STATUS.COM_BATTLE_ASSIST_LV_NOT_ENOUGH); } - if (!gameData.blueprtByLv.has(lv)) { - return resResult(STATUS.COM_BLUEPRT_QUALITY_ERROR); - } - - const teams = await ComBattleTeamModel.getOtherTeamByLvAndSt(roleId, lv, COM_TEAM_STATUS.DEFAULT, topLineupCe); + const teams = await ComBattleTeamModel.getOtherTeamByLvAndSt(roleId, lvs, COM_TEAM_STATUS.DEFAULT, topLineupCe); const team: ComBattleTeamType = await oneTeamNotInBlack(teams, roleId); if (team && team.roleIds.length < 3 && team.status === COM_TEAM_STATUS.DEFAULT && team.roleIds.indexOf(roleId) === -1 && team.blacklist && team.blacklist.indexOf(roleId) === -1) { return resResult(STATUS.SUCCESS, {teamCode: team.teamCode}); } let teamCode = session.get('teamCode'); - await setTeamSearchReq(roleId, sid, lv); + await setTeamSearchReq(roleId, sid, lvs); let thiz = this; // 倒计时匹配两个机器人 setTimeout(async () => { - let inQueue = await checkRoleInQueue(roleId, sid, lv); + let inQueue = await checkRoleInQueue(roleId, sid, lvs); if (!inQueue) return; - await rmRoleFromQueue(roleId, sid, lv); + await rmRoleFromQueue(roleId, sid, lvs); // 创建队伍 - let blueprtId = getRandBlueprtId(lv).pop(); + let blueprtId = getRandBlueprtId(lvs).pop(); let comTeam = new MemComBtlTeam(teamCode, false, blueprtId, 'robot', 0) let isFrd = await getFrd(roleId); @@ -147,7 +143,7 @@ export class ComBattleHandler { addUserToChannel(channel, new ChannelUser(roleId, sid)); // 创建并添加机器人 - await addRobotsToTeam(comTeam, roleId, topLineupCe, lv, thiz.teamMap, thiz.teamDisTimer, channel, 2); + await addRobotsToTeam(comTeam, roleId, topLineupCe, playerLv, thiz.teamMap, thiz.teamDisTimer, channel, 2); await ComBattleTeamModel.createTeam(comTeam); thiz.teamMap.set(teamCode, comTeam); @@ -196,7 +192,7 @@ export class ComBattleHandler { if (lv < COM_BTL_CONST.ENABLE_LV) { return resResult(STATUS.COM_BATTLE_LV_NOT_ENOUGH); - } else if (comBtlLvInvalid(lv, teamStatus.lv)) { + } else if (comBtlLvInvalid(lv, [teamStatus.lv])) { return resResult(STATUS.COM_BATTLE_ASSIST_LV_NOT_ENOUGH); } else if (topLineupCe < teamStatus.ceLimit) { return resResult(STATUS.COM_BATTLE_CE_LIMIT); diff --git a/game-server/app/services/comBattleService.ts b/game-server/app/services/comBattleService.ts index 73efa67d7..7fbf1787c 100644 --- a/game-server/app/services/comBattleService.ts +++ b/game-server/app/services/comBattleService.ts @@ -25,9 +25,14 @@ import { handleCost } from './rewardService'; * @param lv 品质数组,在所有给定品质的藏宝图中筛选1 * @param cnt 返回藏宝图数量 */ -export function getRandBlueprtId(lv: number, cnt = 1) { - if (!gameData.blueprtByLv.has(lv)) return null; - let blueprtIdArr: number[] = gameData.blueprtByLv.get(lv)||[]; +export function getRandBlueprtId(lvs: number[], cnt = 1) { + if (!lvs || !lvs.length) return null; + + let blueprtIdArr: number[] = []; + for (let lv of lvs) { + blueprtIdArr = blueprtIdArr.concat(gameData.blueprtByLv.get(lv)); + } + if (blueprtIdArr.length === 0) return null; const res = getRandEelm(blueprtIdArr, cnt); // console.log('******** getRandBlueprtId', blueprtIdArr, cnt, res) @@ -322,11 +327,14 @@ export function clearRobotHurtTimer(teamStatus, robotHurtTimer: Map max; +export function comBtlLvInvalid(playerLv: number, blueprtLvs: number[]) { + for(let blueprtLv of blueprtLvs) { + const range = gameData.comBtlLvRange.get(blueprtLv); + if (!range) return true; + let { min, max } = range; + if(playerLv < min || playerLv > max) return false; + } + return true } export async function dismissTeam(teamStatus: MemComBtlTeam, teamMap: Map, roleId: string, teamDisTimer: Map, channel) { diff --git a/game-server/app/services/redisService.ts b/game-server/app/services/redisService.ts index 15f1b1959..3cd23812e 100644 --- a/game-server/app/services/redisService.ts +++ b/game-server/app/services/redisService.ts @@ -158,10 +158,15 @@ function getComTeamValue(roleId: string, sid: string) { * @param {number} lvRange * @returns */ -export async function setTeamSearchReq(roleId: string, sid: string, lv: number) { +export async function setTeamSearchReq(roleId: string, sid: string, lvs: number[]) { + let cmds = []; + lvs.forEach(lv => { + if (lv) { + cmds.push(['sadd', getComTeamKey(lv), getComTeamValue(roleId, sid)]); + } + }); + const res = await redisClient().multi(cmds).execAsync(); - const res = await redisClient().saddAsync(getComTeamKey(lv), [getComTeamValue(roleId, sid)]); - console.log('setTeamSearchReq: ', res); return res; } @@ -172,11 +177,13 @@ export async function setTeamSearchReq(roleId: string, sid: string, lv: number) * @param {string} sid * @param {number} lv 如果不填表示所有品阶 */ -export async function rmRoleFromQueue(roleId: string, sid: string, lv?: number) { +export async function rmRoleFromQueue(roleId: string, sid: string, lvs?: number[]) { let cmds = []; - if (lv) { - cmds.push(['srem', getComTeamKey(lv), getComTeamValue(roleId, sid)]); + if (lvs) { + for(let lv of lvs) { + cmds.push(['srem', getComTeamKey(lv), getComTeamValue(roleId, sid)]); + } } else { for (let range of comBtlRanges()) { cmds.push(['srem', getComTeamKey(range), getComTeamValue(roleId, sid)]); @@ -216,11 +223,14 @@ export async function getTeamSearchByLv(lv: number) { * @param {number} lv * @returns */ -export async function checkRoleInQueue(roleId: string, sid: string, lv: number) { - let res = await redisClient().sismemberAsync(getComTeamKey(lv), `${roleId}:${sid}`); - if (res) { - return true; - } +export async function checkRoleInQueue(roleId: string, sid: string, lvs: number[]) { + for (let lv of lvs) { + let res = await redisClient().sismemberAsync(getComTeamKey(lv), `${roleId}:${sid}`); + if (res) { + return true; + } + }; + return false; } diff --git a/shared/db/ComBattleTeam.ts b/shared/db/ComBattleTeam.ts index fdc6adf6a..0cf14309d 100644 --- a/shared/db/ComBattleTeam.ts +++ b/shared/db/ComBattleTeam.ts @@ -289,9 +289,9 @@ export default class ComBattleTeam extends BaseModel { return team; } - public static async getOtherTeamByLvAndSt(roleId: string, lv: number, status: number, ce = 0, pub = true, cntLmt = 2, lean = true) { + public static async getOtherTeamByLvAndSt(roleId: string, lvs: number[], status: number, ce = 0, pub = true, cntLmt = 2, lean = true) { const curTime = new Date(Date.now() - 10 * 60 * 1000); // 10分钟之前 - const team: ComBattleTeamType[] = await ComBattleTeamModel.find({ lv, status, ceLimit: {$lte: ce}, pub, roleCnt: {$lte: cntLmt}, roleIds: {$nin: [roleId]}, updatedAt: {$gte: curTime}}).lean(lean); + const team: ComBattleTeamType[] = await ComBattleTeamModel.find({ lv: { $in: lvs }, status, ceLimit: {$lte: ce}, pub, roleCnt: {$lte: cntLmt}, roleIds: {$nin: [roleId]}, updatedAt: {$gte: curTime}}).lean(lean); return team; }