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 } // 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 } if dbLinestory.Tasks == nil { dbLinestory.Tasks = make(map[int32]*pb.TaskNode) } else { if v, ok := dbLinestory.Tasks[req.TaskId]; ok { // 是否被禁止进入 if v.Status == 3 { code = pb.ErrorCode_LinestoryTaskDisabledEnter return } } } var curTask *pb.TaskNode //当前任务 rsp := &pb.LinestoryDotaskResp{} defer func() { if err := session.SendMsg(string(this.moduleLinestory.GetType()), LinestorySubTypeDotask, rsp); err != nil { code = pb.ErrorCode_SystemError return } }() //校验前置 if conf.PreTId != -1 { if tn, ok := dbLinestory.Tasks[conf.PreTId]; !ok { code = pb.ErrorCode_LinestoryTaskNoFinished return } else { curTask = tn // 判此任务是否是结局 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 code = this.moduleLinestory.DispenseRes(session, conf.Reward, true); code != pb.ErrorCode_Success { log.Errorf("%v", code) } } } // 校验子任务是否完成 if _, ok := utils.Findx(curTask.SubtaskIds, req.SubtaskId); !ok { code = pb.ErrorCode_LinestorySubTaskNoFinished return } // 校验子任务前置 if stageConf.PreTId != -1 { 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, condiId); code != pb.ErrorCode_Success { return } } // 全部符合条件 curTask.SubtaskIds = append(curTask.SubtaskIds, req.SubtaskId) if len(conf.StageTId) == len(curTask.SubtaskIds) { curTask.Status = 2 //完成 } else { curTask.Status = 1 //进行中 } dbLinestory.Tasks[conf.PreTId] = curTask } } // 更新子任务 update := map[string]interface{}{ "tasks": dbLinestory.Tasks, } if err := this.moduleLinestory.modelLinestory.Change(session.GetUserId(), update); err != nil { code = pb.ErrorCode_DBError return } if stageConf.NextTId == -1 { //派发奖励 code = this.moduleLinestory.DispenseRes(session, stageConf.Reward, true) } return }