xy-server/game/core/RoleTaskMgr.ts
2025-04-23 09:34:08 +08:00

606 lines
22 KiB
TypeScript

import TaskState from "../object/TaskState";
import GameUtil from "./GameUtil";
import TaskConfigMgr from "../task/TaskConfigMgr";
import TeamMgr from "./TeamMgr";
import NpcMgr from "./NpcMgr";
import SKDataUtil from "../gear/SKDataUtil";
import Player from '../object/Player';
import SKLogger from '../gear/SKLogger';
import { EEventType, ETaskKind, ETaskState } from "../role/EEnum";
import Task from "../task/Task";
import EventStateBase from "../event/EventStateBase";
import BangMgr from "../bang/BangMgr";
import DB from "../utils/DB";
export default class RoleTaskMgr {
player: Player;
recordList: number[];
mapTaskState: { [key: number]: TaskState };
nTimeCnt: any;
schedule: any;
mapDailyCnt: { [key: number]: number };
mapDailyStart: any;
mapFuBenCnt: any;
mapActiveScore: any;
szBeenTake: any;
szActivePrize: any;
bCanAutoFight: any;
constructor(player: Player) {
this.player = player;
this.recordList = [];
this.mapTaskState = {};
this.nTimeCnt = 0;
this.mapDailyCnt = {};
this.mapDailyStart = {};
this.mapFuBenCnt = {};
this.mapActiveScore = {};
this.szBeenTake = [0, 0, 0, 0, 0, 0];
this.szActivePrize = ['10301,1', '10406,10', '10204,10', '10404,30', '90004,50000', '70004,1'];//活跃度
this.bCanAutoFight = 0;
}
reset() {
this.mapTaskState = {};
}
OnTimer(nIndex?: any) { //一秒一次
this.nTimeCnt += 1;
if (this.nTimeCnt % 2 == 0) {
this.onGameEvent(EEventType.PLAYER_ARRIVE_AREA, {
mapid: this.player.mapid,
x: this.player.x,
y: this.player.y
});
}
if (this.nTimeCnt % 5 == 0)
this.OnFailEvent(EEventType.TIMEOUT, GameUtil.getTime());
}
OnNewDay() {
this.mapDailyStart = {};
let vecTask = [];
for (var it in this.mapTaskState) {
if (this.mapTaskState[it].nKind == ETaskKind.DAILY || this.mapTaskState[it].nKind == ETaskKind.FUBEN) {
if (this.mapTaskState[it].nTaskGrop == 22){
if (new Date().getDay() == 1){
vecTask.push(this.mapTaskState[it].nTaskID);
}
}else {
vecTask.push(this.mapTaskState[it].nTaskID);
}
}
}
for (var it in vecTask) {
this.abortTask(vecTask[it]);
}
let data: any = this.mapDailyCnt[22];
this.mapDailyCnt = {}; //放弃任务会增加计数,所以放到放弃后面
this.mapFuBenCnt = {};
this.mapActiveScore = {};
if (new Date().getDay() != 1){
if (data != undefined){
this.mapDailyCnt[22] = data;
}
}
this.szBeenTake = [0, 0, 0, 0, 0, 0];
this.player.unget_doublecnt += 60;
this.updateTaskStateToClient();
}
// 获得任务步骤状态
getTaskStepState(taskId: number, step: number): EventStateBase {
if (this.mapTaskState.hasOwnProperty(taskId) == false) {
return null;
}
if (step < 0 || step >= this.mapTaskState[taskId].vecEventState.length) {
return null;
}
let result = this.mapTaskState[taskId].vecEventState[step];
return result;
}
// 初始化
init(taskList: any[], recordList: number[], mapDailyCnt: any, mapFuBenCnt: any, mapDailyStart: any, mapActiveScore: any, szBeenTake: number[]) {
this.recordList = recordList.slice(0);
this.mapTaskState = {};
this.mapDailyCnt = mapDailyCnt;
this.mapFuBenCnt = mapFuBenCnt;
this.mapDailyStart = mapDailyStart;
this.mapActiveScore = mapActiveScore;
this.szBeenTake = szBeenTake;
if (SKDataUtil.isEmptyArray(taskList)) {
SKLogger.warn(`玩家[${this.player.roleid}:${this.player.name}]无任务数据!`);
}
for (let item of taskList) {
let isFinish = this.isAlreadyDoneThisTask(item.nTaskID);
if (!isFinish) {
this.addTaskState(parseInt(item.nTaskID), parseInt(item.nCurStep));
}
}
this.checkAndDeleteFinishedTask();
}
// 是否完成此任务
isAlreadyDoneThisTask(taskId: number): boolean {
for (let item of this.recordList) {
if (item == taskId) {
return true;
}
}
return false;
}
isMatchLimit(stTask: any): boolean {
for (var itLimit in stTask.vecLimit) {
if (stTask.vecLimit[itLimit].nKey == 'nPreTask') //前置任务
{
let nPreTask = parseInt(stTask.vecLimit[itLimit].nValue);
if (this.isAlreadyDoneThisTask(nPreTask) == false)
return false;
}
if (stTask.vecLimit[itLimit].nKey == 'nBang') {
if (this.player.bangid == 0)
return false;
}
if (stTask.vecLimit[itLimit].nKey == 'nRace') {
let nNeedRace = parseInt(stTask.vecLimit[itLimit].nValue);
if (this.player.race != nNeedRace)
return false;
}
}
return true;
}
// 加入任务状态
addTaskState(taskId: number, step: number) {
let task: Task = TaskConfigMgr.shared.getTaskConf(taskId);
if (task == null) {
SKLogger.warn(`玩家[${this.player.roleid}:${this.player.name}]找不到任务配置[${taskId}]!`);
return;
}
// 组队任务,玩家未组队
if (TaskConfigMgr.shared.isTeamTask(taskId) && this.player.teamid == 0) {
// SKLogger.warn(`玩家[${this.player.roleid}:${this.player.name}]组队任务未组队跳过!`);
return;
}
let taskState = new TaskState();
taskState.player = this.player;
taskState.initState(task, step);
this.mapTaskState[taskState.nTaskID] = taskState;
}
isAlreadyHasThisKindDailyTask(groupId: number): boolean {
for (let key in this.mapTaskState) {
let taskId: number = SKDataUtil.numberBy(key);
let task: Task = TaskConfigMgr.shared.getTaskConf(taskId);
if (task == null) {
continue;
}
if (task.nTaskGrop == groupId) {
return true;
}
}
return false;
}
// 获得任务次数
getKindTaskCnt(taskGroup: number): number {
let result = this.mapDailyCnt[taskGroup];
if (result == null) {
return 0;
}
return result;
}
// 获得活动组任务
getDailyGroupTask(): { [key: number]: Task[] } {
let dailyTasks: Task[] = TaskConfigMgr.shared.mapConfigTask[ETaskKind.DAILY];
if (dailyTasks == null) {
SKLogger.warn(`角色任务管理器:玩家[${this.player.roleid}:${this.player.name}]活动组任务没有配置!`);
return {};
}
let result: any = {};
for (let task of dailyTasks) {
let group = task.nTaskGrop;
if (result[group] == null) {
result[group] = [];
}
result[group].push(task);
}
return result;
}
// 取得开启的活动任务
getEnableDailyTask(mapDailyTask: any, group: any): Task[] {
let dailyGroup: Task[] = mapDailyTask[group];
let result: Task[] = [];
for (let key in dailyGroup) {
let task: Task = dailyGroup[key];
if (this.isMatchLimit(task) == false) {
continue;
}
result.push(task);
}
return result;
}
// 检查并接受任务
checkAndInceptTask() {
let taskList: Task[] = GameUtil.getDefault(TaskConfigMgr.shared.mapConfigTask[ETaskKind.STORY], []);
for (let key in taskList) {
let task: Task = taskList[key];
if (this.isAlreadyDoneThisTask(task.nTaskID)) {
continue;
}
if (this.mapTaskState.hasOwnProperty(task.nTaskID)) {
continue;
}
if (this.isMatchLimit(task) == false) {
continue;
}
this.addTaskState(task.nTaskID, 0);
break;
}
let dailyTasks = this.getDailyGroupTask();
for (let key in dailyTasks) {
if (this.mapDailyStart.hasOwnProperty(key) == false) {
continue;
}
let groupId: number = SKDataUtil.numberBy(key);
// 活动任务是组队,玩家不是队长则跳过
if (TaskConfigMgr.shared.IsTeamDaily(groupId) && this.player.isleader == false) {
continue;
}
if (this.isAlreadyHasThisKindDailyTask(groupId)) {
continue;
}
let groupTask: Task[] = this.getEnableDailyTask(dailyTasks, key);
if (SKDataUtil.isEmptyArray(groupTask)) {
SKLogger.debug(`玩家[${this.player.roleid}:${this.player.name}]组任务[${key}]为空`);
return;
}
let task: Task = SKDataUtil.randomList(groupTask);
// let task: Task = groupTask[3];
if (task != null) {
if (this.getKindTaskCnt(groupId) >= task.nDailyCnt) //这个类型的每日任务做完了
continue;
if (this.isMatchLimit(task) == false)
continue;
this.addTaskState(task.nTaskID, 0);
}
}
}
// 开始组任务
startGroupTask(taskGroup: number): string {
let current: number = this.getKindTaskCnt(taskGroup);
let max = TaskConfigMgr.shared.getDailyMaxCount(taskGroup);
if (current >= max) {
return "次数已满";
}
if (TaskConfigMgr.shared.IsTeamDaily(taskGroup) && this.player.teamid == 0 && this.player.isleader == false) {
return '只有队长才能接这个任务';
}
if (this.mapDailyStart.hasOwnProperty(taskGroup)) {
return '你已经领过这个任务了';
}
this.mapDailyStart[taskGroup] = true;
this.checkAndInceptTask();
this.updateTaskStateToClient();
return "";
}
CheckAndInceptFuBenTask(nTaskID: any) {
let pTaskConfig = TaskConfigMgr.shared.getTaskConf(nTaskID);
if (null == pTaskConfig || pTaskConfig.nKind != ETaskKind.FUBEN)
return 'syserr';
if (this.GetFuBenCnt(nTaskID) >= 1 && pTaskConfig.nTaskGrop != 14)
return '次数已满';
if (this.player.teamid == 0 || this.player.isleader == false)
return '只有队长才能接这个任务';
if (this.mapTaskState.hasOwnProperty(pTaskConfig.nTaskID))
return '你已经领取过这个任务';
if (this.isMatchLimit(pTaskConfig) == false)
return '不满足条件';
this.addTaskState(pTaskConfig.nTaskID, 0);
this.updateTaskStateToClient();
return '';
}
// 游戏事件
onGameEvent(nEventType: EEventType, data: any) {
if (this.player.teamid > 0 && this.player.isleader == false) {
SKLogger.debug(`游戏事件:玩家[${this.player.roleid}:${this.player.name}]是队员跳过!`);
return;
}
let onchange = false
for (let key in this.mapTaskState) {
if(this.mapTaskState[key].taskOnGameEvent(nEventType, data) == true){
onchange = true
}
}
if(onchange){
this.checkAndDeleteFinishedTask();
this.updateTaskStateToClient();
}
}
OnTeamTaskState(mapLeaderTaskState: any) {
for (let key in mapLeaderTaskState) {
if (TaskConfigMgr.shared.isTeamTask(key) == false) {
continue;
}
let groupId: number = SKDataUtil.numberBy(key);
if (this.mapTaskState.hasOwnProperty(groupId)) {
delete this.mapTaskState[groupId];
}
let pInfo = mapLeaderTaskState[key];
let taskState = new TaskState();
taskState.nTaskID = pInfo.nTaskID;
taskState.nKind = pInfo.nKind;
taskState.nTaskGrop = pInfo.nTaskGrop;
taskState.nTaskFinish = pInfo.nTaskFinish;
taskState.vecEventState = pInfo.vecEventState.slice(0);
taskState.vecFailEvent = pInfo.vecFailEvent.slice(0);
taskState.player = this.player;
this.mapTaskState[groupId] = taskState
}
this.updateTaskStateToClient();
}
// 放弃任务
abortTask(taskId: number) {
let taskState = this.mapTaskState[taskId];
if (taskState == null) {
SKLogger.debug(`放弃任务:找不到任务[${taskId}]状态!`);
return;
}
let task: Task = TaskConfigMgr.shared.getTaskConf(taskId);
if (task == null) {
SKLogger.warn(`放弃任务:找不到任务[${taskId}]信息!`);
return;
}
if (task.nKind == ETaskKind.STORY) {
this.player.send('s2c_notice', {
strRichText: '剧情任务无法取消'
});
SKLogger.debug(`放弃任务:剧情任务[${task.nTaskID}:${task.strTaskName}]不能取消!`);
return;
}
taskState.nTaskFinish = ETaskState.FALIED;
this.checkAndDeleteFinishedTask();
this.updateTaskStateToClient();
SKLogger.debug(`玩家[${this.player.roleid}:${this.player.name}]取消任务[${task.nTaskID}:${task.strTaskName}]`);
}
// 玩家离队
leaveTeam() {
// 找到所有的组队任务
let list = [];
for (let key in this.mapTaskState) {
if (TaskConfigMgr.shared.isTeamTask(key) == false) {
continue;
}
list.push(SKDataUtil.numberBy(key));
}
//放弃任务
for (let key in list) {
this.abortTask(list[key]);
}
}
// 任务失败
OnFailEvent(nEventType: any, stData: any) {
let bChange = false;
for (let it in this.mapTaskState) {
if (this.mapTaskState[it].TaskOnFialEvent(nEventType, stData) == true)
bChange = true;
}
if (bChange) {
this.checkAndDeleteFinishedTask();
this.updateTaskStateToClient();
}
}
// 检查所有完成或失败的任务
checkAndDeleteFinishedTask() {
for (let key in this.mapTaskState) {
let taskState: TaskState = this.mapTaskState[key];
if (taskState.nTaskFinish == ETaskState.DONE) {
this.onTaskFinish(taskState, true);
delete this.mapTaskState[key];
continue;
}
if (taskState.nTaskFinish == ETaskState.FALIED) {
this.onTaskFinish(taskState, false);
delete this.mapTaskState[key];
continue;
}
}
this.checkAndInceptTask();
}
// 任务完成
onTaskFinish(taskState: TaskState, isFinish: boolean) {
let playerList: Player[];
let leaderStep = 0;
if (this.player.teamid == 0) {
playerList = [this.player];
}
if (this.player.teamid > 0) {
playerList = TeamMgr.shared.getTeamPlayer(this.player.teamid);
}
let taskInfo = TaskConfigMgr.shared.getTaskConf(taskState.nTaskID);
if (taskInfo == null) {
console.warn(`玩家[${this.player.roleid}:${this.player.name}]任务[${taskState.nTaskID}]找不到!`);
return;
}
for (let member of playerList) {
if (member == null) {
continue;
}
if (isFinish && taskInfo.nKind == ETaskKind.STORY) {
member.getTaskMgr().recordList.push(taskState.nTaskID);
}
if(isFinish){
if(taskInfo.nTaskGrop == 2){
let bang = BangMgr.shared.getBang(member.bangid);
if(bang){
for (const roleInfo of bang.rolelist) {
if(roleInfo.roleid == member.roleid){
roleInfo.daytask++;
bang.bangexp += 75;
DB.updateBangMember(roleInfo,1);
DB.bangUpdate({bangid: member.bangid, banglevel: bang.banglevel, bangexp: bang.bangexp});
break;
}
}
}
}
if(member.doublecnt > 0 && taskInfo.nTaskGrop == 6){
member.doublecnt --;
DB.updateDoublePoint({doublecnt: member.doublecnt,unget_doublecnt: member.unget_doublecnt,roleid: member.roleid})
}
if(member.doublecnt > 0 && taskInfo.nTaskGrop == 7){
member.doublecnt -= 4;
DB.updateDoublePoint({doublecnt: member.doublecnt,unget_doublecnt: member.unget_doublecnt,roleid: member.roleid})
}
member.getTaskMgr().onDeleteTask(taskState,leaderStep, true);
if(member.isleader){
leaderStep = GameUtil.getDefault(this.mapFuBenCnt[taskState.nTaskID], 0);
}
}else{
member.getTaskMgr().onDeleteTask(taskState,leaderStep, false);
}
member.send('s2c_notice', {
strRichText: isFinish ? `任务[${taskInfo.strTaskName}]完成!` : `任务[${taskInfo.strTaskName}]失败!`
});
}
}
// 删除任务
onDeleteTask(taskState: TaskState,leaderStep: number, isSuccess: boolean) {
let max = TaskConfigMgr.shared.getDailyMaxCount(taskState.nTaskGrop);
let nextStep: number = taskState.vecEventState.length;
for (let key in taskState.vecEventState) {
let stepState = taskState.vecEventState[key];
if (stepState.nState == ETaskState.DOING) {
continue;
}
nextStep = SKDataUtil.numberBy(key);
if (typeof (stepState.vecRemainNpc) == "undefined") {
continue;
}
for (let npc in stepState.vecRemainNpc) {
NpcMgr.shared.CheckAndDeleteNpc(stepState.vecRemainNpc[npc].nOnlyID, this.player);
}
}
if (isSuccess) {//任务次数加1
//判断是不是组队任务
let flag = TaskConfigMgr.shared.isTeamTask(taskState.nTaskID);
if(flag == false){//如果不是组队任务,队员不加次数
if(this.player.teamid > 0 && this.player.isleader == false){
return;
}
}
if (taskState.nKind == ETaskKind.DAILY ) {
let num = this.mapDailyCnt[taskState.nTaskGrop];
if(num == undefined){
this.mapDailyCnt[taskState.nTaskGrop] = GameUtil.getDefault(this.mapDailyCnt[taskState.nTaskGrop], 0) + 1;
}else {
if(num < max){
this.mapDailyCnt[taskState.nTaskGrop] = GameUtil.getDefault(this.mapDailyCnt[taskState.nTaskGrop], 0) + 1;
}
}
}
if (taskState.nKind == ETaskKind.FUBEN) {
let nCurStep = GameUtil.getDefault(this.mapFuBenCnt[taskState.nTaskID], 0);
if(this.player.isleader == false && taskState.nTaskID == 1004){
nCurStep = leaderStep;
}
this.mapFuBenCnt[taskState.nTaskID] = Math.max(nCurStep, nextStep);
}
}
}
// 更新任务状态给客户端
updateTaskStateToClient() {
let vecData = [];
for (let it in this.mapTaskState) {
let stTask = this.mapTaskState[it];
let vecJson = [];
for (let itStep in stTask.vecEventState) {
let strJson = SKDataUtil.toJson(stTask.vecEventState[itStep], "{}");
vecJson.push(strJson);
}
vecData.push({
nTaskID: stTask.nTaskID,
vecStep: vecJson
});
}
this.player.send('s2c_role_task_list', {
vecTask: vecData,
strJsonDaily: SKDataUtil.toJson(this.mapDailyCnt, "{}")
});
if (this.player.teamid > 0 && this.player.isleader == true) {
this.SynchroTaskToTeam();
}
}
SynchroTaskToTeam() {
let pTeamInfo = TeamMgr.shared.teamList[this.player.teamid];
if (null == pTeamInfo) {
return;
}
for (let index = 1; index < pTeamInfo.playerlist.length; index++) {
let pMember: Player = pTeamInfo.playerlist[index];
if (null == pMember || pMember.roleid == this.player.roleid || pMember.isleader) {
continue;
}
if (pMember.getTaskMgr() == null) {
continue;
}
pMember.getTaskMgr().OnTeamTaskState(this.mapTaskState);
}
}
AddActive(nKind: any, nNum: any) {
if (this.mapActiveScore.hasOwnProperty(nKind) == false)
this.mapActiveScore[nKind] = 0;
this.mapActiveScore[nKind] = Math.min(this.mapActiveScore[nKind] + nNum, 140);
this.SendDailyActive();
}
SendDailyActive() {
let tmpData: any = {};
tmpData.mapActiveScore = this.mapActiveScore;
tmpData.szBeenTake = this.szBeenTake;
tmpData.szActivePrize = this.szActivePrize;
// 已接的每日任务
tmpData.mapDailyStart = this.mapDailyStart;
// 每日任务次数
tmpData.mapDailyCnt = this.mapDailyCnt;
// 副本任务次数
tmpData.mapFuBenCnt = this.mapFuBenCnt;
// 双倍点数
tmpData.doublecnt = this.player.doublecnt;
// 可领取点数
tmpData.canget = this.player.unget_doublecnt == null ? 0 : this.player.unget_doublecnt;
this.player.send('s2c_daily_info', {
strJson: SKDataUtil.toJson(tmpData, "{}")
});
}
GetFuBenCnt(nTaskID: any) {
if (this.mapFuBenCnt.hasOwnProperty(nTaskID) == false)
return 0;
return this.mapFuBenCnt[nTaskID];
}
//获取任务信息
getTaskStateByNpcOnlyid(npcOnlyid: any): { taskID: any, step: any } {
for (let it in this.mapTaskState) {
let step = this.mapTaskState[it].getTaskStepByNpcOnlyid(npcOnlyid);
if (step)
return { taskID: this.mapTaskState[it].nTaskID, step: step };
}
return null;
}
}