任务接取、进度、完成状态

This commit is contained in:
flswld
2023-02-21 19:01:04 +08:00
parent 418655dea9
commit 7d21f24dc8
11 changed files with 746 additions and 52 deletions

View File

@@ -148,6 +148,7 @@ func (g *GameManager) LoginNotify(userId uint32, player *model.Player, clientSeq
g.SendMsg(cmd.PlayerStoreNotify, userId, clientSeq, g.PacketPlayerStoreNotify(player))
g.SendMsg(cmd.AvatarDataNotify, userId, clientSeq, g.PacketAvatarDataNotify(player))
g.SendMsg(cmd.OpenStateUpdateNotify, userId, clientSeq, g.PacketOpenStateUpdateNotify())
g.SendMsg(cmd.QuestListNotify, userId, clientSeq, g.PacketQuestListNotify(player))
// g.GCGLogin(player) // 发送GCG登录相关的通知包
playerLoginRsp := &proto.PlayerLoginRsp{
IsUseAbilityHash: true,
@@ -160,45 +161,6 @@ func (g *GameManager) LoginNotify(userId uint32, player *model.Player, clientSeq
TotalTickTime: 0.0,
}
g.SendMsg(cmd.PlayerLoginRsp, userId, clientSeq, playerLoginRsp)
questListNotify := &proto.QuestListNotify{
QuestList: make([]*proto.Quest, 0),
}
for _, questDataConfig := range gdconf.GetQuestDataMap() {
if questDataConfig.QuestId == 35104 {
questListNotify.QuestList = append(questListNotify.QuestList, &proto.Quest{
QuestId: 35104,
State: 2,
StartTime: uint32(time.Now().Unix()),
ParentQuestId: 351,
StartGameTime: 438,
AcceptTime: uint32(time.Now().Unix()),
FinishProgressList: []uint32{0},
})
continue
}
finishProgressList := make([]uint32, 0)
if questDataConfig.FinishCondType1 != 0 {
finishProgressList = append(finishProgressList, 0)
}
if questDataConfig.FinishCondType2 != 0 {
finishProgressList = append(finishProgressList, 0)
}
if questDataConfig.FinishCondType3 != 0 {
finishProgressList = append(finishProgressList, 0)
}
questListNotify.QuestList = append(questListNotify.QuestList, &proto.Quest{
QuestId: uint32(questDataConfig.QuestId),
State: 1,
StartTime: uint32(time.Now().Unix()),
ParentQuestId: uint32(questDataConfig.ParentQuestId),
StartGameTime: 0,
AcceptTime: uint32(time.Now().Unix()),
FinishProgressList: finishProgressList,
})
}
g.SendMsg(cmd.QuestListNotify, userId, clientSeq, questListNotify)
}
func (g *GameManager) PacketPlayerDataNotify(player *model.Player) *proto.PlayerDataNotify {
@@ -432,5 +394,7 @@ func (g *GameManager) CreatePlayer(userId uint32, nickName string, mainCharAvata
player.ChatMsgMap = make(map[uint32][]*model.ChatMsg)
g.AcceptQuest(player, false)
return player
}

157
gs/game/player_quest.go Normal file
View File

@@ -0,0 +1,157 @@
package game
import (
"hk4e/common/constant"
"hk4e/gdconf"
"hk4e/gs/model"
"hk4e/pkg/logger"
"hk4e/protocol/cmd"
"hk4e/protocol/proto"
pb "google.golang.org/protobuf/proto"
)
// AddQuestContentProgressReq 添加任务内容进度请求
func (g *GameManager) AddQuestContentProgressReq(player *model.Player, payloadMsg pb.Message) {
req := payloadMsg.(*proto.AddQuestContentProgressReq)
logger.Error("AddQuestContentProgressReq: %v", req)
g.AddQuestProgress(player, req)
rsp := &proto.AddQuestContentProgressRsp{
ContentType: req.ContentType,
}
g.SendMsg(cmd.AddQuestContentProgressRsp, player.PlayerID, player.ClientSeq, rsp)
g.AcceptQuest(player, true)
}
// AddQuestProgress 添加任务进度
func (g *GameManager) AddQuestProgress(player *model.Player, req *proto.AddQuestContentProgressReq) {
dbQuest := player.GetDbQuest()
updateQuestIdList := make([]uint32, 0)
for _, quest := range dbQuest.GetQuestMap() {
questDataConfig := gdconf.GetQuestDataById(int32(quest.QuestId))
if questDataConfig == nil {
logger.Error("get quest data config is nil, questId: %v", quest.QuestId)
continue
}
for index, finishCond := range questDataConfig.FinishCondList {
if len(finishCond.Param) != 1 {
continue
}
if req.ContentType != uint32(finishCond.Type) || req.Param != uint32(finishCond.Param[0]) {
continue
}
dbQuest.AddQuestProgress(quest.QuestId, index, req.AddProgress)
updateQuestIdList = append(updateQuestIdList, quest.QuestId)
}
}
for _, questId := range updateQuestIdList {
quest := dbQuest.GetQuestById(questId)
if quest == nil {
logger.Error("get quest is nil, questId: %v", quest.QuestId)
continue
}
ntf := &proto.QuestProgressUpdateNotify{
QuestId: quest.QuestId,
FinishProgressList: quest.FinishProgressList,
}
g.SendMsg(cmd.QuestProgressUpdateNotify, player.PlayerID, player.ClientSeq, ntf)
}
}
// AcceptQuest 接取当前条件下能接取到的全部任务
func (g *GameManager) AcceptQuest(player *model.Player, isNtfClient bool) {
dbQuest := player.GetDbQuest()
addQuestIdList := make([]uint32, 0)
for _, questData := range gdconf.GetQuestDataMap() {
if dbQuest.GetQuestById(uint32(questData.QuestId)) != nil {
continue
}
canAccept := true
for _, acceptCond := range questData.AcceptCondList {
switch acceptCond.Type {
case constant.QUEST_ACCEPT_COND_TYPE_QUEST_STATE_EQ:
// 某个任务状态等于 参数1:任务id 参数2:任务状态
if len(acceptCond.Param) != 2 {
logger.Error("quest accept cond config format error, questId: %v", questData.QuestId)
canAccept = false
break
}
quest := dbQuest.GetQuestById(uint32(acceptCond.Param[0]))
if quest == nil {
canAccept = false
break
}
if quest.State != uint32(acceptCond.Param[1]) {
canAccept = false
break
}
default:
canAccept = false
break
}
}
if canAccept {
dbQuest.AddQuest(uint32(questData.QuestId))
// TODO 判断任务是否能开始执行
dbQuest.ExecQuest(uint32(questData.QuestId))
addQuestIdList = append(addQuestIdList, uint32(questData.QuestId))
}
}
if isNtfClient {
ntf := &proto.QuestListUpdateNotify{
QuestList: make([]*proto.Quest, 0),
}
for _, questId := range addQuestIdList {
pbQuest := g.PacketQuest(player, questId)
if pbQuest == nil {
continue
}
ntf.QuestList = append(ntf.QuestList, pbQuest)
}
g.SendMsg(cmd.QuestListUpdateNotify, player.PlayerID, player.ClientSeq, ntf)
}
}
// PacketQuest 打包一个任务
func (g *GameManager) PacketQuest(player *model.Player, questId uint32) *proto.Quest {
dbQuest := player.GetDbQuest()
questDataConfig := gdconf.GetQuestDataById(int32(questId))
if questDataConfig == nil {
logger.Error("get quest data config is nil, questId: %v", questId)
return nil
}
quest := dbQuest.GetQuestById(questId)
if quest == nil {
logger.Error("get quest is nil, questId: %v", quest.QuestId)
return nil
}
pbQuest := &proto.Quest{
QuestId: quest.QuestId,
State: quest.State,
StartTime: quest.StartTime,
ParentQuestId: uint32(questDataConfig.ParentQuestId),
StartGameTime: 0,
AcceptTime: quest.AcceptTime,
FinishProgressList: quest.FinishProgressList,
}
return pbQuest
}
// PacketQuestListNotify 打包任务列表通知
func (g *GameManager) PacketQuestListNotify(player *model.Player) *proto.QuestListNotify {
questListNotify := &proto.QuestListNotify{
QuestList: make([]*proto.Quest, 0),
}
dbQuest := player.GetDbQuest()
for _, quest := range dbQuest.GetQuestMap() {
pbQuest := g.PacketQuest(player, quest.QuestId)
if pbQuest == nil {
continue
}
questListNotify.QuestList = append(questListNotify.QuestList, pbQuest)
}
return questListNotify
}

View File

@@ -138,6 +138,7 @@ func (r *RouteManager) initRoute() {
r.registerRouter(cmd.AvatarPromoteGetRewardReq, GAME_MANAGER.AvatarPromoteGetRewardReq)
r.registerRouter(cmd.SetEquipLockStateReq, GAME_MANAGER.SetEquipLockStateReq)
r.registerRouter(cmd.TakeoffEquipReq, GAME_MANAGER.TakeoffEquipReq)
r.registerRouter(cmd.AddQuestContentProgressReq, GAME_MANAGER.AddQuestContentProgressReq)
}
func (r *RouteManager) RouteHandle(netMsg *mq.NetMsg) {

132
gs/model/db_quest.go Normal file
View File

@@ -0,0 +1,132 @@
package model
import (
"time"
"hk4e/common/constant"
"hk4e/gdconf"
"hk4e/pkg/logger"
)
// DbQuest 玩家任务数据
type DbQuest struct {
QuestMap map[uint32]*Quest // 任务列表 key:任务id value:任务
}
// Quest 任务
type Quest struct {
QuestId uint32 // 任务id
State uint32 // 任务状态
AcceptTime uint32 // 接取时间
StartTime uint32 // 开始执行时间
FinishProgressList []uint32 // 任务进度
}
func (p *Player) GetDbQuest() *DbQuest {
if p.DbQuest == nil {
p.DbQuest = &DbQuest{
QuestMap: make(map[uint32]*Quest),
}
}
return p.DbQuest
}
// GetQuestMap 获取全部任务
func (q *DbQuest) GetQuestMap() map[uint32]*Quest {
return q.QuestMap
}
// GetQuestById 获取一个任务
func (q *DbQuest) GetQuestById(questId uint32) *Quest {
return q.QuestMap[questId]
}
// AddQuest 添加一个任务
func (q *DbQuest) AddQuest(questId uint32) {
_, exist := q.QuestMap[questId]
if exist {
logger.Error("quest is already exist, questId: %v", questId)
return
}
questDataConfig := gdconf.GetQuestDataById(int32(questId))
if questDataConfig == nil {
logger.Error("get quest data config is nil, questId: %v", questId)
return
}
q.QuestMap[questId] = &Quest{
QuestId: uint32(questDataConfig.QuestId),
State: constant.QUEST_STATE_TYPE_ACCEPT,
AcceptTime: uint32(time.Now().Unix()),
StartTime: 0,
FinishProgressList: nil,
}
}
// ExecQuest 开始执行一个任务
func (q *DbQuest) ExecQuest(questId uint32) {
quest, exist := q.QuestMap[questId]
if !exist {
logger.Error("get quest is nil, questId: %v", questId)
return
}
if quest.State != constant.QUEST_STATE_TYPE_ACCEPT {
logger.Error("invalid quest state, questId: %v, state: %v", questId, quest.State)
return
}
questDataConfig := gdconf.GetQuestDataById(int32(questId))
if questDataConfig == nil {
logger.Error("get quest data config is nil, questId: %v", questId)
return
}
quest.State = constant.QUEST_STATE_TYPE_EXEC
quest.StartTime = uint32(time.Now().Unix())
quest.FinishProgressList = make([]uint32, len(questDataConfig.FinishCondList))
}
// DeleteQuest 删除一个任务
func (q *DbQuest) DeleteQuest(questId uint32) {
_, exist := q.QuestMap[questId]
if !exist {
logger.Error("quest is not exist, questId: %v", questId)
return
}
delete(q.QuestMap, questId)
}
// AddQuestProgress 添加一个任务的进度
func (q *DbQuest) AddQuestProgress(questId uint32, index int, progress uint32) {
quest, exist := q.QuestMap[questId]
if !exist {
logger.Error("get quest is nil, questId: %v", questId)
return
}
if quest.State != constant.QUEST_STATE_TYPE_EXEC {
logger.Error("invalid quest state, questId: %v, state: %v", questId, quest.State)
return
}
questDataConfig := gdconf.GetQuestDataById(int32(questId))
if questDataConfig == nil {
logger.Error("get quest data config is nil, questId: %v", questId)
return
}
if index >= len(quest.FinishProgressList) || index >= len(questDataConfig.FinishCondList) {
logger.Error("invalid quest progress index, questId: %v, index: %v", questId, index)
return
}
quest.FinishProgressList[index] += progress
if quest.FinishProgressList[index] >= uint32(questDataConfig.FinishCondList[index].Count) {
quest.State = constant.QUEST_STATE_TYPE_FINISH
}
}
// ForceFinishQuest 强制完成一个任务
func (q *DbQuest) ForceFinishQuest(questId uint32) {
questDataConfig := gdconf.GetQuestDataById(int32(questId))
if questDataConfig == nil {
logger.Error("get quest data config is nil, questId: %v", questId)
return
}
for index, finishCond := range questDataConfig.FinishCondList {
q.AddQuestProgress(questId, index, uint32(finishCond.Count))
}
}

View File

@@ -54,6 +54,7 @@ type Player struct {
MainCharAvatarId uint32 // 主角id
GCGInfo *GCGInfo // 七圣召唤信息
IsGM uint8 // 管理员权限等级
DbQuest *DbQuest // 任务
// 在线数据 请随意 记得加忽略字段的tag
LastSaveTime uint32 `bson:"-" msgpack:"-"` // 上一次保存时间
EnterSceneToken uint32 `bson:"-" msgpack:"-"` // 玩家的世界进入令牌