寻宝:协助次数&匹配范围修改

This commit is contained in:
luying
2022-02-17 20:01:57 +08:00
parent 41e0f3a457
commit c87f50ced0
14 changed files with 205 additions and 354 deletions

View File

@@ -6,7 +6,7 @@ import { difference } from 'underscore';
* @Last Modified by: 梁桐川
* @Last Modified time: 2021-08-27 17:47:56
*/
import { IT_TYPE, CURRENCY_BY_TYPE, CURRENCY_TYPE, COM_TEAM_STATUS, COM_BTL_CONST, CONSUME_TYPE, COM_BTL_QUALITY, MSG_SOURCE, QUALITY_TYPE, ROLE_SELECT, TASK_TYPE, KING_EXP_RATIO_TYPE, ITEM_CHANGE_REASON, getChannelType, CHANNEL_PREFIX } from './../../../consts';
import { IT_TYPE, CURRENCY_BY_TYPE, CURRENCY_TYPE, COM_TEAM_STATUS, COM_BTL_CONST, CONSUME_TYPE, MSG_SOURCE, ROLE_SELECT, TASK_TYPE, KING_EXP_RATIO_TYPE, ITEM_CHANGE_REASON, getChannelType, CHANNEL_PREFIX } from './../../../consts';
import Role, { RoleModel } from '../../../db/Role';
import { STATUS } from '../../../consts/statusCode';
import { Application, BackendSession } from 'pinus';
@@ -15,7 +15,7 @@ import { RoleStatus, ComBattleTeamModel, ComBattleTeamType, BossHp, ComRoleStatu
import { ItemModel, ItemType } from '../../../db/Item';
import { addItems, handleCost } from '../../../services/rewardService';
import { checkRoleInQueue, rmRoleFromQueue, setTeamSearchReq } from '../../../services/redisService';
import { getRandBlueprtId, clearComBtlTimer, getFrd, updateRobotHurtByTime, comBtlLvInvalid, clearRobotHurtTimer, setDismissTimer, dismissTeam, handleComBtlProgress, getComBattleFriendAdd, teammateInBlackList, blueprtIdValid, createComTeamData, hasEnoughBlueprt, addRoleToTeam, addRoleStToTeam, addValidSearchingRoles, validToJoin, addRobotsToTeam, addRobotsLater, teamIsFullToStart, oneTeamNotInBlack, getAllAssistCnt, checkHasMyTeam } from '../../../services/comBattleService';
import { getRandBlueprtId, clearComBtlTimer, getFrd, updateRobotHurtByTime, comBtlLvInvalid, clearRobotHurtTimer, setDismissTimer, dismissTeam, handleComBtlProgress, getComBattleFriendAdd, teammateInBlackList, blueprtIdValid, hasEnoughBlueprt, addRoleToTeam, addRoleStToTeam, addValidSearchingRoles, validToJoin, addRobotsToTeam, addRobotsLater, teamIsFullToStart, oneTeamNotInBlack, getAllAssistCnt, checkHasMyTeam } from '../../../services/comBattleService';
import { setAp } from '../../../services/actionPointService';
import { roleLevelup } from '../../../services/normalBattleService';
import { addUserToChannel, getSimpleRoleInfo } from '../../../services/roleService';
@@ -72,7 +72,7 @@ export class ComBattleHandler {
let channel = channelService.getChannel(teamCode, true);
// 创建队伍数据结构
let comTeam: MemComBtlTeam = createComTeamData(teamCode, pub, blueprtId, roleId, ceLimit);
let comTeam = new MemComBtlTeam(teamCode, pub, blueprtId, roleId, ceLimit);
addRoleToTeam(comTeam, roleInfo, true, false);
addUserToChannel(channel, new ChannelUser(roleId, sid));
// 将正在匹配的符合要求的玩家加入队伍,并推送入队消息
@@ -96,50 +96,50 @@ export class ComBattleHandler {
/**
* @description 匹配队伍
* @param {{qualityArr: [number]}} msg 要匹配的品质数组列表
* @param {{ lv: number }} msg 要匹配藏宝图品阶
* @param {BackendSession} session
* @returns
* @memberof ComBattleHandler
*/
async searchTeam(msg: {qualityArr: [number], lvRange: number}, session: BackendSession) {
async searchTeam(msg: { lv: number }, session: BackendSession) {
let roleId = session.get('roleId');
let sid = session.get('sid');
const { qualityArr, lvRange = 1 } = msg;
const { lv = 1 } = msg;
const roleInfo = await RoleModel.findByRoleId(roleId, null, true);
const { lv } = roleInfo;
const { lv: playerLv } = roleInfo;
let { topLineupCe = 1000 } = roleInfo;
if(await checkHasMyTeam(roleId)) {
return resResult(STATUS.COM_BATTLE_IS_RUNNING);
}
if (comBtlLvInvalid(lv, lvRange)) {
if (comBtlLvInvalid(playerLv, lv)) {
return resResult(STATUS.COM_BATTLE_ASSIST_LV_NOT_ENOUGH);
}
if (difference(qualityArr, COM_BTL_QUALITY).length !== 0) {
if (!gameData.blueprtByLv.has(lv)) {
return resResult(STATUS.COM_BLUEPRT_QUALITY_ERROR);
}
const teams = await ComBattleTeamModel.getOtherTeamByQualityAndSt(roleId, qualityArr, COM_TEAM_STATUS.DEFAULT, lvRange, topLineupCe);
const teams = await ComBattleTeamModel.getOtherTeamByLvAndSt(roleId, lv, COM_TEAM_STATUS.DEFAULT, topLineupCe);
const team: ComBattleTeamType = await oneTeamNotInBlack(teams, roleId);
if (team && team.roleIds.length < 3 && team.status === COM_TEAM_STATUS.DEFAULT && team.roleIds.indexOf(roleId) === -1 && team.blacklist && team.blacklist.indexOf(roleId) === -1) {
return resResult(STATUS.SUCCESS, {teamCode: team.teamCode});
}
let teamCode = session.get('teamCode');
await setTeamSearchReq(roleId, sid, qualityArr, lvRange);
await setTeamSearchReq(roleId, sid, lv);
let thiz = this;
// 倒计时匹配两个机器人
setTimeout(async () => {
let inQueue = await checkRoleInQueue(roleId, sid, qualityArr, lvRange);
let inQueue = await checkRoleInQueue(roleId, sid, lv);
if (!inQueue) return;
await rmRoleFromQueue(roleId, sid, qualityArr, lvRange);
await rmRoleFromQueue(roleId, sid, lv);
// 创建队伍
let blueprtId = getRandBlueprtId(qualityArr, lvRange).pop();
let comTeam: MemComBtlTeam = createComTeamData(teamCode, false, blueprtId, 'robot', 0)
let blueprtId = getRandBlueprtId(lv).pop();
let comTeam = new MemComBtlTeam(teamCode, false, blueprtId, 'robot', 0)
let { quality } = gameData.goods.get(blueprtId);
let isFrd = await getFrd(roleId, quality);
let isFrd = await getFrd(roleId);
// 将玩家加入队伍
addRoleToTeam(comTeam, roleInfo, false, isFrd);
let channelService = thiz.app.get('channelService');
@@ -169,7 +169,7 @@ export class ComBattleHandler {
let roleId = session.get('roleId');
let sid = session.get('sid');
await rmRoleFromQueue(roleId, sid, COM_BTL_QUALITY, null);
await rmRoleFromQueue(roleId, sid);
return resResult(STATUS.SUCCESS);
}
@@ -194,17 +194,16 @@ export class ComBattleHandler {
let { lv = 1, head = EXTERIOR.EXTERIOR_FACE, topLineupCe = 0, frame = EXTERIOR.EXTERIOR_FACECASE, spine = EXTERIOR.EXTERIOR_APPEARANCE } = await Role.findByRoleId(roleId, null, true);
let { quality } = gameData.goods.get(teamStatus.blueprtId);
if (lv < COM_BTL_CONST.ENABLE_LV) {
return resResult(STATUS.COM_BATTLE_LV_NOT_ENOUGH);
} else if (comBtlLvInvalid(lv, teamStatus.lvRange)) {
} else if (comBtlLvInvalid(lv, teamStatus.lv)) {
return resResult(STATUS.COM_BATTLE_ASSIST_LV_NOT_ENOUGH);
} else if (topLineupCe < teamStatus.ceLimit) {
return resResult(STATUS.COM_BATTLE_CE_LIMIT);
}
if (!isFrd) {
isFrd = await getFrd(roleId, quality);
isFrd = await getFrd(roleId);
}
// 加入队伍
@@ -242,7 +241,7 @@ export class ComBattleHandler {
if (!teamStatus || teamStatus.status !== COM_TEAM_STATUS.DEFAULT) return resResult(STATUS.COM_BATTLE_TEAM_INVALID);
if (teamStatus.capId === roleId) return resResult(STATUS.COM_BATTLE_SET_FRD_ERR);
if (!isFrd) {
isFrd = await getFrd(roleId, teamStatus.quality);
isFrd = await getFrd(roleId);
}
if (isFrd !== isFrdPre) {
return resResult(STATUS.COM_BATTLE_ASSIST_NOT_ENOUGH);
@@ -466,7 +465,7 @@ export class ComBattleHandler {
updateRobotHurtByTime(teamStatus, st, COM_BTL_CONST.ROBOT_BASE_TIME_INTERVAL + idx, channel, this.robotHurtTimer, this.teamMap);
}
});
await checkTaskInComBattleStart(teamStatus.roleStatus, teamStatus.capId, teamStatus.quality);
await checkTaskInComBattleStart(teamStatus.roleStatus, teamStatus.capId, teamStatus.lv);
return resResult(STATUS.SUCCESS);
}
@@ -774,61 +773,4 @@ export class ComBattleHandler {
return resResult(STATUS.SUCCESS, { list: result });
}
/**
* @description 藏宝图合成
* @param {{original: Array<{id: number, count: number}>}} msg
* @param {BackendSession} session
* @returns
* @memberof ComBattleHandler
*/
async composeBlueprt(msg: {original: Array<{id: number, count: number}>}, session: BackendSession) {
const roleId = session.get('roleId');
const roleName = session.get('roleName');
const sid = session.get('sid');
const serverId = session.get('serverId');
const { original } = msg;
// 原材料检查
let originalQuality: number, originalSum: number = 0;
for(let {id, count} of original) {
const goodInfo = gameData.goods.get(id);
if(!originalQuality) originalQuality = goodInfo.quality;
if(originalQuality != goodInfo.quality) {
return resResult(STATUS.COM_BLUEPRT_QUALITY_ERROR);
}
if(goodInfo.itid == IT_TYPE.BLUEPRT) {
originalSum += count;
}
}
const dicCompose = gameData.blurprtCompose.get(originalQuality);
if(!dicCompose) {
return resResult(STATUS.COM_BLUEPRT_QUALITY_CANNOT_COMPOSE);
}
if(originalSum != dicCompose.blueprtNum) {
return resResult(STATUS.COM_BLUEPRT_COUNT_ERROR);
}
// 添加寻宝币
original.push(...dicCompose.coinNum);
// 消耗藏宝图和寻宝币
let costResult = await handleCost(roleId, sid, original, ITEM_CHANGE_REASON.BLUEPRT_COMPOSE);
if(!costResult) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
const targetList = gameData.blueprt.get(dicCompose.targetQuality);
const target = getRandSingleEelm(targetList);
const reward = [{id: target, count: 1}];
const goods = await addItems(roleId, roleName, sid, reward, ITEM_CHANGE_REASON.BLUEPRT_COMPOSE);
if (dicCompose.targetQuality >= QUALITY_TYPE.ORANGE) {
const { name } = gameData.goods.get(target);
pushNormalItemMsg(roleId, roleName, serverId, MSG_SOURCE.ORANGE_BLUEPRT_COMPOSE, target, name);
}
await checkTask(roleId, sid, TASK_TYPE.COM_BATTLE_BLUEPRT, 1, true, { quality: dicCompose.targetQuality });
return resResult(STATUS.SUCCESS, { goods, costGold: 0 });
}
}

View File

@@ -213,7 +213,7 @@ export class EntryHandler {
}
});
reportTAUserSet(TA_USERSET_TYPE.ADD, roleId, { total_play_time: nowSeconds() - loginTime });
rmRoleFromQueue(roleId, sid, COM_BTL_QUALITY, null); // 删除redis中寻宝的匹配记录
rmRoleFromQueue(roleId, sid); // 删除redis中寻宝的匹配记录
let channelService = this.app.get('channelService');
let channel = channelService.getChannel(roleId, true);
channel.leave(roleId, sid);

View File

@@ -1,43 +1,33 @@
import { MemComBtlTeam } from './../domain/battleField/ComBattleTeamField';
import { ItemModel } from './../db/Item';
import { ITEM_CHANGE_REASON, IT_TYPE } from './../consts';
import { COM_BTL_QUALITY } from './../consts/constModules/itemConst';
import { FriendRelationModel } from './../db/FriendRelation';
import { RoleModel, RoleType } from './../db/Role';
import { EquipPrintDropType, EquipPrintDropModel } from './../db/EquipPrintDrop';
import { FriendPointModel } from './../db/FriendPoint';
import { STATUS } from './../consts/statusCode';
import { COM_TEAM_STATUS, FRIEND_DROP_TYPE, COM_BTL_CONST, FRIEND_DROP_MAX } from './../consts';
import { RoleStatus, ComBattleTeamModel, ComBattleTeamType } from './../db/ComBattleTeam';
import { getRandEelm, getRandValue, resResult, ratioReward, getRandValueByMinMax, getRandEelmWithWeight, getRobotInfo } from "../pubUtils/util";
import { getRandRobot, transBossHpArr } from "./battleService";
import { difference, omit } from 'underscore';
import { Channel, ChannelService, pinus } from 'pinus';
import { TREASURE, EXTERIOR } from '../pubUtils/dicParam';
import { getFriendLvAdd } from './friendService';
import { getRoleIds } from '../pubUtils/friendUtil';
import { getTeamSearchByQuality, rmRoleFromQueue } from './redisService';
import { getTeamSearchByLv, rmRoleFromQueue } from './redisService';
import { addUserToChannel } from './roleService';
import { ChannelUser } from '../domain/ChannelUser';
import { getRewardByBlueprtId, gameData, getBossHpByBlueprtId } from '../pubUtils/data';
import { getFriendPointObject } from '../pubUtils/itemUtils';
import { DicWar } from '../pubUtils/dictionary/DicWar';
import { getRewardByBlueprtId, gameData, getBossHpByBlueprtId, getDicBlueprtById } from '../pubUtils/data';
import { getZeroPointD, nowSeconds } from '../pubUtils/timeUtil';
import { dispatch } from '../pubUtils/dispatcher';
import { handleCost } from './rewardService';
/**
* 在给定的品质列表中随机返回一定数量的藏宝图Id
* @param qualityArr 品质数组在所有给定品质的藏宝图中筛选1
* @param lv 品质数组在所有给定品质的藏宝图中筛选1
* @param cnt 返回藏宝图数量
*/
export function getRandBlueprtId(qualityArr: number[], lvRange: number, cnt = 1) {
if (!qualityArr || !qualityArr.length) return null;
let blueprtIdArr: number[] = [];
for (let q of qualityArr) {
blueprtIdArr = blueprtIdArr.concat(gameData.blueprtWithQualityAndStar.get(`${q}_${lvRange}`));
}
if (blueprtIdArr.length === 0) return null;
export function getRandBlueprtId(lv: number, cnt = 1) {
if (!gameData.blueprtByLv.has(lv)) return null;
let blueprtIdArr: number[] = gameData.blueprtByLv.get(lv)||[];
const res = getRandEelm(blueprtIdArr, cnt);
// console.log('******** getRandBlueprtId', blueprtIdArr, cnt, res)
@@ -167,37 +157,14 @@ export async function getRealReward(blueprtId: number, roleSt: RoleStatus) {
}
export async function getAllAssistCnt(roleId: string) {
let cntMap = await getAssistTimesByQuality(roleId);
let cnt = [];
for (let i = 0; i < COM_BTL_QUALITY.length; ++i) {
cnt[i] = cntMap.get(i + 1) || 0;
}
return cnt;
let teams = await ComBattleTeamModel.getAssistTeamsByTime(roleId, getZeroPointD(), true);
return teams.length;
}
export async function getAssistTimesByQuality(roleId: string, qualityArr?: number[]) {
let teams = await ComBattleTeamModel.getAssistTeamsByTime(roleId, qualityArr, getZeroPointD(), true);
let cntMap = new Map<number, number>();
teams.forEach(team => {
if (team && team.quality && team.roleStatus) {
for (let st of team.roleStatus) {
if (st.roleId !== roleId || st.isFrd) {
continue;
}
let cnt = cntMap.get(team.quality) || 0;
cntMap.set(team.quality, cnt + 1)
}
}
});
return cntMap;
}
export async function getFrd(roleId: string, quality: number) {
export async function getFrd(roleId: string) {
let isFrd = false;
let assistTimes = await getAssistTimesByQuality(roleId, [quality]);
let assistTime = assistTimes.get(quality);
let { assistanceTime } = gameData.xunbao.get(quality);
if (assistTime >= assistanceTime) isFrd = true;
let cnt = await getAllAssistCnt(roleId);
if (cnt >= TREASURE.TREASURE_ASSIST_TIME) isFrd = true;
return isFrd;
}
@@ -242,7 +209,7 @@ function updateRobotKilled(bossHp: number, roleSt: RoleStatus) {
}
export async function handleComBtlProgress(teamStatus: MemComBtlTeam, robotHurtTimer: Map<string, NodeJS.Timer>, teamMap: Map<string, MemComBtlTeam>, channel: Channel) {
const { teamCode, roleIds, capId, quality } = teamStatus;
const { teamCode } = teamStatus;
// 判断战斗是否结束
let battleSt = checkComBattleResult(teamStatus);
teamStatus.status = battleSt;
@@ -351,15 +318,15 @@ export function clearRobotHurtTimer(teamStatus, robotHurtTimer: Map<string, Node
/**
* @description 检查寻宝等级是否合法
* @export
* @param {number} lv 玩家等级
* @param {number} lvRange 藏宝图等级范围
* @param {number} playerLv 玩家等级
* @param {number} blueprtLv 藏宝图等级
* @returns
*/
export function comBtlLvInvalid(lv: number, lvRange: number) {
const range = gameData.comBtlLvRange.get(lvRange);
export function comBtlLvInvalid(playerLv: number, blueprtLv: number) {
const range = gameData.comBtlLvRange.get(blueprtLv);
if (!range) return true;
let { min, max } = range;
return lv < min || lv > max;
return playerLv < min || playerLv > max;
}
export async function dismissTeam(teamStatus: MemComBtlTeam, teamMap: Map<string, MemComBtlTeam>, roleId: string, teamDisTimer: Map<string, NodeJS.Timer>, channel) {
@@ -501,18 +468,17 @@ async function teammateValid(roleInfo: Partial<RoleType>, roleId: string, roleId
* @param {string} roleId 要加入玩家的信息
* @param {string[]} roleIds 队伍中当前玩家列表
* @param {number} ceLimit
* @param {number} quality
* @returns
*/
export async function getValidTeammateRoleSt(roleId: string, roleIds: string[], ceLimit: number, quality: number) {
export async function getValidTeammateRoleSt(roleId: string, roleIds: string[], ceLimit: number) {
let roleInfo = await RoleModel.findByRoleId(roleId, null, true);
let { roleName, head = EXTERIOR.EXTERIOR_FACE, frame = EXTERIOR.EXTERIOR_FACECASE, spine = EXTERIOR.EXTERIOR_APPEARANCE, topLineupCe, lv } = roleInfo;
let { roleName, head = EXTERIOR.EXTERIOR_FACE, frame = EXTERIOR.EXTERIOR_FACECASE, spine = EXTERIOR.EXTERIOR_APPEARANCE, topLineupCe, lv: playerLv } = roleInfo;
const valid = await teammateValid(roleInfo, roleId, roleIds, ceLimit);
if (!valid) return null;
let isFrd = await getFrd(roleId, quality);
const result = new RoleStatus(roleId, roleName, false, isFrd, head, frame, spine, topLineupCe, lv);
let isFrd = await getFrd(roleId);
const result = new RoleStatus(roleId, roleName, false, isFrd, head, frame, spine, topLineupCe, playerLv);
return result;
}
@@ -532,36 +498,7 @@ export async function teammateInBlackList(roleId: string, roleIds: string[]) {
}
export function blueprtIdValid(id: number) {
const goodData = gameData.goods.get(id);
return goodData && goodData.itid === IT_TYPE.BLUEPRT && COM_BTL_QUALITY.indexOf(goodData.quality) !== -1;
}
/**
* @description 创建 ComBattleTeam 的数据结构
* @export
* @param {string} teamCode
* @param {boolean} pub
* @param {number} blueprtId
* @param {number} status
* @param {string} capId
* @param {number} ceLimit
* @param {number} bossHp
* @param {number} quality
* @param {BossHp[]} bossHpArr
* @returns
*/
export function createComTeamData(teamCode: string, pub: boolean, blueprtId: number, capId: string, ceLimit: number) {
const { equipLvl, quality } = gameData.goods.get(blueprtId);
const { bossHpSum, bossHpArr } = getBossHpByBlueprtId(blueprtId);
const curRnd = 0;
const roleCnt = 1;
const timeout = false;
const bossCurHp = bossHpSum;
const bossHp = bossHpSum;
const status = COM_TEAM_STATUS.DEFAULT;
return {
teamCode, pub, blueprtId, status, capId, ceLimit, bossHp, bossCurHp, quality, bossHpArr: transBossHpArr(bossHpArr), curRnd, roleCnt, timeout, lvRange: equipLvl, blacklist: []
};
return gameData.blueprt.has(id);
}
/**
@@ -619,14 +556,14 @@ export function addRoleStToTeam(comTeam: MemComBtlTeam, roleSt: RoleStatus) {
* @returns
*/
export async function addValidSearchingRoles(comTeam: MemComBtlTeam, channelService: ChannelService) {
const { quality, equipLvl } = gameData.goods.get(comTeam.blueprtId);
let teammates = await getTeamSearchByQuality(quality, equipLvl);
const { lv } = getDicBlueprtById(comTeam.blueprtId);
let teammates = await getTeamSearchByLv(lv);
if (teammates && teammates.length) {
for (let teammate of teammates) {
const { roleId: teammateRoleId, sid } = teammate;
const st = await getValidTeammateRoleSt(teammateRoleId, comTeam.roleIds, comTeam.ceLimit, quality);
const st = await getValidTeammateRoleSt(teammateRoleId, comTeam.roleIds, comTeam.ceLimit);
if (!st) continue;
await rmRoleFromQueue(teammateRoleId, sid, COM_BTL_QUALITY, null); // 匹配成功后删除redis中该用户的匹配记录
await rmRoleFromQueue(teammateRoleId, sid); // 匹配成功后删除redis中该用户的匹配记录
addRoleStToTeam(comTeam, st);
const channel = channelService.getChannel(comTeam.teamCode, false);
addUserToChannel(channel, new ChannelUser(teammateRoleId, sid));

View File

@@ -133,11 +133,10 @@ export async function updateUserInfo(key: string, roleId: string, arr: Array<{fi
/**
* @description 拼接匹配分组的 key
* @param {number} quality 品质
* @param {number} lvRange 等级范围
* @param {number} lv 藏宝图品阶
*/
function getComTeamKey(quality: number, lvRange: number) {
return `${REDIS_KEY.COM_TEAM_SEARCH_PRE}:${quality}_${lvRange}`;
function getComTeamKey(lv: number) {
return `${REDIS_KEY.COM_TEAM_SEARCH_PRE}:${lv}`;
}
/**
@@ -159,14 +158,9 @@ function getComTeamValue(roleId: string, sid: string) {
* @param {number} lvRange
* @returns
*/
export async function setTeamSearchReq(roleId: string, sid: string, qualityArr: Array<number>, lvRange: number) {
let cmds = [];
qualityArr.forEach(quality => {
if (quality) {
cmds.push(['sadd', getComTeamKey(quality, lvRange), getComTeamValue(roleId, sid)]);
}
});
const res = await redisClient().multi(cmds).execAsync();
export async function setTeamSearchReq(roleId: string, sid: string, lv: number) {
const res = await redisClient().saddAsync(getComTeamKey(lv), [getComTeamValue(roleId, sid)]);
console.log('setTeamSearchReq: ', res);
return res;
}
@@ -176,21 +170,18 @@ export async function setTeamSearchReq(roleId: string, sid: string, qualityArr:
* @export
* @param {string} roleId
* @param {string} sid
* @param {Array<number>} qualityArr
* @param {number} lvRange
* @param {number} lv 如果不填表示所有品阶
*/
export async function rmRoleFromQueue(roleId: string, sid: string, qualityArr: Array<number>, lvRange: number) {
export async function rmRoleFromQueue(roleId: string, sid: string, lv?: number) {
let cmds = [];
for (let q of qualityArr) {
if (lvRange) {
cmds.push(['srem', getComTeamKey(q, lvRange), getComTeamValue(roleId, sid)]);
} else {
for (let range of comBtlRanges()) {
cmds.push(['srem', getComTeamKey(q, range), getComTeamValue(roleId, sid)]);
}
if (lv) {
cmds.push(['srem', getComTeamKey(lv), getComTeamValue(roleId, sid)]);
} else {
for (let range of comBtlRanges()) {
cmds.push(['srem', getComTeamKey(range), getComTeamValue(roleId, sid)]);
}
};
}
await redisClient().multi(cmds).execAsync();
}
@@ -201,10 +192,10 @@ export async function rmRoleFromQueue(roleId: string, sid: string, qualityArr: A
* @param {number} lvRange 等级范围
* @returns
*/
export async function getTeamSearchByQuality(quality: number, lvRange: number) {
export async function getTeamSearchByLv(lv: number) {
// TODO: 操作不具有原子性
const userInfos = await redisClient().srandmemberAsync(getComTeamKey(quality, lvRange), 2);
console.log('getTeamSearchByQuality: ' + userInfos);
const userInfos = await redisClient().srandmemberAsync(getComTeamKey(lv), 2);
console.log('getTeamSearchByLv: ' + userInfos);
if (!userInfos || !userInfos.length) return null;
let res = [];
@@ -213,7 +204,7 @@ export async function getTeamSearchByQuality(quality: number, lvRange: number) {
if (decodeData.length !== 2) return null;
res.push({roleId: decodeData[0], sid: decodeData[1]});
}
console.log('getTeamSearchByQuality res: ', res);
console.log('getTeamSearchByLv res: ', res);
return res;
}
@@ -222,17 +213,14 @@ export async function getTeamSearchByQuality(quality: number, lvRange: number) {
* @export
* @param {string} roleId
* @param {string} sid
* @param {Array<number>} qualityArr
* @param {number} lvRange
* @param {number} lv
* @returns
*/
export async function checkRoleInQueue(roleId: string, sid: string, qualityArr: Array<number>, lvRange: number) {
for (let quality of qualityArr) {
let res = await redisClient().sismemberAsync(getComTeamKey(quality, lvRange), `${roleId}:${sid}`);
if (res) {
return true;
}
};
export async function checkRoleInQueue(roleId: string, sid: string, lv: number) {
let res = await redisClient().sismemberAsync(getComTeamKey(lv), `${roleId}:${sid}`);
if (res) {
return true;
}
return false;
}
@@ -241,11 +229,7 @@ export async function checkRoleInQueue(roleId: string, sid: string, qualityArr:
* @export
*/
export async function clearComBtlQueue() {
for (let q of COM_BTL_QUALITY) {
for (let lvRange of comBtlRanges()) {
await redisClient().delAsync(getComTeamKey(q, lvRange));
}
}
await delKeys(REDIS_KEY.COM_TEAM_SEARCH_PRE);
}
export function setRedis(key: string, data: string) {

View File

@@ -117,58 +117,6 @@ export class WarReward {
}
}
private async handlerBlueprtReward(num: number) {
const refTime = getZeroPointD();
const battleBlueprtDrop = await BattleBlueprtDropModel.findByTime(this.roleId, refTime);
if(battleBlueprtDrop) {
let { getNum = 0, curCostAp = 0, getSum = 0, costAp = 0 } = battleBlueprtDrop;
for(let i = 0; i < num; i ++) {
let flag = false; // 是否可以获得
if( curCostAp >= BLUEPRT_CONST.PER_AP) {
curCostAp = curCostAp - BLUEPRT_CONST.PER_AP; getNum = 0;
}
costAp += this.costAp; curCostAp += this.costAp;
if(getNum == 0) {
let r = Math.random();
console.log(r, 1/BLUEPRT_CONST.PER_AP*curCostAp);
if(r <= 1/BLUEPRT_CONST.PER_AP*curCostAp || (curCostAp >= BLUEPRT_CONST.PER_AP) ) {
flag = true; // 独立概率随机
}
}
if(getSum >= BLUEPRT_CONST.DAILY_CNT) {
flag = false;
}
if(flag) {
getNum ++; getSum++;
const obj = await this.randomBlueprt();
if(obj) {
this.rewards.push({type: BATTLE_REWARD_TYPE.RANDOM_REWARD, times: i +1, ...obj});
}
}
}
await BattleBlueprtDropModel.updateByTime(this.roleId, refTime, {
getNum, curCostAp, getSum, costAp
});
}
}
private async randomBlueprt() {
const { lv } = await RoleModel.findByRoleId(this.roleId);
const dicPossibility = gameData.blueprtPossibility;
const result = dicPossibility.find(cur => {return cur.min <= lv && cur.max >= lv});
if(result) {
const {dic: {id}} = getRandEelmWithWeight(result.possibility);
const blueprtList = gameData.blueprt.get(id);
const gid = getRandSingleEelm(blueprtList);
return {id: gid, count:1}
} else {
return null
}
}
public async saveReward(num: number, combine: boolean = false) {
this.rewards = new Array();
// let warType = this.warInfo.warType;