diff --git a/game-server/app/servers/role/handler/taskHandler.ts b/game-server/app/servers/role/handler/taskHandler.ts index 20fde14e1..4ad9b333e 100644 --- a/game-server/app/servers/role/handler/taskHandler.ts +++ b/game-server/app/servers/role/handler/taskHandler.ts @@ -7,7 +7,7 @@ import { addItems } from "../../../services/rewardService"; import { UserTaskModel } from "../../../db/UserTask"; import { nowSeconds, getZeroPointD } from "../../../pubUtils/timeUtil"; import { DicDailyTask, DicAchievement, DicMainTask } from "../../../pubUtils/dictionary/DicTask"; -import { getMainTask, refDailyTaskBox, removeHistoryTask, getCurTask, checkTask } from "../../../services/taskService"; +import { getMainTask, refDailyTaskBox, removeHistoryTask, getCurTask, checkTask, getPvpTask } from "../../../services/taskService"; import { TASK } from "../../../pubUtils/dicParam"; import { newHeroGiftPoint } from "../../../services/activity/newHeroGiftsService"; import { ActivityTaskPointModel, ActivityTaskPointModelType } from "../../../db/ActivityTaskPoint"; @@ -31,6 +31,13 @@ export class ShopHandler { return resResult(STATUS.SUCCESS, res); } + public async getPvpTaskList(msg: {}, session: BackendSession) { + const roleId: string = session.get('roleId'); + + const res = await getPvpTask(roleId); + return resResult(STATUS.SUCCESS, res); + } + // 领取主线任务、每日任务、成就单条任务 async receiveTask(msg: { type: number, id: number }, session: BackendSession) { const roleId: string = session.get('roleId'); diff --git a/game-server/app/services/connectorService.ts b/game-server/app/services/connectorService.ts index 730f0472d..3fa242017 100644 --- a/game-server/app/services/connectorService.ts +++ b/game-server/app/services/connectorService.ts @@ -3,7 +3,7 @@ */ import { getMails } from './mailService'; import { recentGuildMsgs, recentPrivateChatInfos, recentSysMsgs, recentWorldMsgs } from './chatService'; -import { getCurTask } from './taskService'; +import { getCurTask, getPvpTask } from './taskService'; import { RoleType } from '../db/Role'; import { Application, FrontendOrBackendSession, pinus } from 'pinus'; @@ -128,7 +128,9 @@ async function getModuleData(type: string, data: { role: RoleType, session: Fron return { receiveBoxs, donateFund, reports, donateCnt: donateCnt || 0, donationLv }; } case 'task': - return await getCurTask(role.roleId, session); + let tasks = await getCurTask(role.roleId, session); + let pvpTask = await getPvpTask(role.roleId); + return {...tasks, pvpTask} case 'chat': const worldMsgs = await recentWorldMsgs(serverId); const sysMsgs = await recentSysMsgs(serverId); diff --git a/game-server/app/services/taskService.ts b/game-server/app/services/taskService.ts index e0f445b9e..9917009c6 100644 --- a/game-server/app/services/taskService.ts +++ b/game-server/app/services/taskService.ts @@ -246,6 +246,22 @@ export async function getAchievement(roleId: string, userTask: UserTaskType) { return { point, taskList, box } } +export async function getPvpTask(roleId: string) { + let type = TASK_FUN_TYPE.PVP; + let recMap = await UserTaskRecModel.findByRoleAndType(roleId, type); // group=>userTaskRec + + let taskList: TaskListReturn[] = []; + for (let [id, dic] of gameData.pvpDailyTask) { + let dbRec = recMap.get(dic.taskType)?.get(dic.group); + if (dbRec) { + taskList.push({ type, id, count: dbRec.count, received: dbRec.received.includes(id) }); + } else { + taskList.push({ type, id, count: 0, received: false }); + } + } + return { taskList } +} + // 刷新每日任务 export async function refDailyTask(roleId: string, sid: string) { let userTask = await UserTaskModel.findByRole(roleId); diff --git a/shared/consts/constModules/sysConst.ts b/shared/consts/constModules/sysConst.ts index 66956c1e3..f48e8bca8 100644 --- a/shared/consts/constModules/sysConst.ts +++ b/shared/consts/constModules/sysConst.ts @@ -473,6 +473,7 @@ export const FILENAME = { DIC_AUCTION_BASIC_POOL: 'dic_zyz_auction_basicPool', DIC_AUCTION_REWARD: 'dic_zyz_auctionReward', DIC_PVP_DIFFICULTRATIO: 'dic_zyz_pvp_difficultRatio', + DIC_PVP_DAILY_TASK: 'dic_zyz_pvp_dailyTask', } export const WAR_RELATE_TABLES = [ @@ -562,6 +563,7 @@ export enum TASK_FUN_TYPE { MAIN = 1, // 主线 DAILY = 2, // 每日 ACHIEVEMENT = 3, // 成就 + PVP = 4, // pvp任务 } export enum TASK_TYPE { diff --git a/shared/db/PvpDefense.ts b/shared/db/PvpDefense.ts index f470e15a5..e7646595b 100644 --- a/shared/db/PvpDefense.ts +++ b/shared/db/PvpDefense.ts @@ -108,7 +108,7 @@ export default class PvpDefense extends BaseModel { const result: PvpDefenseType = await PvpDefenseModel.findOne({ roleId }) .populate('role', 'head frame spine topLineupCe roleId roleName lv globalCeAttr') .populate('heroes.hero') - .populate('oppPlayers.oppDef', 'oppRoleId pos roleName head frame spine heads frames spines rankLv title lv pLv defCe heroes').lean({ getters: true, virtuals: true }); + .populate('oppPlayers.oppDef', 'oppRoleId pos roleName head frame spine heads frames spines rankLv title lv pLv defCe heroes warId buff').lean({ getters: true, virtuals: true }); return result; } @@ -116,7 +116,7 @@ export default class PvpDefense extends BaseModel { const result: PvpDefenseType[] = await PvpDefenseModel.find({ seasonNum, 'defense.pLv': { $gte: min, $lte: max } }) .populate('role', '_id head frame spine heads frames spines topLineupCe roleId roleName lv globalCeAttr') .populate('heroes.hero') - .populate('oppPlayers.oppDef', 'oppRoleId pos roleName head frame spine heads frames spines rankLv pLv title lv defCe heroes') + .populate('oppPlayers.oppDef', 'oppRoleId pos roleName head frame spine heads frames spines rankLv pLv title lv defCe heroes warId buff') .lean({ getters: true, virtuals: true }); return result; } @@ -125,7 +125,7 @@ export default class PvpDefense extends BaseModel { delete update._id; let result: PvpDefenseType = await PvpDefenseModel.findOneAndUpdate({roleId}, {$set:update}, {new: true}) .populate('role', 'head frame spine heads frames spines topLineupCe roleId roleName lv') - .populate('oppPlayers.oppDef', 'oppRoleId pos roleName head frame spine heads frames spines rankLv pLv title lv defCe heroes').lean({ getters: true, virtuals: true }); + .populate('oppPlayers.oppDef', 'oppRoleId pos roleName head frame spine heads frames spines rankLv pLv title lv defCe heroes warId buff').lean({ getters: true, virtuals: true }); return result; } public static async updateInfo(roleId: string, update: pvpUpdateInter, lean = true) { diff --git a/shared/db/UserTaskRec.ts b/shared/db/UserTaskRec.ts index 8cd6bbf3b..1b055634f 100644 --- a/shared/db/UserTaskRec.ts +++ b/shared/db/UserTaskRec.ts @@ -36,7 +36,7 @@ export default class UserTaskRec extends BaseModel { private static getRefreshCondition(type: number) { let today = getZeroPointD(); - if(type == TASK_FUN_TYPE.DAILY) { + if(type == TASK_FUN_TYPE.DAILY || type == TASK_FUN_TYPE.PVP) { return { type, createdAt: { $gte: today } }; } else { return { type }; diff --git a/shared/pubUtils/data.ts b/shared/pubUtils/data.ts index 2cdffac70..948006c31 100644 --- a/shared/pubUtils/data.ts +++ b/shared/pubUtils/data.ts @@ -73,7 +73,7 @@ import { dicShop, dicShopItem, loadShop } from "./dictionary/DicShop"; import { dicShopList, loadShopList } from "./dictionary/DicShopList"; import { dicRank, loadRank } from "./dictionary/DicRank"; import { dicRankReward, loadRankReward } from "./dictionary/DicRankReward"; -import { dicTaskType, taskMap, dicMainTask, dicDailyTask, dicAchievement, loadTask } from "./dictionary/DicTask"; +import { dicTaskType, taskMap, dicMainTask, dicDailyTask, dicAchievement, loadTask, dicPvpDailyTask } from "./dictionary/DicTask"; import { dicMainTaskStage, loadMainTaskStage } from "./dictionary/DicMainTaskStage"; import { dicTaskBox, loadTaskBox } from './dictionary/DicTaskBox'; import { dicGacha, loadGacha } from "./dictionary/DicGacha"; @@ -206,6 +206,7 @@ export const gameData = { mainTask: dicMainTask, dailyTask: dicDailyTask, achievement: dicAchievement, + pvpDailyTask: dicPvpDailyTask, mainTaskStage: dicMainTaskStage, taskBox: dicTaskBox, gacha: dicGacha, diff --git a/shared/pubUtils/dictionary/DicTask.ts b/shared/pubUtils/dictionary/DicTask.ts index ea869e03b..f77de29f8 100644 --- a/shared/pubUtils/dictionary/DicTask.ts +++ b/shared/pubUtils/dictionary/DicTask.ts @@ -87,21 +87,40 @@ const DicAchievementKeys: KeysEnum = { point: true }; + +// pvp任务 +export interface DicPvpDailyTask extends DicTaskBase { + // 奖励 + readonly taskReward: RewardInter[]; +} + +const DicPvpDailyTaskKeys: KeysEnum = { + id: true, + taskType: true, + group: true, + taskParam: true, + condition: true, + taskReward: true +}; + export type DicTask = DicTaskBase & { type: number }; export const dicMainTask = new Map(); // 主线任务 export const dicDailyTask = new Map(); // 每日任务 export const dicAchievement = new Map(); // 成就 -export const taskMap = new Map>(); +export const dicPvpDailyTask = new Map(); // 成就 +export const taskMap = new Map>(); taskMap.set(TASK_FUN_TYPE.MAIN, dicMainTask); taskMap.set(TASK_FUN_TYPE.DAILY, dicDailyTask); taskMap.set(TASK_FUN_TYPE.ACHIEVEMENT, dicAchievement); +taskMap.set(TASK_FUN_TYPE.PVP, dicPvpDailyTask); export const dicTaskType = new Map(); export function loadTask() { dicMainTask.clear(); dicDailyTask.clear(); dicAchievement.clear(); + dicPvpDailyTask.clear(); const arrMainTask = readFileAndParse(FILENAME.DIC_MAIN_TASK); arrMainTask.forEach(o => { @@ -128,6 +147,14 @@ export function loadTask() { pushDicTaskType(o.taskType, TASK_FUN_TYPE.ACHIEVEMENT, o); }); + const arrPvpDailyTask = readFileAndParse(FILENAME.DIC_PVP_DAILY_TASK); + arrPvpDailyTask.forEach(o => { + o.taskParam = parseNumberList(o.taskParam); + o.taskReward = parseGoodStr(o.taskReward); + o.group = 1; + dicPvpDailyTask.set(o.id, _.pick(o, Object.keys(DicPvpDailyTaskKeys))); + pushDicTaskType(o.taskType, TASK_FUN_TYPE.PVP, o); + }); } function pushDicTaskType(taskType: number, type: number, o: any) { diff --git a/shared/resource/jsons/dic_zyz_pvp_dailyTask.json b/shared/resource/jsons/dic_zyz_pvp_dailyTask.json new file mode 100644 index 000000000..71a3da7ff --- /dev/null +++ b/shared/resource/jsons/dic_zyz_pvp_dailyTask.json @@ -0,0 +1,56 @@ +[ + { + "id": 1, + "dailyTaskId": 8, + "taskType": 57, + "taskInfo": "演武3次", + "taskParam": "3&", + "taskReward": "40004&30", + "condition": 3 + }, + { + "id": 2, + "dailyTaskId": 8, + "taskType": 57, + "taskInfo": "演武5次", + "taskParam": "5&", + "taskReward": "40004&60", + "condition": 5 + }, + { + "id": 3, + "dailyTaskId": 8, + "taskType": 57, + "taskInfo": "演武7次", + "taskParam": "7&", + "taskReward": "40004&100", + "condition": 7 + }, + { + "id": 4, + "dailyTaskId": 9, + "taskType": 58, + "taskInfo": "演武胜利1次", + "taskParam": "1&", + "taskReward": "40004&100", + "condition": 1 + }, + { + "id": 5, + "dailyTaskId": 9, + "taskType": 58, + "taskInfo": "演武胜利3次", + "taskParam": "3&", + "taskReward": "40004&300", + "condition": 3 + }, + { + "id": 6, + "dailyTaskId": 9, + "taskType": 58, + "taskInfo": "演武胜利5次", + "taskParam": "5&", + "taskReward": "40004&500", + "condition": 5 + } +] \ No newline at end of file