feat(game): 实现扭蛋系统批量物品添加功能并优化地图逻辑

- 新增ItemAddBatch方法用于批量添加物品,支持普通道具和特殊道具的分别处理
- 优化扭蛋游戏玩法中的物品添加逻辑,使用新的批量接口提升性能
- 在扭蛋机器人命令中实现完整的物品检查和批量添加流程

refactor(map): 重构地图控制器代码结构并添加注释

- 为EnterMap、LeaveMap、GetMapPlayerList等方法添加中文注释
- 统一地图相关的命名规范,如enter map替换进入地图
- 调整地图玩家列表中BOSS广播命令ID,2021和2022进行对调

refactor(boss): 重构定时BOSS代码并优化注释

- 将原有的中文注释改为英文注释,统一代码风格
- 简化TimeBossRule结构体定义和相关配置
- 优化定时任务注册逻辑,去除冗余的注释和变量

refactor(space): 清理地图空间服务代码注释

- 移除多余的中文注释和说明文字
- 统一代码格式,移除不必要的空行和注释
- 保持原有的天气系统和地图刷怪逻辑不变

fix(role): 修复系统角色权限查询逻辑

- 修改BaseSysRoleService中的查询条件,正确处理管理员权限
- 使用Extend方法替代Where进行复杂的权限判断逻辑
- 确保超级管理员可以访问所有角色,其他用户受限于权限范围

refactor(dict): 添加字典服务批量查询方法

- 新增GetMaxMap方法用于批量获取物品最大持有上限
- 优化数据库查询,减少多次单个查询的开销
- 支持一次请求多个物品的最大数量限制

fix(player): 修复玩家信息保存异常处理

- 将panic方式改为错误日志记录,避免程序崩溃
- 优化Save方法的重试逻辑,统一错误处理方式
- 在本地文件回退时记录详细错误信息

feat(robot): 扩展扭蛋机器人功能

