diff --git a/game-server/app.ts b/game-server/app.ts index b73a06e45..2fb8e4e03 100644 --- a/game-server/app.ts +++ b/game-server/app.ts @@ -45,7 +45,7 @@ if(process.env.NODE_ENV == 'local') { } // 创建 mongodb 连接 -mongoose.connect(mongoAddr, { useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true, useFindAndModify: true }, (err) => { +mongoose.connect(mongoAddr, { useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true, useFindAndModify: false }, (err) => { if (err) { console.log('mongodb connect err', err); } else { diff --git a/game-server/app/servers/battle/handler/comBattleHandler.ts b/game-server/app/servers/battle/handler/comBattleHandler.ts index 9bf491816..c84854ce7 100644 --- a/game-server/app/servers/battle/handler/comBattleHandler.ts +++ b/game-server/app/servers/battle/handler/comBattleHandler.ts @@ -2,7 +2,7 @@ * @Author: 梁桐川 * @Date: 2020-11-30 15:05:48 * @Last Modified by: 梁桐川 - * @Last Modified time: 2020-12-01 14:59:45 + * @Last Modified time: 2020-12-01 21:11:33 */ import { COM_BATTLE_ASSIST_TIME, COM_BATTLE_ROBOT_ROUND_LMT, COM_BATTLE_ROBOT_HURT_RATIO, COM_BATTLE_ROBOT_HURT_CH_RATIO, COM_TEAM_STATUS } from './../../../consts/consts'; import { IT_TYPE, GOLD_COST_RATIO, CURRENCY_BY_TYPE, CURRENCY_TYPE, COM_BATTLE_CAP_TIME, COM_BATTLE_TIME_LMT } from './../../../consts/consts'; @@ -16,7 +16,7 @@ import { resResult, getRandomByLen, calculateNum, getRandValue } from '../../../ import { RoleStatus } from '../../../db/ComBattleTeam'; import { ItemModel } from '../../../db/Item'; import { handleReward } from '../../../services/rewardService'; -import { checkRoleInQueue, getTeamSearchByQuality, setTeamSearchReq } from '../../../services/redisService'; +import { checkRoleInQueue, getTeamSearchByQuality, rmRoleFromQueue, setTeamSearchReq } from '../../../services/redisService'; import { transBossHpArr } from '../../../services/battleService'; import { getRandBlueprtId, getRandComBtlRobots, checkComBattleResult } from '../../../services/comBattleService'; @@ -51,7 +51,8 @@ class ComTeam { quality: number; // 当前回合 curRnd: number; - + // 队伍中人数 + roleCnt: number; constructor(teamCode: string, pub: boolean, blueprtId: number, status: number, capId: string, ceLimit: number, bossHp: number, quality: number, bossHpArr:Array<{dataId: number, hp: number, curHp: number}> ) { this.teamCode = teamCode; this.pub = pub; @@ -64,6 +65,7 @@ class ComTeam { this.quality = quality; this.bossHpArr = bossHpArr; this.curRnd = 0; + this.roleCnt = 1; } } export class ComBattleHandler { @@ -141,6 +143,7 @@ export class ComBattleHandler { } } let uids = []; + uids.push({roleId, sid}); if (teammates) { for (let teammate of teammates) { let { roleId, sid } = teammate; @@ -152,15 +155,15 @@ export class ComBattleHandler { // 倒计时一定时间给队长匹配机器人 setTimeout(async () => { let team = thiz.teamMap.get(teamCode); - if (team.roleIds.length < 3) { + if (team && team.roleIds && team.status === COM_TEAM_STATUS.DEFAULT && team.roleIds.length < 3) { let { robotStArr, robotIdArr } = getRandComBtlRobots(topFiveCe, lv, 3 - team.roleIds.length); team.roleIds = team.roleIds.concat(robotIdArr); team.roleStatus = team.roleStatus.concat(robotStArr); for (let st of robotStArr) { await ComBattleTeamModel.addRole(teamCode, st); } + channel.pushMessage('onTeamJoin', {teamInfo: team}); } - channelService.pushMessageByUids('onTeamJoin', {teamInfo: team}, uids); }, COM_BATTLE_CAP_TIME); return resResult(STATUS.SUCCESS, { teamCode, roleStatus }); @@ -188,7 +191,7 @@ export class ComBattleHandler { const team = await ComBattleTeamModel.getOneTeamByQualityAndSt(qualityArr, COM_TEAM_STATUS.DEFAULT, topFiveCe); // TODO: 有匹配的队伍还需要重新 joinTeam 加入,有失败可能,体验不好,需优化 - if (team) { + if (team && team.roleIds.length < 3 && team.status === COM_TEAM_STATUS.DEFAULT && team.roleIds.indexOf(roleId) === -1) { return resResult(STATUS.SUCCESS, {teamCode: team.teamCode}); } let teamCode = session.get('teamCode'); @@ -198,6 +201,7 @@ export class ComBattleHandler { setTimeout(async () => { let inQueue = await checkRoleInQueue(roleId, sid, qualityArr); if (!inQueue) return; + await rmRoleFromQueue(roleId, sid, qualityArr); let roleStatus = []; let roleIds = []; @@ -228,6 +232,11 @@ export class ComBattleHandler { if (users.indexOf(roleId) === -1) { channel.add(roleId, sid); } + // 机器人队伍 3 秒直接开战 + setTimeout(async () => { + await ComBattleTeamModel.updateStatus(teamCode, COM_TEAM_STATUS.FIGHTING); + channelService.pushMessageByUids('onComBtlStart', {teamCode, roleStatus: comTeam.roleStatus}, [{uid: roleId, sid}]); + }, 3000); }, COM_BATTLE_ASSIST_TIME); return resResult(STATUS.SUCCESS); } @@ -243,10 +252,9 @@ export class ComBattleHandler { let roleId = session.get('roleId'); let roleName = session.get('roleName'); let sid = session.get('sid'); - console.log('teamMap:' + JSON.stringify(this.teamMap)); let { teamCode, isFrd } = msg; let teamStatus = this.teamMap.get(teamCode); - if (!teamStatus || teamStatus.status !== 0 || teamStatus.roleIds.length === 3) return resResult(STATUS.COM_BATTLE_MEMBER_LIMIT); + if (!teamStatus || teamStatus.status !== COM_TEAM_STATUS.DEFAULT || teamStatus.roleIds.length === 3) return resResult(STATUS.COM_BATTLE_MEMBER_LIMIT); if (teamStatus.roleIds.indexOf(roleId) !== -1) return resResult(STATUS.COM_BATTLE_DUP_ENTER); let { lv = 1, headHid = 19, topFiveCe = 0, sHid = 19 } = await Role.findByRoleId(roleId); let { quality } = getGoodById(teamStatus.blueprtId); diff --git a/game-server/app/services/comBattleService.ts b/game-server/app/services/comBattleService.ts index f31c07f89..10a66fcd2 100644 --- a/game-server/app/services/comBattleService.ts +++ b/game-server/app/services/comBattleService.ts @@ -21,7 +21,7 @@ export function getRandBlueprtId(qualityArr: Array, cnt = 1) { } export function getRandComBtlRobots(topFiveCe: number, lv: number, cnt: number) { - let robotHeroes = getRandRobot(cnt); // 随机两个阵容 + let robotHeroes = getRandRobot(cnt); // 随机几个阵容 // 创建并添加机器人 let robotStArr = [], robotIdArr = []; for (let robot of robotHeroes) { diff --git a/game-server/app/services/redisService.ts b/game-server/app/services/redisService.ts index 62953a920..7321402e6 100644 --- a/game-server/app/services/redisService.ts +++ b/game-server/app/services/redisService.ts @@ -154,6 +154,17 @@ export async function setTeamSearchReq(roleId: string, sid: string, qualityArr: } // 取出 0 - 2 个某品质的匹配中玩家,并在其它品质中删除此玩家信息 + +export async function rmRoleFromQueue(roleId: string, sid: string, qualityArr: Array) { + let cmds = []; + for (let q of qualityArr) { + cmds.push(['srem', `${REDIS_KEY.COM_TEAM_SEARCH_PRE}${q}`, `${roleId}:${sid}`]); + }; + const multiClient = client.multi(cmds) as Redis.Multi; + const newMulti = promisifyAll(multiClient) as Redis.Multi; + await newMulti.execAsync(); +} + export async function getTeamSearchByQuality(quality: number) { // TODO: 操作不具有原子性 const userInfos = await client.srandmemberAsync(`${REDIS_KEY.COM_TEAM_SEARCH_PRE}${quality}`, 2); diff --git a/shared/db/ComBattleTeam.ts b/shared/db/ComBattleTeam.ts index 71f5a4a61..a2f7e0a52 100644 --- a/shared/db/ComBattleTeam.ts +++ b/shared/db/ComBattleTeam.ts @@ -96,18 +96,22 @@ export default class ComBattleTeam extends BaseModel { @prop({ required: true, default: 0 }) ceLimit: number; + // 队伍中人数 + @prop({ required: true, default: 1 }) + roleCnt: number; + public static async createTeam(teamData: {teamCode: string, roleIds: Array, pub: boolean, blueprtId: number, quality: number, status: number, roleStatus: Array, capId: string, ceLimit: number}, lean = true) { - const team = await ComBattleTeamModel.findOneAndUpdate({ teamCode: teamData.teamCode }, {$set :{...teamData}}, {upsert: true, new: true}).lean(lean); + const team = await ComBattleTeamModel.findOneAndUpdate({ teamCode: teamData.teamCode }, {$set :{...teamData, roleCnt: teamData.roleIds.length}}, {upsert: true, new: true}).lean(lean); return team; } public static async addRole(teamCode: string, roleStatus: RoleStatus, lean = true) { - const team = await ComBattleTeamModel.findOneAndUpdate({ teamCode }, {$push: {roleIds: roleStatus.roleId, roleStatus}}, {new: true}).lean(lean); + const team = await ComBattleTeamModel.findOneAndUpdate({ teamCode }, {$push: {roleIds: roleStatus.roleId, roleStatus}, $inc: {roleCnt: 1}}, {new: true}).lean(lean); return team; } public static async removeRole(teamCode: string, roleIdToRm: string, lean = true) { - const team = await ComBattleTeamModel.findOneAndUpdate({ teamCode }, {$pull: {roleIds: roleIdToRm, roleStatus: {roleId: roleIdToRm}}}, {new: true}).lean(lean); + const team = await ComBattleTeamModel.findOneAndUpdate({ teamCode }, {$pull: {roleIds: roleIdToRm, roleStatus: {roleId: roleIdToRm}}, $inc: {roleCnt: -1}}, {new: true}).lean(lean); return team; } @@ -122,7 +126,7 @@ export default class ComBattleTeam extends BaseModel { } public static async syncTeamData(teamData: {teamCode: string, status: number, roleStatus: Array}, lean = true) { - const team = await ComBattleTeamModel.findOneAndUpdate({ teamCode: teamData.teamCode }, {$set :{...teamData}}, {new: true}).lean(lean); + const team = await ComBattleTeamModel.findOneAndUpdate({ teamCode: teamData.teamCode }, {$set :{...teamData, roleCnt: teamData.roleStatus.length}}, {new: true}).lean(lean); return team; } @@ -168,8 +172,8 @@ export default class ComBattleTeam extends BaseModel { return teams; } - public static async getOneTeamByQualityAndSt(qualityArr: Array, status: number, ce = 0, pub = true, lean = true) { - const team = await ComBattleTeamModel.findOne({quality: {$in: qualityArr}, status, ceLimit: {$lte: ce}, pub}).lean(lean); + public static async getOneTeamByQualityAndSt(qualityArr: Array, status: number, ce = 0, pub = true, cntLmt = 2, lean = true) { + const team = await ComBattleTeamModel.findOne({quality: {$in: qualityArr}, status, ceLimit: {$lte: ce}, pub, roleCnt: {$lte: cntLmt}}).lean(lean); return team; } diff --git a/shared/pubUtils/util.ts b/shared/pubUtils/util.ts index 9f1257f7d..9611bdb4c 100644 --- a/shared/pubUtils/util.ts +++ b/shared/pubUtils/util.ts @@ -251,13 +251,15 @@ export function getRandEelm(source: Array = [], cnt = 1): Array { if (cnt > source.length) return []; if (cnt === source.length) return source; let idxs = new Set(); - for (let i = 0; i < cnt; ++i) { + + while(1) { let rand = Math.floor(Math.random() * source.length); idxs.add(rand); if (idxs.size == cnt) { break; } } + return source.filter((_item, idx) => idxs.has(idx)); }