feat(pet): 实现宠物展示功能和稀有宠物塔配置

- 添加PetDisplay字段到Player结构体,用于管理宠物展示状态
- 实现PlayerShowPet方法,支持宠物展示逻辑,包括设置展示标识、
  检查宠物存在性并返回相应错误码
- 在Space中添加RefreshUserInfo方法,用于刷新用户信息并应用
  宠物展示信息到SimpleInfo
- 扩展SimpleInfo结构体,添加PetRide字段用于宠物骑乘标识
This commit is contained in:
昔念
2026-04-01 02:48:09 +08:00
parent acfdf5679d
commit 81c16590d6
11 changed files with 179 additions and 57 deletions

View File

@@ -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)
}

View File

@@ -13,14 +13,14 @@ const (
type PetReward struct {
*cool.Model // 保留通用ModelID/创建时间/更新时间等)
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对应的数据库表名遵循现有代码规范

View File

@@ -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{})

View File

@@ -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"},

View File

@@ -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
}

View File

@@ -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)
}