pvp:添加购买挑战次数

This commit is contained in:
luying
2021-11-01 15:28:58 +08:00
parent e507ff933b
commit bb625b88ed
7 changed files with 59 additions and 37 deletions

View File

@@ -55,7 +55,7 @@ export class PvpHandler {
if(refChallengeObj.hasChanged) {
update = { ...update, ...refChallengeObj }
}
let refOppObj = refreshRefOppCnt(pvpDefense.refOppCnt, pvpDefense.setAttackCnt, pvpDefense.refDaily);
let refOppObj = refreshRefOppCnt(pvpDefense);
// 每天首次打开要刷掉对手
if(refOppObj.shouldRefOpp) {
if(pvpDefense.attack) {
@@ -104,7 +104,7 @@ export class PvpHandler {
if(!pvpDefense.attack) return resResult(STATUS.PVP_NOT_SET_ATTACK);
// 刷新次数及消耗
let refOppObj = refreshRefOppCnt(pvpDefense.refOppCnt, pvpDefense.setAttackCnt, pvpDefense.refDaily);
let refOppObj = refreshRefOppCnt(pvpDefense);
if (refOppObj.refOppCnt >= gameData.maxPvpRefreshCnt.max) {
return resResult(STATUS.PVP_REFRESH_CNT_REACH_MAX);
}
@@ -277,6 +277,52 @@ export class PvpHandler {
});
}
async buyAttackCnt(msg: { count: number }, session: BackendSession) {
let { count } = msg;
let roleId = session.get('roleId');
let sid = session.get('sid');
if(count <= 0 || count == undefined) return resResult(STATUS.WRONG_PARMS);
let pvpDefense = await PvpDefenseModel.findByRoleId(roleId);
if(!pvpDefense) return resResult(STATUS.PVP_NOT_OPEN);
// 次数
let refOppObj = refreshRefOppCnt(pvpDefense);
if(refOppObj.buyAttackCnt + count > PVP.PVP_BUY_SET_ATTACK_CNT) {
return resResult(STATUS.PVP_BUY_ATTACK_CNT_NOT_ENOUGH);
}
refOppObj.buyAttackCnt += count;
let gold = getGoldObject(PVP.PVP_SET_ATTACK_CNT_GOLD * count);
let costResult = await handleCost(roleId, sid, [gold]);
if(!costResult) return resResult(STATUS.TOWER_GOLD_NOT_ENOUGH);
let update: pvpUpdateInter = { ...refOppObj };
// 更新挑战阵容
if(refOppObj.shouldRefOpp) {
if(pvpDefense.attack) {
let role = await RoleModel.findByRoleId(roleId);
let { seasonNum } = await PVPConfigModel.findCurPVPConfig();
let oppPlayers = await refreshEnemies(role, seasonNum, pvpDefense.attack.score, pvpDefense.attack.pLv||1);
update.oppPlayers = oppPlayers;
}
}
// 保存
pvpDefense = await PvpDefenseModel.updateInfoAndInclude(roleId, update);
// 返回
let result = new PvpDataReturn();
result.setPvpDefense(pvpDefense);
let pickParam = ['buyAttackCnt', 'setAttackCnt', 'refOppCnt'];
if(refOppObj.shouldRefOpp) {
let oppPlayersReturn = await getEnemies(pvpDefense.oppPlayers||[], pvpDefense.winStreakNum);
result.setOppPlayers(oppPlayersReturn);
pickParam.push('oppPlayers');
}
return resResult(STATUS.SUCCESS, pick(result, pickParam));
}
async saveAttack(msg: { heroes: { actorId: number, order: number }[] }, session: BackendSession) {
let { heroes } = msg;
let roleId = session.get('roleId');
@@ -290,15 +336,10 @@ export class PvpHandler {
if(!pvpDefense) return resResult(STATUS.PVP_NOT_OPEN);
// 次数
let refOppObj = refreshRefOppCnt(pvpDefense.refOppCnt, pvpDefense.setAttackCnt, pvpDefense.refDaily);
if(refOppObj.setAttackCnt >= PVP.PVP_SET_ATTACK_CNT) {
let refOppObj = refreshRefOppCnt(pvpDefense);
if(refOppObj.setAttackCnt >= PVP.PVP_BUY_SET_ATTACK_CNT + refOppObj.buyAttackCnt) {
return resResult(STATUS.PVP_SET_ATTACK_CNT_NOT_ENOUGH);
}
if(refOppObj.setAttackCnt >= PVP.PVP_SET_ATTACK_FREE_CNT) {
let gold = getGoldObject(PVP.PVP_SET_ATTACK_CNT_GOLD);
let result = await handleCost(roleId, sid, [gold]);
if(!result) return resResult(STATUS.TOWER_GOLD_NOT_ENOUGH);
}
refOppObj.setAttackCnt ++;
let { seasonNum, seasonEndTime } = await PVPConfigModel.findCurPVPConfig();
let refChallengeObj = refChallengeCnt(pvpDefense.challengeCnt, pvpDefense.challengeRefTime, seasonEndTime);

View File

@@ -79,7 +79,6 @@ export class EntryHandler {
let equips = await EquipModel.findbyRole(role.roleId);
let items = await ItemModel.findbyRole(role.roleId);
let skins = await SkinModel.findbyRole(role.roleId);
// if (role.hasInit) await loginRefresh(role.roleId); // pvp在getData的时候会做初始这里先注掉
reportOneOnline(role.roleId, user.userCode, self.app.get('serverId'), true, user);
let r = new Rank(REDIS_KEY.HERO_NUM_RANK, { serverId });

View File

@@ -1,24 +0,0 @@
import { getFuncsSwitch, gameData } from '../pubUtils/data';
import { FUNCS_ID, FUNC_OPT_TYPE } from '../consts/constModules/sysConst';
import { RoleModel } from '../db/Role';
/**
* 等级提升触发事件
* @param roleId
* @param lv
* @param addFuncs
* @param dataFuncs
*/
export async function eventOnPlayerLvUp(roleId: string, lv: number, addFuncs: Array<number>, dataFuncs: Array<number>) {
for(let [id, dicFunSwitch] of gameData.funcsSwitch) {
if(dicFunSwitch.conditionType != FUNC_OPT_TYPE.LEVEL_UP) continue;
if (dataFuncs.includes(id)) continue; // 已开启过了
if (dicFunSwitch && lv >= dicFunSwitch.param) {
addFuncs.push(id);
}
}
}

View File

@@ -331,15 +331,16 @@ export async function sendLastSeasonRewardIfNotSent(pvpDefense: PvpDefenseType)
}
// 获取刷新对手次数及消耗
export function refreshRefOppCnt(refOppCnt: number, setAttackCnt: number, refDaily: Date) {
export function refreshRefOppCnt(pvpDefense: PvpDefenseType) {
let { refOppCnt = 0, setAttackCnt = 0, buyAttackCnt = 0, refDaily } = pvpDefense;
let curTime = new Date();
let shouldRefOpp = shouldRefresh(refDaily, curTime);
if (shouldRefOpp) {
refOppCnt = 0; setAttackCnt = 0; refDaily = curTime;
refOppCnt = 0; setAttackCnt = 0; buyAttackCnt =0; refDaily = curTime;
}
return {
shouldRefOpp,
refOppCnt, refDaily, setAttackCnt,
refOppCnt, refDaily, setAttackCnt, buyAttackCnt,
consume: gameData.pvpRefreshConsume.get(refOppCnt + 1)
}
}

View File

@@ -143,6 +143,7 @@ export const STATUS = {
PVP_CHALLENGE_TIMES_NOT_ENOUGH: { code: 20805, simStr: '挑战次数不足' },
PVP_SET_ATTACK_CNT_NOT_ENOUGH: { code: 20806, simStr: '设置挑战阵容次数不足' },
PVP_NOT_SET_ATTACK: { code: 20807, simStr: '未设置挑战阵容' },
PVP_BUY_ATTACK_CNT_NOT_ENOUGH: { code: 20808, simStr: '购买挑战阵容次数不足' },
// 军团 20900-20999
GUILD_AUTH_NOT_ENOUGH: { code: 20900, simStr: '权限不足' },

View File

@@ -38,6 +38,8 @@ export default class PvpDefense extends BaseModel {
refOppCnt: number; // 刷新对手总次数,消耗可根据消耗表算出
@prop({ required: true, default: 0 })
setAttackCnt: number; // 设置挑战阵容次数
@prop({ required: true, default: 0 })
buyAttackCnt: number; // 购买挑战阵容次数
@prop({ required: true, default: 0 })
challengeCnt: number; // 可挑战次数每2小时回复一次

View File

@@ -233,6 +233,7 @@ export class PvpDataReturn {
winStreakNum: number = 0;
refOppCnt: number;
setAttackCnt: number;
buyAttackCnt: number;
challengeCnt: number;
challengeRefTime: number;
receiveBox: number[] = [];
@@ -249,6 +250,7 @@ export class PvpDataReturn {
this.refOppCnt = pvpDefense.refOppCnt;
this.setAttackCnt = pvpDefense.setAttackCnt;
this.buyAttackCnt = pvpDefense.buyAttackCnt;
this.challengeCnt = pvpDefense.challengeCnt;
this.challengeRefTime = pvpDefense.challengeRefTime;