diff --git a/game-server/app/servers/battle/handler/pvpHandler.ts b/game-server/app/servers/battle/handler/pvpHandler.ts index dcbec2762..8a7137d76 100644 --- a/game-server/app/servers/battle/handler/pvpHandler.ts +++ b/game-server/app/servers/battle/handler/pvpHandler.ts @@ -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); diff --git a/game-server/app/servers/connector/handler/entryHandler.ts b/game-server/app/servers/connector/handler/entryHandler.ts index e9d131b04..e6130dad8 100644 --- a/game-server/app/servers/connector/handler/entryHandler.ts +++ b/game-server/app/servers/connector/handler/entryHandler.ts @@ -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 }); diff --git a/game-server/app/services/playerEventService.ts b/game-server/app/services/playerEventService.ts deleted file mode 100644 index 34cb55fd3..000000000 --- a/game-server/app/services/playerEventService.ts +++ /dev/null @@ -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, dataFuncs: Array) { - - 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); - - } - } - -} \ No newline at end of file diff --git a/game-server/app/services/pvpService.ts b/game-server/app/services/pvpService.ts index 9cb913f8c..9d3883764 100644 --- a/game-server/app/services/pvpService.ts +++ b/game-server/app/services/pvpService.ts @@ -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) } } diff --git a/shared/consts/statusCode.ts b/shared/consts/statusCode.ts index 7683aea6e..7be392609 100644 --- a/shared/consts/statusCode.ts +++ b/shared/consts/statusCode.ts @@ -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: '权限不足' }, diff --git a/shared/db/PvpDefense.ts b/shared/db/PvpDefense.ts index 720f41b1f..d20bc8752 100644 --- a/shared/db/PvpDefense.ts +++ b/shared/db/PvpDefense.ts @@ -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小时回复一次 diff --git a/shared/domain/battleField/pvp.ts b/shared/domain/battleField/pvp.ts index 20e9cffcb..573e8d6a5 100644 --- a/shared/domain/battleField/pvp.ts +++ b/shared/domain/battleField/pvp.ts @@ -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;