package linestory import ( "go_dreamfactory/comm" "go_dreamfactory/lego/sys/log" "go_dreamfactory/pb" "go_dreamfactory/utils" "google.golang.org/protobuf/proto" ) func (this *apiComp) DotaskCheck(session comm.IUserSession, req *pb.LinestoryDotaskReq) (code pb.ErrorCode) { if req.TaskId == 0 || req.SubtaskId == 0 { code = pb.ErrorCode_ReqParameterError } return } func (this *apiComp) Dotask(session comm.IUserSession, req *pb.LinestoryDotaskReq) (code pb.ErrorCode, data proto.Message) { if code = this.DotaskCheck(session, req); code != pb.ErrorCode_Success { return } rsp := &pb.LinestoryDotaskResp{} defer func() { if err := session.SendMsg(string(this.moduleLinestory.GetType()), LinestorySubTypeDotask, rsp); err != nil { code = pb.ErrorCode_SystemError return } }() // task conf conf := this.moduleLinestory.configure.getLinestoryTaskCfgById(req.TaskId) if conf == nil { code = pb.ErrorCode_ConfigNoFound return } // stage conf stageConf := this.moduleLinestory.configure.getLinestoryStageCfgById(req.SubtaskId) if stageConf == nil { code = pb.ErrorCode_ConfigNoFound return } // 查询当前玩家的支线任务数据 dbLinestory := &pb.DBLinestory{} if err := this.moduleLinestory.modelLinestory.Get(session.GetUserId(), dbLinestory); err != nil { code = pb.ErrorCode_DBError return } var curTask *pb.TaskNode //当前任务 if dbLinestory.Tasks == nil { dbLinestory.Tasks = make(map[int32]*pb.TaskNode) curTask = &pb.TaskNode{} dbLinestory.Tasks[req.TaskId] = curTask } else { if v, ok := dbLinestory.Tasks[req.TaskId]; ok { curTask = v // 是否被禁止进入 if v.Status == 3 { code = pb.ErrorCode_LinestoryTaskDisabledEnter return } } } //校验前置 if conf.PreTId != -1 { if tn, ok := dbLinestory.Tasks[conf.PreTId]; !ok { code = pb.ErrorCode_LinestoryPreTaskNoFinished return } else { if tn.Status != 2 { code = pb.ErrorCode_LinestoryPreTaskNoFinished return } } } // 判此任务是否是结局 if conf.Ending == 0 && conf.Resetto != -1 { // 重置任务 for k, _ := range dbLinestory.Tasks { if k >= conf.Resetto { delete(dbLinestory.Tasks, k) } } // 设置当前任务为禁止 dbLinestory.Tasks[req.TaskId] = &pb.TaskNode{Status: 3} } // 校验子任务是否完成 if _, ok := utils.Findx(curTask.SubtaskIds, req.SubtaskId); ok { code = pb.ErrorCode_LinestorySubTaskFinished return } // 校验子任务前置是否完成 if stageConf.PreTId != -1 { if _, ok := utils.Findx(curTask.SubtaskIds, stageConf.PreTId); !ok { code = pb.ErrorCode_LinestoryPreTaskNoFinished return } } module, err := this.service.GetModule(comm.ModuleRtask) if err != nil { code = pb.ErrorCode_SystemError return } //校验子任务完成条件 if m, ok := module.(comm.IRtask); ok { for _, condiId := range stageConf.Cond { if code = m.CheckCondi(session.GetUserId(), condiId); code != pb.ErrorCode_Success { return } } // 全部符合条件 curTask.SubtaskIds = append(curTask.SubtaskIds, req.SubtaskId) if len(conf.StageTId) == len(curTask.SubtaskIds) { curTask.Status = 2 //完成 // 发任务奖励 if code = this.moduleLinestory.DispenseRes(session, conf.Reward, true); code != pb.ErrorCode_Success { log.Errorf("%v", code) } } else { curTask.Status = 1 //进行中 } dbLinestory.Tasks[conf.Id] = curTask } // 更新子任务 update := map[string]interface{}{ "tasks": dbLinestory.Tasks, } if err := this.moduleLinestory.modelLinestory.Change(session.GetUserId(), update); err != nil { code = pb.ErrorCode_DBError return } //派发子任务奖励 code = this.moduleLinestory.DispenseRes(session, stageConf.Reward, true) return }