- 添加用户验证和角色创建检查
- 实现批量扭蛋的完整逻辑,支持1-10次抽取
- 集成物品数量检查和批量添加功能
```
This commit is contained in:
昔念
2026-04-02 02:33:05 +08:00
parent 5995f0670c
commit 3a13bcc99c
7 changed files with 103 additions and 43 deletions

View File

@@ -20,16 +20,54 @@ func buildPetShortInfo(info model.PetInfo) pet.PetShortInfo {
}
}
func buildPetListOutboundInfo(petList []model.Pet) *pet.GetPetListOutboundInfo {
func buildPetListOutboundInfo(petList []model.PetInfo) *pet.GetPetListOutboundInfo {
result := &pet.GetPetListOutboundInfo{
ShortInfoList: make([]pet.PetShortInfo, len(petList)),
}
for i := range petList {
result.ShortInfoList[i] = buildPetShortInfo(petList[i].Data)
result.ShortInfoList[i] = buildPetShortInfo(petList[i])
}
return result
}
func removePetByCatchTime(petList []model.PetInfo, catchTime uint32) []model.PetInfo {
for i := range petList {
if petList[i].CatchTime == catchTime {
return append(petList[:i], petList[i+1:]...)
}
}
return petList
}
func syncBackupPetList(player *player.Player) {
if len(player.Info.BackupPetList) > 0 {
return
}
storagePets := player.Service.Pet.PetInfo(1)
if len(storagePets) == 0 {
player.Info.BackupPetList = make([]model.PetInfo, 0)
return
}
player.Info.BackupPetList = make([]model.PetInfo, len(storagePets))
for i := range storagePets {
player.Info.BackupPetList[i] = storagePets[i].Data
}
}
func buildUserBagPetInfo(player *player.Player) *pet.GetUserBagPetInfoOutboundInfo {
syncBackupPetList(player)
result := &pet.GetUserBagPetInfoOutboundInfo{
PetList: make([]model.PetInfo, len(player.Info.PetList)),
BackupPetList: make([]model.PetInfo, len(player.Info.BackupPetList)),
}
copy(result.PetList, player.Info.PetList)
copy(result.BackupPetList, player.Info.BackupPetList)
return result
}
func buildPetShowOutboundInfo(userID, flag uint32, info *model.PetInfo) *pet.PetShowOutboundInfo {
return &pet.PetShowOutboundInfo{
UserID: userID,
@@ -49,26 +87,30 @@ func buildPetShowOutboundInfo(userID, flag uint32, info *model.PetInfo) *pet.Pet
// 返回: 精灵信息和错误码
func (h Controller) GetPetInfo(
data *pet.InInfo,
player *player.Player) (result *pet.OutInfo,
player *player.Player) (result *model.PetInfo,
err errorcode.ErrorCode) {
_, petInfo, found := player.FindPet(data.CatchTime)
if found {
result = &pet.OutInfo{
PetInfo: *petInfo,
}
result = petInfo
return result, 0
}
ret := player.Service.Pet.PetInfoOneByCatchTime(data.CatchTime)
if ret == nil {
return nil, errorcode.ErrorCodes.ErrPokemonNotExists
}
result = &pet.OutInfo{
PetInfo: ret.Data,
}
result = &ret.Data
return result, 0
}
// GetUserBagPetInfo 获取主背包和并列备用精灵列表
func (h Controller) GetUserBagPetInfo(
data *pet.GetUserBagPetInfoInboundEmpty,
player *player.Player) (result *pet.GetUserBagPetInfoOutboundInfo,
err errorcode.ErrorCode) {
return buildUserBagPetInfo(player), 0
}
// GetPetList 获取仓库列表
// data: 空输入结构
// player: 当前玩家对象
@@ -77,7 +119,7 @@ func (h Controller) GetPetList(
data *pet.GetPetListInboundEmpty,
player *player.Player) (result *pet.GetPetListOutboundInfo,
err errorcode.ErrorCode) {
return buildPetListOutboundInfo(player.Service.Pet.PetInfo(0)), 0
return buildPetListOutboundInfo(player.Info.PetList), 0
}
// GetPetReleaseList 获取放生列表
@@ -88,7 +130,8 @@ func (h Controller) GetPetReleaseList(
data *pet.GetPetListFreeInboundEmpty,
player *player.Player) (result *pet.GetPetListOutboundInfo,
err errorcode.ErrorCode) {
return buildPetListOutboundInfo(player.Service.Pet.PetInfo(1)), 0
syncBackupPetList(player)
return buildPetListOutboundInfo(player.Info.BackupPetList), 0
}
// PetReleaseToWarehouse 将精灵从仓库包中放生
@@ -156,6 +199,8 @@ func (h Controller) TogglePetBagWarehouse(
return result, errorcode.ErrorCodes.ErrSystemError
}
player.Info.BackupPetList = removePetByCatchTime(player.Info.BackupPetList, data.CatchTime)
player.Info.BackupPetList = append(player.Info.BackupPetList, *pet)
player.Info.PetList = append(player.Info.PetList[:index], player.Info.PetList[index+1:]...)
}
@@ -172,7 +217,10 @@ func (h Controller) TogglePetBagWarehouse(
return result, errorcode.ErrorCodes.ErrPokemonNotExists
}
player.Info.PetList = append(player.Info.PetList, r.Data)
player.Info.BackupPetList = removePetByCatchTime(player.Info.BackupPetList, data.CatchTime)
result.PetInfo = r.Data
} else {
player.Info.BackupPetList = removePetByCatchTime(player.Info.BackupPetList, data.CatchTime)
}
}

View File

@@ -0,0 +1,17 @@
package pet
import (
"blazing/logic/service/common"
"blazing/modules/player/model"
)
type GetUserBagPetInfoInboundEmpty struct {
Head common.TomeeHeader `cmd:"4483" struc:"skip"`
}
type GetUserBagPetInfoOutboundInfo struct {
PetListLen uint32 `struc:"int32,sizeof=PetList"`
PetList []model.PetInfo
BackupPetListLen uint32 `struc:"int32,sizeof=BackupPetList"`
BackupPetList []model.PetInfo
}

View File

@@ -12,10 +12,6 @@ type InInfo struct {
CatchTime uint32
}
type OutInfo struct {
model.PetInfo
}
// PetReleaseOutboundInfo 宠物释放出站消息
type PetReleaseOutboundInfo struct {
HomeEnergy uint32 `json:"home_energy" fieldDescription:"暂定0" autoCodec:"true" uint:"true"`