寻宝:仅匹配特定等级区间;修复机器人武将不阵亡 bug
This commit is contained in:
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user