寻宝:清理匹配成功的玩家信息;修复机器人和匹配条件等bug
This commit is contained in:
@@ -45,7 +45,7 @@ if(process.env.NODE_ENV == 'local') {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 创建 mongodb 连接
|
// 创建 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) {
|
if (err) {
|
||||||
console.log('mongodb connect err', err);
|
console.log('mongodb connect err', err);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
* @Author: 梁桐川
|
* @Author: 梁桐川
|
||||||
* @Date: 2020-11-30 15:05:48
|
* @Date: 2020-11-30 15:05:48
|
||||||
* @Last Modified by: 梁桐川
|
* @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 { 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';
|
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 { RoleStatus } from '../../../db/ComBattleTeam';
|
||||||
import { ItemModel } from '../../../db/Item';
|
import { ItemModel } from '../../../db/Item';
|
||||||
import { handleReward } from '../../../services/rewardService';
|
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 { transBossHpArr } from '../../../services/battleService';
|
||||||
import { getRandBlueprtId, getRandComBtlRobots, checkComBattleResult } from '../../../services/comBattleService';
|
import { getRandBlueprtId, getRandComBtlRobots, checkComBattleResult } from '../../../services/comBattleService';
|
||||||
|
|
||||||
@@ -51,7 +51,8 @@ class ComTeam {
|
|||||||
quality: number;
|
quality: number;
|
||||||
// 当前回合
|
// 当前回合
|
||||||
curRnd: 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}> ) {
|
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.teamCode = teamCode;
|
||||||
this.pub = pub;
|
this.pub = pub;
|
||||||
@@ -64,6 +65,7 @@ class ComTeam {
|
|||||||
this.quality = quality;
|
this.quality = quality;
|
||||||
this.bossHpArr = bossHpArr;
|
this.bossHpArr = bossHpArr;
|
||||||
this.curRnd = 0;
|
this.curRnd = 0;
|
||||||
|
this.roleCnt = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
export class ComBattleHandler {
|
export class ComBattleHandler {
|
||||||
@@ -141,6 +143,7 @@ export class ComBattleHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
let uids = [];
|
let uids = [];
|
||||||
|
uids.push({roleId, sid});
|
||||||
if (teammates) {
|
if (teammates) {
|
||||||
for (let teammate of teammates) {
|
for (let teammate of teammates) {
|
||||||
let { roleId, sid } = teammate;
|
let { roleId, sid } = teammate;
|
||||||
@@ -152,15 +155,15 @@ export class ComBattleHandler {
|
|||||||
// 倒计时一定时间给队长匹配机器人
|
// 倒计时一定时间给队长匹配机器人
|
||||||
setTimeout(async () => {
|
setTimeout(async () => {
|
||||||
let team = thiz.teamMap.get(teamCode);
|
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);
|
let { robotStArr, robotIdArr } = getRandComBtlRobots(topFiveCe, lv, 3 - team.roleIds.length);
|
||||||
team.roleIds = team.roleIds.concat(robotIdArr);
|
team.roleIds = team.roleIds.concat(robotIdArr);
|
||||||
team.roleStatus = team.roleStatus.concat(robotStArr);
|
team.roleStatus = team.roleStatus.concat(robotStArr);
|
||||||
for (let st of robotStArr) {
|
for (let st of robotStArr) {
|
||||||
await ComBattleTeamModel.addRole(teamCode, st);
|
await ComBattleTeamModel.addRole(teamCode, st);
|
||||||
}
|
}
|
||||||
|
channel.pushMessage('onTeamJoin', {teamInfo: team});
|
||||||
}
|
}
|
||||||
channelService.pushMessageByUids('onTeamJoin', {teamInfo: team}, uids);
|
|
||||||
}, COM_BATTLE_CAP_TIME);
|
}, COM_BATTLE_CAP_TIME);
|
||||||
|
|
||||||
return resResult(STATUS.SUCCESS, { teamCode, roleStatus });
|
return resResult(STATUS.SUCCESS, { teamCode, roleStatus });
|
||||||
@@ -188,7 +191,7 @@ export class ComBattleHandler {
|
|||||||
|
|
||||||
const team = await ComBattleTeamModel.getOneTeamByQualityAndSt(qualityArr, COM_TEAM_STATUS.DEFAULT, topFiveCe);
|
const team = await ComBattleTeamModel.getOneTeamByQualityAndSt(qualityArr, COM_TEAM_STATUS.DEFAULT, topFiveCe);
|
||||||
// TODO: 有匹配的队伍还需要重新 joinTeam 加入,有失败可能,体验不好,需优化
|
// 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});
|
return resResult(STATUS.SUCCESS, {teamCode: team.teamCode});
|
||||||
}
|
}
|
||||||
let teamCode = session.get('teamCode');
|
let teamCode = session.get('teamCode');
|
||||||
@@ -198,6 +201,7 @@ export class ComBattleHandler {
|
|||||||
setTimeout(async () => {
|
setTimeout(async () => {
|
||||||
let inQueue = await checkRoleInQueue(roleId, sid, qualityArr);
|
let inQueue = await checkRoleInQueue(roleId, sid, qualityArr);
|
||||||
if (!inQueue) return;
|
if (!inQueue) return;
|
||||||
|
await rmRoleFromQueue(roleId, sid, qualityArr);
|
||||||
let roleStatus = [];
|
let roleStatus = [];
|
||||||
let roleIds = [];
|
let roleIds = [];
|
||||||
|
|
||||||
@@ -228,6 +232,11 @@ export class ComBattleHandler {
|
|||||||
if (users.indexOf(roleId) === -1) {
|
if (users.indexOf(roleId) === -1) {
|
||||||
channel.add(roleId, sid);
|
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);
|
}, COM_BATTLE_ASSIST_TIME);
|
||||||
return resResult(STATUS.SUCCESS);
|
return resResult(STATUS.SUCCESS);
|
||||||
}
|
}
|
||||||
@@ -243,10 +252,9 @@ export class ComBattleHandler {
|
|||||||
let roleId = session.get('roleId');
|
let roleId = session.get('roleId');
|
||||||
let roleName = session.get('roleName');
|
let roleName = session.get('roleName');
|
||||||
let sid = session.get('sid');
|
let sid = session.get('sid');
|
||||||
console.log('teamMap:' + JSON.stringify(this.teamMap));
|
|
||||||
let { teamCode, isFrd } = msg;
|
let { teamCode, isFrd } = msg;
|
||||||
let teamStatus = this.teamMap.get(teamCode);
|
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);
|
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 { lv = 1, headHid = 19, topFiveCe = 0, sHid = 19 } = await Role.findByRoleId(roleId);
|
||||||
let { quality } = getGoodById(teamStatus.blueprtId);
|
let { quality } = getGoodById(teamStatus.blueprtId);
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ export function getRandBlueprtId(qualityArr: Array<number>, cnt = 1) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function getRandComBtlRobots(topFiveCe: number, lv: number, cnt: number) {
|
export function getRandComBtlRobots(topFiveCe: number, lv: number, cnt: number) {
|
||||||
let robotHeroes = getRandRobot(cnt); // 随机两个阵容
|
let robotHeroes = getRandRobot(cnt); // 随机几个阵容
|
||||||
// 创建并添加机器人
|
// 创建并添加机器人
|
||||||
let robotStArr = [], robotIdArr = [];
|
let robotStArr = [], robotIdArr = [];
|
||||||
for (let robot of robotHeroes) {
|
for (let robot of robotHeroes) {
|
||||||
|
|||||||
@@ -154,6 +154,17 @@ export async function setTeamSearchReq(roleId: string, sid: string, qualityArr:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 取出 0 - 2 个某品质的匹配中玩家,并在其它品质中删除此玩家信息
|
// 取出 0 - 2 个某品质的匹配中玩家,并在其它品质中删除此玩家信息
|
||||||
|
|
||||||
|
export async function rmRoleFromQueue(roleId: string, sid: string, qualityArr: Array<number>) {
|
||||||
|
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) {
|
export async function getTeamSearchByQuality(quality: number) {
|
||||||
// TODO: 操作不具有原子性
|
// TODO: 操作不具有原子性
|
||||||
const userInfos = await client.srandmemberAsync(`${REDIS_KEY.COM_TEAM_SEARCH_PRE}${quality}`, 2);
|
const userInfos = await client.srandmemberAsync(`${REDIS_KEY.COM_TEAM_SEARCH_PRE}${quality}`, 2);
|
||||||
|
|||||||
@@ -96,18 +96,22 @@ export default class ComBattleTeam extends BaseModel {
|
|||||||
@prop({ required: true, default: 0 })
|
@prop({ required: true, default: 0 })
|
||||||
ceLimit: number;
|
ceLimit: number;
|
||||||
|
|
||||||
|
// 队伍中人数
|
||||||
|
@prop({ required: true, default: 1 })
|
||||||
|
roleCnt: number;
|
||||||
|
|
||||||
public static async createTeam(teamData: {teamCode: string, roleIds: Array<string>, pub: boolean, blueprtId: number, quality: number, status: number, roleStatus: Array<RoleStatus>, capId: string, ceLimit: number}, lean = true) {
|
public static async createTeam(teamData: {teamCode: string, roleIds: Array<string>, pub: boolean, blueprtId: number, quality: number, status: number, roleStatus: Array<RoleStatus>, 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;
|
return team;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async addRole(teamCode: string, roleStatus: RoleStatus, lean = true) {
|
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;
|
return team;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async removeRole(teamCode: string, roleIdToRm: string, lean = true) {
|
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;
|
return team;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -122,7 +126,7 @@ export default class ComBattleTeam extends BaseModel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static async syncTeamData(teamData: {teamCode: string, status: number, roleStatus: Array<RoleStatus>}, lean = true) {
|
public static async syncTeamData(teamData: {teamCode: string, status: number, roleStatus: Array<RoleStatus>}, 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;
|
return team;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -168,8 +172,8 @@ export default class ComBattleTeam extends BaseModel {
|
|||||||
return teams;
|
return teams;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async getOneTeamByQualityAndSt(qualityArr: Array<number>, status: number, ce = 0, pub = true, lean = true) {
|
public static async getOneTeamByQualityAndSt(qualityArr: Array<number>, status: number, ce = 0, pub = true, cntLmt = 2, lean = true) {
|
||||||
const team = await ComBattleTeamModel.findOne({quality: {$in: qualityArr}, status, ceLimit: {$lte: ce}, pub}).lean(lean);
|
const team = await ComBattleTeamModel.findOne({quality: {$in: qualityArr}, status, ceLimit: {$lte: ce}, pub, roleCnt: {$lte: cntLmt}}).lean(lean);
|
||||||
return team;
|
return team;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -251,13 +251,15 @@ export function getRandEelm(source: Array<any> = [], cnt = 1): Array<any> {
|
|||||||
if (cnt > source.length) return [];
|
if (cnt > source.length) return [];
|
||||||
if (cnt === source.length) return source;
|
if (cnt === source.length) return source;
|
||||||
let idxs = new Set();
|
let idxs = new Set();
|
||||||
for (let i = 0; i < cnt; ++i) {
|
|
||||||
|
while(1) {
|
||||||
let rand = Math.floor(Math.random() * source.length);
|
let rand = Math.floor(Math.random() * source.length);
|
||||||
idxs.add(rand);
|
idxs.add(rand);
|
||||||
if (idxs.size == cnt) {
|
if (idxs.size == cnt) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return source.filter((_item, idx) => idxs.has(idx));
|
return source.filter((_item, idx) => idxs.has(idx));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user