diff --git a/game-server/app/servers/guild/handler/gvgHandler.ts b/game-server/app/servers/guild/handler/gvgHandler.ts index 3b7fc8bda..8bc86947b 100644 --- a/game-server/app/servers/guild/handler/gvgHandler.ts +++ b/game-server/app/servers/guild/handler/gvgHandler.ts @@ -12,7 +12,7 @@ import { GVGUserItemModel } from "../../../db/GVGUserItem"; import { GVGUserTaskModel } from "../../../db/GVGUserTask"; import { GVG } from "../../../pubUtils/dicParam"; import { RoleModel } from "../../../db/Role"; -import { addGVGTechActive, calFighterContribute, calProducerContribute, checkPreTech, checkTechIsIng, getDailyLoginReward, getMyContribute, pushTechChange } from "../../../services/gvg/gvgPrepareService"; +import { addGVGTechActive, calFighterContribute, calProducerContribute, checkPreTech, checkTechIsIng, getDailyLoginReward, getMyContribute, pushTechChange, sendUngotBoxReward } from "../../../services/gvg/gvgPrepareService"; import { GVGUserDailyDataModel } from "../../../db/GVGUserDailyData"; import { gameData } from "../../../pubUtils/data"; import { lockLeagueData } from "../../../services/redLockService"; @@ -85,6 +85,7 @@ export class GVGHandler { const roleId = session.get('roleId'); const serverId = session.get('serverId'); const guildCode = session.get('guildCode'); + const sid = session.get('sid'); // if(!await checkCanPrepare(roleId)) return resResult(STATUS.GVG_CANNOT_PREPARE); // TODO 临时去拦截 @@ -98,6 +99,8 @@ export class GVGHandler { let cities = await getGVGCitiesInfo(configId, groupKey, myLeague); let vestiges = await getMyVestiges(serverId, roleId); + await sendUngotBoxReward(configId, myLeague.leagueCode, roleId, sid); + return resResult(STATUS.SUCCESS, { configId, period, countdownTime, startFightTime, endFightTime, cities, diff --git a/game-server/app/services/gvg/gvgFightService.ts b/game-server/app/services/gvg/gvgFightService.ts index 82a5413cf..490f427e0 100644 --- a/game-server/app/services/gvg/gvgFightService.ts +++ b/game-server/app/services/gvg/gvgFightService.ts @@ -438,51 +438,49 @@ export async function saveVestigeRankSchedule() { } // systimer 服,每周六5点 -export async function sendUngotVestigeReward() { +export async function gvgBattlePeriodSchedule() { const config = await GVGConfigModel.findConfig(); - const playerDatas = await GVGVestigeSumRankModel.getAllCanReceiveRanks(config.configId); - const leagueCodeByConfig = new Map(); - const dataByConfig = new Map>>(); // configId => leagueCode => playerdata + await sendUngotVestigeReward(config.configId); +} + +export async function sendUngotVestigeReward(configId: number) { + const playerDatas = await GVGVestigeSumRankModel.getAllCanReceiveRanks(configId); + const leagueCodes: string[] = []; + const dataByLeague = new Map>(); // leagueCode => playerdata const receiveLeagueParam: { _id: string, roleIds: string[] }[] = [], receivePlayerParam: string[] = []; for(let player of playerDatas) { - if(!leagueCodeByConfig.has(player.configId)) leagueCodeByConfig.set(player.configId, []); - if(leagueCodeByConfig.get(player.configId).indexOf(player.leagueCode) == -1) { - leagueCodeByConfig.get(player.configId).push(player.leagueCode); + if(leagueCodes.indexOf(player.leagueCode) == -1) { + leagueCodes.push(player.leagueCode); } - if(!dataByConfig.has(player.configId)) dataByConfig.set(player.configId, new Map()); - if(!dataByConfig.get(player.configId).has(player.leagueCode)) dataByConfig.get(player.configId).set(player.leagueCode, new Map()); - if(!dataByConfig.get(player.configId).get(player.leagueCode).has(player.roleId)) dataByConfig.get(player.configId).get(player.leagueCode).set(player.roleId, { playerRanks: [], leagueRanks: [] }); - dataByConfig.get(player.configId).get(player.leagueCode).get(player.roleId).playerRanks.push({ _id: player._id, rank: player.rank }); + if(!dataByLeague.has(player.leagueCode)) dataByLeague.set(player.leagueCode, new Map()); + if(!dataByLeague.get(player.leagueCode).has(player.roleId)) dataByLeague.get(player.leagueCode).set(player.roleId, { playerRanks: [], leagueRanks: [] }); + dataByLeague.get(player.leagueCode).get(player.roleId).playerRanks.push({ _id: player._id, rank: player.rank }); receivePlayerParam.push(player._id); } - for(let [configId, leagueCodes] of leagueCodeByConfig) { - const leagueDatas = await GVGVestigeLeagueRankModel.getAllCanReceiveRanks(configId, leagueCodes); - for(let leagueData of leagueDatas) { - let players = dataByConfig.get(configId)?.get(leagueData.leagueCode); - if(players) { - for(let [roleId, data] of players) { - if(leagueData.receiveMembers.indexOf(roleId) == -1) { - data.leagueRanks.push({ _id: leagueData._id, rank: leagueData.rank }); - let index = receiveLeagueParam.findIndex(cur => cur._id == leagueData._id); - if(index == -1) { - receiveLeagueParam.push({ _id: leagueData._id, roleIds: [ roleId ] }); - } else { - receiveLeagueParam[index].roleIds.push(roleId); - } - } + + const leagueDatas = await GVGVestigeLeagueRankModel.getAllCanReceiveRanks(configId, leagueCodes); + for(let leagueData of leagueDatas) { + let players = dataByLeague.get(leagueData.leagueCode); + if(!players) continue; + for(let [roleId, data] of players) { + if(leagueData.receiveMembers.indexOf(roleId) == -1) { + data.leagueRanks.push({ _id: leagueData._id, rank: leagueData.rank }); + let index = receiveLeagueParam.findIndex(cur => cur._id == leagueData._id); + if(index == -1) { + receiveLeagueParam.push({ _id: leagueData._id, roleIds: [ roleId ] }); + } else { + receiveLeagueParam[index].roleIds.push(roleId); } } } } - for(let [configId, leagueMap] of dataByConfig) { - for(let [ leagueCode, players ] of leagueMap) { - for(let [ roleId, { playerRanks, leagueRanks }] of players) { - let { leagueReward, rewards } = calVestigeLeagueBoxRewards(leagueRanks, playerRanks); - if(leagueReward.length > 0) await addGVGReward(roleId, '', leagueCode, null, leagueReward, [], ITEM_CHANGE_REASON.GVG_VESTIGE_RECEIVE_RANK); - if(rewards.length > 0) await sendMailByContent(MAIL_TYPE.VESTIGE_REWARD, roleId, { params: [`${configId}`], goods: rewards }); - } + for(let [ leagueCode, players ] of dataByLeague) { + for(let [ roleId, { playerRanks, leagueRanks }] of players) { + let { leagueReward, rewards } = calVestigeLeagueBoxRewards(leagueRanks, playerRanks); + if(leagueReward.length > 0) await addGVGReward(roleId, '', leagueCode, null, leagueReward, [], ITEM_CHANGE_REASON.GVG_VESTIGE_RECEIVE_RANK); + if(rewards.length > 0) await sendMailByContent(MAIL_TYPE.VESTIGE_REWARD, roleId, { params: [`${configId}`], goods: rewards }); } } diff --git a/game-server/app/services/gvg/gvgPrepareService.ts b/game-server/app/services/gvg/gvgPrepareService.ts index 9643aed1c..ac4a756ec 100644 --- a/game-server/app/services/gvg/gvgPrepareService.ts +++ b/game-server/app/services/gvg/gvgPrepareService.ts @@ -1,9 +1,9 @@ import { BackendSession } from "pinus"; -import { GVG_ACTIVE_TYPE, GVG_ITEM, GVG_RESOURCE_TYPE, GVG_SEED_TYPE, GVG_TECH_TYPE, ITEM_CHANGE_REASON, LEAGUE_JOB, PUSH_ROUTE } from "../../consts"; +import { GVG_ACTIVE_TYPE, GVG_ITEM, GVG_PERIOD, GVG_RESOURCE_TYPE, GVG_SEED_TYPE, GVG_TECH_TYPE, ITEM_CHANGE_REASON, LEAGUE_JOB, MAIL_TYPE, PUSH_ROUTE } from "../../consts"; import { GVGLeagueFarmModel, GVGLeagueFarmType } from "../../db/GVGLeagueFarm"; import { GVGLeaguePrepareModel, Tech } from "../../db/GVGLeaguePrepare"; import { GVGUserDailyDataModel, GVGUserDailyDataType } from "../../db/GVGUserDailyData"; -import { GVGUserDataModel } from "../../db/GVGUserData"; +import { Contribute, GVGUserDataModel } from "../../db/GVGUserData"; import { GVGUserItemModel } from "../../db/GVGUserItem"; import { LeagueField } from "../../domain/gvgField/returnData"; import { calLeagueLv, gameData, getFieldMaxAddType } from "../../pubUtils/data"; @@ -11,13 +11,13 @@ import { GVG } from "../../pubUtils/dicParam"; import { RewardInter } from "../../pubUtils/interface"; import { nowSeconds } from "../../pubUtils/timeUtil"; import { arrToMap, getArrayOfNumber, getRandEelm, decodeIdCntArrayStr, parseGoodStr, sortArrRandom } from "../../pubUtils/util"; -import { addGVGReward } from "./gvgItemService"; -import { getGVGConfig } from "./gvgService"; -import { getProduceCoinCnt } from "./gvgItemService"; +import { addGVGReward, combinePushItem, getProduceCoinCnt } from "./gvgItemService"; +import { getGVGConfig, getGVGPeriodData } from "./gvgService"; import { GVGVestigeRankModel } from "../../db/GVGVestigeRank"; import { addLeagueLvUpMessage, addResourceRecord } from "./gvgRecService"; import { GVGLeagueType } from "../../db/GVGLeague"; import { sendMessageToGuildWithSuc } from "../pushService"; +import { sendMailByContent } from "../mailService"; export function checkPreTech(techId: number, activeQueue: number[], techQueue: Tech[]) { const dicTech = gameData.gvgTech.get(techId); @@ -477,3 +477,26 @@ export async function pushTechChange(guildCodes: string[], isActive: boolean, id }); } } + +export async function sendUngotBoxReward(configId: number, leagueCode: string, roleId: string, sid: string) { + let { period } = getGVGPeriodData(); + if(period != GVG_PERIOD.BATTLE) return; + let userData = await GVGUserDataModel.checkBox(configId, leagueCode, roleId); + if(userData) { + let { contribute = new Contribute(), box = [] } = userData||{}; + + let rewards: RewardInter[] = [], leagueReward: RewardInter[] = [], receiveBoxes: number[] = []; + for(let [boxId, dicBox] of gameData.gvgContributeBox) { + if(box.indexOf(boxId) != -1) continue; + let sumContribute = dicBox.job == LEAGUE_JOB.PRODUCER? calProducerContribute(contribute): calFighterContribute(contribute); + if(sumContribute < dicBox.boxPoint) continue; + receiveBoxes.push(boxId); + combinePushItem(rewards, dicBox.boxReward); + combinePushItem(leagueReward, dicBox.boxLeagueReward); + } + if(leagueReward.length > 0) await addGVGReward(roleId, '', leagueCode, sid, leagueReward, [], ITEM_CHANGE_REASON.GVG_VESTIGE_RECEIVE_RANK); + if(rewards.length > 0) await sendMailByContent(MAIL_TYPE.GVG_BOX_REWARD, roleId, { params: [`${configId}`, receiveBoxes.join()], goods: rewards }); + + await GVGUserDataModel.receiveBoxes(configId, leagueCode, roleId, receiveBoxes); + } +} diff --git a/game-server/app/services/timeTaskService.ts b/game-server/app/services/timeTaskService.ts index 8a9a7f0a0..037bb930f 100644 --- a/game-server/app/services/timeTaskService.ts +++ b/game-server/app/services/timeTaskService.ts @@ -44,7 +44,7 @@ import { HiddenDataModel, HiddenDataModelType } from '../db/HiddenData'; import { setHiddenData, setHiddenDataToMemory } from './dataService'; import { GVGConfigModel } from '../db/GVGConfig'; import { createNewGVGConfig, initLeaguePrepare } from './gvg/gvgService'; -import { getFightTimeByPeriod, saveVestigeRankSchedule, sendUngotVestigeReward } from './gvg/gvgFightService'; +import { getFightTimeByPeriod, saveVestigeRankSchedule, gvgBattlePeriodSchedule } from './gvg/gvgFightService'; import { gvgBattleEnd } from './gvg/gvgBattleService'; const PER_SECOND = 1 * 1000; @@ -926,7 +926,7 @@ export async function initGVGConfigSchedule() { scheduleJob(`gvgFight`, '0 0 22 * * ?', saveVestigeRankSchedule); if(scheduledJobs[`gvgBattle`]) scheduledJobs[`gvgBattle`].cancel(); - scheduleJob(`gvgBattle`, config.battleTime * 1000, sendUngotVestigeReward); + scheduleJob(`gvgBattle`, config.battleTime * 1000, gvgBattlePeriodSchedule); let { startFightTime, endFightTime } = getFightTimeByPeriod(GVG_PERIOD.BATTLE, config.battleTime); diff --git a/shared/consts/constModules/mailConst.ts b/shared/consts/constModules/mailConst.ts index 62dc2f712..1f1945d0f 100644 --- a/shared/consts/constModules/mailConst.ts +++ b/shared/consts/constModules/mailConst.ts @@ -71,6 +71,7 @@ export enum MAIL_TYPE { GVG_GUARD_CITY_REWARD = 41, // 激战期城池占领奖励 LEAGUE_MAIL = 42, // 联军邮件 VESTIGE_REWARD = 43, // 补发遗迹邮件 + GVG_BOX_REWARD = 44, // 云台补发 }; export const SEND_NAME = '系统'; diff --git a/shared/db/GVGUserData.ts b/shared/db/GVGUserData.ts index 199f9bcca..fc4ec1b81 100644 --- a/shared/db/GVGUserData.ts +++ b/shared/db/GVGUserData.ts @@ -28,7 +28,7 @@ export class Contribute { score: number = 0; // 据点积分 } -@index({ leagueCode: 1, roleId: 1, configId: 1, status: 1 }) +@index({ leagueCode: 1, roleId: 1, configId: 1 }) export default class GVGUserData extends BaseModel { @prop({ required: true }) @@ -65,6 +65,9 @@ export default class GVGUserData extends BaseModel { @prop({ required: true, default: 0 }) sendFightRewardTime: number; // 发送征战奖励的时间 + @prop({ required: true }) + hasCheckBox: boolean; + // 激战期 @prop({ required: true, default: 0 }) @@ -122,6 +125,11 @@ export default class GVGUserData extends BaseModel { return result; } + public static async receiveBoxes(configId: number, leagueCode: string, roleId: string, boxIds: number[]) { + const result: GVGUserDataType = await GVGUserDataModel.findOneAndUpdate({ configId, leagueCode, roleId }, { $push: { box: { $each: boxIds } }}, { new: true }).lean(); + return result; + } + public static async receiveLv(configId: number, leagueCode: string, roleId: string, lv: number) { const result: GVGUserDataType = await GVGUserDataModel.findOneAndUpdate({ configId, leagueCode, roleId }, { $set: { receivedLv: lv }}, { new: true }).lean(); return result; @@ -138,6 +146,10 @@ export default class GVGUserData extends BaseModel { return result; } + public static async checkBox(configId: number, leagueCode: string, roleId: string) { + const result: GVGUserDataType = await GVGUserDataModel.findOneAndUpdate({ configId, leagueCode, roleId, hasCheckBox: { $exists: false }}, { $set: { hasCheckBox: true } }).lean(); + return result; + } } export const GVGUserDataModel = getModelForClass(GVGUserData); diff --git a/shared/db/GVGVestigeSumRank.ts b/shared/db/GVGVestigeSumRank.ts index 47d9bf0af..221cd911d 100644 --- a/shared/db/GVGVestigeSumRank.ts +++ b/shared/db/GVGVestigeSumRank.ts @@ -79,7 +79,7 @@ export default class GVGVestigeSumRank extends BaseModel { } public static async getAllCanReceiveRanks(configId: number) { - let result: GVGVestigeSumRankType[] = await GVGVestigeSumRankModel.find({ configId: { $lte: configId }, rank: { $gt: 0 }, isReceived: false }).lean(); + let result: GVGVestigeSumRankType[] = await GVGVestigeSumRankModel.find({ configId, rank: { $gt: 0 }, isReceived: false }).lean(); return result; } } diff --git a/shared/resource/jsons/dic_email_content.json b/shared/resource/jsons/dic_email_content.json index eabc272cb..378d2e2bf 100644 --- a/shared/resource/jsons/dic_email_content.json +++ b/shared/resource/jsons/dic_email_content.json @@ -304,7 +304,14 @@ "id": 43, "title": "&", "sendName": "学宫驿使", - "content": "亲爱的百家传人,逐鹿中原本轮备战期已结束,您有奖励尚未领取,现已发送至邮箱,请查收", + "content": "亲爱的百家传人,逐鹿中原本轮备战期已结束,您遗迹奖励的宝箱尚未领取,现已发送至邮箱,请查收", + "time": 720 + }, + { + "id": 44, + "title": "&", + "sendName": "学宫驿使", + "content": "亲爱的百家传人,逐鹿中原本轮备战期已结束,您在联军云台中的宝箱奖励尚未领取,现已发送至邮箱,请查收", "time": 720 } ] \ No newline at end of file