diff --git a/logic/controller/pet_info.go b/logic/controller/pet_info.go index 13addf3d1..3373b1aa4 100644 --- a/logic/controller/pet_info.go +++ b/logic/controller/pet_info.go @@ -189,13 +189,28 @@ func (h Controller) TogglePetBagWarehouse( // PlayerShowPet 精灵展示 func (h Controller) PlayerShowPet( data *pet.PetShowInboundInfo, player *player.Player) (result *pet.PetShowOutboundInfo, err errorcode.ErrorCode) { //这个时候player应该是空的 - result = &pet.PetShowOutboundInfo{} + result = &pet.PetShowOutboundInfo{ + UserID: data.Head.UserID, + CatchTime: data.CatchTime, + Flag: data.Flag, + } _, currentPet, ok := player.FindPet(data.CatchTime) - if ok { - result = buildPetShowOutboundInfo(data.Head.UserID, data.Flag, currentPet) + if data.Flag == 0 { + player.SetPetDisplay(0, nil) + player.GetSpace().RefreshUserInfo(player) defer player.GetSpace().Broadcast(player, data.Head.CMD, result) + return } + + if !ok { + return nil, errorcode.ErrorCodes.ErrPokemonNotExists + } + + player.SetPetDisplay(data.Flag, currentPet) + player.GetSpace().RefreshUserInfo(player) + result = buildPetShowOutboundInfo(data.Head.UserID, data.Flag, currentPet) + defer player.GetSpace().Broadcast(player, data.Head.CMD, result) return } diff --git a/logic/service/player/pet_display.go b/logic/service/player/pet_display.go new file mode 100644 index 000000000..58b971ac4 --- /dev/null +++ b/logic/service/player/pet_display.go @@ -0,0 +1,60 @@ +package player + +import ( + "blazing/common/data" + spaceinfo "blazing/logic/service/space/info" + "blazing/modules/player/model" +) + +type PetDisplayState struct { + Flag uint32 + CatchTime uint32 + PetID uint32 + Dv uint32 + ShinyInfo []data.GlowFilter + SkinID uint32 +} + +func (p *Player) SetPetDisplay(flag uint32, petInfo *model.PetInfo) { + if flag == 0 || petInfo == nil { + p.PetDisplay = PetDisplayState{} + return + } + + p.PetDisplay = PetDisplayState{ + Flag: flag, + CatchTime: petInfo.CatchTime, + PetID: petInfo.ID, + Dv: petInfo.Dv, + ShinyInfo: append([]data.GlowFilter(nil), petInfo.ShinyInfo...), + SkinID: petInfo.SkinID, + } +} + +func (p *Player) ApplyPetDisplayInfo(out *spaceinfo.SimpleInfo) { + if out == nil { + return + } + + out.SpiritTime = 0 + out.SpiritID = 0 + out.PetDV = 0 + out.ShinyLen = 0 + out.ShinyInfo = nil + out.PetSkin = 0 + out.PetRide = 0 + + if p.PetDisplay.CatchTime == 0 || p.PetDisplay.PetID == 0 || p.PetDisplay.Flag == 0 { + return + } + + out.SpiritTime = p.PetDisplay.CatchTime + out.SpiritID = p.PetDisplay.PetID + out.PetDV = p.PetDisplay.Dv + out.ShinyInfo = append([]data.GlowFilter(nil), p.PetDisplay.ShinyInfo...) + out.ShinyLen = uint32(len(out.ShinyInfo)) + out.PetSkin = p.PetDisplay.SkinID + if p.PetDisplay.Flag == 2 { + out.PetRide = 2 + } +} diff --git a/logic/service/player/player.go b/logic/service/player/player.go index 35ebe95d8..c89271a33 100644 --- a/logic/service/player/player.go +++ b/logic/service/player/player.go @@ -103,6 +103,7 @@ type Player struct { Logintime uint32 // 当前登录时间 OgrePet + PetDisplay PetDisplayState Service *blservice.UserService User *service.BaseSysUserService diff --git a/logic/service/space/in_out.go b/logic/service/space/in_out.go index 9c6ecc9cd..4c8b1a74a 100644 --- a/logic/service/space/in_out.go +++ b/logic/service/space/in_out.go @@ -10,6 +10,10 @@ import ( "github.com/jinzhu/copier" ) +type petDisplayInfoProvider interface { + ApplyPetDisplayInfo(*info.SimpleInfo) +} + // 向其他人广播,不含自己 // 广播是c 为空就不特判,发给全体成员广播 func (s *Space) Broadcast(c common.PlayerI, cmd uint32, data any) { @@ -53,6 +57,9 @@ func (s *Space) EnterMap(c common.PlayerI) { out := info.NewOutInfo() copier.CopyWithOption(out, c.GetInfo(), copier.Option{DeepCopy: true}) + if provider, ok := c.(petDisplayInfoProvider); ok { + provider.ApplyPetDisplayInfo(out) + } c.SendPackCmd(2001, out) s.Broadcast(c, 2001, out) @@ -65,6 +72,19 @@ func (s *Space) EnterMap(c common.PlayerI) { } } + +func (s *Space) RefreshUserInfo(c common.PlayerI) { + current, ok := s.UserInfo.Load(c.GetInfo().UserID) + if !ok { + return + } + + if provider, ok := c.(petDisplayInfoProvider); ok { + provider.ApplyPetDisplayInfo(¤t) + s.UserInfo.Store(c.GetInfo().UserID, current) + } +} + func (s *Space) GetInfo(c common.PlayerI) []info.SimpleInfo { ret := make([]info.SimpleInfo, 0) diff --git a/logic/service/space/info/info.go b/logic/service/space/info/info.go index f5cf03c6a..6e5695ded 100644 --- a/logic/service/space/info/info.go +++ b/logic/service/space/info/info.go @@ -100,9 +100,9 @@ type SimpleInfo struct { ShinyLen uint32 `json:"-" struc:"sizeof=ShinyInfo"` ShinyInfo []data.GlowFilter `json:"ShinyInfo,omitempty"` // 宠物皮肤暂时无法测试,给 0 - PetSkin uint32 `struc:"uint32" fieldDesc:"宠物皮肤暂时无法测试, 给0" json:"pet_skin"` - // 填充字符 - Reserved [3]uint32 + PetSkin uint32 `struc:"uint32" fieldDesc:"宠物皮肤暂时无法测试, 给0" json:"pet_skin"` + PetRide uint32 `struc:"uint32" fieldDesc:"pet ride flag" json:"pet_ride"` + Reserved [2]uint32 // 暂时不明给0 FightFlag uint32 `struc:"uint32" fieldDesc:"暂时不明给0" json:"fight_flag"` diff --git a/modules/config/controller/admin/tower1.go b/modules/config/controller/admin/tower1.go new file mode 100644 index 000000000..1e11ca0e6 --- /dev/null +++ b/modules/config/controller/admin/tower1.go @@ -0,0 +1,22 @@ +package admin + +import ( + "blazing/cool" + "blazing/modules/config/service" +) + +type Tower1ConfigController struct { + *cool.Controller +} + +func init() { + controller := &Tower1ConfigController{ + &cool.Controller{ + Prefix: "/admin/config/tower1config", + Api: []string{"Add", "Delete", "Update", "Info", "List", "Page"}, + Service: service.NewTower1Service(), + }, + } + + cool.RegisterController(controller) +} diff --git a/modules/config/model/pet_gift.go b/modules/config/model/pet_gift.go index fc7e12652..09f5cc903 100644 --- a/modules/config/model/pet_gift.go +++ b/modules/config/model/pet_gift.go @@ -13,14 +13,14 @@ const ( type PetReward struct { *cool.Model // 保留通用Model(ID/创建时间/更新时间等) - MonID int32 `gorm:"not null;comment:'BOSS对应的精灵ID'" json:"mon_id"` - DV int32 `gorm:"not null;default:0;comment:'成长值'" json:"dv"` - Nature int32 `gorm:"not null;default:0;comment:'BOSS属性-性格'" json:"nature"` - Effect int32 `gorm:"not null;comment:'BOSS特性'" json:"effect"` - Lv int32 `gorm:"not null;comment:'BOSS等级(LvHpMatchUser非0时此配置无效)'" json:"lv"` - IsEgg uint32 `gorm:"not null;default:0;comment:'是否蛋'" json:"is_egg"` //奖励是否为扭蛋奖励 - IsLight uint32 `gorm:"not null;default:0;comment:'是否擦灯'" json:"is_light"` //奖励是否为光之子`` - Remark string `gorm:"type:varchar(255);default:'';comment:'性别配置备注(如:默认性别规则)'" json:"remark"` // 调整注释 + MonID int32 `gorm:"not null;comment:'BOSS对应的精灵ID'" json:"mon_id"` + DV int32 `gorm:"not null;default:0;comment:'成长值'" json:"dv"` + Nature int32 `gorm:"not null;default:0;comment:'BOSS属性-性格'" json:"nature"` + Effect int32 `gorm:"not null;comment:'BOSS特性'" json:"effect"` + Lv int32 `gorm:"not null;comment:'BOSS等级(LvHpMatchUser非0时此配置无效)'" json:"lv"` + IsEgg uint32 `gorm:"not null;default:0;comment:'是否蛋'" json:"is_egg"` //奖励是否为扭蛋奖励 + + Remark string `gorm:"type:varchar(255);default:'';comment:'性别配置备注(如:默认性别规则)'" json:"remark"` // 调整注释 } // TableName 指定PetReward对应的数据库表名(遵循现有代码规范) diff --git a/modules/config/model/tower_110.go b/modules/config/model/tower_110.go index 74a639f1e..5c4fe1c0a 100644 --- a/modules/config/model/tower_110.go +++ b/modules/config/model/tower_110.go @@ -4,44 +4,56 @@ import ( "blazing/cool" ) -// -------------------------- 表名常量定义(统一管理所有塔配置表名)-------------------------- const ( - TableNamedARKTowerConfig = "config_tower_110" // 勇者之塔110配置表 - TableNameTrialTowerConfig = "config_tower_500" // 试炼之塔500配置表 - TableNameBraveTowerConfig = "config_tower_600" // 勇者之塔600配置表 + TableNameRarePetTowerConfig = "config_tower_1" + TableNamedARKTowerConfig = "config_tower_110" + TableNameTrialTowerConfig = "config_tower_500" + TableNameBraveTowerConfig = "config_tower_600" ) type BaseTowerConfig struct { *BaseConfig - Name string `gorm:"type:varchar(100);default:'';comment:'塔名称'" json:"name" description:"塔名称"` - TowerLevel uint32 `gorm:"not null;default:0;uniqueIndex;comment:'塔层数'" json:"tower_level" ` - BossIds []uint32 `gorm:"type:jsonb; ;comment:'塔层BOSS ID列表'" json:"boss_ids"` + Name string `gorm:"type:varchar(100);default:'';comment:'name'" json:"name" description:"name"` + TowerLevel uint32 `gorm:"not null;default:0;uniqueIndex;comment:'tower level'" json:"tower_level"` + BossIds []uint32 `gorm:"type:jsonb;comment:'boss ids'" json:"boss_ids"` } -// NewBaseTowerConfig 创建基础塔配置实例(所有塔类型共用) func NewBaseTowerConfig() *BaseTowerConfig { return &BaseTowerConfig{ BaseConfig: NewBaseConfig(), } } +type Tower1Config struct { + *BaseTowerConfig +} + type Tower110Config struct { *BaseTowerConfig } -// Tower500Config 试炼之塔500配置模型 type Tower500Config struct { *BaseTowerConfig } -// Tower600Config 勇者之塔600配置模型 type Tower600Config struct { *BaseTowerConfig } -// -------------------------- 各塔模型的核心配套方法(统一规范)-------------------------- +func (*Tower1Config) TableName() string { + return TableNameRarePetTowerConfig +} + +func (*Tower1Config) GroupName() string { + return "default" +} + +func New1TowerConfig() *Tower1Config { + return &Tower1Config{ + BaseTowerConfig: NewBaseTowerConfig(), + } +} -// ===== Tower110Config 专属方法 ===== func (*Tower110Config) TableName() string { return TableNamedARKTowerConfig } @@ -56,7 +68,6 @@ func New110TowerConfig() *Tower110Config { } } -// ===== Tower500Config 专属方法 ===== func (*Tower500Config) TableName() string { return TableNameTrialTowerConfig } @@ -71,7 +82,6 @@ func New500TowerConfig() *Tower500Config { } } -// ===== Tower600Config 专属方法 ===== func (*Tower600Config) TableName() string { return TableNameBraveTowerConfig } @@ -86,9 +96,8 @@ func New600TowerConfig() *Tower600Config { } } -// -------------------------- 表结构自动同步(初始化所有塔配置表)-------------------------- func init() { - // 依次创建所有塔配置表,保持原有自动同步逻辑 + cool.CreateTable(&Tower1Config{}) cool.CreateTable(&Tower110Config{}) cool.CreateTable(&Tower500Config{}) cool.CreateTable(&Tower600Config{}) diff --git a/modules/config/service/item.go b/modules/config/service/item.go index 5fa45c03b..e980b974a 100644 --- a/modules/config/service/item.go +++ b/modules/config/service/item.go @@ -38,7 +38,7 @@ func (s *ItemService) GetItemCount(id uint32) data.ItemInfo { } return res } -func (s *ItemService) AllEgg( ) []model.ItemGift { +func (s *ItemService) AllEgg() []model.ItemGift { var item []model.ItemGift dbm_notenable(s.Model).Where("is_egg", 1).Scan(&item) @@ -68,7 +68,7 @@ func NewItemService() *ItemService { Model: model.NewItemGift(), ListQueryOp: &cool.QueryOp{ - FieldEQ: []string{"is_egg", "is_light"}, + FieldEQ: []string{"is_egg"}, }, PageQueryOp: &cool.QueryOp{ KeyWordField: []string{"remark"}, diff --git a/modules/config/service/pet.go b/modules/config/service/pet.go index 24222a98b..3e906883d 100644 --- a/modules/config/service/pet.go +++ b/modules/config/service/pet.go @@ -14,37 +14,36 @@ func NewPetRewardService() *PetRewardService { &cool.Service{ Model: model.NewPetReward(), ListQueryOp: &cool.QueryOp{ - FieldEQ: []string{"is_egg", "is_light"}, + FieldEQ: []string{"is_egg"}, }, - PageQueryOp: &cool.QueryOp{ - - FieldEQ: []string{"is_egg", "is_light"}, + FieldEQ: []string{"is_egg"}, }, }, } } + func (s *PetRewardService) GetEgg() model.PetReward { var item model.PetReward dbm_nocache_noenable(s.Model).Where("is_egg", 1).OrderRandom().Limit(1).Scan(&item) return item - } + func (s *PetRewardService) AllEgg() []model.PetReward { var item []model.PetReward dbm_nocache_noenable(s.Model).Where("is_egg", 1).Scan(&item) return item - } + func (s *PetRewardService) Get(id uint32) *model.PetReward { if id == 0 { return nil } + var item *model.PetReward dbm_notenable(s.Model).Where("id", id).Scan(&item) return item - } diff --git a/modules/config/service/tower.go b/modules/config/service/tower.go index 62607e53b..0edc1b1b2 100644 --- a/modules/config/service/tower.go +++ b/modules/config/service/tower.go @@ -7,26 +7,27 @@ import ( "github.com/gogf/gf/v2/database/gdb" ) -// 定义塔类型枚举,方便区分不同塔的业务逻辑 type TowerType uint32 const ( - TowerType110 TowerType = 110 // 110塔 - TowerType500 TowerType = 500 // 500塔 - TowerType600 TowerType = 600 // 600塔 + TowerType1 TowerType = 1 + TowerType110 TowerType = 110 + TowerType500 TowerType = 500 + TowerType600 TowerType = 600 ) -// TowerService 统一的塔配置服务,整合110/500/600塔的逻辑 type TowerService struct { *cool.Service - towerType TowerType // 标记当前服务对应的塔类型 - tableName string // 存储当前塔类型对应的表名 + towerType TowerType + tableName string } -// NewTowerService 创建指定类型的塔配置服务 func NewTowerService(towerType TowerType) *TowerService { var tableName string + switch towerType { + case TowerType1: + tableName = model.TableNameRarePetTowerConfig case TowerType110: tableName = model.TableNamedARKTowerConfig case TowerType500: @@ -34,10 +35,9 @@ func NewTowerService(towerType TowerType) *TowerService { case TowerType600: tableName = model.TableNameBraveTowerConfig default: - panic("unsupported tower type: " + string(rune(towerType))) // 非支持类型直接panic,也可返回error + panic("unsupported tower type") } - // 创建一个统一的模型,设置对应的表名 unifiedModel := &UnifiedTowerModel{ tableName: tableName, } @@ -49,37 +49,33 @@ func NewTowerService(towerType TowerType) *TowerService { } } -// UnifiedTowerModel 统一的塔模型,通过设置不同的表名来区分不同类型的塔 type UnifiedTowerModel struct { *cool.Model tableName string } -// TableName 返回当前模型对应的表名 func (m *UnifiedTowerModel) TableName() string { return m.tableName } -// GroupName 返回模型所属组 func (m *UnifiedTowerModel) GroupName() string { return "default" } -// Boss 根据塔等级获取对应的Boss配置(统一入口) func (s *TowerService) Boss(towerLevel ...uint32) []model.BaseTowerConfig { - // 构建基础查询条件 query := dbm_enable(s.Model).WhereIn("tower_level", towerLevel).OrderAsc("tower_level") - // 600塔专属的缓存配置 var config []model.BaseTowerConfig query.Cache(gdb.CacheOption{ - // Duration: time.Hour, // 可根据需要开启缓存时长 Force: false, }).Scan(&config) return config } -// 兼容原有调用方式的快捷构造函数(可选,保证代码平滑迁移) +func NewTower1Service() *TowerService { + return NewTowerService(TowerType1) +} + func NewTower110Service() *TowerService { return NewTowerService(TowerType110) }