feat: 添加ItemInfo结构体并重构抽蛋和任务系统

- 在common/data/color.go中添加ItemInfo结构体用于表示发放物品的信息
- 在common/utils/tomap.go中添加RandomSlice泛型函数用于从切片中随机选取元素
- 重构action_egg.go中的EggGamePlay功能,实现抽蛋逻辑和物品发放
- 更新fight_boss.go中使用新的ItemInfo结构体替换旧的model.ItemInfo
- 修改user_talk.go中获取物品数量的逻辑
- 更新user_task.go中任务完成逻辑使用新的ItemInfo结构体
- 在egg.go中更新抽蛋结果结构体使用ItemInfo
- 更新战斗奖励结构体使用ItemInfo
- 在player.go中添加学习力道具处理逻辑
- 重构任务系统使用新的ItemInfo结构体
- 移除旧的model.ItemInfo定义
- 更新宠物奖励配置模型添加成长值等字段
- 实现GetEgg方法用于获取扭蛋奖励
- 修复宠物融合材料服务中的道具验证逻辑
```
This commit is contained in:
2025-12-26 20:38:08 +08:00
parent b8d6772256
commit c9bc4be244
18 changed files with 242 additions and 134 deletions

View File

@@ -48,3 +48,10 @@ type GlowFilter struct {
Knockout bool `json:"knockout,omitempty"`
ColorMatrixFilter [20]float32 `json:"matrix,omitempty"`
}
// ItemInfo
// 用于表示发放物品的信息
type ItemInfo struct {
ItemId uint32 `json:"itemId" description:"发放物品ID"` // 发放物品ID
ItemCnt uint32 `json:"itemCount" description:"发放物品的数量"` // 发放物品的数量,
}

View File

@@ -1,5 +1,7 @@
package utils
import "github.com/gogf/gf/v2/util/grand"
// ToMap converts a slice to a map with the keyFunc determining what the key of a value should be.
// Will override any double values.
func ToMap[T any, K comparable](slice []T, keyFunc func(T) K) map[K]T {
@@ -35,6 +37,7 @@ func Max[T Number](a, b T) T {
}
return b
}
// Max 泛型函数:接收两个同类型的 Number 参数,返回最大值
func Min[T Number](a, b T) T {
if a < b {
@@ -42,3 +45,42 @@ func Min[T Number](a, b T) T {
}
return b
}
// RandomSlice 泛型函数从任意类型的切片中随机选取n个不重复元素
// T: 泛型类型参数any表示兼容任意类型
// slice: 源切片(任意类型)
// n: 要选取的元素数量
// 返回值: 与源切片同类型的新切片包含随机选取的n个元素
func RandomSlice[T any](slice []T, n int) []T {
// 边界条件1n≤0 或 源切片为空 → 返回空切片
if n <= 0 || len(slice) == 0 {
return []T{}
}
// 边界条件2n≥源切片长度 → 返回源切片的拷贝(避免修改原切片)
if n >= len(slice) {
copySlice := make([]T, len(slice))
copy(copySlice, slice)
return copySlice
}
// 步骤1生成源切片的索引切片
indices := make([]int, len(slice))
for i := range indices {
indices[i] = i
}
// 步骤2Fisher-Yates洗牌算法打乱索引保证随机性均匀
for i := len(indices) - 1; i > 0; i-- {
j := grand.Intn(i + 1) // 生成0~i的随机数
indices[i], indices[j] = indices[j], indices[i]
}
// 步骤3取前n个打乱后的索引映射为源切片的元素
result := make([]T, n)
for i := 0; i < n; i++ {
result[i] = slice[indices[i]]
}
return result
}

View File

@@ -1,17 +1,44 @@
package controller
import (
"blazing/common/data"
"blazing/common/socket/errorcode"
"blazing/logic/service/egg"
"blazing/logic/service/player"
"blazing/modules/blazing/model"
"blazing/modules/config/service"
"github.com/gogf/gf/v2/util/grand"
)
func (h Controller) EggGamePlay(data *egg.C2S_EGG_GAME_PLAY, c *player.Player) (result *egg.S2C_EGG_GAME_PLAY, err errorcode.ErrorCode) {
newPet := model.GenPetInfo(1, -1, -1, -1, 1, nil)
c.Service.Pet.PetAdd(newPet)
result = &egg.S2C_EGG_GAME_PLAY{HadTime: newPet.CatchTime, ListInfo: []model.ItemInfo{}, PetID: newPet.ID}
func (h Controller) EggGamePlay(data1 *egg.C2S_EGG_GAME_PLAY, c *player.Player) (result *egg.S2C_EGG_GAME_PLAY, err errorcode.ErrorCode) {
switch data1.EggNum {
case 2:
data1.EggNum = 5
case 3:
data1.EggNum = 10
}
result = &egg.S2C_EGG_GAME_PLAY{ListInfo: []data.ItemInfo{}}
if grand.Meet(int(data1.EggNum), 100) {
r := service.NewPetRewardService().GetEgg()
newPet := model.GenPetInfo(int(r.MonID), int(r.DV), int(r.Nature), int(r.Effect), int(r.Lv), nil)
c.Service.Pet.PetAdd(newPet)
result.HadTime = newPet.CatchTime
result.PetID = newPet.ID
}
items := service.NewItemService().GetEgg(data1.EggNum)
for _, item := range items {
if item.ItemId == 0 {
continue
}
c.ItemAdd(item.ItemId, item.ItemCnt)
result.ListInfo = append(result.ListInfo, data.ItemInfo{ItemId: item.ItemId, ItemCnt: item.ItemCnt})
}
c.Service.Item.UPDATE(400501, int(-data1.EggNum))
return
}

View File

@@ -1,6 +1,7 @@
package controller
import (
"blazing/common/data"
"blazing/common/data/xmlres"
"blazing/common/socket/errorcode"
"strings"
@@ -160,11 +161,11 @@ func (h Controller) PlayerFightBoss(data *fight.ChallengeBossInboundInfo, p *pla
// data: 包含战斗野怪信息的输入数据
// player: 当前玩家对象
// 返回: 战斗结果和错误码
func (h Controller) OnPlayerFightNpcMonster(data *fight.FightNpcMonsterInboundInfo, p *player.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) {
func (h Controller) OnPlayerFightNpcMonster(data1 *fight.FightNpcMonsterInboundInfo, p *player.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) {
if !p.CanFight() {
return nil, errorcode.ErrorCodes.ErrSystemError
}
refPet := p.OgreInfo.Data[data.Number]
refPet := p.OgreInfo.Data[data1.Number]
if refPet.Id == 0 {
return nil, errorcode.ErrorCodes.ErrPokemonNotExists
@@ -203,7 +204,7 @@ func (h Controller) OnPlayerFightNpcMonster(data *fight.FightNpcMonsterInboundIn
}
if refPet.Item != 0 {
p.ItemAdd(refPet.Item, uint32(grand.Intn(2)+1))
items.ItemList = append(items.ItemList, model.ItemInfo{
items.ItemList = append(items.ItemList, data.ItemInfo{
ItemId: refPet.Item,
ItemCnt: uint32(grand.Intn(2) + 1),
})

View File

@@ -34,15 +34,13 @@ func (h Controller) GetTalkCategory(data *item.TalkCateInboundInfo, c *player.Pl
//service.NewItemService().GetItemCount(config.ItemID)
for _, itemID := range config.ItemIDS {
itemCount := service.NewItemService().GetItemCount(itemID)
success := c.ItemAdd(uint32(itemID), uint32(itemCount))
iteminfo := service.NewItemService().GetItemCount(itemID)
success := c.ItemAdd(uint32(iteminfo.ItemId), uint32(iteminfo.ItemCnt))
if success {
result.OutList = append(result.OutList, item.CateInfo{ID: itemID, Count: uint32(itemCount)})
result.OutList = append(result.OutList, item.CateInfo{ID: iteminfo.ItemId, Count: uint32(iteminfo.ItemCnt)})
}
}
c.Service.Talk.Update(int(data.ID))
return result, 0
}

View File

@@ -1,6 +1,7 @@
package controller
import (
"blazing/common/data"
"blazing/common/socket/errorcode"
"blazing/logic/service/player"
@@ -46,19 +47,19 @@ func (h Controller) AddTaskBuf(data *task.AddTaskBufInboundInfo, c *player.Playe
// data: 包含任务ID的输入信息
// c: 当前玩家对象
// 返回: 任务完成结果和错误码
func (h Controller) CompleteTask(data *task.CompleteTaskInboundInfo, c *player.Player) (result *task.CompleteTaskOutboundInfo, err errorcode.ErrorCode) {
if c.Info.GetTask(int(data.TaskId)) != model.Accepted {
func (h Controller) CompleteTask(data1 *task.CompleteTaskInboundInfo, c *player.Player) (result *task.CompleteTaskOutboundInfo, err errorcode.ErrorCode) {
if c.Info.GetTask(int(data1.TaskId)) != model.Accepted {
return result, 0
}
c.Info.SetTask(int(data.TaskId), model.Completed)
c.Info.SetTask(int(data1.TaskId), model.Completed)
result = &task.CompleteTaskOutboundInfo{
TaskId: data.TaskId,
ItemList: make([]model.ItemInfo, 0),
TaskId: data1.TaskId,
ItemList: make([]data.ItemInfo, 0),
}
taskInfo := task.Get_Task_Info(*data)
taskInfo := task.Get_Task_Info(*data1)
if taskInfo == nil {
return result, 0
}

View File

@@ -1,8 +1,8 @@
package egg
import (
"blazing/common/data"
"blazing/logic/service/common"
"blazing/modules/blazing/model"
)
// C2S_EGG_GAME_PLAY 前端向后端发送的抽蛋请求结构体
@@ -16,9 +16,9 @@ type C2S_EGG_GAME_PLAY struct {
// S2C_EGG_GAME_PLAY 后端向前端返回的抽蛋结果结构体
// 对应原 C# 的 S2C_EGG_GAME_PLAY
type S2C_EGG_GAME_PLAY struct {
GiftIN uint32 `json:"giftIN"` // 未知字段 写0 未引用
PetID uint32 `json:"petID"` // 抽中精灵的id
HadTime uint32 `json:"hadTime"` // 抽中精灵的捕捉时间(若为时间戳,建议改为 uint64
ListInfoLen uint32 `struc:"sizeof=ListInfo"`
ListInfo []model.ItemInfo `json:"listinfo"` // 抽中物品的物品数组
GiftIN uint32 `json:"giftIN"` // 未知字段 写0 未引用
PetID uint32 `json:"petID"` // 抽中精灵的id
HadTime uint32 `json:"hadTime"` // 抽中精灵的捕捉时间(若为时间戳,建议改为 uint64
ListInfoLen uint32 `struc:"sizeof=ListInfo"`
ListInfo []data.ItemInfo `json:"listinfo"` // 抽中物品的物品数组
}

View File

@@ -1,15 +1,15 @@
package info
import "blazing/modules/blazing/model"
import "blazing/common/data"
type S2C_GET_BOSS_MONSTER struct {
BonusID uint32 // 激活前端任务的ID
EXP uint32 `json:"exp" description:"奖励经验"`
EV uint32 `json:"ev" description:"奖励累计学习力"`
PetID uint32 // 发放精灵的ID
CaptureTm uint32 // 发放精灵的捕获时间
ItemListLen uint32 `struc:"sizeof=ItemList"`
ItemList []model.ItemInfo // 发放物品的数组:
BonusID uint32 // 激活前端任务的ID
EXP uint32 `json:"exp" description:"奖励经验"`
EV uint32 `json:"ev" description:"奖励累计学习力"`
PetID uint32 // 发放精灵的ID
CaptureTm uint32 // 发放精灵的捕获时间
ItemListLen uint32 `struc:"sizeof=ItemList"`
ItemList []data.ItemInfo // 发放物品的数组:
// 特殊说明:
// 1. 仅发放精灵不发放物品时ItemList 无需填充元素,但序列化时需先写入 uint 类型的长度值为0
// 2. 发放多个物品时:序列化时先写入 uint 类型的数组长度再依次写入每个ItemInfo元素

View File

@@ -204,6 +204,8 @@ func (p *Player) ItemAdd(ItemId, ItemCnt uint32) (result bool) {
case 5: //金豆ItemAdd
p.User.UpdateGold(p.Info.UserID, int64(ItemCnt*100))
return true
case 9: //学习力
p.Info.EVPool = p.Info.EVPool + ItemCnt
default:
itemx, ok := xmlres.ItemsMAP[int(ItemId)]

View File

@@ -1,8 +1,8 @@
package task
import (
"blazing/common/data"
"blazing/logic/service/common"
"blazing/modules/blazing/model"
)
type CompleteTaskInboundInfo struct {
@@ -11,9 +11,9 @@ type CompleteTaskInboundInfo struct {
OutState uint32 `json:"outState" ` // 当前状态1表示完成任务
}
type CompleteTaskOutboundInfo struct {
TaskId uint32 `json:"taskId" description:"任务ID"` // 任务ID
PetTypeId uint32 `json:"petTypeId" description:"发放的精灵ID"` // 发放的精灵ID
CaptureTime uint32 `json:"captureTime" description:"发放的精灵捕获时间"` // 发放的精灵捕获时间,
ItemLen uint32 `struc:"sizeof=ItemList"`
ItemList []model.ItemInfo `json:"itemList" description:"发放物品的数组"` // 发放物品的数组,
TaskId uint32 `json:"taskId" description:"任务ID"` // 任务ID
PetTypeId uint32 `json:"petTypeId" description:"发放的精灵ID"` // 发放的精灵ID
CaptureTime uint32 `json:"captureTime" description:"发放的精灵捕获时间"` // 发放的精灵捕获时间,
ItemLen uint32 `struc:"sizeof=ItemList"`
ItemList []data.ItemInfo `json:"itemList" description:"发放物品的数组"` // 发放物品的数组,
}

View File

@@ -1,13 +1,13 @@
package task
import (
"blazing/modules/blazing/model"
"blazing/common/data"
"sync"
)
// RegisterTask 注册任务奖励
// 参数任务ID、分支(OutState)、物品列表、精灵类型(0=无)
func RegisterTask(taskID uint32, outState uint32, items []model.ItemInfo, petType uint32) {
func RegisterTask(taskID uint32, outState uint32, items []data.ItemInfo, petType uint32) {
if _, ok := TaskResultMap[taskID]; !ok {
TaskResultMap[taskID] = make(map[uint32]TaskResult)
}
@@ -19,24 +19,24 @@ func RegisterTask(taskID uint32, outState uint32, items []model.ItemInfo, petTyp
func init() {
// -------------------------- 新手任务 --------------------------
RegisterTask(85, 1, []model.ItemInfo{ // 新手任务1默认分支1
RegisterTask(85, 1, []data.ItemInfo{ // 新手任务1默认分支1
{100027, 1}, // 新手帽
{100028, 1}, // 新手腰带
{500001, 1}, // 精灵仓库
{500502, 1}, // 精灵恢复仓
}, 0)
RegisterTask(86, 1, []model.ItemInfo{}, 1) // 新手任务2分支1布布种子
RegisterTask(86, 2, []model.ItemInfo{}, 7) // 新手任务2分支2小火猴
RegisterTask(86, 3, []model.ItemInfo{}, 4) // 新手任务2分支3伊优
RegisterTask(86, 0, []model.ItemInfo{}, 1) // 新手任务2默认分支布布种子
RegisterTask(86, 1, []data.ItemInfo{}, 1) // 新手任务2分支1布布种子
RegisterTask(86, 2, []data.ItemInfo{}, 7) // 新手任务2分支2小火猴
RegisterTask(86, 3, []data.ItemInfo{}, 4) // 新手任务2分支3伊优
RegisterTask(86, 0, []data.ItemInfo{}, 1) // 新手任务2默认分支布布种子
RegisterTask(87, 0, []model.ItemInfo{ // 新手任务3默认分支
RegisterTask(87, 0, []data.ItemInfo{ // 新手任务3默认分支
{300001, 5}, // 普通胶囊x5
{300011, 3}, // 初级体力药剂x3
}, 0)
RegisterTask(88, 1, []model.ItemInfo{ // 新手任务4默认分支
RegisterTask(88, 1, []data.ItemInfo{ // 新手任务4默认分支
{1, 50000}, // 赛尔豆x50000
{3, 50000}, // 累积经验x50000
{5, 20}, // 金豆x20
@@ -45,19 +45,19 @@ func init() {
}, 0)
// -------------------------- 普通任务(无精灵奖励) --------------------------
RegisterTask(90, 0, []model.ItemInfo{ // 克洛斯星的皮皮
RegisterTask(90, 0, []data.ItemInfo{ // 克洛斯星的皮皮
{1, 1000}, // 赛尔豆x1000
{3, 1000}, // 经验x1000
}, 0)
RegisterTask(8, 0, []model.ItemInfo{{500510, 1}}, 0) // 西塔的珍贵回忆记忆晶体x1
RegisterTask(9, 0, []model.ItemInfo{{100059, 1}}, 0) // 进入神秘通道电能锯子x1
RegisterTask(10, 0, []model.ItemInfo{}, 0) // 神秘通道拼图(无奖励)
RegisterTask(12, 0, []model.ItemInfo{}, 0) // 精灵广场拿石头(无奖励)
RegisterTask(19, 0, []model.ItemInfo{{3, 3000}}, 0) // 先锋队招募积累经验x3000
RegisterTask(25, 0, []model.ItemInfo{{400501, 10}}, 0) // 新船员的考验神奇扭蛋牌x10
RegisterTask(8, 0, []data.ItemInfo{{500510, 1}}, 0) // 西塔的珍贵回忆记忆晶体x1
RegisterTask(9, 0, []data.ItemInfo{{100059, 1}}, 0) // 进入神秘通道电能锯子x1
RegisterTask(10, 0, []data.ItemInfo{}, 0) // 神秘通道拼图(无奖励)
RegisterTask(12, 0, []data.ItemInfo{}, 0) // 精灵广场拿石头(无奖励)
RegisterTask(19, 0, []data.ItemInfo{{3, 3000}}, 0) // 先锋队招募积累经验x3000
RegisterTask(25, 0, []data.ItemInfo{{400501, 10}}, 0) // 新船员的考验神奇扭蛋牌x10
RegisterTask(37, 0, []model.ItemInfo{ // 帕诺星系星球测绘
RegisterTask(37, 0, []data.ItemInfo{ // 帕诺星系星球测绘
{1, 3000}, // 赛尔豆x3000
{100178, 1}, // 勘察头盔x1
@@ -66,182 +66,182 @@ func init() {
{100181, 1}, // 勘察军靴x1
}, 0)
RegisterTask(47, 0, []model.ItemInfo{ // 突围磁风暴
RegisterTask(47, 0, []data.ItemInfo{ // 突围磁风暴
{3, 5000}, // 累积经验x5000
{1, 5000}, // 赛尔豆x5000
{500585, 1}, // 磁力光束枪台x1
}, 0)
RegisterTask(48, 0, []model.ItemInfo{ // 神秘失踪的爱丽丝
RegisterTask(48, 0, []data.ItemInfo{ // 神秘失踪的爱丽丝
{3, 3000}, // 累积经验x3000
{1, 2000}, // 赛尔豆x2000
//{700452, 2}, // 中型智慧芯片x2
}, 0)
RegisterTask(52, 0, []model.ItemInfo{ // 谁偷走了雪球能源?
RegisterTask(52, 0, []data.ItemInfo{ // 谁偷走了雪球能源?
{3, 3000}, // 累积经验x3000
{400021, 10}, // 雪球能源x10
{100254, 1}, // 斯诺纪念x1
}, 0)
RegisterTask(54, 0, []model.ItemInfo{ // 米鲁族的两个小不点
RegisterTask(54, 0, []data.ItemInfo{ // 米鲁族的两个小不点
{3, 5000}, // 累积经验x5000
{400021, 10}, // 雪球能源x10
}, 0)
RegisterTask(57, 0, []model.ItemInfo{ // 米鲁族食王选拔赛
RegisterTask(57, 0, []data.ItemInfo{ // 米鲁族食王选拔赛
{3, 3000}, // 累积经验x3000
{1, 3000}, // 赛尔豆x3000
}, 0)
RegisterTask(58, 0, []model.ItemInfo{ // 斯诺岩洞的不解之谜
RegisterTask(58, 0, []data.ItemInfo{ // 斯诺岩洞的不解之谜
{3, 3000}, // 累积经验x3000
{1, 3000}, // 赛尔豆x3000
{400021, 10}, // 雪球能源x10
}, 0)
RegisterTask(63, 0, []model.ItemInfo{ // 新型试作机SR-01同步调试
RegisterTask(63, 0, []data.ItemInfo{ // 新型试作机SR-01同步调试
{3, 3000}, // 累积经验x3000
{1, 3000}, // 赛尔豆x3000
}, 0)
RegisterTask(64, 0, []model.ItemInfo{ // 铸造斯诺冰冠
RegisterTask(64, 0, []data.ItemInfo{ // 铸造斯诺冰冠
{3, 3000}, // 累积经验x3000
{1, 3000}, // 赛尔豆x3000
{400021, 10}, // 雪球能源x10
}, 0)
RegisterTask(65, 0, []model.ItemInfo{ // 露希欧星勘察
RegisterTask(65, 0, []data.ItemInfo{ // 露希欧星勘察
{3, 3000}, // 累积经验x3000
{1, 3000}, // 赛尔豆x3000
}, 0)
RegisterTask(66, 0, []model.ItemInfo{ // 合金强化试验
RegisterTask(66, 0, []data.ItemInfo{ // 合金强化试验
{3, 3000}, // 累积经验x3000
{1, 3000}, // 赛尔豆x3000
}, 0)
RegisterTask(68, 0, []model.ItemInfo{ // 资料室的神秘事件
RegisterTask(68, 0, []data.ItemInfo{ // 资料室的神秘事件
{3, 3000}, // 累积经验x3000
{1, 3000}, // 赛尔豆x3000
}, 0)
RegisterTask(69, 0, []model.ItemInfo{ // 宇宙遭遇站
RegisterTask(69, 0, []data.ItemInfo{ // 宇宙遭遇站
{3, 3000}, // 累积经验x3000
{1, 3000}, // 赛尔豆x3000
}, 0)
RegisterTask(70, 0, []model.ItemInfo{ // 船体紧急修复
RegisterTask(70, 0, []data.ItemInfo{ // 船体紧急修复
{3, 3000}, // 累积经验x3000
{1, 3000}, // 赛尔豆x3000
}, 0)
RegisterTask(72, 0, []model.ItemInfo{ // 船长搜救任务
RegisterTask(72, 0, []data.ItemInfo{ // 船长搜救任务
{3, 2000}, // 累积经验x2000
{1, 1000}, // 赛尔豆x1000
}, 0)
RegisterTask(73, 0, []model.ItemInfo{ // 秘制改良机SR-02
RegisterTask(73, 0, []data.ItemInfo{ // 秘制改良机SR-02
{100303, 1}, // SR-02铠甲x1
{400055, 30}, // 变形能量块x30
{3, 3000}, // 累积经验x3000
}, 0)
RegisterTask(74, 0, []model.ItemInfo{{3, 3000}}, 0) // 露希欧星历险积累经验x3000
RegisterTask(74, 0, []data.ItemInfo{{3, 3000}}, 0) // 露希欧星历险积累经验x3000
RegisterTask(75, 0, []model.ItemInfo{ // 哈莫的童年片段一
RegisterTask(75, 0, []data.ItemInfo{ // 哈莫的童年片段一
{3, 3000}, // 累积经验x3000
{100324, 1}, // 龙之纪念x1
}, 0)
RegisterTask(79, 0, []model.ItemInfo{ // 寻找哈莫雷特的族人
RegisterTask(79, 0, []data.ItemInfo{ // 寻找哈莫雷特的族人
{3, 3000}, // 累积经验x3000
{1, 2000}, // 赛尔豆x2000
}, 0)
RegisterTask(80, 0, []model.ItemInfo{ // 重铸贾斯丁站长
RegisterTask(80, 0, []data.ItemInfo{ // 重铸贾斯丁站长
{3, 2000}, // 累积经验x2000
{1, 3000}, // 赛尔豆x3000
}, 0)
RegisterTask(81, 0, []model.ItemInfo{ // 守候宿命的追随者
RegisterTask(81, 0, []data.ItemInfo{ // 守候宿命的追随者
{3, 1000}, // 累积经验x1000
{1, 1000}, // 赛尔豆x1000
}, 0)
RegisterTask(83, 0, []model.ItemInfo{ // 光暗之迷
RegisterTask(83, 0, []data.ItemInfo{ // 光暗之迷
{3, 1000}, // 累积经验x1000
{1, 1000}, // 赛尔豆x1000
}, 0)
RegisterTask(84, 0, []model.ItemInfo{ // 星球改造计划
RegisterTask(84, 0, []data.ItemInfo{ // 星球改造计划
{3, 2000}, // 累积经验x2000
{1, 2000}, // 赛尔豆x2000
}, 0)
RegisterTask(89, 0, []model.ItemInfo{ // 试炼之塔的磨练
RegisterTask(89, 0, []data.ItemInfo{ // 试炼之塔的磨练
{3, 500}, // 累积经验x500
{1, 1000}, // 赛尔豆x1000
}, 0)
RegisterTask(91, 0, []model.ItemInfo{ // 月光下的约定
RegisterTask(91, 0, []data.ItemInfo{ // 月光下的约定
{3, 2000}, // 累积经验x2000
{1, 2000}, // 赛尔豆x2000
}, 246)
RegisterTask(93, 0, []model.ItemInfo{ // 云霄星的新来客
RegisterTask(93, 0, []data.ItemInfo{ // 云霄星的新来客
{3, 1000}, // 累积经验x1000
{1, 500}, // 赛尔豆x500
}, 0)
RegisterTask(94, 0, []model.ItemInfo{ // 初识星球能源
RegisterTask(94, 0, []data.ItemInfo{ // 初识星球能源
{3, 500}, // 累积经验x500
{1, 1000}, // 赛尔豆x1000
}, 0)
RegisterTask(96, 0, []model.ItemInfo{ // 旅途中的伙伴
RegisterTask(96, 0, []data.ItemInfo{ // 旅途中的伙伴
{3, 500}, // 累积经验x500
{1, 1000}, // 赛尔豆x1000
}, 0)
RegisterTask(97, 0, []model.ItemInfo{ // 我是音乐小麦霸
RegisterTask(97, 0, []data.ItemInfo{ // 我是音乐小麦霸
{3, 1000}, // 累积经验x1000
{1, 1000}, // 赛尔豆x1000
}, 0)
RegisterTask(98, 0, []model.ItemInfo{ // 尼布守卫战
RegisterTask(98, 0, []data.ItemInfo{ // 尼布守卫战
{3, 2000}, // 累积经验x2000
{1, 1000}, // 赛尔豆x1000
}, 0)
RegisterTask(201, 0, []model.ItemInfo{{100062, 1}}, 0) // 教官考核教官指挥棒x1
RegisterTask(300, 0, []model.ItemInfo{}, 300) // 领取谱尼真身谱尼的精元x1
RegisterTask(201, 0, []data.ItemInfo{{100062, 1}}, 0) // 教官考核教官指挥棒x1
RegisterTask(300, 0, []data.ItemInfo{}, 300) // 领取谱尼真身谱尼的精元x1
// -------------------------- 带精灵奖励的任务 --------------------------
RegisterTask(28, 0, []model.ItemInfo{}, 102) // 遗迹中的精灵信号奇塔类型102
RegisterTask(40, 0, []model.ItemInfo{}, 139) // 时空之门迪卢卡类型139
RegisterTask(28, 0, []data.ItemInfo{}, 102) // 遗迹中的精灵信号奇塔类型102
RegisterTask(40, 0, []data.ItemInfo{}, 139) // 时空之门迪卢卡类型139
RegisterTask(49, 0, []model.ItemInfo{ // 密林中的托尼(托尼+物品)
RegisterTask(49, 0, []data.ItemInfo{ // 密林中的托尼(托尼+物品)
// {700452, 2}, // 中型智慧芯片x2
}, 158) // 托尼类型158
RegisterTask(71, 0, []model.ItemInfo{ // 赛尔号大整修TOE+物品)
RegisterTask(71, 0, []data.ItemInfo{ // 赛尔号大整修TOE+物品)
{3, 1000}, // 累积经验x1000
{1, 1000}, // 赛尔豆x1000
}, 213) // TOE类型213
RegisterTask(92, 0, []model.ItemInfo{ // 站长归来(尼布+物品)
RegisterTask(92, 0, []data.ItemInfo{ // 站长归来(尼布+物品)
{3, 2000}, // 累积经验x2000
{1, 2000}, // 赛尔豆x2000
}, 95) // 尼布类型95
RegisterTask(133, 0, []model.ItemInfo{ // 寻找迷失的心(史空+物品)
RegisterTask(133, 0, []data.ItemInfo{ // 寻找迷失的心(史空+物品)
{3, 2000}, // 累积经验x2000
{1, 2000}, // 赛尔豆x2000
}, 381) // 史空类型381
// -------------------------- 多分支任务 --------------------------
RegisterTask(95, 1, []model.ItemInfo{ // 宇宙中的黑色旋涡分支1刺蜂套装
RegisterTask(95, 1, []data.ItemInfo{ // 宇宙中的黑色旋涡分支1刺蜂套装
{3, 4000}, // 累积经验x4000
{1, 2000}, // 赛尔豆x2000
{100346, 1}, // 刺蜂重盔x1
@@ -250,7 +250,7 @@ func init() {
{100349, 1}, // 刺蜂滚轮x1
}, 0)
RegisterTask(95, 2, []model.ItemInfo{ // 宇宙中的黑色旋涡分支2锡蝶套装
RegisterTask(95, 2, []data.ItemInfo{ // 宇宙中的黑色旋涡分支2锡蝶套装
{3, 4000}, // 累积经验x4000
{1, 2000}, // 赛尔豆x2000
{100350, 1}, // 锡蝶重盔x1

View File

@@ -1,11 +1,13 @@
package task
import "blazing/modules/blazing/model"
import (
"blazing/common/data"
)
type TaskResult struct {
PetTypeId uint32 `json:"petTypeId" description:"发放的精灵ID"` // 发放的精灵ID
ItemList []model.ItemInfo `json:"itemList" description:"发放物品的数组"` // 发放物品的数组,
ItemList []data.ItemInfo `json:"itemList" description:"发放物品的数组"` // 发放物品的数组,
}
var TaskResultMap = make(map[uint32]map[uint32]TaskResult)
@@ -27,9 +29,9 @@ func Get_Task_Info(v CompleteTaskInboundInfo) *TaskResult {
}
func init() {
// 定义通用奖励经验奖励ItemId:3数量20000
expReward := []model.ItemInfo{{ItemId: 3, ItemCnt: 20000}}
expReward := []data.ItemInfo{{ItemId: 3, ItemCnt: 20000}}
// 定义扭蛋牌奖励ItemId:400501数量5
eggReward := []model.ItemInfo{{ItemId: 400501, ItemCnt: 5}}
eggReward := []data.ItemInfo{{ItemId: 400501, ItemCnt: 5}}
// 批量初始化任务ID 401-407奖励均为经验
for taskID := 401; taskID <= 407; taskID++ {

View File

@@ -6,13 +6,6 @@ import (
const TableNamePlayerBagItem = "player_bag_item"
// ItemInfo
// 用于表示发放物品的信息
type ItemInfo struct {
ItemId uint32 `json:"itemId" description:"发放物品ID"` // 发放物品ID
ItemCnt uint32 `json:"itemCount" description:"发放物品的数量"` // 发放物品的数量,
}
// PlayerBagItem mapped from table <player_bag_item>
type Item struct {
*cool.Model

View File

@@ -11,22 +11,14 @@ const (
// PetReward 精灵奖励基础配置模型(核心存储结构,与数据库表字段一一对应)
type PetReward struct {
*cool.Model // 嵌入通用Model包含ID/创建时间/更新时间等通用字段保持与BossConfig一致
MonID int32 `gorm:"not null;comment:'BOSS对应的精灵ID'" json:"mon_id"`
Nature uint32 `gorm:"not null;default:0;comment:'BOSS属性-性格'" json:"nature"`
Effect []uint32 `gorm:"type:jsonb;not null;default:'[]';comment:'BOSS特性'" json:"effect"`
Lv int32 `gorm:"not null;comment:'BOSS等级LvHpMatchUser非0时此配置无效'" json:"lv"`
Color string `gorm:"comment:'BOSS颜色'" json:"color"`
IsEgg uint32 `gorm:"not null;default:0;comment:'是否蛋'" json:"is_egg"` //奖励是否为扭蛋奖励
}
// PetRewardEX 精灵奖励扩展配置模型(用于前端/业务层的复杂数据解析,继承基础模型)
type PetRewardEX struct {
PetReward // 嵌入基础精灵奖励模型
RewardName string `json:"reward_name"` // 奖励名称(前端展示用,非数据库存储字段)
RewardIcon string `json:"reward_icon"` // 奖励图标路径(前端展示用,非数据库存储字段)
DropRateDesc string `json:"drop_rate_desc"` // 掉落概率描述(如"10%概率获取",前端展示用)
*cool.Model // 嵌入通用Model包含ID/创建时间/更新时间等通用字段保持与BossConfig一致
IsEnabled uint32 `gorm:"not null;default:0;comment:'是否启用0-禁用 1-启用)'" json:"is_enabled"`
MonID int32 `gorm:"not null;comment:'BOSS对应的精灵ID'" json:"mon_id"`
DV int32 `gorm:"not null;default:0;comment:'成长值'" json:"dv"`
Nature uint32 `gorm:"not null;default:0;comment:'BOSS属性-性格'" json:"nature"`
Effect uint32 `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"` //奖励是否为扭蛋奖励
}
// TableName 指定PetReward对应的数据库表名遵循现有代码规范

