343 lines
10 KiB
Go
343 lines
10 KiB
Go
package robot
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"go_dreamfactory/comm"
|
|
"go_dreamfactory/lego/core"
|
|
"go_dreamfactory/lego/sys/log"
|
|
"go_dreamfactory/pb"
|
|
"go_dreamfactory/sys/configure"
|
|
cfg "go_dreamfactory/sys/configure/structs"
|
|
"time"
|
|
|
|
"google.golang.org/protobuf/proto"
|
|
)
|
|
|
|
//用户模块 机器人
|
|
type ModuleRobot_WTask struct {
|
|
info *pb.DBWTask
|
|
progress []*pb.DBWTaskItem //任务进度
|
|
state int32
|
|
change chan bool
|
|
}
|
|
|
|
func (this *ModuleRobot_WTask) Init() (err error) {
|
|
this.change = make(chan bool)
|
|
return
|
|
}
|
|
|
|
//接收到消息
|
|
func (this *ModuleRobot_WTask) Receive(robot IRobot, stype string, message proto.Message) (err error) {
|
|
// log.Debug("[机器人 WTask]", log.Field{Key: "Account", Value: robot.Account()}, log.Field{Key: "message", Value: message})
|
|
switch stype {
|
|
case "info":
|
|
resp := message.(*pb.WTaskInfoResp)
|
|
this.info = resp.Info
|
|
this.progress = resp.Accepts
|
|
break
|
|
case "accept":
|
|
resp := message.(*pb.WTaskAcceptResp)
|
|
this.progress = resp.Accepts
|
|
if this.info != nil {
|
|
this.info.Activations = resp.Activations
|
|
this.info.Accepts = make([]int32, 0)
|
|
for _, v := range this.progress {
|
|
this.info.Accepts = append(this.info.Accepts, v.Tid)
|
|
}
|
|
}
|
|
break
|
|
case "completecondi":
|
|
resp := message.(*pb.WTaskCompleteCondiResp)
|
|
for i, v := range this.progress {
|
|
if v.Tid == resp.TaskId {
|
|
this.progress[i] = resp.Progress
|
|
break
|
|
}
|
|
}
|
|
for _, v := range this.progress {
|
|
if v.Tid == resp.Progress.Tid {
|
|
v.Conlds = resp.Progress.Conlds
|
|
return
|
|
}
|
|
}
|
|
this.progress = append(this.progress, resp.Progress)
|
|
break
|
|
case "finish":
|
|
resp := message.(*pb.WTaskFinishResp)
|
|
for i, v := range this.info.Accepts {
|
|
if v == resp.Tid {
|
|
this.info.Accepts = append(this.info.Accepts[0:i], this.info.Accepts[i+1:]...)
|
|
}
|
|
}
|
|
break
|
|
case "activationschange":
|
|
resp := message.(*pb.WTaskActivationsChangePush)
|
|
if this.info != nil {
|
|
this.info.Activations = resp.Activations
|
|
}
|
|
break
|
|
case "acceptchange":
|
|
resp := message.(*pb.WTaskAcceptChangePush)
|
|
// log.Debug("[机器人 WTask-AcceptChange]", log.Field{Key: "Account", Value: robot.Account()}, log.Field{Key: "Resp", Value: resp.String()})
|
|
this.progress = resp.Accepts
|
|
if this.info != nil {
|
|
this.info.Accepts = make([]int32, 0)
|
|
for _, v := range this.progress {
|
|
this.info.Accepts = append(this.info.Accepts, v.Tid)
|
|
}
|
|
}
|
|
break
|
|
case "boxchange":
|
|
resp := message.(*pb.WTaskBoxChangePush)
|
|
this.info.Boxs = resp.Boxs
|
|
break
|
|
}
|
|
return
|
|
}
|
|
func (this *ModuleRobot_WTask) OncePipeline(robot IRobot) (err error) {
|
|
var (
|
|
errdata *pb.ErrorData
|
|
)
|
|
//获取任务列表
|
|
if _, errdata = robot.SendMessage("wtask", "info", &pb.WTaskInfoReq{}); errdata != nil {
|
|
err = errors.New(fmt.Sprintf("code:%d message:%s", errdata.Code, errdata.Message))
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
//机器人执行流
|
|
func (this *ModuleRobot_WTask) DoPipeline(robot IRobot) (err error) {
|
|
var (
|
|
errdata *pb.ErrorData
|
|
tconf *cfg.GameWorldTaskData
|
|
cconf *cfg.GameBuriedCondiData
|
|
module core.M_Modules
|
|
)
|
|
locp:
|
|
for {
|
|
//寻找可做任务
|
|
tconf = this.findtask()
|
|
if tconf == nil {
|
|
break locp
|
|
}
|
|
if this.checkaccept(tconf) { //是否需要接收任务
|
|
if _, errdata = robot.SendMessage("wtask", "accept", &pb.WTaskAcceptReq{Tid: tconf.Key}); errdata != nil {
|
|
err = errors.New(fmt.Sprintf("code:%d message:%s", errdata.Code, errdata.Message))
|
|
return
|
|
}
|
|
continue
|
|
}
|
|
//找到能做的任务
|
|
cconf, err = this.findconlds(tconf)
|
|
if err != nil {
|
|
break locp
|
|
}
|
|
//有问完成的子任务
|
|
if cconf != nil {
|
|
switch comm.TaskType(cconf.Type) {
|
|
case comm.Rtype1, comm.Rtype14:
|
|
module = comm.ModuleHero
|
|
case comm.Rtype20001, comm.Rtype70, comm.Rtype205, comm.Rtype227:
|
|
module = comm.ModuleWtask
|
|
case comm.Rtype149, comm.Rtype152:
|
|
module = comm.ModulePractice
|
|
case comm.Rtype61:
|
|
module = comm.ModuleMainline
|
|
case comm.Rtype5, comm.Rtype41, comm.Rtype43, comm.Rtype92, comm.Rtype94, comm.Rtype95, comm.Rtype96, comm.Rtype169:
|
|
module = comm.ModuleEquipment
|
|
case comm.Rtype128, comm.Rtype129, comm.Rtype131:
|
|
module = comm.ModuleArena
|
|
case comm.Rtype168:
|
|
module = comm.ModulePagoda
|
|
case comm.Rtype73:
|
|
module = comm.ModuleViking
|
|
case comm.Rtype199:
|
|
module = comm.ModuleHero
|
|
case comm.Rtype62:
|
|
module = comm.ModuleChat
|
|
case comm.Rtype104:
|
|
module = comm.ModuleShop
|
|
default:
|
|
err = fmt.Errorf("[Robot DoTask] ctype:%d conld:%d Not Achieved !", cconf.Type, cconf.Id)
|
|
// log.Error("[Robot DoTask]", log.Field{Key: "ctype", Value: cconf.Type}, log.Field{Key: "conld", Value: cconf.Id}, log.Field{Key: "err", Value: "Not Achieved !"})
|
|
break locp
|
|
}
|
|
|
|
if err = robot.DoTask(tconf, cconf, module); err != nil {
|
|
// log.Error("[Robot DoTask]", log.Field{Key: "task", Value: tconf.Key}, log.Field{Key: "conld", Value: cconf.Id}, log.Field{Key: "err", Value: err.Error()})
|
|
break locp
|
|
}
|
|
time.Sleep(time.Second * 2)
|
|
continue
|
|
} else { //任务已完成直接完成
|
|
if _, errdata = robot.SendMessage("wtask", "finish", &pb.WTaskFinishReq{Tid: tconf.Key}); errdata != nil {
|
|
err = errors.New(fmt.Sprintf("code:%d message:%s", errdata.Code, errdata.Message))
|
|
return
|
|
}
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
//做任务
|
|
func (this *ModuleRobot_WTask) DoTask(robot IRobot, taskconf *cfg.GameWorldTaskData, condconf *cfg.GameBuriedCondiData) (err error) {
|
|
var (
|
|
errdata *pb.ErrorData
|
|
)
|
|
switch comm.TaskType(condconf.Type) {
|
|
case comm.Rtype20001: //完成对话
|
|
if _, errdata = robot.SendTaskMessage(taskconf.Key, condconf.Id, "wtask", "completecondi", &pb.WTaskCompleteCondiReq{TaskId: taskconf.Key, CondiId: condconf.Id}); errdata != nil {
|
|
err = errors.New(fmt.Sprintf("code:%d message:%s", errdata.Code, errdata.Message))
|
|
return
|
|
}
|
|
break
|
|
case comm.Rtype70: //完成世界任务战斗
|
|
var (
|
|
heromodule *ModuleRobot_Hero
|
|
heros []string
|
|
resp proto.Message
|
|
)
|
|
heromodule = robot.GetModule(comm.ModuleHero).(*ModuleRobot_Hero)
|
|
heros = heromodule.getbattlehero()
|
|
if resp, errdata = robot.SendTaskMessage(taskconf.Key, condconf.Id, "wtask", "battlestart", &pb.WTaskBattleStartReq{BattleConfId: condconf.Filter[0], Battle: &pb.BattleFormation{Format: heros}}); errdata != nil {
|
|
err = errors.New(fmt.Sprintf("code:%d message:%s", errdata.Code, errdata.Message))
|
|
return
|
|
}
|
|
if _, errdata = robot.SendTaskMessage(taskconf.Key, condconf.Id, "wtask", "battlefinish", &pb.WTaskBattleFinishReq{BattleConfId: condconf.Filter[0], Report: &pb.BattleReport{
|
|
Info: resp.(*pb.WTaskBattleStartResp).Info,
|
|
WinSide: 1,
|
|
}}); errdata != nil {
|
|
err = errors.New(fmt.Sprintf("code:%d message:%s", errdata.Code, errdata.Message))
|
|
return
|
|
}
|
|
break
|
|
case comm.Rtype227: //完成世界任务战斗 失败
|
|
var (
|
|
heromodule *ModuleRobot_Hero
|
|
heros []string
|
|
resp proto.Message
|
|
)
|
|
heromodule = robot.GetModule(comm.ModuleHero).(*ModuleRobot_Hero)
|
|
heros = heromodule.getbattlehero()
|
|
if resp, errdata = robot.SendTaskMessage(taskconf.Key, condconf.Id, "wtask", "battlestart", &pb.WTaskBattleStartReq{BattleConfId: condconf.Filter[0], Battle: &pb.BattleFormation{Format: heros}}); errdata != nil {
|
|
err = errors.New(fmt.Sprintf("code:%d message:%s", errdata.Code, errdata.Message))
|
|
return
|
|
}
|
|
if _, errdata = robot.SendTaskMessage(taskconf.Key, condconf.Id, "wtask", "battlefinish", &pb.WTaskBattleFinishReq{BattleConfId: condconf.Filter[0], Report: &pb.BattleReport{
|
|
Info: resp.(*pb.WTaskBattleStartResp).Info,
|
|
WinSide: 2,
|
|
}}); errdata != nil {
|
|
err = errors.New(fmt.Sprintf("code:%d message:%s", errdata.Code, errdata.Message))
|
|
return
|
|
}
|
|
break
|
|
case comm.Rtype205: //拾取宝箱
|
|
boxid := int32(0)
|
|
for k, v := range this.info.Boxs[taskconf.Key].Boxs {
|
|
if v == 0 {
|
|
boxid = k
|
|
break
|
|
}
|
|
}
|
|
if _, errdata = robot.SendTaskMessage(taskconf.Key, condconf.Id, "wtask", "boxreceive", &pb.WTaskBoxReceiveReq{
|
|
Tid: taskconf.Key,
|
|
Boxid: boxid,
|
|
}); errdata != nil {
|
|
err = errors.New(fmt.Sprintf("code:%d message:%s", errdata.Code, errdata.Message))
|
|
return
|
|
}
|
|
break
|
|
}
|
|
return
|
|
}
|
|
|
|
func (this *ModuleRobot_WTask) findtask() (conf *cfg.GameWorldTaskData) {
|
|
var (
|
|
confs []*cfg.GameWorldTaskData
|
|
err error
|
|
)
|
|
for _, v := range this.info.Accepts {
|
|
if conf, err = this.getGameWorldTaskData(v); err != nil {
|
|
log.Error("[Robot 世界任务配置未找到]", log.Field{Key: "task", Value: v}, log.Field{Key: "err", Value: err.Error()})
|
|
}
|
|
if conf.Des == 2 { //优先找到主线任务
|
|
return
|
|
}
|
|
confs = append(confs, conf)
|
|
}
|
|
|
|
for _, v := range this.info.Activations { //可接取任务列表
|
|
if conf, err = this.getGameWorldTaskData(v); err != nil {
|
|
log.Error("[Robot 世界任务配置未找到]", log.Field{Key: "task", Value: v}, log.Field{Key: "err", Value: err.Error()})
|
|
return
|
|
}
|
|
if conf.Des == 2 { //优先找到主线任务
|
|
return
|
|
}
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (this *ModuleRobot_WTask) findconlds(conf *cfg.GameWorldTaskData) (cconf *cfg.GameBuriedCondiData, err error) {
|
|
for _, tp := range this.progress {
|
|
if tp.Tid == conf.Key {
|
|
for _, v := range tp.Conlds {
|
|
if v.State == pb.BuriedItemFinishState_buried_unfinish { //未完成
|
|
if cconf, err = this.getburiedcondidata(v.Conid); err != nil {
|
|
log.Error("[Robot 埋点任务配置未找到]", log.Field{Key: "conld", Value: v.Conid}, log.Field{Key: "err", Value: err.Error()})
|
|
return
|
|
}
|
|
return
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func (this *ModuleRobot_WTask) checkaccept(conf *cfg.GameWorldTaskData) bool {
|
|
for _, v := range this.info.Accepts {
|
|
if v == conf.Key {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
//获取任务配置
|
|
func (this *ModuleRobot_WTask) getGameWorldTaskData(tid int32) (conf *cfg.GameWorldTaskData, err error) {
|
|
var (
|
|
v interface{}
|
|
ok bool
|
|
)
|
|
if v, err = configure.GetConfigure(gameWorldTask); err != nil {
|
|
return
|
|
} else {
|
|
if conf, ok = v.(*cfg.GameWorldTask).GetDataMap()[tid]; !ok {
|
|
err = comm.NewNotFoundConfErr("robot", gameWorldTask, tid)
|
|
return
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
// 读取条件任务id配置
|
|
func (this *ModuleRobot_WTask) getburiedcondidata(cid int32) (conf *cfg.GameBuriedCondiData, err error) {
|
|
var (
|
|
v interface{}
|
|
ok bool
|
|
)
|
|
if v, err = configure.GetConfigure(game_buriedcondi); err != nil {
|
|
return
|
|
} else {
|
|
if conf, ok = v.(*cfg.GameBuriedCondi).GetDataMap()[cid]; !ok {
|
|
err = comm.NewNotFoundConfErr("robot", game_buriedcondi, cid)
|
|
return
|
|
}
|
|
}
|
|
return
|
|
}
|