🐞 fix(gvg): 遗迹挑战次数添加元宝购买逻辑

This commit is contained in:
luying
2023-03-24 17:25:28 +08:00
parent 6fd0c682db
commit 6ca399c2e8
3 changed files with 37 additions and 8 deletions

View File

@@ -2,6 +2,7 @@ import { Application, BackendSession, ChannelService, HandlerService, pinus } fr
import { GVG_ACTIVE_TYPE, GVG_ITEM, GVG_PERIOD, ITEM_CHANGE_REASON, REDIS_KEY, ROLE_SELECT, STATUS, TASK_TYPE, VESTIGE_OPP_STATUS, VESTIGE_STATUS, WAR_TYPE } from "../../../consts";
import { BattleRecordModel } from "../../../db/BattleRecord";
import { GVGLeagueModel } from "../../../db/GVGLeague";
import { GVGUserDailyDataModel } from "../../../db/GVGUserDailyData";
import { GVGUserItemModel } from "../../../db/GVGUserItem";
import { GVGVestigeLeagueRankModel } from "../../../db/GVGVestigeLeagueRank";
import { GVGVestigeLockModel } from "../../../db/GVGVestigeLock";
@@ -16,7 +17,7 @@ import { getRemoteRplFilePath, getRemoteRplPrefix } from "../../../pubUtils/batt
import { gameData } from "../../../pubUtils/data";
import { GVG } from "../../../pubUtils/dicParam";
import { RewardInter } from "../../../pubUtils/interface";
import { resResult } from "../../../pubUtils/util";
import { parseGoodStr, resResult } from "../../../pubUtils/util";
import { isHeroHidden } from "../../../services/dataService";
import { calBreakGoods, checkHeroIsUsedInOtherVestige, checkVestige, checkVestigeOppStatus, checkVestigeRank, generateAttackHeroInfo, generateAttackInfo, generateDefenseInfo, getDayKeyInfo, getMyVestigeRank, getOppDetailData, getOppPlayerByRanks, getVestigeRecStatus, getVestigeRank, getVestigeUsedHeroes, isRobot, refreshVestigeOppRanks, saveScoreToRank, updateMyVestigeRank, saveVestigeRankSchedule, calVestigeLeagueBoxRewards, checkFightTime, savePlayerRank } from "../../../services/gvg/gvgFightService";
import { addGVGReward, combinePushItem, handleGVGCost } from "../../../services/gvg/gvgItemService";
@@ -26,6 +27,7 @@ import { getGroupKey, getGVGPeriodData } from "../../../services/gvg/gvgService"
import { checkBattleHeroesByHid } from "../../../services/normalBattleService";
import { Rank } from "../../../services/rankService";
import { getAllServerName } from "../../../services/redisService";
import { CheckMeterial } from "../../../services/role/checkMaterial";
import { checkGVGTask } from "../../../services/task/taskService";
export default function (app: Application) {
@@ -56,6 +58,8 @@ export class GVGProduceHandler {
const myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode);
if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
const myUserDailyData = await GVGUserDailyDataModel.findByRole(configId, myLeague.leagueCode, roleId);
let groupKey = await getGroupKey(serverId);
let dicRankMap = gameData.gvgVestige.get(vestigeId);
@@ -77,7 +81,8 @@ export class GVGProduceHandler {
lineup, lineupCe,
oppPlayers,
refreshCnt,
usedHeroes
usedHeroes,
costGoldCnt: myUserDailyData?.costGoldCnt||0
})
}
@@ -191,14 +196,14 @@ export class GVGProduceHandler {
}
// 选择对手
async chooseOpp(msg: { vestigeId: number, roleId: string, rank: number, myRank: number }, session: BackendSession) {
async chooseOpp(msg: { vestigeId: number, roleId: string, rank: number, myRank: number, costGold: boolean }, session: BackendSession) {
let roleId = session.get('roleId');
let roleName = session.get('roleName');
let serverId = session.get('serverId');
let guildCode = session.get('guildCode');
let sid = session.get('sid');
let { vestigeId, roleId: targetRoleId, rank, myRank } = msg;
let { vestigeId, roleId: targetRoleId, rank, myRank, costGold } = msg;
let { configId, period } = getGVGPeriodData();
if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD);
@@ -217,8 +222,15 @@ export class GVGProduceHandler {
// 检查对手排名/自己排名
if(!checkVestigeRank(myRank, rank)) return resResult(STATUS.GVG_VESTIGE_RANK_ERR);
const hasItem = await GVGUserItemModel.checkItemCnt(configId, myLeague.leagueCode, roleId, GVG_ITEM.FIGHT_COIN, 1);
if(!hasItem) return resResult(STATUS.GVG_ITEMS_NOT_ENOUGH);
let goldCost = parseGoodStr(GVG.GVG_VESTIGE_BUY_COST);
if(costGold) {
let check = new CheckMeterial(roleId);
let isEnough = await check.decrease(goldCost);
if (!isEnough) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
} else {
const hasItem = await GVGUserItemModel.checkItemCnt(configId, myLeague.leagueCode, roleId, GVG_ITEM.FIGHT_COIN, 1);
if(!hasItem) return resResult(STATUS.GVG_ITEMS_NOT_ENOUGH);
}
const groupKey = await getGroupKey(serverId);
let status = await checkVestigeOppStatus(configId, groupKey, vestigeId, roleId, myRank, targetRoleId, rank); // 锁
@@ -229,11 +241,12 @@ export class GVGProduceHandler {
}
// 扣征战令
const costResult = await handleGVGCost(roleId, myLeague.leagueCode, sid, [{ id: GVG_ITEM.FIGHT_COIN, count: 1 }], [], ITEM_CHANGE_REASON.GVG_VESTIGE_START);
const costResult = await handleGVGCost(roleId, myLeague.leagueCode, sid, costGold? []: [{ id: GVG_ITEM.FIGHT_COIN, count: 1 }], costGold? goldCost: [], ITEM_CHANGE_REASON.GVG_VESTIGE_START);
if(!costResult) {
await GVGVestigeLockModel.releaseLock(groupKey, vestigeId, rank);
return resResult(STATUS.GVG_ITEMS_NOT_ENOUGH);
}
let userDailyData = await GVGUserDailyDataModel.incCostGoldCnt(configId, myLeague.leagueCode, roleId, costGold);
// 获取征战令对应奖励
const leagueGoods = await addGVGReward(roleId, roleName, myLeague.leagueCode, sid, dicRank.battleLeagueReward, dicRank.battleReward, ITEM_CHANGE_REASON.GVG_VESTIGE_START);
// 消耗征战令的获得活跃
@@ -247,6 +260,7 @@ export class GVGProduceHandler {
checkGVGTask(serverId, roleId, sid, configId, myLeague.leagueCode, TASK_TYPE.GVG_VESTIGE, { count: 1 });
return resResult(STATUS.SUCCESS, {
active,
costGoldCnt: userDailyData?.costGoldCnt||0,
...oppDetail
});
}

View File

@@ -39,8 +39,11 @@ export default class GVGUserDailyData extends BaseModel {
@prop({ required: true, default: 0 })
hasLogin: boolean; // 是否登录
@prop({ required: true, default: 0 })
costGoldCnt: number; // 已使用元宝的次数
public static async findByRole(configId: number, leagueCode: string, roleId: string) {
const result: GVGUserDailyDataType = await GVGUserDailyDataModel.findOne({ configId, leagueCode, roleId, time: getZeroPoint() }).select('food mineral wood score').lean();
const result: GVGUserDailyDataType = await GVGUserDailyDataModel.findOne({ configId, leagueCode, roleId, time: getZeroPoint() }).select('food mineral wood score costGoldCnt').lean();
return result;
}
@@ -66,6 +69,16 @@ export default class GVGUserDailyData extends BaseModel {
const result: GVGUserDailyDataType = await GVGUserDailyDataModel.findOneAndUpdate({ configId, leagueCode, roleId, time: getZeroPoint()}, { $inc: { food, mineral, wood }}, { new: true, upsert: true }).lean();
return result;
}
public static async incCostGoldCnt(configId: number, leagueCode: string, roleId: string, costGold: boolean) {
if(costGold) {
const result: GVGUserDailyDataType = await GVGUserDailyDataModel.findOneAndUpdate({ configId, leagueCode, roleId, time: getZeroPoint() }, { $inc: { costGoldCnt: 1 } }, { new: true, upsert: true }).lean();
return result;
} else {
const result: GVGUserDailyDataType = await GVGUserDailyDataModel.findOne({ configId, leagueCode, roleId, time: getZeroPoint() }).lean();
return result;
}
}
}
export const GVGUserDailyDataModel = getModelForClass(GVGUserDailyData);

View File

@@ -429,6 +429,8 @@ export const GVG = {
GVG_REVIVE_GOLD: '1&100|2&100|3&100|4&100|5&100|6&100|7&100|8&100|9&100|10&100|11&200', // GVG激战期元宝购买复活的消耗次数&元宝数
GVG_VESTIGE_CHALLENGE_TIME: '5:00:00&22:00:00', // 征战中原遗迹可挑战时间
GVG_DEFAULT_BATTLE_CD: 20, // 激战期战斗锁定时长,用于玩家退出时获取不到数据的情况
GVG_VESTIGE_BUY_COST: "31002&200", // 每次购买消耗
GVG_VESTIGE_BUY_LIMIT: 10, // 每日上限
};
export const PLATFORM_CONFIG = {
OPEN_ANIMATION: 1, // 0关1开开场动画视频