Files
bl/logic/service/player/boss.go
昔念 a29a8ddec2
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
```
feat(service): 宠物添加功能增加销售计数参数并优化价格更新逻辑

- 修改PetAdd方法签名,增加salecount参数用于追踪宠物销售次数
- 在多个控制器中统一调用PetAdd方法时传入0作为初始销售次数
- 临时禁用寒流枪活动中的宠物发放功能
- 优化UPdatePrice方法,添加错误处理和价格范围验证逻辑
- 调整宠物购买逻辑,使用免费金币系统并计算递增购买
2026-03-11 12:19:13 +08:00

117 lines
2.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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, 0)
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)
}