feat(pet): 添加宠物收集功能和称号系统

- 实现了宠物收集任务状态查询功能
- 新增Collect方法处理宠物收集逻辑,包括类型验证和ID合法性检查
- 创建validTypeIDMap映射表统一管理合法的类型ID集合
- 重构任务状态判断逻辑,基于model.Completion状态进行判断

refactor(map): 统一玩家信息结构体

- 将OutInfo重命名为SimpleInfo并添加Title字段
- 更新EnterMap方法的返回类型为SimpleInfo
- 修改space包中的UserInfo映射类型为SimpleInfo

feat(task): 集成称号奖励到任务系统

- 在PlayerInfo结构体中添加Title字段
- 扩展TaskConfig模型支持称号奖励配置
- 更新用户信息服务处理用户名大小写转换

refactor(space): 优化空间服务数据结构

- 更新GetInfo方法返回SimpleInfo切片
- 调整UserInfo CsMap泛型类型参数
- 修改ListMapPlayerOutboundInfo中Player数组类型

style(login): 规范化用户名输入处理

- 登录时将用户名转换为小写进行比较
- 使用strings.EqualFold进行大小
This commit is contained in:
昔念
2026-01-17 00:47:41 +08:00
parent b6754df9a0
commit 08ebf849eb
17 changed files with 168 additions and 61 deletions

View File

@@ -15,7 +15,7 @@ import (
"github.com/jinzhu/copier"
)
func (h Controller) EnterMap(data *space.InInfo, c *player.Player) (result *info.OutInfo, err errorcode.ErrorCode) { //这个时候player应该是空的
func (h Controller) EnterMap(data *space.InInfo, c *player.Player) (result *info.SimpleInfo, err errorcode.ErrorCode) { //这个时候player应该是空的
c.Info.MapID = data.MapId //登录地图
c.GetSpace().User.Store(c.Info.UserID, c) //添加玩家

View File

@@ -0,0 +1,27 @@
package controller
import (
"blazing/common/socket/errorcode"
"blazing/logic/service/pet"
"blazing/logic/service/player"
)
// GetPetBargeList 精灵图鉴
func (h Controller) GetPetBargeList(data *pet.PetBargeListInboundInfo, player *player.Player) (result *pet.PetBargeListOutboundInfo, err errorcode.ErrorCode) {
ret := &pet.PetBargeListOutboundInfo{
PetBargeList: make([]pet.PetBargeListInfo, 0),
}
r := player.Service.Barge.Get(data.StartPetId, data.EndPetId)
for _, v := range r {
ret.PetBargeList = append(ret.PetBargeList, pet.PetBargeListInfo{
PetId: v.PetId,
EnCntCnt: 1,
IsCatched: v.CatchedCount,
IsKilled: v.KilledCount,
})
}
return ret, 0
}

View File

@@ -4,19 +4,58 @@ import (
"blazing/common/socket/errorcode"
"blazing/logic/service/pet"
"blazing/logic/service/player"
"blazing/modules/blazing/model"
"github.com/samber/lo"
)
func (h Controller) IsCollect(
data *pet.C2S_IS_COLLECT, c *player.Player) (result *pet.S2C_IS_COLLECT, err errorcode.ErrorCode) { //这个时候player应该是空的
result = &pet.S2C_IS_COLLECT{
ID: data.Type,
IsCom: 0,
ID: data.Type,
}
// r := c.Service.Barge.Get()
// for _, v := range r {
// }
res := c.Info.GetTask(1335 + int(data.Type)) //第一期
if res == model.Completed {
result.IsCom = 1
}
return result, 0
}
// 定义 Type 与合法 ID 集合的映射表,集中管理所有规则
var validTypeIDMap = map[int][]uint32{
1: {1, 4, 7}, // Type1合法ID为1、4、7
2: {71}, // Type2合法ID为71
3: {275}, // Type3合法ID为275
4: {669}, // Type4合法ID为669你之前提到的是670确认是否笔误
301: {1, 4, 7}, //精灵王计划
}
func (h Controller) Collect(
data *pet.C2S_PET_COLLECT, c *player.Player) (result *pet.S2C_PET_COLLECT, err errorcode.ErrorCode) { //这个时候player应该是空的
result = &pet.S2C_PET_COLLECT{ID: data.ID}
res := c.Info.GetTask(1335 + int(data.Type)) //第一期
if res != model.Unaccepted {
return nil, errorcode.ErrorCode(errorcode.ErrorCodes.ErrSystemError)
}
validIDs, ok := validTypeIDMap[int(data.Type)]
if !ok {
// Type不在映射表中返回系统错误
return nil, errorcode.ErrorCode(errorcode.ErrorCodes.ErrSystemError)
}
// 2. 判断ID是否在合法集合中
if !lo.Contains(validIDs, data.ID) {
return nil, errorcode.ErrorCode(errorcode.ErrorCodes.ErrSystemError)
}
c.Info.SetTask(1335+int(data.Type), model.Completed)
r := model.GenPetInfo(int(data.ID), -1, -1, 0, 1, nil)
c.Service.Pet.PetAdd(r)
result.CatchTime = r.CatchTime
return result, 0

View File

@@ -0,0 +1,17 @@
package controller
import (
"blazing/common/socket/errorcode"
"blazing/logic/service/pet"
"blazing/logic/service/player"
)
// Exelist 对应C#的List<Exeing 实现获取精灵训练数据
func (h Controller) PetExt(
data *pet.C2S_NONO_EXE_LIST, player *player.Player) (result *pet.S2C_NONO_EXE_LIST, err errorcode.ErrorCode) { //这个时候player应该是空的
result = &pet.S2C_NONO_EXE_LIST{}
return
}

View File

@@ -222,23 +222,3 @@ func (h Controller) SetPetExp(data *pet.PetSetExpInboundInfo, player *player.Pla
Exp: player.Info.ExpPool,
}, errorcode.ErrorCodes.ErrSystemError
}
// GetPetBargeList 精灵图鉴
func (h Controller) GetPetBargeList(data *pet.PetBargeListInboundInfo, player *player.Player) (result *pet.PetBargeListOutboundInfo, err errorcode.ErrorCode) {
ret := &pet.PetBargeListOutboundInfo{
PetBargeList: make([]pet.PetBargeListInfo, 0),
}
r := player.Service.Barge.Get(data.StartPetId, data.EndPetId)
for _, v := range r {
ret.PetBargeList = append(ret.PetBargeList, pet.PetBargeListInfo{
PetId: v.PetId,
EnCntCnt: 1,
IsCatched: v.CatchedCount,
IsKilled: v.KilledCount,
})
}
return ret, 0
}