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