package controller import ( "blazing/common/socket/errorcode" "blazing/logic/service/pet" "blazing/logic/service/player" "blazing/modules/player/model" "github.com/pointernil/bitset32" "github.com/samber/lo" ) // IsCollect 处理控制器请求。 func (h Controller) IsCollect( data *pet.C2S_IS_COLLECT, c *player.Player) (result *pet.S2C_IS_COLLECT, err errorcode.ErrorCode) { //这个时候player应该是空的 result = &pet.S2C_IS_COLLECT{ ID: data.Type, } c.Service.Task.Exec(uint32(1335), func(te *model.Task) bool { r := bitset32.From(te.Data) // 分支未完成时,标记完成并发放奖励 if r.Test(uint(data.Type)) { result.IsCom = 1 } return false }) _, ok := lo.Find([]uint32{1, 2, 3, 4, 301}, func(item uint32) bool { return data.Type == item }) if ok { res := c.Info.GetTask(1335 + int(data.Type)) //第一期 if res == model.Completed { result.IsCom = 1 } } return result, 0 } // 定义 Type 与合法 ID 集合的映射表,集中管理所有规则 var validTypeIDMap = map[int][]uint32{ 1: {1, 4, 7}, // Type1:合法ID为1、4、7 2: {71}, // Type2:合法ID为71 3: {275}, // Type3:合法ID为275 4: {669}, // Type4:合法ID为669(注:你之前提到的是670,确认是否笔误) 301: {1, 4, 7}, //精灵王计划 100: {856, 857, 858}, //测试 } // Collect 处理控制器请求。 func (h Controller) Collect( data *pet.C2S_PET_COLLECT, c *player.Player) (result *pet.S2C_PET_COLLECT, err errorcode.ErrorCode) { //这个时候player应该是空的 result = &pet.S2C_PET_COLLECT{ID: data.ID} res := c.Info.GetTask(1335 + int(data.Type)) //第一期 _, ok := lo.Find([]uint32{1, 2, 3, 4, 301}, func(item uint32) bool { return data.Type == item }) if res == model.Completed && ok { //这块是为了兼容旧版本 c.Service.Task.Exec(uint32(1335), func(te *model.Task) bool { r := bitset32.From(te.Data) r.Set(uint(data.Type)) te.Data = r.Bytes() return true }) return nil, errorcode.ErrorCode(errorcode.ErrorCodes.ErrSystemError) } validIDs, ok := validTypeIDMap[int(data.Type)] if !ok { // Type不在映射表中,返回系统错误 return nil, errorcode.ErrorCode(errorcode.ErrorCodes.ErrSystemError) } // 2. 判断ID是否在合法集合中 if !lo.Contains(validIDs, data.ID) { return nil, errorcode.ErrorCode(errorcode.ErrorCodes.ErrSystemError) } c.Service.Task.Exec(uint32(1335), func(te *model.Task) bool { r := bitset32.From(te.Data) // 分支未完成时,标记完成并发放奖励 if !r.Test(uint(data.Type)) { r.Set(uint(data.Type)) te.Data = r.Bytes() r := model.GenPetInfo(int(data.ID), -1, -1, 0, 1, nil, 0) c.Service.Pet.PetAdd(r, 0) result.CatchTime = r.CatchTime return true } return false }) if result.CatchTime == 0 { return nil, errorcode.ErrorCode(errorcode.ErrorCodes.ErrAwardAlreadyClaimed) } return result, 0 }