🐞 fix(gvg): 云台补发
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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<number, string[]>();
|
||||
const dataByConfig = new Map<number, Map<string, Map<string, { playerRanks: {_id: string, rank: number }[], leagueRanks: { _id: string, rank: number }[] }>>>(); // 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<string, Map<string, { playerRanks: {_id: string, rank: number }[], leagueRanks: { _id: string, rank: number }[] }>>(); // 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 });
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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 = '系统';
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -304,7 +304,14 @@
|
||||
"id": 43,
|
||||
"title": "&",
|
||||
"sendName": "学宫驿使",
|
||||
"content": "亲爱的百家传人,逐鹿中原本轮备战期已结束,您有奖励尚未领取,现已发送至邮箱,请查收",
|
||||
"content": "亲爱的百家传人,逐鹿中原本轮备战期已结束,您遗迹奖励的宝箱尚未领取,现已发送至邮箱,请查收",
|
||||
"time": 720
|
||||
},
|
||||
{
|
||||
"id": 44,
|
||||
"title": "&",
|
||||
"sendName": "学宫驿使",
|
||||
"content": "亲爱的百家传人,逐鹿中原本轮备战期已结束,您在联军云台中的宝箱奖励尚未领取,现已发送至邮箱,请查收",
|
||||
"time": 720
|
||||
}
|
||||
]
|
||||
Reference in New Issue
Block a user