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