176 lines
5.0 KiB
Go
176 lines
5.0 KiB
Go
package worldtask
|
|
|
|
import (
|
|
"fmt"
|
|
"go_dreamfactory/comm"
|
|
"go_dreamfactory/lego/core"
|
|
"go_dreamfactory/lego/sys/log"
|
|
"go_dreamfactory/pb"
|
|
)
|
|
|
|
// 世界任务完成
|
|
func (this *apiComp) FinishCheck(session comm.IUserSession, req *pb.WorldtaskFinishReq) (errdata *pb.ErrorData) {
|
|
if req.TaskId == 0 {
|
|
this.module.Error("世界任务完成参数错误", log.Field{Key: "uid", Value: session.GetUserId()}, log.Field{Key: "params", Value: req.String()})
|
|
errdata = &pb.ErrorData{
|
|
Code: pb.ErrorCode_ReqParameterError,
|
|
Title: pb.ErrorCode_ReqParameterError.ToString(),
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func (this *apiComp) Finish(session comm.IUserSession, req *pb.WorldtaskFinishReq) (errdata *pb.ErrorData) {
|
|
if errdata = this.FinishCheck(session, req); errdata != nil {
|
|
return
|
|
}
|
|
uid := session.GetUserId()
|
|
|
|
rsp := &pb.WorldtaskFinishResp{}
|
|
|
|
// 获取用户信息
|
|
user := this.module.ModuleUser.GetUser(uid)
|
|
if user == nil {
|
|
errdata = &pb.ErrorData{
|
|
Code: pb.ErrorCode_UserSessionNobeing,
|
|
Title: pb.ErrorCode_UserSessionNobeing.ToString(),
|
|
Datastring: uid,
|
|
}
|
|
return
|
|
}
|
|
|
|
// 当前任务配置
|
|
curTaskConf, err := this.module.configure.getWorldtaskById(req.TaskId)
|
|
if err != nil || curTaskConf == nil {
|
|
errdata = &pb.ErrorData{
|
|
Code: pb.ErrorCode_ConfigNoFound,
|
|
Title: pb.ErrorCode_ConfigNoFound.ToString(),
|
|
Message: err.Error(),
|
|
}
|
|
return
|
|
}
|
|
|
|
if curTaskConf.DeliverNpc == 0 {
|
|
errdata = &pb.ErrorData{
|
|
Code: pb.ErrorCode_WorldtaskNoProcess,
|
|
Title: pb.ErrorCode_WorldtaskNoProcess.ToString(),
|
|
Message: "配置DeliverNpc字段是0",
|
|
}
|
|
return
|
|
}
|
|
|
|
// 判断玩家等级要求
|
|
if user.Lv < curTaskConf.Lock {
|
|
errdata = &pb.ErrorData{
|
|
Code: pb.ErrorCode_WorldtaskLvNotEnough,
|
|
Title: pb.ErrorCode_WorldtaskLvNotEnough.ToString(),
|
|
Message: fmt.Sprintf("实际等级:%d 期望等级:%d", user.Lv, curTaskConf.Lock),
|
|
}
|
|
return
|
|
}
|
|
|
|
// 当前玩家世界任务
|
|
userTask, err := this.module.modelWorldtask.getWorldtask(uid)
|
|
if err != nil {
|
|
errdata = &pb.ErrorData{
|
|
Code: pb.ErrorCode_DBError,
|
|
Title: pb.ErrorCode_DBError.ToString(),
|
|
Message: err.Error(),
|
|
}
|
|
return
|
|
}
|
|
if userTask.Uid == "" {
|
|
userTask.Uid = uid
|
|
}
|
|
|
|
// 前置任务ID 只有世界任务才校验前置 (完成任务无需校验前置任务)
|
|
// if !this.module.modelWorldtask.IsPreFinished(userTask, curTaskConf) {
|
|
// errdata = &pb.ErrorData{
|
|
// Code: pb.ErrorCode_WorldtaskLastUnFinished,
|
|
// Title: pb.ErrorCode_WorldtaskLastUnFinished.ToString(),
|
|
// Message: fmt.Sprintf("任务[%v]的前置任务 [%v] 未完成", curTaskConf.Key, curTaskConf.Ontxe),
|
|
// }
|
|
// return
|
|
// }
|
|
|
|
//判断任务是否已完成
|
|
for _, v := range userTask.TaskList {
|
|
if v == req.TaskId {
|
|
this.module.Debug("任务已完成,返回下一个",
|
|
log.Field{Key: "uid", Value: uid},
|
|
log.Field{Key: "taskId", Value: req.TaskId},
|
|
)
|
|
this.sendMsg(session, WorldtaskSubtypeFinish, rsp)
|
|
this.module.modelWorldtask.taskFinishPush(session, userTask, curTaskConf)
|
|
return
|
|
}
|
|
}
|
|
|
|
conds, err := this.module.ModuleBuried.CheckCondition(uid, curTaskConf.Completetask...)
|
|
if err != nil {
|
|
errdata = &pb.ErrorData{
|
|
Code: pb.ErrorCode_ExternalModule,
|
|
Title: pb.ErrorCode_ExternalModule.ToString(),
|
|
Message: comm.NewExternalModuleErr("Buried", "CheckCondition", uid, curTaskConf.Completetask).Error(),
|
|
}
|
|
return
|
|
}
|
|
|
|
for _, cond := range conds {
|
|
if cond.State == pb.BuriedItemFinishState_buried_unfinish {
|
|
errdata = &pb.ErrorData{
|
|
Code: pb.ErrorCode_RtaskCondiNoReach,
|
|
Title: pb.ErrorCode_RtaskCondiNoReach.ToString(),
|
|
Message: fmt.Sprintf("世界任务[%v] 条件[%v]未达成", req.TaskId, cond.Conid),
|
|
}
|
|
return
|
|
}
|
|
}
|
|
|
|
for _, cond := range conds {
|
|
if cond.State == pb.BuriedItemFinishState_buried_unfinish {
|
|
errdata = &pb.ErrorData{
|
|
Code: pb.ErrorCode_RtaskCondiNoReach,
|
|
Title: pb.ErrorCode_RtaskCondiNoReach.ToString(),
|
|
Message: fmt.Sprintf("世界任务[%v]条件[%v]未达标,类型:%v 实际:%v 期望:%v", req.TaskId, cond.Conid, cond.Btype, cond.Value, cond.Target),
|
|
}
|
|
return
|
|
}
|
|
}
|
|
|
|
// 完成任务
|
|
if err := this.module.modelWorldtask.finishTask(req.TaskId, userTask); err != nil {
|
|
errdata = &pb.ErrorData{
|
|
Code: pb.ErrorCode_WorldtaskFinish,
|
|
Title: pb.ErrorCode_WorldtaskFinish.ToString(),
|
|
Message: err.Error(),
|
|
}
|
|
return
|
|
}
|
|
// 发奖
|
|
if errdata = this.module.DispenseRes(session, curTaskConf.Reword, true); errdata != nil {
|
|
this.module.Error("资源发放",
|
|
log.Field{Key: "uid", Value: uid},
|
|
log.Field{Key: "taskId", Value: req.TaskId},
|
|
log.Field{Key: "reword", Value: curTaskConf.Reword},
|
|
log.Field{Key: "errdata", Value: errdata},
|
|
)
|
|
}
|
|
|
|
//判断是否配置了通知module
|
|
for _, m := range curTaskConf.Module {
|
|
i, err := this.service.GetModule(core.M_Modules(m))
|
|
if err != nil {
|
|
this.module.Errorln(err)
|
|
continue
|
|
}
|
|
|
|
if ic, ok := i.(comm.ITaskComplete); ok {
|
|
ic.TaskComplete(session, req.TaskId)
|
|
}
|
|
}
|
|
this.sendMsg(session, WorldtaskSubtypeFinish, rsp)
|
|
this.module.modelWorldtask.taskFinishPush(session, userTask, curTaskConf)
|
|
return
|
|
}
|