271 lines
14 KiB
TypeScript
271 lines
14 KiB
TypeScript
import { pinus } from "pinus";
|
|
import { ACTIVITY_TYPE, STATUS, TASK_SUM_TYPE, TASK_TYPE } from "../../consts";
|
|
import { ActivityBuyRecordsModel } from "../../db/ActivityBuyRecords";
|
|
import { ActivityDailyChallengesModel } from "../../db/ActivityDailyChallenges";
|
|
import { ActivityGrowthModel } from "../../db/ActivityGrowth";
|
|
import { ActivityGrowthFundModel } from "../../db/ActivityGrowthFund";
|
|
import { ActivityRefreshTaskModel } from "../../db/ActivityRefreshTask";
|
|
import { ActivityThirtyDaysModel } from "../../db/ActivityThirtyDays";
|
|
import { ActivityTreasureHuntTaskModel } from "../../db/ActivityTreasureHuntTask";
|
|
import { RoleType } from "../../db/Role";
|
|
import { ServerTempModel, ServerTempModelType } from "../../db/ServerTemp";
|
|
import { UserTaskRecModel } from "../../db/UserTaskRec";
|
|
import { GrowthFundData } from "../../domain/activityField/growthFundField";
|
|
import { RefreshTaskData } from "../../domain/activityField/refreshTaskField";
|
|
import { SevenDaysData } from "../../domain/activityField/sevenDaysField";
|
|
import { ThirtyDaysData } from "../../domain/activityField/thirtyDaysField";
|
|
import { TreasureHuntData } from "../../domain/activityField/treasureHuntField";
|
|
import { TaskListReturn, UpdateTaskParam } from "../../domain/roleField/task";
|
|
import { gameData } from "../../pubUtils/data";
|
|
import { getZeroPoint } from "../../pubUtils/timeUtil";
|
|
import { resResult } from "../../pubUtils/util";
|
|
import { getActivities, getActivitiesByType, getActivityByServerId } from "../activity/activityService";
|
|
import { getRoleOnlineInfo } from "../redisService";
|
|
|
|
/**
|
|
* @class CheckTask
|
|
* @classdesc 检查某个玩家任务的达成情况
|
|
*/
|
|
export class CheckTask {
|
|
serverId: number; // 区id
|
|
roleId: string; // 玩家id
|
|
taskType: TASK_TYPE; // 任务type
|
|
roleCreateTime: number; // 玩家的创建时间
|
|
serverCreateTime: number; // 服务器的创建时间
|
|
|
|
param: TaskParam; // 检查任务时传入的参数
|
|
|
|
treasureHuntTemp: ServerTempModelType;
|
|
|
|
constructor(serverId: number, roleId: string, taskType: TASK_TYPE, roleCreateTime: number, serverCreateTime: number) {
|
|
this.serverId = serverId;
|
|
this.roleId = roleId;
|
|
this.taskType = taskType;
|
|
this.roleCreateTime = roleCreateTime;
|
|
this.serverCreateTime = serverCreateTime;
|
|
this.param = new TaskParam();
|
|
}
|
|
|
|
/**
|
|
* @description 检查任务的主程序
|
|
*/
|
|
public async check(count: number, sid: string) {
|
|
let { taskType, roleId, serverId, roleCreateTime, serverCreateTime } = this;
|
|
let dicTaskTypeDesc = gameData.taskDescByType.get(taskType);
|
|
let taskPushMessages: TaskListReturn[] = [];
|
|
let activityTaskPushMessages = [];
|
|
|
|
// 检查一般任务
|
|
let dicTasks = gameData.taskType.get(taskType);
|
|
for (let dicTask of dicTasks) {
|
|
|
|
let taskUpdateParam = this.checkIsMatch(dicTask.taskParam, count);
|
|
if (taskUpdateParam) {
|
|
let rec = await UserTaskRecModel.checkAndUpdateTask(roleId, dicTask.type, taskType, dicTask.group, taskUpdateParam);
|
|
if (!rec) continue;
|
|
if (rec.received && rec.received.includes(dicTask.id)) continue; // 已领取,不再推送
|
|
let received = rec.received || [];
|
|
taskPushMessages.push({ type: dicTask.type, id: dicTask.id, count: rec.count, received: received.includes(dicTask.id) });
|
|
|
|
}
|
|
}
|
|
|
|
// 检查活动任务
|
|
let activities = await getActivityByServerId(serverId);
|
|
for(let activity of activities) {
|
|
let { activityId, type: activityType } = activity;
|
|
switch(activityType) {
|
|
case ACTIVITY_TYPE.SEVEN_DAY:
|
|
case ACTIVITY_TYPE.FOURTEEN_DAY://十四天乐活动 28
|
|
case ACTIVITY_TYPE.COMMON_SEVEN_DAY://通用七天乐活动 29
|
|
{
|
|
//成长活动统计
|
|
let playerData = new SevenDaysData(activity, roleCreateTime, serverCreateTime);
|
|
let growthTaskArray = playerData.growth.findTaskByType(taskType); // 所有任务
|
|
for (let task of growthTaskArray) {
|
|
let taskUpdateParam = this.checkIsMatch(task.taskParamArray, count);
|
|
if(taskUpdateParam) {
|
|
let rec = await ActivityGrowthModel.checkAndUpdateTask(serverId, activityId, roleId, task.dayIndex, task.cellIndex, taskUpdateParam);
|
|
if(!rec) continue;
|
|
activityTaskPushMessages.push({...task, totalCount: rec.totalCount, receiveRewardCount: rec.receiveRewardCount||0, activityId, activityType: "growth" });
|
|
}
|
|
}
|
|
//今日挑战统计
|
|
let dailyChallengeTaskArray = playerData.dailyChallenge.findTaskByType(taskType);
|
|
for (let task of dailyChallengeTaskArray) {
|
|
if(dicTaskTypeDesc.sumType == TASK_SUM_TYPE.DO && task.dayIndex != playerData.today()) {
|
|
continue;
|
|
}
|
|
let taskUpdateParam = this.checkIsMatch(task.taskParamArray, count);
|
|
if(taskUpdateParam) {
|
|
let rec = await ActivityDailyChallengesModel.checkAndUpdateTask(serverId, activityId, roleId, task.dayIndex, task.cellIndex, taskUpdateParam);
|
|
if(!rec) continue;
|
|
activityTaskPushMessages.push({...task, totalCount: rec.totalCount, receiveRewardCount: rec.receiveRewardCount||0, activityId, activityType: "daily" });
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case ACTIVITY_TYPE.REFRESH_TASK:
|
|
{
|
|
// 通用的刷新任务
|
|
let taskActivity = new RefreshTaskData(activity, roleCreateTime, serverCreateTime);
|
|
let taskArray = taskActivity.findTaskByType(taskType);
|
|
for (let task of taskArray) {
|
|
let taskUpdateParam = this.checkIsMatch(task.taskParamArray, count);
|
|
if(taskUpdateParam) {
|
|
let rec = await ActivityRefreshTaskModel.checkAndUpdateTask(serverId, activityId, roleId, taskActivity.roundIndex, task.pageIndex, task.id, taskUpdateParam);
|
|
if(!rec) continue;
|
|
activityTaskPushMessages.push({...task, totalCount: rec.totalCount, receiveRewardCount: rec.receiveRewardCount||0, activityId });
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case ACTIVITY_TYPE.TREASURE_HUNT:
|
|
{
|
|
// 寻宝奇兵任务
|
|
let tempData = await this.getTreasureHuntTemp();
|
|
if(tempData && tempData.huntActivityId == activityId) {
|
|
let playerData = new TreasureHuntData(activity, roleCreateTime, serverCreateTime);
|
|
let taskArray = playerData.tasks.findItemByTaskType(taskType);
|
|
for (let task of taskArray) {
|
|
let taskUpdateParam = this.checkIsMatch(task.taskParamArray, count);
|
|
if(taskUpdateParam) {
|
|
let rec = await ActivityTreasureHuntTaskModel.checkAndUpdateTask(serverId, activityId, roleId, tempData.huntRoundIndex, task.cellIndex, taskUpdateParam);
|
|
if(!rec) continue;
|
|
activityTaskPushMessages.push({ ...task, totalCount: rec.totalCount, activityId });
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case ACTIVITY_TYPE.THIRTY_DAYS:
|
|
{
|
|
//30天任务统计
|
|
let thirtyDaysActivity = new ThirtyDaysData(activity, roleCreateTime, serverCreateTime);
|
|
let taskArray = thirtyDaysActivity.findTaskByType(taskType);
|
|
for (let task of taskArray) {
|
|
let taskUpdateParam = this.checkIsMatch(task.taskParamArray, count);
|
|
if(taskUpdateParam) {
|
|
let rec = await ActivityThirtyDaysModel.checkAndUpdateTask(serverId, thirtyDaysActivity.activityId, roleId, task.pageIndex, task.cellIndex, task.tab, taskUpdateParam);
|
|
if(!rec) continue;
|
|
activityTaskPushMessages.push({ ...task, totalCount: rec.totalCount, activityId });
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case ACTIVITY_TYPE.GROWTH_FUND_MAIN:
|
|
case ACTIVITY_TYPE.GROWTH_FUND_MAIN_VIP:
|
|
{
|
|
//主线成长基金
|
|
if(taskType != TASK_TYPE.BATTLE_MAIN) continue;
|
|
|
|
let growthFundActivity = new GrowthFundData(activity, roleCreateTime, serverCreateTime);
|
|
let playerRecords = await ActivityGrowthFundModel.findData(activity.activityId, roleId);
|
|
growthFundActivity.setPlayerRecords(playerRecords);
|
|
if (growthFundActivity.isVipActivity()) {//vip高阶需要购买
|
|
let buyRecords = await ActivityBuyRecordsModel.findRecordsByActivityId(activity.activityId, roleId);
|
|
growthFundActivity.initBuyRecords(buyRecords);
|
|
}
|
|
let taskArray = growthFundActivity.unLockItem(this.param.warId);
|
|
//推送
|
|
activityTaskPushMessages.push(...taskArray);
|
|
break;
|
|
}
|
|
case ACTIVITY_TYPE.GROWTH_FUND_TOWER:
|
|
case ACTIVITY_TYPE.GROWTH_FUND_TOWER_VIP:
|
|
{
|
|
//镇念塔成长基金
|
|
if(taskType != TASK_TYPE.BATTLE_TOWER_LV) continue;
|
|
|
|
let growthFundActivity = new GrowthFundData(activity, roleCreateTime, serverCreateTime);
|
|
let playerRecords = await ActivityGrowthFundModel.findData(activity.activityId, roleId);
|
|
growthFundActivity.setPlayerRecords(playerRecords);
|
|
if (growthFundActivity.isVipActivity()) {//vip高阶需要购买
|
|
let buyRecords = await ActivityBuyRecordsModel.findRecordsByActivityId(activity.activityId, roleId);
|
|
growthFundActivity.initBuyRecords(buyRecords);
|
|
}
|
|
let taskArray = growthFundActivity.unLockItem(this.param.towerLv);
|
|
//推送
|
|
activityTaskPushMessages.push(...taskArray);
|
|
break;
|
|
}
|
|
case ACTIVITY_TYPE.GROWTH_FUND_MAIN_ELITE:
|
|
case ACTIVITY_TYPE.GROWTH_FUND_MAIN_ELITE_VIP:
|
|
{
|
|
//精英成长基金
|
|
if(taskType != TASK_TYPE.BATTLE_MAIN_ELITE) continue;
|
|
|
|
let growthFundActivity = new GrowthFundData(activity, roleCreateTime, serverCreateTime);
|
|
let playerRecords = await ActivityGrowthFundModel.findData(activity.activityId, roleId);
|
|
growthFundActivity.setPlayerRecords(playerRecords);
|
|
if (growthFundActivity.isVipActivity()) {//vip高阶需要购买
|
|
let buyRecords = await ActivityBuyRecordsModel.findRecordsByActivityId(activity.activityId, roleId);
|
|
growthFundActivity.initBuyRecords(buyRecords);
|
|
}
|
|
let taskArray = growthFundActivity.unLockItem(this.param.warId);
|
|
//推送
|
|
activityTaskPushMessages.push(...taskArray);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (taskPushMessages.length > 0) {
|
|
if (!sid) {
|
|
let onlineUser = await getRoleOnlineInfo(roleId);
|
|
sid = onlineUser.sid;
|
|
}
|
|
if (!!sid) {
|
|
let uids = [{ uid: roleId, sid }];
|
|
pinus.app.get('channelService').pushMessageByUids('onTaskUpdate', resResult(STATUS.SUCCESS, taskPushMessages), uids);
|
|
}
|
|
}
|
|
if (activityTaskPushMessages?.length > 0) {
|
|
if (!sid) {
|
|
let onlineUser = await getRoleOnlineInfo(roleId);
|
|
sid = onlineUser.sid;
|
|
}
|
|
if (!!sid) {
|
|
let uids = [{ uid: roleId, sid }];
|
|
pinus.app.get('channelService').pushMessageByUids('onActivityTaskUpdate', resResult(STATUS.SUCCESS, activityTaskPushMessages), uids);
|
|
}
|
|
}
|
|
}
|
|
|
|
public checkIsMatch(dicTaskParam: number[], count: number): UpdateTaskParam {
|
|
let param = this.param;
|
|
switch(this.taskType) {
|
|
case TASK_TYPE.LOGIN_SUM:
|
|
{
|
|
let today = getZeroPoint();
|
|
if (today > param.role.loginTime) {
|
|
return { inc: count }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private async getTreasureHuntTemp() {
|
|
if(this.treasureHuntTemp) return this.treasureHuntTemp;
|
|
|
|
let tempData: ServerTempModelType = await ServerTempModel.findData(this.serverId);
|
|
if (tempData) {
|
|
this.treasureHuntTemp = tempData;
|
|
return tempData
|
|
} else {
|
|
return null
|
|
}
|
|
}
|
|
}
|
|
|
|
class TaskParam {
|
|
role?: RoleType; // 玩家数据
|
|
warId?: number;
|
|
towerLv?: number;
|
|
|
|
public setRole(role: RoleType) {
|
|
this.role = role;
|
|
}
|
|
|
|
}
|