```
feat(pet): 实现宠物展示功能和稀有宠物塔配置 - 添加PetDisplay字段到Player结构体,用于管理宠物展示状态 - 实现PlayerShowPet方法,支持宠物展示逻辑,包括设置展示标识、 检查宠物存在性并返回相应错误码 - 在Space中添加RefreshUserInfo方法,用于刷新用户信息并应用 宠物展示信息到SimpleInfo - 扩展SimpleInfo结构体,添加PetRide字段用于宠物骑乘标识
This commit is contained in:
@@ -189,13 +189,28 @@ func (h Controller) TogglePetBagWarehouse(
|
|||||||
// PlayerShowPet 精灵展示
|
// PlayerShowPet 精灵展示
|
||||||
func (h Controller) PlayerShowPet(
|
func (h Controller) PlayerShowPet(
|
||||||
data *pet.PetShowInboundInfo, player *player.Player) (result *pet.PetShowOutboundInfo, err errorcode.ErrorCode) { //这个时候player应该是空的
|
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)
|
_, currentPet, ok := player.FindPet(data.CatchTime)
|
||||||
|
|
||||||
if ok {
|
if data.Flag == 0 {
|
||||||
result = buildPetShowOutboundInfo(data.Head.UserID, data.Flag, currentPet)
|
player.SetPetDisplay(0, nil)
|
||||||
|
player.GetSpace().RefreshUserInfo(player)
|
||||||
defer player.GetSpace().Broadcast(player, data.Head.CMD, result)
|
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
|
return
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
60
logic/service/player/pet_display.go
Normal file
60
logic/service/player/pet_display.go
Normal file
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -103,6 +103,7 @@ type Player struct {
|
|||||||
|
|
||||||
Logintime uint32 // 当前登录时间
|
Logintime uint32 // 当前登录时间
|
||||||
OgrePet
|
OgrePet
|
||||||
|
PetDisplay PetDisplayState
|
||||||
|
|
||||||
Service *blservice.UserService
|
Service *blservice.UserService
|
||||||
User *service.BaseSysUserService
|
User *service.BaseSysUserService
|
||||||
|
|||||||
@@ -10,6 +10,10 @@ import (
|
|||||||
"github.com/jinzhu/copier"
|
"github.com/jinzhu/copier"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type petDisplayInfoProvider interface {
|
||||||
|
ApplyPetDisplayInfo(*info.SimpleInfo)
|
||||||
|
}
|
||||||
|
|
||||||
// 向其他人广播,不含自己
|
// 向其他人广播,不含自己
|
||||||
// 广播是c 为空就不特判,发给全体成员广播
|
// 广播是c 为空就不特判,发给全体成员广播
|
||||||
func (s *Space) Broadcast(c common.PlayerI, cmd uint32, data any) {
|
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()
|
out := info.NewOutInfo()
|
||||||
copier.CopyWithOption(out, c.GetInfo(), copier.Option{DeepCopy: true})
|
copier.CopyWithOption(out, c.GetInfo(), copier.Option{DeepCopy: true})
|
||||||
|
if provider, ok := c.(petDisplayInfoProvider); ok {
|
||||||
|
provider.ApplyPetDisplayInfo(out)
|
||||||
|
}
|
||||||
c.SendPackCmd(2001, out)
|
c.SendPackCmd(2001, out)
|
||||||
|
|
||||||
s.Broadcast(c, 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 {
|
func (s *Space) GetInfo(c common.PlayerI) []info.SimpleInfo {
|
||||||
|
|
||||||
ret := make([]info.SimpleInfo, 0)
|
ret := make([]info.SimpleInfo, 0)
|
||||||
|
|||||||
@@ -100,9 +100,9 @@ type SimpleInfo struct {
|
|||||||
ShinyLen uint32 `json:"-" struc:"sizeof=ShinyInfo"`
|
ShinyLen uint32 `json:"-" struc:"sizeof=ShinyInfo"`
|
||||||
ShinyInfo []data.GlowFilter `json:"ShinyInfo,omitempty"`
|
ShinyInfo []data.GlowFilter `json:"ShinyInfo,omitempty"`
|
||||||
// 宠物皮肤暂时无法测试,给 0
|
// 宠物皮肤暂时无法测试,给 0
|
||||||
PetSkin uint32 `struc:"uint32" fieldDesc:"宠物皮肤暂时无法测试, 给0" json:"pet_skin"`
|
PetSkin uint32 `struc:"uint32" fieldDesc:"宠物皮肤暂时无法测试, 给0" json:"pet_skin"`
|
||||||
// 填充字符
|
PetRide uint32 `struc:"uint32" fieldDesc:"pet ride flag" json:"pet_ride"`
|
||||||
Reserved [3]uint32
|
Reserved [2]uint32
|
||||||
|
|
||||||
// 暂时不明给0
|
// 暂时不明给0
|
||||||
FightFlag uint32 `struc:"uint32" fieldDesc:"暂时不明给0" json:"fight_flag"`
|
FightFlag uint32 `struc:"uint32" fieldDesc:"暂时不明给0" json:"fight_flag"`
|
||||||
|
|||||||
22
modules/config/controller/admin/tower1.go
Normal file
22
modules/config/controller/admin/tower1.go
Normal 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)
|
||||||
|
}
|
||||||
@@ -13,14 +13,14 @@ const (
|
|||||||
type PetReward struct {
|
type PetReward struct {
|
||||||
*cool.Model // 保留通用Model(ID/创建时间/更新时间等)
|
*cool.Model // 保留通用Model(ID/创建时间/更新时间等)
|
||||||
|
|
||||||
MonID int32 `gorm:"not null;comment:'BOSS对应的精灵ID'" json:"mon_id"`
|
MonID int32 `gorm:"not null;comment:'BOSS对应的精灵ID'" json:"mon_id"`
|
||||||
DV int32 `gorm:"not null;default:0;comment:'成长值'" json:"dv"`
|
DV int32 `gorm:"not null;default:0;comment:'成长值'" json:"dv"`
|
||||||
Nature int32 `gorm:"not null;default:0;comment:'BOSS属性-性格'" json:"nature"`
|
Nature int32 `gorm:"not null;default:0;comment:'BOSS属性-性格'" json:"nature"`
|
||||||
Effect int32 `gorm:"not null;comment:'BOSS特性'" json:"effect"`
|
Effect int32 `gorm:"not null;comment:'BOSS特性'" json:"effect"`
|
||||||
Lv int32 `gorm:"not null;comment:'BOSS等级(LvHpMatchUser非0时此配置无效)'" json:"lv"`
|
Lv int32 `gorm:"not null;comment:'BOSS等级(LvHpMatchUser非0时此配置无效)'" json:"lv"`
|
||||||
IsEgg uint32 `gorm:"not null;default:0;comment:'是否蛋'" json:"is_egg"` //奖励是否为扭蛋奖励
|
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"` // 调整注释
|
Remark string `gorm:"type:varchar(255);default:'';comment:'性别配置备注(如:默认性别规则)'" json:"remark"` // 调整注释
|
||||||
}
|
}
|
||||||
|
|
||||||
// TableName 指定PetReward对应的数据库表名(遵循现有代码规范)
|
// TableName 指定PetReward对应的数据库表名(遵循现有代码规范)
|
||||||
|
|||||||
@@ -4,44 +4,56 @@ import (
|
|||||||
"blazing/cool"
|
"blazing/cool"
|
||||||
)
|
)
|
||||||
|
|
||||||
// -------------------------- 表名常量定义(统一管理所有塔配置表名)--------------------------
|
|
||||||
const (
|
const (
|
||||||
TableNamedARKTowerConfig = "config_tower_110" // 勇者之塔110配置表
|
TableNameRarePetTowerConfig = "config_tower_1"
|
||||||
TableNameTrialTowerConfig = "config_tower_500" // 试炼之塔500配置表
|
TableNamedARKTowerConfig = "config_tower_110"
|
||||||
TableNameBraveTowerConfig = "config_tower_600" // 勇者之塔600配置表
|
TableNameTrialTowerConfig = "config_tower_500"
|
||||||
|
TableNameBraveTowerConfig = "config_tower_600"
|
||||||
)
|
)
|
||||||
|
|
||||||
type BaseTowerConfig struct {
|
type BaseTowerConfig struct {
|
||||||
*BaseConfig
|
*BaseConfig
|
||||||
Name string `gorm:"type:varchar(100);default:'';comment:'塔名称'" json:"name" description:"塔名称"`
|
Name string `gorm:"type:varchar(100);default:'';comment:'name'" json:"name" description:"name"`
|
||||||
TowerLevel uint32 `gorm:"not null;default:0;uniqueIndex;comment:'塔层数'" json:"tower_level" `
|
TowerLevel uint32 `gorm:"not null;default:0;uniqueIndex;comment:'tower level'" json:"tower_level"`
|
||||||
BossIds []uint32 `gorm:"type:jsonb; ;comment:'塔层BOSS ID列表'" json:"boss_ids"`
|
BossIds []uint32 `gorm:"type:jsonb;comment:'boss ids'" json:"boss_ids"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewBaseTowerConfig 创建基础塔配置实例(所有塔类型共用)
|
|
||||||
func NewBaseTowerConfig() *BaseTowerConfig {
|
func NewBaseTowerConfig() *BaseTowerConfig {
|
||||||
return &BaseTowerConfig{
|
return &BaseTowerConfig{
|
||||||
BaseConfig: NewBaseConfig(),
|
BaseConfig: NewBaseConfig(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type Tower1Config struct {
|
||||||
|
*BaseTowerConfig
|
||||||
|
}
|
||||||
|
|
||||||
type Tower110Config struct {
|
type Tower110Config struct {
|
||||||
*BaseTowerConfig
|
*BaseTowerConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tower500Config 试炼之塔500配置模型
|
|
||||||
type Tower500Config struct {
|
type Tower500Config struct {
|
||||||
*BaseTowerConfig
|
*BaseTowerConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tower600Config 勇者之塔600配置模型
|
|
||||||
type Tower600Config struct {
|
type Tower600Config struct {
|
||||||
*BaseTowerConfig
|
*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 {
|
func (*Tower110Config) TableName() string {
|
||||||
return TableNamedARKTowerConfig
|
return TableNamedARKTowerConfig
|
||||||
}
|
}
|
||||||
@@ -56,7 +68,6 @@ func New110TowerConfig() *Tower110Config {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ===== Tower500Config 专属方法 =====
|
|
||||||
func (*Tower500Config) TableName() string {
|
func (*Tower500Config) TableName() string {
|
||||||
return TableNameTrialTowerConfig
|
return TableNameTrialTowerConfig
|
||||||
}
|
}
|
||||||
@@ -71,7 +82,6 @@ func New500TowerConfig() *Tower500Config {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ===== Tower600Config 专属方法 =====
|
|
||||||
func (*Tower600Config) TableName() string {
|
func (*Tower600Config) TableName() string {
|
||||||
return TableNameBraveTowerConfig
|
return TableNameBraveTowerConfig
|
||||||
}
|
}
|
||||||
@@ -86,9 +96,8 @@ func New600TowerConfig() *Tower600Config {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// -------------------------- 表结构自动同步(初始化所有塔配置表)--------------------------
|
|
||||||
func init() {
|
func init() {
|
||||||
// 依次创建所有塔配置表,保持原有自动同步逻辑
|
cool.CreateTable(&Tower1Config{})
|
||||||
cool.CreateTable(&Tower110Config{})
|
cool.CreateTable(&Tower110Config{})
|
||||||
cool.CreateTable(&Tower500Config{})
|
cool.CreateTable(&Tower500Config{})
|
||||||
cool.CreateTable(&Tower600Config{})
|
cool.CreateTable(&Tower600Config{})
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ func (s *ItemService) GetItemCount(id uint32) data.ItemInfo {
|
|||||||
}
|
}
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
func (s *ItemService) AllEgg( ) []model.ItemGift {
|
func (s *ItemService) AllEgg() []model.ItemGift {
|
||||||
var item []model.ItemGift
|
var item []model.ItemGift
|
||||||
dbm_notenable(s.Model).Where("is_egg", 1).Scan(&item)
|
dbm_notenable(s.Model).Where("is_egg", 1).Scan(&item)
|
||||||
|
|
||||||
@@ -68,7 +68,7 @@ func NewItemService() *ItemService {
|
|||||||
|
|
||||||
Model: model.NewItemGift(),
|
Model: model.NewItemGift(),
|
||||||
ListQueryOp: &cool.QueryOp{
|
ListQueryOp: &cool.QueryOp{
|
||||||
FieldEQ: []string{"is_egg", "is_light"},
|
FieldEQ: []string{"is_egg"},
|
||||||
},
|
},
|
||||||
PageQueryOp: &cool.QueryOp{
|
PageQueryOp: &cool.QueryOp{
|
||||||
KeyWordField: []string{"remark"},
|
KeyWordField: []string{"remark"},
|
||||||
|
|||||||
@@ -14,37 +14,36 @@ func NewPetRewardService() *PetRewardService {
|
|||||||
&cool.Service{
|
&cool.Service{
|
||||||
Model: model.NewPetReward(),
|
Model: model.NewPetReward(),
|
||||||
ListQueryOp: &cool.QueryOp{
|
ListQueryOp: &cool.QueryOp{
|
||||||
FieldEQ: []string{"is_egg", "is_light"},
|
FieldEQ: []string{"is_egg"},
|
||||||
},
|
},
|
||||||
|
|
||||||
PageQueryOp: &cool.QueryOp{
|
PageQueryOp: &cool.QueryOp{
|
||||||
|
FieldEQ: []string{"is_egg"},
|
||||||
FieldEQ: []string{"is_egg", "is_light"},
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *PetRewardService) GetEgg() model.PetReward {
|
func (s *PetRewardService) GetEgg() model.PetReward {
|
||||||
var item model.PetReward
|
var item model.PetReward
|
||||||
dbm_nocache_noenable(s.Model).Where("is_egg", 1).OrderRandom().Limit(1).Scan(&item)
|
dbm_nocache_noenable(s.Model).Where("is_egg", 1).OrderRandom().Limit(1).Scan(&item)
|
||||||
|
|
||||||
return item
|
return item
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *PetRewardService) AllEgg() []model.PetReward {
|
func (s *PetRewardService) AllEgg() []model.PetReward {
|
||||||
var item []model.PetReward
|
var item []model.PetReward
|
||||||
dbm_nocache_noenable(s.Model).Where("is_egg", 1).Scan(&item)
|
dbm_nocache_noenable(s.Model).Where("is_egg", 1).Scan(&item)
|
||||||
|
|
||||||
return item
|
return item
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *PetRewardService) Get(id uint32) *model.PetReward {
|
func (s *PetRewardService) Get(id uint32) *model.PetReward {
|
||||||
if id == 0 {
|
if id == 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var item *model.PetReward
|
var item *model.PetReward
|
||||||
dbm_notenable(s.Model).Where("id", id).Scan(&item)
|
dbm_notenable(s.Model).Where("id", id).Scan(&item)
|
||||||
|
|
||||||
return item
|
return item
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,26 +7,27 @@ import (
|
|||||||
"github.com/gogf/gf/v2/database/gdb"
|
"github.com/gogf/gf/v2/database/gdb"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 定义塔类型枚举,方便区分不同塔的业务逻辑
|
|
||||||
type TowerType uint32
|
type TowerType uint32
|
||||||
|
|
||||||
const (
|
const (
|
||||||
TowerType110 TowerType = 110 // 110塔
|
TowerType1 TowerType = 1
|
||||||
TowerType500 TowerType = 500 // 500塔
|
TowerType110 TowerType = 110
|
||||||
TowerType600 TowerType = 600 // 600塔
|
TowerType500 TowerType = 500
|
||||||
|
TowerType600 TowerType = 600
|
||||||
)
|
)
|
||||||
|
|
||||||
// TowerService 统一的塔配置服务,整合110/500/600塔的逻辑
|
|
||||||
type TowerService struct {
|
type TowerService struct {
|
||||||
*cool.Service
|
*cool.Service
|
||||||
towerType TowerType // 标记当前服务对应的塔类型
|
towerType TowerType
|
||||||
tableName string // 存储当前塔类型对应的表名
|
tableName string
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewTowerService 创建指定类型的塔配置服务
|
|
||||||
func NewTowerService(towerType TowerType) *TowerService {
|
func NewTowerService(towerType TowerType) *TowerService {
|
||||||
var tableName string
|
var tableName string
|
||||||
|
|
||||||
switch towerType {
|
switch towerType {
|
||||||
|
case TowerType1:
|
||||||
|
tableName = model.TableNameRarePetTowerConfig
|
||||||
case TowerType110:
|
case TowerType110:
|
||||||
tableName = model.TableNamedARKTowerConfig
|
tableName = model.TableNamedARKTowerConfig
|
||||||
case TowerType500:
|
case TowerType500:
|
||||||
@@ -34,10 +35,9 @@ func NewTowerService(towerType TowerType) *TowerService {
|
|||||||
case TowerType600:
|
case TowerType600:
|
||||||
tableName = model.TableNameBraveTowerConfig
|
tableName = model.TableNameBraveTowerConfig
|
||||||
default:
|
default:
|
||||||
panic("unsupported tower type: " + string(rune(towerType))) // 非支持类型直接panic,也可返回error
|
panic("unsupported tower type")
|
||||||
}
|
}
|
||||||
|
|
||||||
// 创建一个统一的模型,设置对应的表名
|
|
||||||
unifiedModel := &UnifiedTowerModel{
|
unifiedModel := &UnifiedTowerModel{
|
||||||
tableName: tableName,
|
tableName: tableName,
|
||||||
}
|
}
|
||||||
@@ -49,37 +49,33 @@ func NewTowerService(towerType TowerType) *TowerService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// UnifiedTowerModel 统一的塔模型,通过设置不同的表名来区分不同类型的塔
|
|
||||||
type UnifiedTowerModel struct {
|
type UnifiedTowerModel struct {
|
||||||
*cool.Model
|
*cool.Model
|
||||||
tableName string
|
tableName string
|
||||||
}
|
}
|
||||||
|
|
||||||
// TableName 返回当前模型对应的表名
|
|
||||||
func (m *UnifiedTowerModel) TableName() string {
|
func (m *UnifiedTowerModel) TableName() string {
|
||||||
return m.tableName
|
return m.tableName
|
||||||
}
|
}
|
||||||
|
|
||||||
// GroupName 返回模型所属组
|
|
||||||
func (m *UnifiedTowerModel) GroupName() string {
|
func (m *UnifiedTowerModel) GroupName() string {
|
||||||
return "default"
|
return "default"
|
||||||
}
|
}
|
||||||
|
|
||||||
// Boss 根据塔等级获取对应的Boss配置(统一入口)
|
|
||||||
func (s *TowerService) Boss(towerLevel ...uint32) []model.BaseTowerConfig {
|
func (s *TowerService) Boss(towerLevel ...uint32) []model.BaseTowerConfig {
|
||||||
// 构建基础查询条件
|
|
||||||
query := dbm_enable(s.Model).WhereIn("tower_level", towerLevel).OrderAsc("tower_level")
|
query := dbm_enable(s.Model).WhereIn("tower_level", towerLevel).OrderAsc("tower_level")
|
||||||
|
|
||||||
// 600塔专属的缓存配置
|
|
||||||
var config []model.BaseTowerConfig
|
var config []model.BaseTowerConfig
|
||||||
query.Cache(gdb.CacheOption{
|
query.Cache(gdb.CacheOption{
|
||||||
// Duration: time.Hour, // 可根据需要开启缓存时长
|
|
||||||
Force: false,
|
Force: false,
|
||||||
}).Scan(&config)
|
}).Scan(&config)
|
||||||
return config
|
return config
|
||||||
}
|
}
|
||||||
|
|
||||||
// 兼容原有调用方式的快捷构造函数(可选,保证代码平滑迁移)
|
func NewTower1Service() *TowerService {
|
||||||
|
return NewTowerService(TowerType1)
|
||||||
|
}
|
||||||
|
|
||||||
func NewTower110Service() *TowerService {
|
func NewTower110Service() *TowerService {
|
||||||
return NewTowerService(TowerType110)
|
return NewTowerService(TowerType110)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user