Files
bl/logic/controller/task.go
昔念 42bb66f677 ```
feat(socket): 调整踢人逻辑以支持错误返回

将 KickPlayer 方法的返回值从 void 改为 error,
并在 KickPerson 中正确处理该错误返回。

fix(controller): 登录时增加延迟以确保踢人操作完成

在登录流程中添加 3 秒延迟,避免用户尚未被踢出就重新上线的问题。

feat(task): 完善任务缓冲获取逻辑

初始化 GetTaskBufOutboundInfo 时直接赋值 TaskId,
并移除后续重复赋值操作,提升代码可读性。

refactor(player): 优化玩家踢出方法结构

清理
2025-10-16 12:16:03 +08:00

578 lines
18 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 controller
import (
"blazing/common/socket/errorcode"
"blazing/logic/service/player"
"blazing/logic/service/task"
"blazing/modules/blazing/model"
)
/**
* 接受任务
*/
func (h Controller) AcceptTask(data *task.AcceptTaskInboundInfo, c *player.Player) (result *task.AcceptTaskOutboundInfo, err errorcode.ErrorCode) {
//isdaliy := false
// if data.Head.CMD != 2201 { //判断是每日任务
// //isdaliy = true
// }
if c.Info.TaskList[data.TaskId-1] == 0 {
c.Info.TaskList[data.TaskId-1] = 1
}
result = &task.AcceptTaskOutboundInfo{}
result.TaskId = data.TaskId
return result, 0
}
/**
* 更新任务步骤
*/
func (h Controller) AddTaskBuf(data *task.AddTaskBufInboundInfo, c *player.Player) (result *task.AddTaskBufOutboundInfo, err errorcode.ErrorCode) {
// isdaliy := false
// if data.Head.CMD != 2204 { //判断是每日任务
// isdaliy = true
// }
result = &task.AddTaskBufOutboundInfo{}
c.Service.Task(data.TaskId, func(te *model.TaskEX) bool {
te.Data = data.TaskList
return true
})
return &task.AddTaskBufOutboundInfo{}, 0
}
/**
* 完成任务
*/
func (h Controller) Complete_Task(data *task.CompleteTaskInboundInfo, c *player.Player) (result *task.CompleteTaskOutboundInfo, err errorcode.ErrorCode) {
if c.Info.TaskList[data.TaskId-1] != 1 { //如果任务没有接受或者已经完成Complete_Task
return result, 0
}
c.Info.TaskList[data.TaskId-1] = 3
result = &task.CompleteTaskOutboundInfo{}
result.ItemList = make([]task.ItemInfo, 0)
result.TaskId = data.TaskId
// 根据任务ID和选择分支OutState处理奖励
switch data.TaskId {
// 新手任务1
case 85:
// out_id=1默认分支的奖励物品
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 100027, ItemCount: 1}, // 新手帽默认数量1
task.ItemInfo{ItemId: 100028, ItemCount: 1}, // 新手腰带
task.ItemInfo{ItemId: 500001, ItemCount: 1}, // 精灵仓库
task.ItemInfo{ItemId: 500502, ItemCount: 1}, // 精灵恢复仓
task.ItemInfo{ItemId: 500503, ItemCount: 1}, // 分子转化仪
)
// 新手任务2选择不同精灵
case 86:
var petType int
// 根据out_iddata.OutState选择宠物类型
switch data.OutState {
case 1:
petType = 1 // 布布种子
case 2:
petType = 7 // 小火猴
case 3:
petType = 4 // 伊优
default:
// 默认给布布种子(或日志告警)
petType = 1
// log.Printf("任务86未知分支out_id=%d默认奖励布布种子", data.OutState)
}
// 生成宠物pet_dv=31锁个体
r := c.GenPetInfo(petType, 31, -1, 0, 0, 5)
result.CaptureTime = r.CatchTime
result.PetTypeId = r.ID
c.Service.PetAdd(*r)
// 新手任务3
case 87:
// out_id=1的奖励物品
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 300001, ItemCount: 5}, // 普通胶囊x5
task.ItemInfo{ItemId: 300011, ItemCount: 3}, // 初级体力药剂x3
)
// 新手任务4
case 88:
// out_id=1的奖励物品
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 1, ItemCount: 50000}, // 赛尔豆x50000
task.ItemInfo{ItemId: 3, ItemCount: 50000}, // 累积经验x50000
task.ItemInfo{ItemId: 5, ItemCount: 20}, // 金豆x20
task.ItemInfo{ItemId: 300650, ItemCount: 3}, // 全能学习力遗忘器x3
task.ItemInfo{ItemId: 300651, ItemCount: 6}, // 全能学习力注入器x6
)
// 克洛斯星的皮皮
case 90:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 1, ItemCount: 1000}, // 赛尔豆x1000
task.ItemInfo{ItemId: 3, ItemCount: 1000}, // 经验x1000
)
// 西塔的珍贵回忆
case 8:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 500510, ItemCount: 1}, // 记忆晶体x1
)
// 进入神秘通道
case 9:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 100059, ItemCount: 1}, // 电能锯子x1
)
// 神秘通道拼图(无奖励物品)
case 10:
// 无物品奖励,无需处理
// 精灵广场拿石头(无奖励物品)
case 12:
// 无物品奖励,无需处理
// 先锋队招募
case 19:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 3, ItemCount: 3000}, // 积累经验x3000
)
// 新船员的考验
case 25:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 400501, ItemCount: 10}, // 神奇扭蛋牌x10
)
// 遗迹中的精灵信号(奖励奇塔)
case 28:
// out_id=1宠物类型102奇塔
r := c.GenPetInfo(102, 31, -1, 0, 0, 5) // pet_dv默认-1随机个体
result.CaptureTime = r.CatchTime
result.PetTypeId = r.ID
c.Service.PetAdd(*r)
// 帕诺星系星球测绘
case 37:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 1, ItemCount: 3000}, // 赛尔豆x3000
task.ItemInfo{ItemId: 700452, ItemCount: 1}, // 中型智慧芯片x1
task.ItemInfo{ItemId: 100178, ItemCount: 1}, // 勘察头盔x1
task.ItemInfo{ItemId: 100179, ItemCount: 1}, // 勘察护腕x1
task.ItemInfo{ItemId: 100180, ItemCount: 1}, // 勘察腰带x1
task.ItemInfo{ItemId: 100181, ItemCount: 1}, // 勘察军靴x1
)
// 时空之门(奖励迪卢卡)
case 40:
// out_id=1宠物类型139迪卢卡
r := c.GenPetInfo(139, 31, -1, 0, 0, 5)
result.CaptureTime = r.CatchTime
result.PetTypeId = r.ID
c.Service.PetAdd(*r)
// 突围磁风暴
case 47:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 3, ItemCount: 5000}, // 累积经验x5000
task.ItemInfo{ItemId: 1, ItemCount: 5000}, // 赛尔豆x5000
task.ItemInfo{ItemId: 500585, ItemCount: 1}, // 磁力光束枪台x1
)
// 神秘失踪的爱丽丝
case 48:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 3, ItemCount: 3000}, // 累积经验x3000
task.ItemInfo{ItemId: 1, ItemCount: 2000}, // 赛尔豆x2000
task.ItemInfo{ItemId: 700452, ItemCount: 2}, // 中型智慧芯片x2
)
// 密林中的托尼(奖励托尼+物品)
case 49:
// 1. 奖励宠物托尼类型158
r := c.GenPetInfo(158, 31, -1, 0, 0, 5)
result.CaptureTime = r.CatchTime
result.PetTypeId = r.ID
c.Service.PetAdd(*r)
// 2. 奖励物品
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 700452, ItemCount: 2}, // 中型智慧芯片x2
)
// 谁偷走了雪球能源?
case 52:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 3, ItemCount: 3000}, // 累积经验x3000
task.ItemInfo{ItemId: 400021, ItemCount: 10}, // 雪球能源x10
task.ItemInfo{ItemId: 100254, ItemCount: 1}, // 斯诺纪念x1
)
// 米鲁族的两个小不点
case 54:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 3, ItemCount: 5000}, // 累积经验x5000
task.ItemInfo{ItemId: 400021, ItemCount: 10}, // 雪球能源x10
)
// 米鲁族食王选拔赛
case 57:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 3, ItemCount: 3000}, // 累积经验x3000
task.ItemInfo{ItemId: 1, ItemCount: 3000}, // 赛尔豆x3000
)
// 斯诺岩洞的不解之谜
case 58:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 3, ItemCount: 3000}, // 累积经验x3000
task.ItemInfo{ItemId: 1, ItemCount: 3000}, // 赛尔豆x3000
task.ItemInfo{ItemId: 400021, ItemCount: 10}, // 雪球能源x10
)
// 新型试作机SR-01同步调试
case 63:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 3, ItemCount: 3000}, // 累积经验x3000
task.ItemInfo{ItemId: 1, ItemCount: 3000}, // 赛尔豆x3000
)
// 铸造斯诺冰冠
case 64:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 3, ItemCount: 3000}, // 累积经验x3000
task.ItemInfo{ItemId: 1, ItemCount: 3000}, // 赛尔豆x3000
task.ItemInfo{ItemId: 400021, ItemCount: 10}, // 雪球能源x10
)
// 露希欧星勘察
case 65:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 3, ItemCount: 3000}, // 累积经验x3000
task.ItemInfo{ItemId: 1, ItemCount: 3000}, // 赛尔豆x3000
)
// 合金强化试验
case 66:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 3, ItemCount: 3000}, // 累积经验x3000
task.ItemInfo{ItemId: 1, ItemCount: 3000}, // 赛尔豆x3000
)
// 资料室的神秘事件
case 68:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 3, ItemCount: 3000}, // 累积经验x3000
task.ItemInfo{ItemId: 1, ItemCount: 3000}, // 赛尔豆x3000
)
// 宇宙遭遇站
case 69:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 3, ItemCount: 3000}, // 累积经验x3000
task.ItemInfo{ItemId: 1, ItemCount: 3000}, // 赛尔豆x3000
)
// 船体紧急修复
case 70:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 3, ItemCount: 3000}, // 累积经验x3000
task.ItemInfo{ItemId: 1, ItemCount: 3000}, // 赛尔豆x3000
)
// 赛尔号大整修奖励TOE+物品)
case 71:
// 1. 奖励宠物TOE类型213
r := c.GenPetInfo(213, 31, -1, 0, 0, 5)
result.CaptureTime = r.CatchTime
result.PetTypeId = r.ID
c.Service.PetAdd(*r)
// 2. 奖励物品
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 3, ItemCount: 1000}, // 累积经验x1000
task.ItemInfo{ItemId: 1, ItemCount: 1000}, // 赛尔豆x1000
)
// 船长搜救任务
case 72:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 3, ItemCount: 2000}, // 累积经验x2000
task.ItemInfo{ItemId: 1, ItemCount: 1000}, // 赛尔豆x1000
)
// 秘制改良机SR-02
case 73:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 100303, ItemCount: 1}, // SR-02铠甲x1
task.ItemInfo{ItemId: 400055, ItemCount: 30}, // 变形能量块x30
task.ItemInfo{ItemId: 3, ItemCount: 3000}, // 累积经验x3000
)
// 露希欧星历险
case 74:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 3, ItemCount: 3000}, // 积累经验x3000
)
// 哈莫的童年片段一
case 75:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 3, ItemCount: 3000}, // 累积经验x3000
task.ItemInfo{ItemId: 100324, ItemCount: 1}, // 龙之纪念x1
)
// 寻找哈莫雷特的族人
case 79:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 3, ItemCount: 3000}, // 累积经验x3000
task.ItemInfo{ItemId: 1, ItemCount: 2000}, // 赛尔豆x2000
)
// 重铸贾斯丁站长
case 80:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 3, ItemCount: 2000}, // 累积经验x2000
task.ItemInfo{ItemId: 1, ItemCount: 3000}, // 赛尔豆x3000
)
// 守候宿命的追随者
case 81:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 3, ItemCount: 1000}, // 累积经验x1000
task.ItemInfo{ItemId: 1, ItemCount: 1000}, // 赛尔豆x1000
)
// 光暗之迷
case 83:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 3, ItemCount: 1000}, // 累积经验x1000
task.ItemInfo{ItemId: 1, ItemCount: 1000}, // 赛尔豆x1000
)
// 星球改造计划
case 84:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 3, ItemCount: 2000}, // 累积经验x2000
task.ItemInfo{ItemId: 1, ItemCount: 2000}, // 赛尔豆x2000
)
// 试炼之塔的磨练
case 89:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 3, ItemCount: 500}, // 累积经验x500
task.ItemInfo{ItemId: 1, ItemCount: 1000}, // 赛尔豆x1000
)
// 月光下的约定
case 91:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 3, ItemCount: 2000}, // 累积经验x2000
task.ItemInfo{ItemId: 1, ItemCount: 2000}, // 赛尔豆x2000
task.ItemInfo{ItemId: 400124, ItemCount: 1}, // 艾贝多芬的精元x1
)
// 站长归来(奖励尼布+物品)
case 92:
// 1. 奖励宠物尼布类型95
r := c.GenPetInfo(95, 31, -1, 0, 0, 5)
result.CaptureTime = r.CatchTime
result.PetTypeId = r.ID
c.Service.PetAdd(*r)
// 2. 奖励物品
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 3, ItemCount: 2000}, // 累积经验x2000
task.ItemInfo{ItemId: 1, ItemCount: 2000}, // 赛尔豆x2000
)
// 云霄星的新来客
case 93:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 3, ItemCount: 1000}, // 累积经验x1000
task.ItemInfo{ItemId: 1, ItemCount: 500}, // 赛尔豆x500
)
// 初识星球能源
case 94:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 3, ItemCount: 500}, // 累积经验x500
task.ItemInfo{ItemId: 1, ItemCount: 1000}, // 赛尔豆x1000
)
// 宇宙中的黑色旋涡(两个奖励分支)
case 95:
switch data.OutState {
case 1: // 分支1刺蜂套装
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 3, ItemCount: 4000}, // 累积经验x4000
task.ItemInfo{ItemId: 1, ItemCount: 2000}, // 赛尔豆x2000
task.ItemInfo{ItemId: 100346, ItemCount: 1}, // 刺蜂重盔x1
task.ItemInfo{ItemId: 100347, ItemCount: 1}, // 刺蜂护肩x1
task.ItemInfo{ItemId: 100348, ItemCount: 1}, // 刺蜂腰带x1
task.ItemInfo{ItemId: 100349, ItemCount: 1}, // 刺蜂滚轮x1
)
case 2: // 分支2锡蝶套装
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 3, ItemCount: 4000}, // 累积经验x4000
task.ItemInfo{ItemId: 1, ItemCount: 2000}, // 赛尔豆x2000
task.ItemInfo{ItemId: 100350, ItemCount: 1}, // 锡蝶重盔x1
task.ItemInfo{ItemId: 100351, ItemCount: 1}, // 锡蝶护肩x1
task.ItemInfo{ItemId: 100352, ItemCount: 1}, // 锡蝶腰带x1
task.ItemInfo{ItemId: 100353, ItemCount: 1}, // 锡蝶滚轮x1
)
default:
// 默认给分支1奖励
// log.Printf("任务95未知分支out_id=%d默认奖励刺蜂套装", data.OutState)
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 3, ItemCount: 4000},
task.ItemInfo{ItemId: 1, ItemCount: 2000},
task.ItemInfo{ItemId: 100346, ItemCount: 1},
task.ItemInfo{ItemId: 100347, ItemCount: 1},
task.ItemInfo{ItemId: 100348, ItemCount: 1},
task.ItemInfo{ItemId: 100349, ItemCount: 1},
)
}
// 旅途中的伙伴
case 96:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 3, ItemCount: 500}, // 累积经验x500
task.ItemInfo{ItemId: 1, ItemCount: 1000}, // 赛尔豆x1000
)
// 我是音乐小麦霸
case 97:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 3, ItemCount: 1000}, // 累积经验x1000
task.ItemInfo{ItemId: 1, ItemCount: 1000}, // 赛尔豆x1000
)
// 尼布守卫战
case 98:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 3, ItemCount: 2000}, // 累积经验x2000
task.ItemInfo{ItemId: 1, ItemCount: 1000}, // 赛尔豆x1000
)
// 寻找迷失的心(奖励史空+物品)
case 133:
// 1. 奖励宠物史空类型381
r := c.GenPetInfo(381, 31, -1, 0, 0, 5)
result.CaptureTime = r.CatchTime
result.PetTypeId = r.ID
c.Service.PetAdd(*r)
// 2. 奖励物品
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 3, ItemCount: 2000}, // 累积经验x2000
task.ItemInfo{ItemId: 1, ItemCount: 2000}, // 赛尔豆x2000
)
// 教官考核
case 201:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 100062, ItemCount: 1}, // 教官指挥棒x1
)
// 领取谱尼真身(需校验物品,奖励谱尼精元)
case 300:
// 注意此处省略“check节点”的物品校验逻辑需先检查玩家背包是否有7个裂片
// 实际业务中需先校验,通过后再发奖励
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 400150, ItemCount: 1}, // 谱尼的精元x1
)
// 每日任务之毛毛
case 401:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 3, ItemCount: 20000}, // 积累经验x2000
)
// 每日任务之小火猴
case 402:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 3, ItemCount: 20000}, // 积累经验x20000
)
// 每日任务之布布种子
case 403:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 3, ItemCount: 20000}, // 积累经验x20000
)
// 每日任务之依优
case 404:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 3, ItemCount: 20000}, // 积累经验x20000
)
// 每日任务之比比鼠
case 405:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 3, ItemCount: 20000}, // 积累经验x2000
)
// 每日任务之幽浮
case 406:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 3, ItemCount: 20000}, // 积累经验x2000
)
// 每日任务之利牙鱼
case 407:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 3, ItemCount: 20000}, // 积累经验x2000
)
// 每日任务之谱尼扭蛋牌
case 462:
result.ItemList = append(result.ItemList,
task.ItemInfo{ItemId: 400501, ItemCount: 5}, // 神奇扭蛋牌x5
)
default:
// 未定义的任务ID可添加日志
// log.Printf("未处理的任务ID: %d", data.TaskId)
}
var ttt []model.SingleItemInfo
for _, v := range result.ItemList {
ttt = append(ttt, model.SingleItemInfo{ItemId: v.ItemId, ItemCnt: v.ItemCount})
}
c.ItemAdd(ttt)
return result, 0
}
/**
* 获取任务状态
*/
func (h Controller) Get_Task_Buf(data *task.GetTaskBufInboundInfo, c *player.Player) (result *task.GetTaskBufOutboundInfo, err errorcode.ErrorCode) {
result = &task.GetTaskBufOutboundInfo{
TaskId: data.TaskId,
}
c.Service.Task(data.TaskId, func(te *model.TaskEX) bool {
result.TaskList = te.Data
return false
})
return result, 0
}
/**
* 删除任务
*/
func (h Controller) Delete_Task(data *task.DeleteTaskInboundInfo, c *player.Player) (result *task.DeleteTaskOutboundInfo, err errorcode.ErrorCode) {
// if data.Head.CMD == 2205 { //判断不是每日任务
// } else {
// }
return &task.DeleteTaskOutboundInfo{}, 0
}