pvp:添加购买挑战次数
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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 });
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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: '权限不足' },
|
||||
|
||||
@@ -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小时回复一次
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user