寻宝:仅匹配特定等级区间;修复机器人武将不阵亡 bug

This commit is contained in:
liangtongchuan
2021-01-27 16:00:48 +08:00
parent 58b8d1c05d
commit d0cd3faab5
7 changed files with 104 additions and 38 deletions
+9 -3
View File
@@ -2,7 +2,7 @@ import { FriendPointModel } from './../db/FriendPoint';
import { STATUS } from './../consts/statusCode';
import { COM_BATTLE_ROBOT_ID_NAME, COM_TEAM_STATUS, CURRENCY_BY_TYPE, CURRENCY_TYPE, FRIEND_DROP_TYPE, COM_BTL_CONST, FRIEND_DROP_MAX } from './../consts';
import { RoleStatus, ComBattleTeamModel } from './../db/ComBattleTeam';
import { getBluePrtByQuality, getComBtlSetByQuality, getRewardByBlueprtId, getWarById, getWarIdByBlueprtId } from "../pubUtils/gamedata";
import { getBluePrtByQuality, getComBtlSetByQuality, getRewardByBlueprtId, getWarById, getWarIdByBlueprtId, comBtlRangeInfo } from "../pubUtils/gamedata";
import { getRandEelm, getRandValue, resResult, ratioReward } from "../pubUtils/util";
import { getRandRobot } from "./battleService";
import { difference } from 'underscore';
@@ -204,7 +204,7 @@ function updateRobotKilled(bossHp: number, roleSt: RoleStatus) {
const newKilledCnt = dmgProgress - roleSt.killed.length;
const aliveHeroes = difference(roleSt.heroes, roleSt.killed);
const newKilledHeroes = getRandEelm(aliveHeroes, newKilledCnt);
roleSt.killed.concat(newKilledHeroes);
roleSt.killed = roleSt.killed.concat(newKilledHeroes);
}
}
@@ -235,7 +235,7 @@ export function updateRobotHurt(teamStatus, roleSt: RoleStatus, channel: Channel
teamStatus.bossCurHp -= robotTotalHurt;
roleSt.totalDmg += robotTotalHurt;
updateRobotKilled(teamStatus.bossHp, roleSt);
channel.pushMessage('onTeammateAct', resResult(STATUS.SUCCESS, { teamCode: teamStatus.teamCode, bossCurHp: teamStatus.bossCurHp, bossHpArr: teamStatus.bossHpArr, roleStatus: roleSt, actRoleId: roleSt.roleId, actBossHurts }));
channel.pushMessage('onTeammateAct', resResult(STATUS.SUCCESS, { teamCode: teamStatus.teamCode, bossCurHp: teamStatus.bossCurHp, bossHpArr: teamStatus.bossHpArr, roleStatus: teamStatus.roleStatus, actRoleId: roleSt.roleId, actBossHurts }));
}
@@ -259,3 +259,9 @@ export function updateRobotHurtByTime(teamStatus, roleSt: RoleStatus, interval:
}, interval * 1000);
}
export function comBtlLvInvalid(lv: number, lvRange: number) {
const lvs = comBtlRangeInfo(lvRange);
if (!lvs) return true;
const minLv = lvs[0];
return lv < minLv;
}
+28 -11
View File
@@ -9,7 +9,7 @@ import { PvpDefenseModel } from '../db/PvpDefense';
import { SystemConfigModel } from '../db/SystemConfig';
import { RankParam, GuildRankParam, GuildLeader } from '../pubUtils/interface';
import { GuildModel } from '../db/Guild';
import { comBtlRanges } from '../pubUtils/gamedata';
/**
* 在服务重新启动时,将信息存入redis
*/
@@ -216,13 +216,22 @@ export async function removeFromRank(key: string, serverId: number, myId: string
/**************** 寻宝相关 start */
/**
* @description 拼接匹配分组的 key
* @param {number} quality
* @param {number} lvRange
*/
function getComTeamKey(quality: number, lvRange: number) {
return `${REDIS_KEY.COM_TEAM_SEARCH_PRE}:${quality}_${lvRange}`;
}
// 把寻宝的玩家信息存入 redis
export async function setTeamSearchReq(roleId: string, sid: string, qualityArr: Array<number>) {
export async function setTeamSearchReq(roleId: string, sid: string, qualityArr: Array<number>, lvRange: number) {
const client: Redis.RedisClient = pinus.app.get('redis');
let cmds = [];
qualityArr.forEach(quality => {
if (quality) {
cmds.push(['sadd', `${REDIS_KEY.COM_TEAM_SEARCH_PRE}${quality}`, `${roleId}:${sid}`]);
cmds.push(['sadd', getComTeamKey(quality, lvRange), `${roleId}:${sid}`]);
}
});
const multiClient = client.multi(cmds) as Redis.Multi;
@@ -233,22 +242,28 @@ export async function setTeamSearchReq(roleId: string, sid: string, qualityArr:
}
// 取出 0 - 2 个某品质的匹配中玩家,并在其它品质中删除此玩家信息
export async function rmRoleFromQueue(roleId: string, sid: string, qualityArr: Array<number>) {
export async function rmRoleFromQueue(roleId: string, sid: string, qualityArr: Array<number>, lvRange: number) {
const client: Redis.RedisClient = pinus.app.get('redis');
let cmds = [];
for (let q of qualityArr) {
cmds.push(['srem', `${REDIS_KEY.COM_TEAM_SEARCH_PRE}${q}`, `${roleId}:${sid}`]);
if (lvRange) {
cmds.push(['srem', getComTeamKey(q, lvRange), `${roleId}:${sid}`]);
} else {
for (let range of comBtlRanges()) {
cmds.push(['srem', getComTeamKey(q, range), `${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, lvRange: number) {
const client: Redis.RedisClient = pinus.app.get('redis');
// TODO: 操作不具有原子性
const userInfos = await client.srandmemberAsync(`${REDIS_KEY.COM_TEAM_SEARCH_PRE}${quality}`, 2);
const userInfos = await client.srandmemberAsync(getComTeamKey(quality, lvRange), 2);
console.log('getTeamSearchByQuality: ' + userInfos);
if (!userInfos || !userInfos.length) return null;
@@ -260,7 +275,7 @@ export async function getTeamSearchByQuality(quality: number) {
res.push({roleId: decodeData[0], sid: decodeData[1]});
GOOD_QUALITY.forEach((q) => {
cmds.push(['srem', `${REDIS_KEY.COM_TEAM_SEARCH_PRE}${q}`, userInfo]);
cmds.push(['srem', getComTeamKey(q, lvRange), userInfo]);
})
const multiClient = client.multi(cmds) as Redis.Multi;
const newMulti = promisifyAll(multiClient) as Redis.Multi;
@@ -270,10 +285,10 @@ export async function getTeamSearchByQuality(quality: number) {
return res;
}
export async function checkRoleInQueue(roleId: string, sid: string, qualityArr: Array<number>) {
export async function checkRoleInQueue(roleId: string, sid: string, qualityArr: Array<number>, lvRange: number) {
const client: Redis.RedisClient = pinus.app.get('redis');
for (let quality of qualityArr) {
let res = await client.sismemberAsync(`${REDIS_KEY.COM_TEAM_SEARCH_PRE}${quality}`, `${roleId}:${sid}`);
let res = await client.sismemberAsync(getComTeamKey(quality, lvRange), `${roleId}:${sid}`);
if (res) {
return true;
}
@@ -284,7 +299,9 @@ export async function checkRoleInQueue(roleId: string, sid: string, qualityArr:
export async function clearComBtlQueue() {
const client: Redis.RedisClient = pinus.app.get('redis');
for (let q of GOOD_QUALITY) {
await client.delAsync(`${REDIS_KEY.COM_TEAM_SEARCH_PRE}${q}`);
for (let lvRange of comBtlRanges()) {
await client.delAsync(getComTeamKey(q, lvRange));
}
}
}