View File

@@ -16,3 +16,10 @@ func NewPetRewardService() *PetRewardService {
},
}
}
func (s *PetRewardService) GetEgg() model.PetReward {
var item model.PetReward
cool.DBM(s.Model).Where("is_egg", 1).Where("is_enabled", 1).OrderRandom().Limit(1).Scan(&item)
return item
}

View File

@@ -1,6 +1,8 @@
package service
import (
"blazing/common/data"
"blazing/common/utils"
"blazing/cool"
"blazing/modules/config/model"
@@ -14,24 +16,50 @@ type ItemService struct {
//实现物品数量的获取
func (s *ItemService) GetItemCount(id uint32) uint32 {
func (s *ItemService) GetItemCount(id uint32) data.ItemInfo {
var item model.ItemGift
cool.DBM(s.Model).Where("id", id).Cache(gdb.CacheOption{
var res data.ItemInfo
cool.DBM(s.Model).Where("id", id).Where("is_enabled", 1).Cache(gdb.CacheOption{
// Duration: time.Hour,
Force: false,
}).Scan(&item)
if item.ItemID == 0 {
return 0
return res
}
res.ItemId = item.ItemID
res.ItemCnt = item.ItemMinCount
if item.ItemMaxCount != 0 {
return uint32(grand.N(int(item.ItemMinCount), int(item.ItemMaxCount)))
}
return item.ItemMinCount
}
res.ItemCnt = uint32(grand.N(int(item.ItemMinCount), int(item.ItemMaxCount)))
}
return res
}
func (s *ItemService) GetEgg(count uint32) []data.ItemInfo {
var item []model.ItemGift
cool.DBM(s.Model).Where("is_egg", 1).Where("is_enabled", 1).Cache(gdb.CacheOption{
// Duration: time.Hour,
Force: false,
}).Scan(&item)
rr := utils.RandomSlice(item, int(count))
var res = make([]data.ItemInfo, len(rr))
for _, v := range rr {
if v.ItemMaxCount != 0 {
v.ItemMinCount = uint32(grand.N(int(v.ItemMinCount), int(v.ItemMaxCount)))
}
res = append(res, data.ItemInfo{ItemId: v.ItemID, ItemCnt: v.ItemMinCount})
}
return res
}
func NewItemService() *ItemService {
return &ItemService{
&cool.Service{

View File

@@ -18,8 +18,6 @@ type PetFusionMaterialService struct {
*cool.Service // 嵌入通用Service继承基础CRUD方法
}
// NewPetFusionMaterialService 创建PetFusionMaterialService实例
func NewPetFusionMaterialService() *PetFusionMaterialService {
return &PetFusionMaterialService{
@@ -39,10 +37,10 @@ func (s *PetFusionMaterialService) Data(Material1 [4]uint32) uint32 {
fusions := service.DictInfoServiceS.GetData("fusion")
for _, v := range Material1 {
if v < 10000 {
//使用过小的道具
return 0
}
// if v < 10000 {
// //使用过小的道具
// return 0
// }
_, ok := fusions[v]
if !ok {
//todo使用了非法材料

View File

@@ -3,6 +3,9 @@ package service
import (
"blazing/cool"
"blazing/modules/config/model"
"context"
"github.com/gogf/gf/v2/frame/g"
)
type ShinyService struct {
@@ -13,6 +16,13 @@ func NewShinyService() *ShinyService {
return &ShinyService{
&cool.Service{
Model: model.NewColorfulSkin(),
InsertParam: func(ctx context.Context) g.MapStrAny {
admin := cool.GetAdmin(ctx)
userId := admin.UserId
return g.MapStrAny{
"author": userId,
}
},
},
}
}