Files
bl/modules/player/controller/robot/egg.go

150 lines
4.6 KiB
Go
Raw Normal View History

package robot
import (
"blazing/common/data"
"blazing/common/data/xmlres"
base "blazing/modules/base/service"
config "blazing/modules/config/service"
dictservice "blazing/modules/dict/service"
"blazing/modules/player/model"
"blazing/modules/player/service"
"strings"
"github.com/gogf/gf/v2/util/gconv"
"github.com/gogf/gf/v2/util/grand"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
)
func init() {
2026-04-02 10:23:07 +08:00
zero.OnCommand("扭蛋", zero.Type("message/group")).
Handle(func(ctx *zero.Ctx) {
msgs := strings.Fields(ctx.Event.Message.String())
if len(msgs) <= 1 {
return
}
count := gconv.Int(msgs[1])
if count > 10 {
count = 10
}
if count <= 0 {
return
}
user := base.NewBaseSysUserService().GetQQ(ctx.Event.Sender.ID)
if user == nil {
ctx.Send("未绑定,请先在个人中心绑定 token")
return
}
userID := uint32(user.ID)
itemService := service.NewItemService(userID)
infoService := service.NewInfoService(userID)
playerInfo := infoService.GetLogin()
if playerInfo == nil {
ctx.Send("未创建角色,请先登录游戏")
return
}
havs := itemService.CheakItem(400501)
2026-04-14 11:06:04 +08:00
if havs <= int64(count) {
ctx.Send("扭蛋币不足,当前扭蛋币数量:" + gconv.String(havs))
return
}
if err := itemService.UPDATE(400501, -count); err != nil {
ctx.Send("扭蛋币不足,当前扭蛋币数量:" + gconv.String(havs))
return
}
var buf strings.Builder
buf.WriteString("当前扭蛋币数量:" + gconv.String(havs) + "\n")
if grand.Meet(count, 100) {
r := config.NewPetRewardService().GetEgg()
newPet := model.GenPetInfo(int(r.MonID), int(r.DV), int(r.Nature), int(r.Effect), int(r.Lv), nil, 0)
if grand.Meet(1, 500) {
newPet.RandomByWeightShiny()
}
service.NewPetService(userID).PetAdd(newPet, 0)
buf.WriteString("恭喜你获得 " + xmlres.PetMAP[int(newPet.ID)].DefName + "\n")
}
items := config.NewItemService().GetEgg(count)
regularItems := make([]data.ItemInfo, 0, len(items))
itemIDs := make([]uint32, 0, len(items))
seenIDs := make(map[uint32]struct{}, len(items))
infoDirty := false
for _, item := range items {
switch item.ItemId {
case 1:
playerInfo.Coins += item.ItemCnt
infoDirty = true
buf.WriteString("恭喜你获得 " + xmlres.ItemsMAP[int(item.ItemId)].Name + ":" + gconv.String(item.ItemCnt) + "\n")
case 3:
playerInfo.ExpPool += item.ItemCnt
infoDirty = true
buf.WriteString("恭喜你获得 " + xmlres.ItemsMAP[int(item.ItemId)].Name + ":" + gconv.String(item.ItemCnt) + "\n")
case 5:
base.NewBaseSysUserService().UpdateGold(userID, item.ItemCnt*100)
buf.WriteString("恭喜你获得 " + xmlres.ItemsMAP[int(item.ItemId)].Name + ":" + gconv.String(item.ItemCnt) + "\n")
case 9:
playerInfo.EVPool += item.ItemCnt
infoDirty = true
buf.WriteString("恭喜你获得 " + xmlres.ItemsMAP[int(item.ItemId)].Name + ":" + gconv.String(item.ItemCnt) + "\n")
default:
regularItems = append(regularItems, item)
itemID := uint32(item.ItemId)
if _, ok := seenIDs[itemID]; ok {
continue
}
seenIDs[itemID] = struct{}{}
itemIDs = append(itemIDs, itemID)
}
}
if infoDirty {
infoService.Save(*playerInfo)
}
currentItems := itemService.CheakItemM(itemIDs...)
currentMap := make(map[uint32]int64, len(currentItems))
for _, item := range currentItems {
currentMap[item.ItemId] = item.ItemCnt
}
maxMap := dictservice.NewDictInfoService().GetMaxMap(itemIDs...)
addableItems := make([]data.ItemInfo, 0, len(regularItems))
pendingMap := make(map[uint32]int64, len(itemIDs))
for _, item := range regularItems {
itemID := uint32(item.ItemId)
itemMax := maxMap[itemID]
if itemMax == 0 {
buf.WriteString("未发放奖励:物品不存在 " + gconv.String(item.ItemId) + "\n")
continue
}
if currentMap[itemID]+pendingMap[itemID]+item.ItemCnt > int64(itemMax) {
buf.WriteString("未发放奖励:" + xmlres.ItemsMAP[int(item.ItemId)].Name + " 超出最大持有数量\n")
continue
}
pendingMap[itemID] += item.ItemCnt
addableItems = append(addableItems, item)
}
addedItems, err := itemService.AddItemsChecked(addableItems, currentMap)
if err != nil {
ctx.Send("扭蛋失败,请稍后再试")
return
}
for _, item := range addedItems {
buf.WriteString("恭喜你获得 " + xmlres.ItemsMAP[int(item.ItemId)].Name + ":" + gconv.String(item.ItemCnt) + "\n")
}
ctx.SendChain(message.At(ctx.Event.Sender.ID), message.Reply(ctx.Event.MessageID), message.Text(buf.String()))
})
}