重构 Talk 方法中物品奖励的获取方式,使用新的配置服务以支持多物品 ID 奖励机制。 移除了对 github.com/gogf/gf/v2/util/grand 包的依赖,改为通过服务获取实际物品数量。 同时更新了相关模型定义: - 修改 MineralCollectionConfig 中 ItemID 为数组形式以支持多个物品配置 - 调整 ItemGift 模型字段
144 lines
5.1 KiB
Go
144 lines
5.1 KiB
Go
package model
|
||
|
||
import (
|
||
"blazing/cool"
|
||
"errors"
|
||
"fmt"
|
||
)
|
||
|
||
// 表名常量定义:试炼之塔配置表
|
||
const (
|
||
TableNameTrialTowerConfig = "trial_tower_config" // 试炼之塔配置表(核心记录层数、BOSS数组、奖励物品/精灵)
|
||
)
|
||
|
||
type BaseTowerConfig struct {
|
||
*cool.Model `json:"-" gorm:"embedded"` // 嵌入通用Model(ID/创建时间/更新时间,不参与json序列化)
|
||
|
||
// 核心必填字段(与勇者之塔完全一致,仅表名和标识不同)
|
||
TowerLevel uint32 `gorm:"not null;default:0;uniqueIndex;comment:'试炼之塔层数(唯一标识每层配置)'" json:"tower_level" description:"试炼之塔层数"`
|
||
BossIds []uint32 `gorm:"not null;type:json;default:'[]';comment:'绑定BOSS ID数组,关联config_pet_boss表主键'" json:"boss_ids" description:"绑定BOSS数组"`
|
||
ItemRewardIds []uint32 `gorm:"not null;type:json;default:'[]';comment:'绑定奖励物品ID数组,关联item_gift表主键'" json:"item_reward_ids" description:"绑定奖励物品数组"`
|
||
ElfRewardIds []uint32 `gorm:"not null;type:json;default:'[]';comment:'绑定奖励精灵ID数组,关联config_pet_boss表主键'" json:"elf_reward_ids" description:"绑定奖励精灵数组"`
|
||
|
||
// 通用辅助字段(与勇者之塔完全一致,无额外添加)
|
||
IsEnabled uint32 `gorm:"not null;default:1;comment:'是否启用该层配置(0-禁用 1-启用)'" json:"is_enabled" description:"是否启用"`
|
||
Remark string `gorm:"size:512;default:'';comment:'试炼之塔层备注'" json:"remark" description:"备注信息"`
|
||
// ItemGift []ItemGift `orm:"with:item_id=id"`
|
||
}
|
||
|
||
func NewBaseTowerConfig() BaseTowerConfig {
|
||
return BaseTowerConfig{
|
||
Model: cool.NewModel(),
|
||
}
|
||
}
|
||
|
||
// TrialTowerConfig 试炼之塔核心配置模型(与勇者之塔结构完全一致,无额外专属字段)
|
||
type TrialTowerConfig struct {
|
||
BaseTowerConfig
|
||
}
|
||
|
||
// -------------------------- 核心配套方法(与勇者之塔完全一致)--------------------------
|
||
func (*TrialTowerConfig) TableName() string {
|
||
return TableNameTrialTowerConfig
|
||
}
|
||
|
||
func (*TrialTowerConfig) GroupName() string {
|
||
return "default"
|
||
}
|
||
|
||
func NewTrialTowerConfig() *TrialTowerConfig {
|
||
return &TrialTowerConfig{
|
||
BaseTowerConfig: NewBaseTowerConfig(),
|
||
}
|
||
}
|
||
|
||
// -------------------------- 业务操作方法(与勇者之塔逻辑完全一致,仅模型标识不同)--------------------------
|
||
// AddBossId 为试炼之塔添加单个BOSS ID(避免重复)
|
||
func (t *TrialTowerConfig) AddBossId(bossId uint32) error {
|
||
if bossId == 0 {
|
||
return errors.New("BOSS ID不能为空(不能为0)")
|
||
}
|
||
for _, id := range t.BossIds {
|
||
if id == bossId {
|
||
return fmt.Errorf("BOSS ID%d已绑定试炼之塔%d层,无需重复添加", bossId, t.TowerLevel)
|
||
}
|
||
}
|
||
t.BossIds = append(t.BossIds, bossId)
|
||
return nil
|
||
}
|
||
|
||
// AddItemRewardId 为试炼之塔添加单个奖励物品ID(避免重复)
|
||
func (t *TrialTowerConfig) AddItemRewardId(itemId uint32) error {
|
||
if itemId == 0 {
|
||
return errors.New("奖励物品ID不能为空(不能为0)")
|
||
}
|
||
for _, id := range t.ItemRewardIds {
|
||
if id == itemId {
|
||
return fmt.Errorf("奖励物品ID%d已绑定试炼之塔%d层,无需重复添加", itemId, t.TowerLevel)
|
||
}
|
||
}
|
||
t.ItemRewardIds = append(t.ItemRewardIds, itemId)
|
||
return nil
|
||
}
|
||
|
||
// AddElfRewardId 为试炼之塔添加单个奖励精灵ID(避免重复)
|
||
func (t *TrialTowerConfig) AddElfRewardId(elfId uint32) error {
|
||
if elfId == 0 {
|
||
return errors.New("奖励精灵ID不能为空(不能为0)")
|
||
}
|
||
for _, id := range t.ElfRewardIds {
|
||
if id == elfId {
|
||
return fmt.Errorf("奖励精灵ID%d已绑定试炼之塔%d层,无需重复添加", elfId, t.TowerLevel)
|
||
}
|
||
}
|
||
t.ElfRewardIds = append(t.ElfRewardIds, elfId)
|
||
return nil
|
||
}
|
||
|
||
// RemoveBossId 从试炼之塔移除单个BOSS ID
|
||
func (t *TrialTowerConfig) RemoveBossId(bossId uint32) error {
|
||
if bossId == 0 {
|
||
return errors.New("BOSS ID不能为空(不能为0)")
|
||
}
|
||
for i, id := range t.BossIds {
|
||
if id == bossId {
|
||
t.BossIds = append(t.BossIds[:i], t.BossIds[i+1:]...)
|
||
return nil
|
||
}
|
||
}
|
||
return fmt.Errorf("试炼之塔%d层未绑定BOSS ID%d,无法移除", t.TowerLevel, bossId)
|
||
}
|
||
|
||
// RemoveItemRewardId 从试炼之塔移除单个奖励物品ID
|
||
func (t *TrialTowerConfig) RemoveItemRewardId(itemId uint32) error {
|
||
if itemId == 0 {
|
||
return errors.New("奖励物品ID不能为空(不能为0)")
|
||
}
|
||
for i, id := range t.ItemRewardIds {
|
||
if id == itemId {
|
||
t.ItemRewardIds = append(t.ItemRewardIds[:i], t.ItemRewardIds[i+1:]...)
|
||
return nil
|
||
}
|
||
}
|
||
return fmt.Errorf("试炼之塔%d层未绑定奖励物品ID%d,无法移除", t.TowerLevel, itemId)
|
||
}
|
||
|
||
// RemoveElfRewardId 从试炼之塔移除单个奖励精灵ID
|
||
func (t *TrialTowerConfig) RemoveElfRewardId(elfId uint32) error {
|
||
if elfId == 0 {
|
||
return errors.New("奖励精灵ID不能为空(不能为0)")
|
||
}
|
||
for i, id := range t.ElfRewardIds {
|
||
if id == elfId {
|
||
t.ElfRewardIds = append(t.ElfRewardIds[:i], t.ElfRewardIds[i+1:]...)
|
||
return nil
|
||
}
|
||
}
|
||
return fmt.Errorf("试炼之塔%d层未绑定奖励精灵ID%d,无法移除", t.TowerLevel, elfId)
|
||
}
|
||
|
||
// -------------------------- 表结构自动同步 --------------------------
|
||
func init() {
|
||
cool.CreateTable(&TrialTowerConfig{})
|
||
}
|