@@ -1,31 +1,31 @@
import { gameData } from './data' ;
import { DicTask } from './dictionary/DicTask' ;
import { TASK_TYPE , ABI_STAGE , WAR_TYPE , GUILD_JOB } from '../consts' ;
import { TASK_TYPE , ABI_STAGE , WAR_TYPE , GUILD_JOB , TASK_FUN_TYPE , FUNCS_ID } from '../consts' ;
import { UserTaskRecModel , UserTaskRecType } from '../db/UserTaskRec'
import { RoleType } from '../db/Role' ;
import { RoleType , RoleModel } from '../db/Role' ;
import { TaskParam } from '../domain/roleField/task' ;
import { getTodayZeroPoint } from './timeUtil' ;
import { HeroType } from '../db/Hero' ;
import { EquipType , EquipModel } from '../db/Equip' ;
import { Reward Inter } from './interface' ;
import { Item Inter } from './interface' ;
export async function checkTaskWithRoles ( taskType : number , roles : RoleType [ ] ) {
export async function checkTaskWithRoles ( taskType : number , roles : RoleType [ ] , funcs? : number [ ] ) {
let pushMessage = new Array < { type : number , id : number , count : number , received : boolean } > ( ) ;
for ( let role of roles ) {
let singlePush = await checkTaskWithRole ( role . roleId , taskType , role ) ;
let singlePush = await checkTaskWithRole ( role . roleId , taskType , role , funcs );
pushMessage . concat ( singlePush ) ;
}
return pushMessage
}
export async function checkTaskWithRole ( roleId : string , taskType : number , role : RoleType ) {
export async function checkTaskWithRole ( roleId : string , taskType : number , role : RoleType , funcs? : number [ ] ) {
let pushMessage = new Array < { type : number , id : number , count : number , received : boolean } > ( ) ;
if ( taskType == TASK_TYPE . LOGIN_SUM )
{
let today = getTodayZeroPoint ( ) ;
if ( today > role . loginTime ) {
pushMessage = await checkTask ( roleId , taskType , 1 , true , { } ) ;
pushMessage = await checkTask ( roleId , taskType , 1 , true , { } , funcs );
}
}
else if ( taskType == TASK_TYPE . LOGIN_SERIES )
@@ -33,53 +33,53 @@ export async function checkTaskWithRole(roleId: string, taskType: number, role:
let today = getTodayZeroPoint ( ) ;
if ( today > role . loginTime ) {
if ( today - role . loginTime > 24 * 60 * 60 ) {
pushMessage = await checkTask ( roleId , taskType , 0 , false , { } ) ;
pushMessage = await checkTask ( roleId , taskType , 0 , false , { } , funcs );
} else {
pushMessage = await checkTask ( roleId , taskType , 1 , true , { } ) ;
pushMessage = await checkTask ( roleId , taskType , 1 , true , { } , funcs );
}
}
}
else if ( taskType == TASK_TYPE . FRIEND_NUM )
{
let { friendCnt } = role ;
pushMessage = await checkTask ( roleId , taskType , friendCnt , false , { } ) ;
pushMessage = await checkTask ( roleId , taskType , friendCnt , false , { } , funcs );
}
return pushMessage
}
export async function checkTaskWithHeroes ( roleId : string , taskType : number , heroes : HeroType [ ] ) {
export async function checkTaskWithHeroes ( roleId : string , taskType : number , heroes : HeroType [ ] , funcs? : number [ ] ) {
let pushMessage = new Array < { type : number , id : number , count : number , received : boolean } > ( ) ;
for ( let hero of heroes ) {
let singlePush = await checkTaskWithHero ( roleId , taskType , hero ) ;
let singlePush = await checkTaskWithHero ( roleId , taskType , hero , [ ] , funcs );
pushMessage . concat ( singlePush ) ;
}
return pushMessage
}
export async function checkTaskWithHero ( roleId : string , taskType : number , hero : HeroType , args? : number [ ] ) {
export async function checkTaskWithHero ( roleId : string , taskType : number , hero : HeroType , args : number [ ] = [ ] , funcs ? : number [ ] ) {
let pushMessage = new Array < { type : number , id : number , count : number , received : boolean } > ( ) ;
if ( taskType == TASK_TYPE . HERO_STAR_UP )
{
let dicHero = gameData . hero . get ( hero . hid ) ;
let starUp = hero . star - dicHero . initialStars ;
if ( hero . colorStar > 1 ) starUp += hero . colorStar - 1 ;
pushMessage = await checkTask ( roleId , taskType , 1 , true , { star : starUp } )
pushMessage = await checkTask ( roleId , taskType , 1 , true , { star : starUp } , funcs )
}
else if ( taskType == TASK_TYPE . HERO_QUALITY )
{
let dicHero = gameData . hero . get ( hero . hid ) ;
pushMessage = await checkTask ( roleId , taskType , 1 , true , { quality : dicHero.quality } ) ;
pushMessage = await checkTask ( roleId , taskType , 1 , true , { quality : dicHero.quality } , funcs );
}
else if ( taskType == TASK_TYPE . HERO_QUALITY_STAR_UP )
{
let dicHero = gameData . hero . get ( hero . hid ) ;
pushMessage = await checkTask ( roleId , taskType , 1 , true , { quality : dicHero.quality , star : hero.star } ) ;
pushMessage = await checkTask ( roleId , taskType , 1 , true , { quality : dicHero.quality , star : hero.star } , funcs );
}
else if ( taskType == TASK_TYPE . HERO_LV )
{
pushMessage = await checkTask ( roleId , taskType , 1 , true , { lv : hero.lv } ) ;
pushMessage = await checkTask ( roleId , taskType , 1 , true , { lv : hero.lv } , funcs );
}
else if ( taskType == TASK_TYPE . HERO_TRAIN )
{
@@ -87,13 +87,13 @@ export async function checkTaskWithHero(roleId: string, taskType: number, hero:
let initGrage = gameData . job . get ( dicHero . jobid ) . grade ;
let curGrade = gameData . job . get ( hero . job ) . grade ;
let count = ( curGrade - initGrage ) * ( ABI_STAGE . END - ABI_STAGE . START ) + ( hero . jobStage - ABI_STAGE . START ) ; // 训练次数
pushMessage = await checkTask ( roleId , taskType , 1 , true , { count } ) ;
pushMessage = await checkTask ( roleId , taskType , 1 , true , { count } , funcs );
}
else if ( taskType == TASK_TYPE . HERO_QUALITY_UP )
{
let dicHero = gameData . hero . get ( hero . hid ) ;
if ( hero . quality - dicHero . quality == 1 ) { // 每个武将升品算一次
pushMessage = await checkTask ( roleId , taskType , 1 , true , { } ) ;
pushMessage = await checkTask ( roleId , taskType , 1 , true , { } , funcs );
}
}
else if ( taskType == TASK_TYPE . HERO_STAGE_UP )
@@ -102,18 +102,18 @@ export async function checkTaskWithHero(roleId: string, taskType: number, hero:
let initGrage = gameData . job . get ( dicHero . jobid ) . grade ;
let curGrade = gameData . job . get ( hero . job ) . grade ;
let count = curGrade - initGrage ; // 进阶次数
pushMessage = await checkTask ( roleId , taskType , 1 , true , { count } ) ;
pushMessage = await checkTask ( roleId , taskType , 1 , true , { count } , funcs );
}
else if ( taskType == TASK_TYPE . HERO_FAVOUR_LV )
{
pushMessage = await checkTask ( roleId , taskType , 1 , true , { favourLv : hero.favourLv } )
pushMessage = await checkTask ( roleId , taskType , 1 , true , { favourLv : hero.favourLv } , funcs )
}
else if ( taskType == TASK_TYPE . EQUIP_BY_HERO )
{
// arg[0] 1: 穿上 -1: 脱下
let { ePlace } = hero ;
let count = ePlace . filter ( cur = > cur . equip ) . length ;
pushMessage = await checkTask ( roleId , taskType , args [ 0 ] , true , { count , isPutOn : args [ 0 ] } ) ;
pushMessage = await checkTask ( roleId , taskType , args [ 0 ] , true , { count , isPutOn : args [ 0 ] } , funcs );
}
else if ( taskType == TASK_TYPE . EQUIP_STRENGTHEN )
{
@@ -121,7 +121,7 @@ export async function checkTaskWithHero(roleId: string, taskType: number, hero:
let { ePlace } = hero ;
let index = 0 ;
for ( let { lv } of ePlace ) {
let p = await checkTask ( roleId , taskType , 1 , true , { oldLv : args [ index ++ ] , lv } ) ;
let p = await checkTask ( roleId , taskType , 1 , true , { oldLv : args [ index ++ ] , lv } , funcs );
pushMessage = pushMessage . concat ( p ) ;
}
}
@@ -130,13 +130,13 @@ export async function checkTaskWithHero(roleId: string, taskType: number, hero:
}
export async function checkTaskWithEquip ( roleId : string , taskType : number , equip : EquipType , args? : number [ ] ) {
export async function checkTaskWithEquip ( roleId : string , taskType : number , equip : EquipType , args : number [ ] = [ ] , funcs ? : number [ ] ) {
let pushMessage = new Array < { type : number , id : number , count : number , received : boolean } > ( ) ;
if ( taskType == TASK_TYPE . EQUIP_QUALITY )
{
// args[0] 1: 装上 -1: 脱下
let dicGood = gameData . goods . get ( equip . id ) ;
pushMessage = await checkTask ( roleId , taskType , args [ 0 ] , true , { quality : dicGood.quality } )
pushMessage = await checkTask ( roleId , taskType , args [ 0 ] , true , { quality : dicGood.quality } , funcs )
}
else if ( taskType == TASK_TYPE . EQUIP_JEWEL )
{
@@ -144,16 +144,16 @@ export async function checkTaskWithEquip(roleId: string, taskType: number, equip
let { holes } = equip ;
let jewelCount = holes . filter ( cur = > cur . jewel > 0 ) . length ;
if ( jewelCount > 0 && args [ 0 ] <= 0 ) { // 原来没有,镶嵌上了
pushMessage = await checkTask ( roleId , taskType , 1 , true , { } ) ;
pushMessage = await checkTask ( roleId , taskType , 1 , true , { } , funcs );
} else if ( jewelCount <= 0 && args [ 0 ] > 0 ) { // 原来镶嵌着,现在没了
pushMessage = await checkTask ( roleId , taskType , - 1 , true , { } ) ;
pushMessage = await checkTask ( roleId , taskType , - 1 , true , { } , funcs );
}
}
else if ( taskType == TASK_TYPE . EQUIP_COMPOSE_SUIT )
{
let dicGood = gameData . goods . get ( equip . id ) ;
if ( dicGood . suitId ) {
pushMessage = await checkTask ( roleId , taskType , 1 , true , { } ) ;
pushMessage = await checkTask ( roleId , taskType , 1 , true , { } , funcs );
}
}
else if ( taskType == TASK_TYPE . EQUIP_SUIT )
@@ -177,7 +177,7 @@ export async function checkTaskWithEquip(roleId: string, taskType: number, equip
if ( id == equip . id ) curCount = count ;
}
if ( curCount == minCount ) {
pushMessage = await checkTask ( roleId , taskType , 1 , true , { } ) ;
pushMessage = await checkTask ( roleId , taskType , 1 , true , { } , funcs );
}
}
}
@@ -186,21 +186,21 @@ export async function checkTaskWithEquip(roleId: string, taskType: number, equip
// args[0] 原来镶嵌了多少宝石
let { holes } = equip ;
let jewelCount = holes . filter ( cur = > cur . jewel > 0 ) . length ;
pushMessage = await checkTask ( roleId , taskType , jewelCount - args [ 0 ] , true , { } ) ;
pushMessage = await checkTask ( roleId , taskType , jewelCount - args [ 0 ] , true , { } , funcs );
}
return pushMessage
}
export async function checkTaskWithArgs ( roleId : string , taskType : number , args : number [ ] ) {
export async function checkTaskWithArgs ( roleId : string , taskType : number , args : number [ ] , funcs? : number [ ] ) {
let pushMessage = new Array < { type : number , id : number , count : number , received : boolean } > ( ) ;
if ( taskType == TASK_TYPE . ROLE_SCHOOL_PUT_HERO )
{
let [ hid , preHid ] = args ;
if ( hid > 0 && preHid <= 0 ) { // 放置
pushMessage = await checkTask ( roleId , taskType , 1 , true , { } ) ;
pushMessage = await checkTask ( roleId , taskType , 1 , true , { } , funcs );
} else if ( hid <= 0 && preHid > 0 ) { // 卸下
pushMessage = await checkTask ( roleId , taskType , - 1 , true , { } ) ;
pushMessage = await checkTask ( roleId , taskType , - 1 , true , { } , funcs );
}
}
else if ( taskType == TASK_TYPE . EQUIP_JEWEL_STAGE )
@@ -209,95 +209,95 @@ export async function checkTaskWithArgs(roleId: string, taskType: number, args:
let [ putOnJewel , putOffJewel ] = args ;
if ( putOnJewel > 0 ) {
let dicGood = gameData . goods . get ( putOnJewel ) ;
let push = await checkTask ( roleId , taskType , 1 , true , { stage : dicGood.lvLimited } ) ;
let push = await checkTask ( roleId , taskType , 1 , true , { stage : dicGood.lvLimited } , funcs );
pushMessage . concat ( push ) ;
}
if ( putOffJewel > 0 ) {
let dicGood = gameData . goods . get ( putOffJewel ) ;
let push = await checkTask ( roleId , taskType , - 1 , true , { stage : dicGood.lvLimited } ) ;
let push = await checkTask ( roleId , taskType , - 1 , true , { stage : dicGood.lvLimited } , funcs );
pushMessage . concat ( push ) ;
}
}
else if ( taskType == TASK_TYPE . CHAT )
{
// args[0] 聊天type 1-系统 2-世界 3-军团 4-组队 5-私聊
pushMessage = await checkTask ( roleId , taskType , 1 , true , { chatType : args [ 0 ] } )
pushMessage = await checkTask ( roleId , taskType , 1 , true , { chatType : args [ 0 ] } , funcs )
}
return pushMessage
}
export async function checkTaskWithWar ( roleId : string , taskType : number , warId : number , heroes : number [ ] , count : number , star : number ) {
export async function checkTaskWithWar ( roleId : string , taskType : number , warId : number , heroes : number [ ] , count : number , star : number , funcs? : number [ ] ) {
let dicWar = gameData . war . get ( warId ) ;
let pushMessage = new Array < { type : number , id : number , count : number , received : boolean } > ( ) ;
if ( taskType == TASK_TYPE . BATTLE_WITH_HERO )
{
pushMessage = await checkTask ( roleId , taskType , count , true , { warId , heroes } ) ;
pushMessage = await checkTask ( roleId , taskType , count , true , { warId , heroes } , funcs );
}
else if ( taskType == TASK_TYPE . BATTLE_MAIN )
{
if ( dicWar . warType == WAR_TYPE . NORMAL ) {
pushMessage = await checkTask ( roleId , taskType , count , true , { warId } ) ;
pushMessage = await checkTask ( roleId , taskType , count , true , { warId } , funcs );
}
}
else if ( taskType == TASK_TYPE . BATTLE_MAIN_SWEEP )
{
if ( dicWar . warType == WAR_TYPE . NORMAL ) {
pushMessage = await checkTask ( roleId , taskType , count , true , { } ) ;
pushMessage = await checkTask ( roleId , taskType , count , true , { } , funcs );
}
}
else if ( taskType == TASK_TYPE . BATTLE_DAILY_STAR )
{
if ( dicWar . warType == WAR_TYPE . DAILY ) {
pushMessage = await checkTask ( roleId , taskType , count , true , { warId , star } ) ;
pushMessage = await checkTask ( roleId , taskType , count , true , { warId , star } , funcs );
}
}
else if ( taskType == TASK_TYPE . BATTLE_DAILY )
{
if ( dicWar . warType == WAR_TYPE . DAILY ) {
pushMessage = await checkTask ( roleId , taskType , count , true , { dailyType : dicWar.dailyType } )
pushMessage = await checkTask ( roleId , taskType , count , true , { dailyType : dicWar.dailyType } , funcs )
}
}
else if ( taskType == TASK_TYPE . BATTLE_DUNGEON )
{
if ( dicWar . warType == WAR_TYPE . MYSTERY || dicWar . warType == WAR_TYPE . MYSTERY_ELITE ) {
pushMessage = await checkTask ( roleId , taskType , count , true , { } ) ;
pushMessage = await checkTask ( roleId , taskType , count , true , { } , funcs );
}
}
else if ( taskType == TASK_TYPE . BATTLE_DUNGEON_WAR )
{
if ( dicWar . warType == WAR_TYPE . MYSTERY || dicWar . warType == WAR_TYPE . MYSTERY_ELITE ) {
pushMessage = await checkTask ( roleId , taskType , count , true , { warId } ) ;
pushMessage = await checkTask ( roleId , taskType , count , true , { warId } , funcs );
}
}
else if ( taskType == TASK_TYPE . BATTLE_TOWER )
{
if ( dicWar . warType == WAR_TYPE . TOWER ) {
pushMessage = await checkTask ( roleId , taskType , count , true , { } ) ;
pushMessage = await checkTask ( roleId , taskType , count , true , { } , funcs );
}
}
else if ( taskType == TASK_TYPE . BATTLE_VESTIGE )
{
if ( dicWar . warType == WAR_TYPE . VESTIGE ) {
pushMessage = await checkTask ( roleId , taskType , count , true , { } ) ;
pushMessage = await checkTask ( roleId , taskType , count , true , { } , funcs );
}
}
else if ( taskType == TASK_TYPE . BATTLE_EXPEDITION )
{
if ( dicWar . warType == WAR_TYPE . EXPEDITION ) {
pushMessage = await checkTask ( roleId , taskType , count , true , { } ) ;
pushMessage = await checkTask ( roleId , taskType , count , true , { } , funcs );
}
}
return pushMessage
}
export async function checkTaskWithGoods ( roleId : string , taskType : number , goods : RewardInt er[ ] ) {
export async function checkTaskWithGoods ( roleId : string , taskType : number , goods : ItemInter [ ] , funcs? : numb er[ ] ) {
let pushMessage = new Array < { type : number , id : number , count : number , received : boolean } > ( ) ;
if ( taskType == TASK_TYPE . COM_BATTLE_DROP )
{
for ( let { id , count } of goods ) {
let push = await checkTask ( roleId , taskType , count , true , { gid : id } ) ;
let push = await checkTask ( roleId , taskType , count , true , { gid : id } , funcs );
pushMessage . concat ( push ) ;
}
}
@@ -305,7 +305,7 @@ export async function checkTaskWithGoods(roleId: string, taskType: number, goods
}
// 根据taskType判断有哪些任务需要check的
export async function checkTask ( roleId : string , taskType : number , count : number , isInc : boolean , param : TaskParam ) {
export async function checkTask ( roleId : string , taskType : number , count : number , isInc : boolean , param : TaskParam , funcs? : number [ ] ) {
let tasks = gameData . taskType . get ( taskType ) ;
let pushMessage = new Array < { type : number , id : number , count : number , received : boolean } > ( ) ;
let groups = new Map < number , { task0 : DicTask , tasks : DicTask [ ] } > ( ) ;
@@ -315,9 +315,13 @@ export async function checkTask(roleId: string, taskType: number, count: number,
}
groups . get ( dicTask . group ) . tasks . push ( dicTask ) ;
}
if ( ! funcs ) {
let role = await RoleModel . findByRoleId ( roleId , 'funcs' ) ;
funcs = role . funcs || [ ] ;
}
for ( let [ group , { task0 , tasks } ] of groups ) {
let rec = await checkTaskRec ( roleId , group , task0 , count , isInc , param ) ;
let rec = await checkTaskRec ( roleId , group , task0 , count , isInc , param , funcs );
if ( rec ) {
for ( let dicTask of tasks ) {
if ( checkRecResult ( rec , dicTask . condition ) ) {
@@ -330,8 +334,15 @@ export async function checkTask(roleId: string, taskType: number, count: number,
}
// 检查各项任务是否达成,达成了就保存到数据库
export async function checkTaskRec ( roleId : string , group : number , dicTask : DicTask , count : number , isInc : boolean , param : TaskParam ) {
export async function checkTaskRec ( roleId : string , group : number , dicTask : DicTask , count : number , isInc : boolean , param : TaskParam , funcs : number [ ] ) {
let { type , taskParam , taskType } = dicTask ;
let sp = [ TASK_TYPE . LOGIN_SUM , TASK_TYPE . LOGIN_SERIES ] ;
if ( type == TASK_FUN_TYPE . DAILY && funcs . indexOf ( FUNCS_ID . DAILY_TASK ) == - 1 && sp . indexOf ( taskType ) == - 1 ) { // 功能未开启
return false ;
}
let isMatch = true ; // 条件是否满足
let checkHistory = false ; // 是否检查历史
switch ( taskType ) {