package player import ( "blazing/logic/service/fight/info" "blazing/logic/service/task" "blazing/modules/player/model" "github.com/pointernil/bitset32" ) // 辅助函数:获取任务奖励,封装逻辑便于复用和统一检查 // 返回nil表示无奖励 func (p *Player) getTaskGift(taskID int, ot int) *task.TaskResult { // 防御性检查:taskID非法时直接返回nil if taskID <= 0 { return nil } return task.GetTaskInfo(taskID, ot) } // SptCompletedTask 完成任务(单分支) // 优化点:仅当奖励存在时,才完成任务并发放奖励 func (p *Player) SptCompletedTask(taskID int, ot int) { if !p.IsLogin { return } // 1. 检查任务当前状态:未接受才处理 if p.Info.GetTask(taskID) == model.Completed { return } // 2. 核心逻辑:先检查奖励是否存在,无奖励则直接返回(不完成任务) gift := p.getTaskGift(taskID, ot) if gift == nil { return } // 3. 奖励存在时,才标记任务完成 + 发放奖励 p.Info.SetTask(taskID, model.Completed) p.bossgive(taskID, ot) } // TawerCompletedTask 完成塔类任务(多分支) // 优化点:1. 默认分支仅奖励存在时才完成主任务 2. 指定分支仅奖励存在时才标记完成并发奖 func (p *Player) TawerCompletedTask(taskID int, ot int) { if !p.IsLogin { return } // 处理默认分支(ot=-1):仅奖励存在时才完成主任务 if p.Info.GetTask(taskID) != model.Completed { defaultGift := p.getTaskGift(taskID, -1) if defaultGift != nil { // 奖励存在才标记主任务完成 p.Info.SetTask(taskID, model.Completed) p.bossgive(taskID, -1) } } // 处理指定分支(ot):仅奖励存在时才标记分支完成并发奖 p.Service.Task.Exec(uint32(taskID), func(te *model.Task) bool { // 核心检查:指定分支的奖励是否存在 branchGift := p.getTaskGift(taskID, ot) if branchGift == nil { return false } // 初始化分支数据 if te.Data == nil { te.Data = []uint32{} } r := bitset32.From(te.Data) // 分支未完成时,标记完成并发放奖励 if !r.Test(uint(ot)) { r.Set(uint(ot)) p.bossgive(taskID, ot) te.Data = r.Bytes() return true } return false }) } // bossgive 发放任务奖励(逻辑保持不变,仅补充注释) func (p *Player) bossgive(taskID int, ot int) { gift := p.getTaskGift(taskID, ot) if gift == nil { return } res := &info.S2C_GET_BOSS_MONSTER{ BonusID: uint32(taskID), } // 发放宠物奖励 if gift.Pet != nil { p.Service.Pet.PetAdd(gift.Pet) res.PetID = gift.Pet.ID res.CaptureTm = gift.Pet.CatchTime } // 发放道具奖励(仅成功添加的道具才返回给前端) for _, item := range gift.ItemList { if success := p.ItemAdd(item.ItemId, item.ItemCnt); success { res.ItemList = append(res.ItemList, item) } } // 发放称号奖励 if gift.Title != 0 { p.GiveTitle(gift.Title) } // 发送奖励通知给前端 p.SendPackCmd(8004, res) }