package controller import ( "blazing/common/data/xmlres" "blazing/common/socket/errorcode" "blazing/logic/service/pet" "blazing/logic/service/player" "blazing/modules/blazing/model" "github.com/jinzhu/copier" ) // 获取精灵信息 func (h *Controller) GetPetInfo( data *pet.InInfo, c *player.Player) (result *pet.OutInfo, err errorcode.ErrorCode) { //这个时候player应该是空的 for _, pi := range c.Info.PetList { if pi.CatchTime == data.CatchTime { result = &pet.OutInfo{ PetInfo: pi, } } } if result == nil { result = &pet.OutInfo{ PetInfo: c.Service.PetInfo_One(data.CatchTime).Data, } } return result, 0 } // 获取仓库列表 func (h *Controller) GetPetList( data *pet.GetPetListInboundEmpty, c *player.Player) (result *pet.GetPetListOutboundInfo, err errorcode.ErrorCode) { //这个时候player应该是空的 result = &pet.GetPetListOutboundInfo{} tt := c.Service.PetInfo(0) //获得未放生的精灵 result.ShortInfoList = make([]pet.PetShortInfo, len(tt)) for i, v := range tt { copier.Copy(&result.ShortInfoList[i], &v) } return result, 0 } // 精灵背包仓库切换 func (h *Controller) PetRelease( data *pet.PetReleaseInboundInfo, c *player.Player) ( result *pet.PetReleaseOutboundInfo, err errorcode.ErrorCode) { //这个时候player应该是空的 //放入背包=数据库置1+添加到背包+pet release发包 仓库=数据库置0+移除背包 设置首发等于取到首发精灵后重新排序 //这里只修改,因为添加和移除背包在宠物获取时已经做了 result = &pet.PetReleaseOutboundInfo{} result.Flag = uint32(data.Flag) c.Service.PetInfo_One_exec(data.CatchTime, func(t *model.PetEX) { t.InBag = int(data.Flag) }) switch data.Flag { case 0: removeIndex := -1 for i, v := range c.Info.PetList { if v.CatchTime == uint32(data.CatchTime) { removeIndex = i break // 只移除第一个匹配值,若需移除所有,可省略 break 继续循环 } } if removeIndex != -1 { c.Info.PetList = append(c.Info.PetList[:removeIndex], c.Info.PetList[removeIndex+1:]...) } case 1: //todo 背包 c.Service.PetInfo_One_exec(data.CatchTime, func(t *model.PetEX) { c.Info.PetList = append(c.Info.PetList, t.Data) result.PetInfo = t.Data }) } if len(c.Info.PetList) > 0 { result.FirstPetTime = c.Info.PetList[0].CatchTime //设置首发 } //service.NewUserService(c.Info.UserID).PetAdd( *r) return result, 0 } // 精灵展示 func (h *Controller) PlayerShowPet( data *pet.PetShowInboundInfo, c *player.Player) (result *pet.PetShowOutboundInfo, err errorcode.ErrorCode) { //这个时候player应该是空的 results := pet.PetShowOutboundInfo{} for _, pi := range c.Info.PetList { if pi.CatchTime == data.CatchTime { copier.Copy(&results, pi) results.Flag = data.Flag results.UserID = data.Head.UserID data.Broadcast(c.Info.MapID, results) //同步广播 } } return result, -1 } func (h *Controller) PetOneCure( data *pet.PetOneCureInboundInfo, c *player.Player) (result *pet.PetOneCureOutboundInfo, err errorcode.ErrorCode) { //这个时候player应该是空的 _, onpet, ok := FindWithIndex(c.Info.PetList, func(item model.PetInfo) bool { return item.CatchTime == data.CatchTime }) if ok { onpet.Hp = onpet.MaxHp for i := 0; i < 4; i++ { maxPP, ok := xmlres.SkillMap[int(onpet.SkillList[i].ID)] // 恢复至最大PP值(从配置表获取) if onpet.SkillList[i].ID != 0 && ok { onpet.SkillList[i].PP = uint32(maxPP.MaxPP) } } } return &pet.PetOneCureOutboundInfo{ CatchTime: data.CatchTime, }, 0 } // 精灵首发 func (h *Controller) PetFirst( data *pet.PetDefaultInboundInfo, c *player.Player) (result *pet.PetDefaultOutboundInfo, err errorcode.ErrorCode) { //这个时候player应该是空的 result = &pet.PetDefaultOutboundInfo{} var ttt []model.PetInfo for index, pi := range c.Info.PetList { if pi.CatchTime == data.CatchTime { ttt = append(ttt, pi) ttt = append(ttt, c.Info.PetList[:index]...) ttt = append(ttt, c.Info.PetList[index+1:]...) result.IsDefault = 1 break } } c.Info.PetList = ttt return result, 0 } // FindWithIndex 遍历slice,找到第一个满足条件的元素 // 返回:索引、元素指针、是否找到 func FindWithIndex[T any](slice []T, predicate func(item T) bool) (int, *T, bool) { for i := range slice { if predicate(slice[i]) { return i, &slice[i], true } } return -1, nil, false }