diff --git a/game-server/app/servers/guild/handler/gvgHandler.ts b/game-server/app/servers/guild/handler/gvgHandler.ts index efc74e5ff..85f3e9804 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 { addGVGActive, calProduce, checkPreTech, checkTechIsIng } from "../../../services/gvg/gvgPrepareService"; +import { addGVGActive, addGVGTechActive, calProduce, checkPreTech, checkTechIsIng, getDailyLoginReward, getGVGDailyItems } from "../../../services/gvg/gvgPrepareService"; import { GVGUserDailyDataModel } from "../../../db/GVGUserDailyData"; import { gameData } from "../../../pubUtils/data"; import { lockLeagueData } from "../../../services/redLockService"; @@ -33,8 +33,10 @@ export class GVGHandler { // 测试 async getData(msg: {}, session: BackendSession) { const roleId = session.get('roleId'); - const guildCode = session.get('guildCode'); + const roleName = session.get('roleName'); const serverId = session.get('serverId'); + const guildCode = session.get('guildCode'); + const sid = session.get('sid'); let { configId, period, countdownTime } = getGVGPeriodData(); let serverType = await getGVGServerType(serverId); @@ -57,6 +59,9 @@ export class GVGHandler { let items = await GVGUserItemModel.findByRole(configId, league.leagueCode, roleId); let tasks = await GVGUserTaskModel.findByRole(configId, league.leagueCode, roleId); data.setPlayerInfo(userData, getMyAuth(league, roleId), await checkCanPrepare(roleId), checkCanChooseJob(userData?.job, leaguePrepare), items, tasks); + + let { reward: dailyReward } = await getDailyLoginReward(roleId, roleName, sid, league.leagueCode, userData?.job); + if(dailyReward) data.setFistLogin(dailyReward); } return resResult(STATUS.SUCCESS, data) @@ -71,6 +76,8 @@ export class GVGHandler { // 选择职能 async chooseJob(msg: { job: number }, session: BackendSession) { const roleId = session.get('roleId'); + const roleName = session.get('roleName'); + const sid = session.get('sid'); const guildCode = session.get('guildCode'); const { job } = msg; @@ -97,12 +104,14 @@ export class GVGHandler { myUserData = await GVGUserDataModel.chooseJob(configId, myLeague.leagueCode, roleId, job); // 更新prepare leaguePrepare = await GVGLeaguePrepareModel.chooseJob(configId, myLeague.leagueCode, job); + let { reward: dailyReward } = await getDailyLoginReward(roleId, roleName, sid, myLeague.leagueCode, myUserData?.job); - return resResult(STATUS.SUCCESS, { + return resResult(STATUS.SUCCESS, { leagueCode: myLeague.leagueCode, job: myUserData.job, producerCnt: leaguePrepare.producerCnt, - fighterCnt: leaguePrepare.fighterCnt + fighterCnt: leaguePrepare.fighterCnt, + leagueGoods: dailyReward? dailyReward: [] }); } @@ -270,7 +279,7 @@ export class GVGHandler { } // 添加 活跃 - let active = await addGVGActive(myLeague.leagueCode, roleId, GVG_ACTIVE_TYPE.TECH_ACTIVATE); + let active = await addGVGTechActive(myLeague.leagueCode, roleId); return resResult(STATUS.SUCCESS, { active, diff --git a/game-server/app/services/gvg/gvgPrepareService.ts b/game-server/app/services/gvg/gvgPrepareService.ts index deeb34218..7fc4e3e68 100644 --- a/game-server/app/services/gvg/gvgPrepareService.ts +++ b/game-server/app/services/gvg/gvgPrepareService.ts @@ -1,8 +1,11 @@ -import { GVG_ACTIVE_TYPE } from "../../consts"; +import { GVG_ACTIVE_TYPE, ITEM_CHANGE_REASON, LEAGUE_JOB } from "../../consts"; import { Tech } from "../../db/GVGLeaguePrepare"; import { GVGUserDailyDataModel } from "../../db/GVGUserDailyData"; -import { GVGUserDataModel } from "../../db/GVGUserData"; +import { GVGUserDataModel, GVGUserDataType } from "../../db/GVGUserData"; import { gameData } from "../../pubUtils/data"; +import { GVG } from "../../pubUtils/dicParam"; +import { parseGoodStr } from "../../pubUtils/util"; +import { addGVGReward } from "./gvgItemService"; import { getGVGConfig } from "./gvgService"; export function checkPreTech(techId: number, activeQueue: number[], techQueue: Tech[]) { @@ -42,14 +45,34 @@ export async function addGVGActive(leagueCode: string, roleId: string, type: GVG let { configId } = getGVGConfig(); let add = gameData.gvgActive.get(type)||0; - if(type == GVG_ACTIVE_TYPE.TECH_ACTIVATE) { - let check = await GVGUserDailyDataModel.checkGetTechActive(configId, leagueCode, roleId); - if(!check) { - await GVGUserDailyDataModel.setHasGetTechActive(configId, leagueCode, roleId); - } else { - add = 0; - } - } let result = await GVGUserDataModel.addActive(configId, leagueCode, roleId, type, add); return result.active; +} + +export async function addGVGTechActive(leagueCode: string, roleId: string) { + let { configId } = getGVGConfig(); + let check = await GVGUserDailyDataModel.checkGetTechActive(configId, leagueCode, roleId); + if(!check) { + await GVGUserDailyDataModel.setHasGetTechActive(configId, leagueCode, roleId); + return await addGVGActive(leagueCode, roleId, GVG_ACTIVE_TYPE.TECH_ACTIVATE); + } else { + const data = await GVGUserDataModel.findByRole(configId, leagueCode, roleId); + return data?.active||0; + } +} + +export function getGVGDailyItems(job: number) { + return job == LEAGUE_JOB.PRODUCER? parseGoodStr(GVG.GVG_PRODUCER_GET): parseGoodStr(GVG.GVG_FIGHTER_GET); +} + +export async function getDailyLoginReward(roleId: string, roleName: string, sid: string, leagueCode: string, job: number) { + let { configId } = getGVGConfig(); + if(job && !await GVGUserDailyDataModel.checkHasLogin(configId, leagueCode, roleId)) { + // 发每日奖励 + await GVGUserDailyDataModel.setHasLogin(configId, leagueCode, roleId); + let leagueGoods = await addGVGReward(roleId, roleName, leagueCode, sid, getGVGDailyItems(job), [], ITEM_CHANGE_REASON.GVG_LOGIN) + let active = await addGVGActive(leagueCode, roleId, GVG_ACTIVE_TYPE.LOGIN); + return { active, reward: leagueGoods } + } + return null; } \ No newline at end of file diff --git a/shared/consts/constModules/sysConst.ts b/shared/consts/constModules/sysConst.ts index 455f5a5c9..a82200e5d 100644 --- a/shared/consts/constModules/sysConst.ts +++ b/shared/consts/constModules/sysConst.ts @@ -1070,6 +1070,7 @@ export enum ITEM_CHANGE_REASON { ARTIFACT_TRANSFER = 159, // 宝物转换 ARTIFACT_REBUILD = 160, // 宝物重铸 GVG_ACTIVE_TECH = 161, // 千机阁解锁 + GVG_LOGIN = 162, // 每日登录 } export enum TA_EVENT { diff --git a/shared/db/GVGLeague.ts b/shared/db/GVGLeague.ts index 54914e6ca..6d5d47420 100644 --- a/shared/db/GVGLeague.ts +++ b/shared/db/GVGLeague.ts @@ -85,7 +85,6 @@ export default class GVGLeague extends BaseModel { public static async findLeagueByGuild(guildCode: string) { const league: GVGLeagueType = await GVGLeagueModel.findOne({ guildCodes: guildCode, status: 1 }) .populate('leader', { roleId: 1, roleName: 1, head: 1, frame: 1, spine: 1, lv: 1, quitTime: 1, ce: 1, title: 1, serverId: 1, _id: 0 }, 'Role') - .select('+serverId') .lean(); return league } diff --git a/shared/db/GVGUserDailyData.ts b/shared/db/GVGUserDailyData.ts index c6fba5aa1..37b10444b 100644 --- a/shared/db/GVGUserDailyData.ts +++ b/shared/db/GVGUserDailyData.ts @@ -37,7 +37,7 @@ export default class GVGUserDailyData extends BaseModel { hasGetTechActive: boolean; // 千机阁激活活跃是否获得 @prop({ required: true, default: 0 }) - hasLogin: boolean; // 每日登录活跃是否获得 + hasLogin: boolean; // 是否登录 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(); @@ -52,6 +52,15 @@ export default class GVGUserDailyData extends BaseModel { const result: GVGUserDailyDataType = await GVGUserDailyDataModel.findOneAndUpdate({ configId, leagueCode, roleId, time: getZeroPoint() }, { hasGetTechActive: true }, { upsert: true, new: true }).lean(); return result; } + + public static async checkHasLogin(configId: number, leagueCode: string, roleId: string) { + return await GVGUserDailyDataModel.exists({ configId, leagueCode, roleId, time: getZeroPoint(), hasLogin: { $exists: true } }); + } + + public static async setHasLogin(configId: number, leagueCode: string, roleId: string) { + const result: GVGUserDailyDataType = await GVGUserDailyDataModel.findOneAndUpdate({ configId, leagueCode, roleId, time: getZeroPoint() }, { hasLogin: true }, { upsert: true, new: true }).lean(); + return result; + } } export const GVGUserDailyDataModel = getModelForClass(GVGUserDailyData); diff --git a/shared/db/GVGUserData.ts b/shared/db/GVGUserData.ts index 102ba3d1b..150549118 100644 --- a/shared/db/GVGUserData.ts +++ b/shared/db/GVGUserData.ts @@ -100,7 +100,7 @@ export default class GVGUserData extends BaseModel { } public static async addActive(configId: number, leagueCode: string, roleId: string, activeType: number, active: number) { - const result: GVGUserDataType = await GVGUserDataModel.findOneAndUpdate({ configId, leagueCode, roleId }, { $inc: { active }, $push: { activeRec: new ActiveRec(activeType, active) } }, { new: true, upsert: true}).lean(); + const result: GVGUserDataType = await GVGUserDataModel.findOneAndUpdate({ configId, leagueCode, roleId }, { $inc: { active }, $push: { activeRec: new ActiveRec(activeType, active) } }, { new: true, upsert: true}).select('active').lean(); return result; } } diff --git a/shared/domain/gvgField/returnData.ts b/shared/domain/gvgField/returnData.ts index 8d2ffa3f1..f29955ee5 100644 --- a/shared/domain/gvgField/returnData.ts +++ b/shared/domain/gvgField/returnData.ts @@ -74,6 +74,10 @@ export class GVGMainData { sumTime: number = 0; // 今日贡献结算时间 10位时间戳 + // 是否每天首次登录 + isFirst = false; + leagueGoods: { itemType: number, id: number, count: number }[]; + constructor(configId: number, period: number, countdownTime: number, type: number) { this.configId = configId; this.period = period; @@ -112,6 +116,11 @@ export class GVGMainData { } this.myInfo.tasks = tasks; } + + setFistLogin(item: { itemType: number, id: number, count: number }[]) { + this.isFirst = true; + this.leagueGoods = item; + } } export class LeagueListInfo {