```
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:
@@ -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{
|
result := &pet.GetPetListOutboundInfo{
|
||||||
ShortInfoList: make([]pet.PetShortInfo, len(petList)),
|
ShortInfoList: make([]pet.PetShortInfo, len(petList)),
|
||||||
}
|
}
|
||||||
for i := range petList {
|
for i := range petList {
|
||||||
result.ShortInfoList[i] = buildPetShortInfo(petList[i].Data)
|
result.ShortInfoList[i] = buildPetShortInfo(petList[i])
|
||||||
}
|
}
|
||||||
return result
|
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 {
|
func buildPetShowOutboundInfo(userID, flag uint32, info *model.PetInfo) *pet.PetShowOutboundInfo {
|
||||||
return &pet.PetShowOutboundInfo{
|
return &pet.PetShowOutboundInfo{
|
||||||
UserID: userID,
|
UserID: userID,
|
||||||
@@ -49,26 +87,30 @@ func buildPetShowOutboundInfo(userID, flag uint32, info *model.PetInfo) *pet.Pet
|
|||||||
// 返回: 精灵信息和错误码
|
// 返回: 精灵信息和错误码
|
||||||
func (h Controller) GetPetInfo(
|
func (h Controller) GetPetInfo(
|
||||||
data *pet.InInfo,
|
data *pet.InInfo,
|
||||||
player *player.Player) (result *pet.OutInfo,
|
player *player.Player) (result *model.PetInfo,
|
||||||
err errorcode.ErrorCode) {
|
err errorcode.ErrorCode) {
|
||||||
_, petInfo, found := player.FindPet(data.CatchTime)
|
_, petInfo, found := player.FindPet(data.CatchTime)
|
||||||
|
|
||||||
if found {
|
if found {
|
||||||
result = &pet.OutInfo{
|
result = petInfo
|
||||||
PetInfo: *petInfo,
|
|
||||||
}
|
|
||||||
return result, 0
|
return result, 0
|
||||||
}
|
}
|
||||||
ret := player.Service.Pet.PetInfoOneByCatchTime(data.CatchTime)
|
ret := player.Service.Pet.PetInfoOneByCatchTime(data.CatchTime)
|
||||||
if ret == nil {
|
if ret == nil {
|
||||||
return nil, errorcode.ErrorCodes.ErrPokemonNotExists
|
return nil, errorcode.ErrorCodes.ErrPokemonNotExists
|
||||||
}
|
}
|
||||||
result = &pet.OutInfo{
|
result = &ret.Data
|
||||||
PetInfo: ret.Data,
|
|
||||||
}
|
|
||||||
return result, 0
|
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 获取仓库列表
|
// GetPetList 获取仓库列表
|
||||||
// data: 空输入结构
|
// data: 空输入结构
|
||||||
// player: 当前玩家对象
|
// player: 当前玩家对象
|
||||||
@@ -77,7 +119,7 @@ func (h Controller) GetPetList(
|
|||||||
data *pet.GetPetListInboundEmpty,
|
data *pet.GetPetListInboundEmpty,
|
||||||
player *player.Player) (result *pet.GetPetListOutboundInfo,
|
player *player.Player) (result *pet.GetPetListOutboundInfo,
|
||||||
err errorcode.ErrorCode) {
|
err errorcode.ErrorCode) {
|
||||||
return buildPetListOutboundInfo(player.Service.Pet.PetInfo(0)), 0
|
return buildPetListOutboundInfo(player.Info.PetList), 0
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPetReleaseList 获取放生列表
|
// GetPetReleaseList 获取放生列表
|
||||||
@@ -88,7 +130,8 @@ func (h Controller) GetPetReleaseList(
|
|||||||
data *pet.GetPetListFreeInboundEmpty,
|
data *pet.GetPetListFreeInboundEmpty,
|
||||||
player *player.Player) (result *pet.GetPetListOutboundInfo,
|
player *player.Player) (result *pet.GetPetListOutboundInfo,
|
||||||
err errorcode.ErrorCode) {
|
err errorcode.ErrorCode) {
|
||||||
return buildPetListOutboundInfo(player.Service.Pet.PetInfo(1)), 0
|
syncBackupPetList(player)
|
||||||
|
return buildPetListOutboundInfo(player.Info.BackupPetList), 0
|
||||||
}
|
}
|
||||||
|
|
||||||
// PetReleaseToWarehouse 将精灵从仓库包中放生
|
// PetReleaseToWarehouse 将精灵从仓库包中放生
|
||||||
@@ -156,6 +199,8 @@ func (h Controller) TogglePetBagWarehouse(
|
|||||||
return result, errorcode.ErrorCodes.ErrSystemError
|
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:]...)
|
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
|
return result, errorcode.ErrorCodes.ErrPokemonNotExists
|
||||||
}
|
}
|
||||||
player.Info.PetList = append(player.Info.PetList, r.Data)
|
player.Info.PetList = append(player.Info.PetList, r.Data)
|
||||||
|
player.Info.BackupPetList = removePetByCatchTime(player.Info.BackupPetList, data.CatchTime)
|
||||||
result.PetInfo = r.Data
|
result.PetInfo = r.Data
|
||||||
|
} else {
|
||||||
|
player.Info.BackupPetList = removePetByCatchTime(player.Info.BackupPetList, data.CatchTime)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
17
logic/service/pet/bag_info.go
Normal file
17
logic/service/pet/bag_info.go
Normal 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
|
||||||
|
}
|
||||||
@@ -12,10 +12,6 @@ type InInfo struct {
|
|||||||
CatchTime uint32
|
CatchTime uint32
|
||||||
}
|
}
|
||||||
|
|
||||||
type OutInfo struct {
|
|
||||||
model.PetInfo
|
|
||||||
}
|
|
||||||
|
|
||||||
// PetReleaseOutboundInfo 宠物释放出站消息
|
// PetReleaseOutboundInfo 宠物释放出站消息
|
||||||
type PetReleaseOutboundInfo struct {
|
type PetReleaseOutboundInfo struct {
|
||||||
HomeEnergy uint32 `json:"home_energy" fieldDescription:"暂定0" autoCodec:"true" uint:"true"`
|
HomeEnergy uint32 `json:"home_energy" fieldDescription:"暂定0" autoCodec:"true" uint:"true"`
|
||||||
|
|||||||
@@ -26,23 +26,12 @@ const (
|
|||||||
MapModelDirectionRightUp
|
MapModelDirectionRightUp
|
||||||
)
|
)
|
||||||
|
|
||||||
// MapModelBroadcastNode 地图模型广播节点配置
|
|
||||||
type MapModelBroadcastNode struct {
|
|
||||||
TriggerID uint32 `gorm:"comment:'触发器ID'" json:"trigger_id" description:"触发器ID"`
|
|
||||||
Pos string `gorm:"type:varchar(255);default:'';comment:'位置'" json:"pos" description:"位置"`
|
|
||||||
HP int32 `gorm:"type:int;default:0;comment:'血量'" json:"hp" description:"血量"`
|
|
||||||
Direction int32 `gorm:"type:int;default:2;comment:'BOSS方向(0-7)'" json:"direction" description:"BOSS方向"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// MapModel 地图模型配置表(NPC/宠物)
|
// MapModel 地图模型配置表(NPC/宠物)
|
||||||
type MapModel struct {
|
type MapModel struct {
|
||||||
*cool.Model // 保留通用Model(ID/创建时间/更新时间等)
|
*cool.Model // 保留通用Model(ID/创建时间/更新时间等)
|
||||||
*MapModelBroadcastNode
|
|
||||||
|
|
||||||
MapID int32 `gorm:"not null;index;comment:'所属地图ID'" json:"map_id" description:"地图ID"`
|
MapID int32 `gorm:"not null;index;comment:'所属地图ID'" json:"map_id" description:"地图ID"`
|
||||||
|
|
||||||
NodeID uint32 `gorm:"not null;default:0;comment:'节点ID'" json:"node_id" description:"节点ID"`
|
|
||||||
|
|
||||||
ModelID uint32 `gorm:"not null;default:0;comment:'模型ID(NPCID或精灵ID)'" json:"model_id" description:"模型ID"`
|
ModelID uint32 `gorm:"not null;default:0;comment:'模型ID(NPCID或精灵ID)'" json:"model_id" description:"模型ID"`
|
||||||
|
|
||||||
ModelType int32 `gorm:"type:int;default:0;comment:'模型类型(0:精灵,1:NPC)'" json:"model_type" description:"模型类型"`
|
ModelType int32 `gorm:"type:int;default:0;comment:'模型类型(0:精灵,1:NPC)'" json:"model_type" description:"模型类型"`
|
||||||
@@ -50,7 +39,9 @@ type MapModel struct {
|
|||||||
ModelName string `gorm:"type:varchar(100);default:'';comment:'模型名称'" json:"model_name" description:"模型名称"`
|
ModelName string `gorm:"type:varchar(100);default:'';comment:'模型名称'" json:"model_name" description:"模型名称"`
|
||||||
|
|
||||||
HeadTalk string `gorm:"type:varchar(255);default:'';comment:'头顶对话框内容'" json:"head_talk" description:"头顶对话框内容"`
|
HeadTalk string `gorm:"type:varchar(255);default:'';comment:'头顶对话框内容'" json:"head_talk" description:"头顶对话框内容"`
|
||||||
|
Pos string `gorm:"type:varchar(255);default:'';comment:'位置'" json:"pos" description:"位置"`
|
||||||
|
HP int32 `gorm:"type:int;default:0;comment:'血量'" json:"hp" description:"血量"`
|
||||||
|
Direction int32 `gorm:"type:int;default:2;comment:'方向(0-7)'" json:"direction" description:"BOSS方向"`
|
||||||
TriggerPlotID uint32 `gorm:"default:0;comment:'触发剧情ID(0表示无剧情)'" json:"trigger_plot_id" description:"触发剧情ID"`
|
TriggerPlotID uint32 `gorm:"default:0;comment:'触发剧情ID(0表示无剧情)'" json:"trigger_plot_id" description:"触发剧情ID"`
|
||||||
Cloths []uint32 `gorm:"type:varchar(255);default:'';comment:'服装'" json:"cloths" description:"服装"`
|
Cloths []uint32 `gorm:"type:varchar(255);default:'';comment:'服装'" json:"cloths" description:"服装"`
|
||||||
Shinyid int32 `gorm:"type:int;default:0;comment:'是否发光'" json:"shiny" description:"是否发光"`
|
Shinyid int32 `gorm:"type:int;default:0;comment:'是否发光'" json:"shiny" description:"是否发光"`
|
||||||
@@ -67,7 +58,6 @@ func (*MapModel) GroupName() string {
|
|||||||
func NewMapModel() *MapModel {
|
func NewMapModel() *MapModel {
|
||||||
return &MapModel{
|
return &MapModel{
|
||||||
Model: cool.NewModel(),
|
Model: cool.NewModel(),
|
||||||
MapModelBroadcastNode: &MapModelBroadcastNode{},
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -76,6 +76,6 @@ func (s *MapmodelService) ServiceList(ctx context.Context, req *cool.ListReq) (d
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *MapmodelService) GetDataByModelId(modelid uint32) (ret *model.MapModel) {
|
func (s *MapmodelService) GetDataByModelId(modelid uint32) (ret *model.MapModel) {
|
||||||
dbm_notenable(s.Model).Where("model_id", modelid).Scan(&ret)
|
dbm_notenable(s.Model).Where("id", modelid).Scan(&ret)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -56,6 +56,7 @@ func NewPlayerInfo() PlayerInfo {
|
|||||||
|
|
||||||
Clothes: make([]PeopleItemInfo, 0),
|
Clothes: make([]PeopleItemInfo, 0),
|
||||||
PetList: make([]PetInfo, 0),
|
PetList: make([]PetInfo, 0),
|
||||||
|
BackupPetList: make([]PetInfo, 0),
|
||||||
}
|
}
|
||||||
|
|
||||||
// 自动填充 struct tag 里的 default 值
|
// 自动填充 struct tag 里的 default 值
|
||||||
@@ -206,6 +207,7 @@ type PlayerInfo struct {
|
|||||||
TaskList [1000]byte `struc:"[1000]byte" default:"0" json:"task_list"` // 任务状态数组500字节,默认3
|
TaskList [1000]byte `struc:"[1000]byte" default:"0" json:"task_list"` // 任务状态数组500字节,默认3
|
||||||
PetListCount uint32 `struc:"sizeof=PetList" json:"pet_list_count"` // 精灵列表长度
|
PetListCount uint32 `struc:"sizeof=PetList" json:"pet_list_count"` // 精灵列表长度
|
||||||
PetList []PetInfo ` json:"pet_list"` // 精灵背包内信息
|
PetList []PetInfo ` json:"pet_list"` // 精灵背包内信息
|
||||||
|
BackupPetList []PetInfo `struc:"skip" json:"backup_pet_list"` // 精灵并列备用列表
|
||||||
ClothesCount uint32 `struc:"sizeof=Clothes" json:"clothes_count"` // 穿戴装备数量
|
ClothesCount uint32 `struc:"sizeof=Clothes" json:"clothes_count"` // 穿戴装备数量
|
||||||
Clothes []PeopleItemInfo ` json:"clothes"` // 穿戴装备
|
Clothes []PeopleItemInfo ` json:"clothes"` // 穿戴装备
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -65,6 +65,13 @@ func (s *InfoService) GetLogin() *model.PlayerInfo {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
tt.Data.AllPetNumber = uint32(NewPetService(s.userid).PetCount(0))
|
tt.Data.AllPetNumber = uint32(NewPetService(s.userid).PetCount(0))
|
||||||
|
if len(tt.Data.BackupPetList) == 0 {
|
||||||
|
storagePets := NewPetService(s.userid).PetInfo(1)
|
||||||
|
tt.Data.BackupPetList = make([]model.PetInfo, len(storagePets))
|
||||||
|
for i := range storagePets {
|
||||||
|
tt.Data.BackupPetList[i] = storagePets[i].Data
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if tt.Data.MapID > 300 || tt.Data.MapID == 0 { //如果位于基地,就重置到传送仓
|
if tt.Data.MapID > 300 || tt.Data.MapID == 0 { //如果位于基地,就重置到传送仓
|
||||||
tt.Data.MapID = 1
|
tt.Data.MapID = 1
|
||||||
|
|||||||
Reference in New Issue
Block a user