diff --git a/game-server/app/servers/battle/handler/comBattleHandler.ts b/game-server/app/servers/battle/handler/comBattleHandler.ts index 5d2c7ea99..783c084c6 100644 --- a/game-server/app/servers/battle/handler/comBattleHandler.ts +++ b/game-server/app/servers/battle/handler/comBattleHandler.ts @@ -16,9 +16,11 @@ import { RoleStatus, ComBattleTeamModel, ComBattleTeamType } from '../../../db/C import { ItemModel } from '../../../db/Item'; import { handleFixedReward, addItems, handleCost } from '../../../services/rewardService'; import { checkRoleInQueue, getTeamSearchByQuality, rmRoleFromQueue, setTeamSearchReq } from '../../../services/redisService'; -import { getRandBlueprtId, getRandComBtlRobots, clearComBtlTimer, getAssistTimesByQuality, getFrd, updateRobotHurtByTime, comBtlLvInvalid, clearRobotHurtTimer, setDismissTimer, dismissTeam, incEquipPrintDrop, randEquipPrintId, handleComBtlProgress, getComBattleFriendAdd, getValidTeammateRoleSt, teammateInBlackList, blueprtIdValid, createComTeamData, hasEnoughBlueprt, addRoleToTeam, addRoleStToTeam } from '../../../services/comBattleService'; +import { getRandBlueprtId, getRandComBtlRobots, clearComBtlTimer, getAssistTimesByQuality, getFrd, updateRobotHurtByTime, comBtlLvInvalid, clearRobotHurtTimer, setDismissTimer, dismissTeam, incEquipPrintDrop, randEquipPrintId, handleComBtlProgress, getComBattleFriendAdd, getValidTeammateRoleSt, teammateInBlackList, blueprtIdValid, createComTeamData, hasEnoughBlueprt, addRoleToTeam, addRoleStToTeam, addValidSearchingRoles } from '../../../services/comBattleService'; import { setAp } from '../../../services/actionPointService'; import { roleLevelup } from '../../../services/normalBattleService'; +import { addUserToChannel } from '../../../services/roleService'; +import { ChannelUser } from '../../../domain/ChannelUser'; export default function(app: Application) { return new ComBattleHandler(app); @@ -45,7 +47,6 @@ export class ComBattleHandler { console.log('createTeam msg: ', msg); // 检查藏宝图Id是否合法 - let goodData = getGoodById(blueprtId); if (!blueprtIdValid(blueprtId)) return resResult(STATUS.COM_BATTLE_BLUEPRT_INVALID); const enoughBlueprt = await hasEnoughBlueprt(roleId, blueprtId); if (!enoughBlueprt) return resResult(STATUS.COM_BATTLE_BLUEPRT_NOT_ENOUGH); @@ -55,47 +56,24 @@ export class ComBattleHandler { const topFiveCe = reduceCe(roleInfo.topFiveCe || 100); if (lv < COM_BTL_CONST.ENABLE_LV) return resResult(STATUS.COM_BATTLE_LV_NOT_ENOUGH); + let channelService = this.app.get('channelService'); + let channel = channelService.getChannel(teamCode, true); + // 创建队伍数据结构 let comTeam: MemComBtlTeam = createComTeamData(teamCode, pub, blueprtId, roleId, ceLimit); addRoleToTeam(comTeam, roleInfo, true, false); + addUserToChannel(channel, new ChannelUser(roleId, sid)); + // 将正在匹配的符合要求的玩家加入队伍,并推送入队消息 + await addValidSearchingRoles(comTeam, channelService); - // 检查是否有正在匹配的符合要求的玩家 - let teammates = await getTeamSearchByQuality(goodData.quality, comBtlRangeByLv(goodData.lvLimited)); - if (teammates && teammates.length) { - for (let teammate of teammates) { - const { roleId: teammateRoleId } = teammate; - const st = await getValidTeammateRoleSt(teammateRoleId, comTeam.roleIds, ceLimit, goodData.quality); - if (!st) continue; - await rmRoleFromQueue(teammateRoleId, sid, COM_BTL_QUALITY, null); // 匹配成功后删除redis中该用户的匹配记录 - addRoleStToTeam(comTeam, st); - } + // 队伍数据持久化 + const team = await ComBattleTeamModel.createTeam(comTeam); + if (!team) { + channel.destroy(); + return resResult(STATUS.COM_BATTLE_CREATE_ERR); } - this.teamMap.set(teamCode, comTeam); - // TODO: 处理助战回滚 - const team = await ComBattleTeamModel.createTeam(comTeam); - if (!team) return resResult(STATUS.COM_BATTLE_CREATE_ERR); - - let channelService = this.app.get('channelService'); - let channel = channelService.getChannel(teamCode, true); - let users = channel.getMembers(); - if (users.indexOf(roleId) === -1) { - channel.add(roleId, sid); - } - let uids = []; - uids.push({roleId, sid}); - if (teammates && teammates.length) { - for (let teammate of teammates) { - let { roleId, sid } = teammate; - uids.push({uid: roleId, sid}); - let users = channel.getMembers(); - if (users.indexOf(roleId) === -1) { - channel.add(roleId, sid); - } - } - channelService.pushMessageByUids('onTeamJoin', resResult(STATUS.SUCCESS, {teamInfo: comTeam}), uids); - } let thiz = this; // 倒计时一定时间给队长匹配机器人 diff --git a/game-server/app/services/comBattleService.ts b/game-server/app/services/comBattleService.ts index 30e4c3799..f476b5b1d 100644 --- a/game-server/app/services/comBattleService.ts +++ b/game-server/app/services/comBattleService.ts @@ -13,11 +13,14 @@ import { getBluePrtByQuality, getComBtlSetByQuality, getRewardByBlueprtId, getWa import { getRandEelm, getRandValue, resResult, ratioReward, getRandValueByMinMax, getRandomWithWeight, decodeStr, getRobotInfo, reduceCe } from "../pubUtils/util"; import { getRandRobot, transBossHpArr } from "./battleService"; import { difference, omit } from 'underscore'; -import { Channel } from 'pinus'; +import { Channel, ChannelService } from 'pinus'; import { TREASURE } from '../pubUtils/dicParam'; import { decreaseItems } from './rewardService'; import { getFriendLvAdd } from './friendService'; import { getRoleIds } from '../pubUtils/friendUtil'; +import { getTeamSearchByQuality, rmRoleFromQueue } from './redisService'; +import { addUserToChannel } from './roleService'; +import { ChannelUser } from '../domain/ChannelUser'; /** @@ -590,4 +593,28 @@ export function addRoleStToTeam(comTeam: MemComBtlTeam, roleSt: RoleStatus) { const { roleStatus = [], roleIds = [] } = comTeam; comTeam.roleStatus = [roleSt, ...roleStatus]; comTeam.roleIds = [roleSt.roleId, ...roleIds]; +} + +/** + * @description 将符合要求的用户匹配到队伍中 + * @export + * @param {MemComBtlTeam} comTeam 队伍数据 + * @param {string} sid 当前用户 sid + * @returns + */ +export async function addValidSearchingRoles(comTeam: MemComBtlTeam, channelService: ChannelService) { + const { quality, lvLimited } = getGoodById(comTeam.blueprtId); + let teammates = await getTeamSearchByQuality(quality, comBtlRangeByLv(lvLimited)); + if (teammates && teammates.length) { + for (let teammate of teammates) { + const { roleId: teammateRoleId, sid } = teammate; + const st = await getValidTeammateRoleSt(teammateRoleId, comTeam.roleIds, comTeam.ceLimit, quality); + if (!st) continue; + await rmRoleFromQueue(teammateRoleId, sid, COM_BTL_QUALITY, null); // 匹配成功后删除redis中该用户的匹配记录 + addRoleStToTeam(comTeam, st); + const channel = channelService.getChannel(comTeam.teamCode, false); + addUserToChannel(channel, new ChannelUser(teammateRoleId, sid)); + } + channelService.pushMessageByUids('onTeamJoin', resResult(STATUS.SUCCESS, {teamInfo: comTeam}), teammates.map(t => {return {uid: t.roleId, sid: t.sid}})); + } } \ No newline at end of file diff --git a/game-server/app/services/roleService.ts b/game-server/app/services/roleService.ts index 9e96b6363..43c99f0d0 100644 --- a/game-server/app/services/roleService.ts +++ b/game-server/app/services/roleService.ts @@ -1,3 +1,5 @@ +import { ChannelUser } from './../domain/ChannelUser'; +import { Channel } from 'pinus'; import { getRandNum, getRandomArr } from '../pubUtils/util'; import { TERAPH_RANDOM } from "../consts/consts"; import { indexOf } from 'underscore'; @@ -57,4 +59,12 @@ export function checkMaterialEnough(count: number, attrs:Array, teraphInfo: consumes.push({ id, count: count*times}); } return {attr: res, consumes}; +} + +export function addUserToChannel(channel: Channel, user: ChannelUser) { + const users = channel.getMembers(); + const { uid, sid } = user; + if (users.indexOf(uid) === -1) { + channel.add(uid, sid); + } } \ No newline at end of file diff --git a/shared/domain/ChannelUser.ts b/shared/domain/ChannelUser.ts new file mode 100644 index 000000000..4dc7ea6be --- /dev/null +++ b/shared/domain/ChannelUser.ts @@ -0,0 +1,21 @@ +export class ChannelUser { + private _roleId: string; + private _sid: string; + + constructor(uid: string, sid: string) { + this._roleId = uid; + this._sid = sid; + } + + get uid() { + return this._roleId; + } + + get roleId() { + return this._roleId; + } + + get sid() { + return this._sid; + } +} \ No newline at end of file