diff --git a/game-server/app/servers/guild/handler/gvgFightHandler.ts b/game-server/app/servers/guild/handler/gvgFightHandler.ts index 58bc8eed0..58e46f62b 100644 --- a/game-server/app/servers/guild/handler/gvgFightHandler.ts +++ b/game-server/app/servers/guild/handler/gvgFightHandler.ts @@ -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 }); } diff --git a/shared/db/GVGUserDailyData.ts b/shared/db/GVGUserDailyData.ts index d3205d839..f0f752042 100644 --- a/shared/db/GVGUserDailyData.ts +++ b/shared/db/GVGUserDailyData.ts @@ -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); diff --git a/shared/pubUtils/dicParam.ts b/shared/pubUtils/dicParam.ts index dcb792649..a1b7eefe8 100644 --- a/shared/pubUtils/dicParam.ts +++ b/shared/pubUtils/dicParam.ts @@ -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开(开场动画视频)