diff --git a/common/socket/errorcode/error.go b/common/socket/errorcode/error.go index 751d74b0..fdd24857 100644 --- a/common/socket/errorcode/error.go +++ b/common/socket/errorcode/error.go @@ -115,6 +115,10 @@ var ErrorCodes = enum.New[struct { ErrPokemonLevelTooLow ErrorCode `enum:"13007"` // 不能展示背包里的精灵! ErrCannotShowBagPokemon ErrorCode `enum:"13017"` + // 基地展示精灵数量已达上限! + ErrRoomShowPetLimit ErrorCode `enum:"13019"` + // 该精灵不在仓库中,无法设为基地展示! + ErrPetNotInWarehouse ErrorCode `enum:"13021"` // 你今天已经被吃掉过一回了,明天再来吧! ErrAlreadyEatenToday ErrorCode `enum:"17018"` // 该道具已经在使用中,无法重复使用。 diff --git a/logic/controller/inbound_map_room_nono.go b/logic/controller/inbound_map_room_nono.go index a4b8573c..38290c41 100644 --- a/logic/controller/inbound_map_room_nono.go +++ b/logic/controller/inbound_map_room_nono.go @@ -87,6 +87,14 @@ type C2S_RoomPetInfo struct { CatchTime uint32 `json:"catchTime"` } +// C2S_RoomPetShowToggle 基地展示精灵添加/移除请求 +type C2S_RoomPetShowToggle struct { + Head common.TomeeHeader `cmd:"2326" struc:"skip"` + CatchTime uint32 `json:"catchTime"` + PetID uint32 `json:"petID"` + Flag uint32 `json:"flag"` // 1=添加展示, 0=移除展示 +} + // C2S_BUY_FITMENT 定义请求或响应数据结构。 type C2S_BUY_FITMENT struct { Head common.TomeeHeader `cmd:"10004" struc:"skip"` diff --git a/logic/controller/pet_info.go b/logic/controller/pet_info.go index 18ec0f10..37019221 100644 --- a/logic/controller/pet_info.go +++ b/logic/controller/pet_info.go @@ -85,18 +85,17 @@ func (h Controller) PlayerShowPet( return } - // 仅允许仓库精灵展示:背包中的精灵直接拒绝 - if _, ok := player.FindPetBagSlot(data.CatchTime); ok { + // 仅允许背包精灵跟随:仓库中的精灵不允许跟随 + slot, found := player.FindPetBagSlot(data.CatchTime) + if !found { return nil, errorcode.ErrorCodes.ErrCannotShowBagPokemon } - ret := player.Service.Pet.PetInfoOneByCatchTime(data.CatchTime) - if ret == nil { + currentPet := slot.PetInfoPtr() + if currentPet == nil { return nil, errorcode.ErrorCodes.ErrPokemonNotExists } - currentPet := &ret.Data - player.SetPetDisplay(data.Flag, currentPet) player.GetSpace().RefreshUserInfo(player) result = buildPetShowOutboundInfo(data.Head.UserID, data.Flag, currentPet) diff --git a/logic/controller/room_info.go b/logic/controller/room_info.go index 7d29b378..7dfbb283 100644 --- a/logic/controller/room_info.go +++ b/logic/controller/room_info.go @@ -3,6 +3,7 @@ package controller import ( "blazing/common/socket/errorcode" "blazing/modules/player/model" + "blazing/modules/player/service" "blazing/logic/service/pet" "blazing/logic/service/player" @@ -32,17 +33,11 @@ func (h Controller) GetFitmentUsing(data *FitmentUseringInboundInfo, c *player.P func (h Controller) GetRoomPetShowInfo(data *PetRoomListInboundInfo, c *player.Player) (result *room.PetRoomListOutboundInfo, err errorcode.ErrorCode) { result = &room.PetRoomListOutboundInfo{} result.Pets = make([]pet.PetShortInfo, 0) - roomInfo := c.Service.Room.Get(data.TargetUserID) - for _, catchTime := range roomInfo.ShowPokemon { - petInfo := c.Service.Pet.PetInfoOneOther(data.TargetUserID, catchTime) - if petInfo.Data.ID == 0 { - continue - } + showPets := service.NewPetService(data.TargetUserID).GetShowPets() + for i := range showPets { var petShortInfo pet.PetShortInfo - copier.Copy(&petShortInfo, &petInfo.Data) - if petInfo.ID != 0 { - result.Pets = append(result.Pets, petShortInfo) - } + copier.Copy(&petShortInfo, &showPets[i].Data) + result.Pets = append(result.Pets, petShortInfo) } return } diff --git a/logic/controller/room_set.go b/logic/controller/room_set.go index 8a87b4ff..45a81a2b 100644 --- a/logic/controller/room_set.go +++ b/logic/controller/room_set.go @@ -2,11 +2,8 @@ package controller import ( "blazing/common/socket/errorcode" - "blazing/logic/service/pet" "blazing/logic/service/player" "blazing/logic/service/room" - - "github.com/jinzhu/copier" ) // SetFitment 设置基地家具摆放 @@ -18,29 +15,3 @@ func (h Controller) SetFitment(data *SET_FITMENT, c *player.Player) (result *roo c.Service.Room.Set(data.Fitments) return } - -// SetPet 设置基地展示的精灵 -// data: 包含精灵展示列表的输入信息 -// c: 当前玩家对象 -// 返回: 精灵展示列表和错误码 -func (h Controller) SetPet(data *C2S_PET_ROOM_SHOW, c *player.Player) (result *room.S2C_PET_ROOM_SHOW, err errorcode.ErrorCode) { - var showPetCatchTimes []uint32 - for _, petShowInfo := range data.PetShowList { - if petShowInfo.CatchTime != 0 { - showPetCatchTimes = append(showPetCatchTimes, petShowInfo.CatchTime) - } - } - c.Service.Room.Show(showPetCatchTimes) - result = &room.S2C_PET_ROOM_SHOW{} - result.PetShowList = make([]pet.PetShortInfo, 0, len(showPetCatchTimes)) - for _, catchTime := range showPetCatchTimes { - petInfo := c.Service.Pet.PetInfoOneByCatchTime(catchTime) - if petInfo == nil { - continue - } - var petShortInfo pet.PetShortInfo - copier.Copy(&petShortInfo, &petInfo.Data) - result.PetShowList = append(result.PetShowList, petShortInfo) - } - return -} diff --git a/logic/service/room/pet.go b/logic/service/room/pet.go index 510fd32c..752755aa 100644 --- a/logic/service/room/pet.go +++ b/logic/service/room/pet.go @@ -39,3 +39,9 @@ type C2S_RoomPetInfo struct { // CatchTime 精灵的捕获时间(Unix时间戳/前端自定义时间格式) CatchTime uint32 `json:"catchTime"` } + +// S2C_RoomPetShowToggle 基地展示精灵添加/移除响应 +type S2C_RoomPetShowToggle struct { + PetShowListLen uint32 `json:"PetShowListLen" struc:"sizeof=PetShowList"` + PetShowList []pet.PetShortInfo `json:"PetShowList"` +} diff --git a/modules/player/controller/admin/pet.go b/modules/player/controller/admin/pet.go index 4448469d..10c6f7ad 100644 --- a/modules/player/controller/admin/pet.go +++ b/modules/player/controller/admin/pet.go @@ -133,6 +133,34 @@ func (c *PetBagController) ModPrise(ctx context.Context, req *PriseReq) (res *co return } +type PetShowReq struct { + g.Meta `path:"/show" method:"POST"` + CatchTime uint32 `json:"catch_time"` + IsShow int `json:"is_show"` // 1=展示 0=取消展示 +} + +func (c *PetBagController) Show(ctx context.Context, req *PetShowReq) (res *cool.BaseRes, err error) { + admin := cool.GetAdmin(ctx) + res = &cool.BaseRes{} + if req.CatchTime == 0 { + err = fmt.Errorf("invalid catch_time") + return + } + if req.IsShow != 0 && req.IsShow != 1 { + req.IsShow = 0 + } + petSvc := service.NewPetService(uint32(admin.UserId)) + pet := petSvc.PetInfoOneByCatchTime(req.CatchTime) + if pet == nil { + err = fmt.Errorf("pet not found") + return + } + if !petSvc.UpdateIsShow(req.CatchTime, req.IsShow) { + err = fmt.Errorf("update failed") + } + return +} + type BuyPetReq struct { g.Meta `path:"/buy" method:"POST"` Cid uint32 `json:"id"` diff --git a/modules/player/model/pet.go b/modules/player/model/pet.go index 07903a47..0c4869bc 100644 --- a/modules/player/model/pet.go +++ b/modules/player/model/pet.go @@ -27,6 +27,7 @@ type Pet struct { PlayerID uint32 `gorm:"not null;index:idx_pet_by_player_id;comment:'所属玩家ID'" json:"player_id"` Free int `gorm:"not null;default:0;comment:'是否放生'" json:"free"` //"0为放入仓库,1为放生,2为上架 CatchTime uint32 `gorm:"not null;comment:'捕捉时间'" json:"catch_time"` //唯一键 + IsShow int `gorm:"not null;default:0;comment:'是否基地展示'" json:"is_show"` //1=基地展示 0=未展示 SalePrice uint32 `gorm:"not null;default:0;comment:'出售价格'" json:"sale_price"` SaleCount uint32 `gorm:"not null;default:0;comment:'出售次数'" json:"sale_count"` diff --git a/modules/player/model/room.go b/modules/player/model/room.go index 385b6749..99321330 100644 --- a/modules/player/model/room.go +++ b/modules/player/model/room.go @@ -22,9 +22,9 @@ type BaseHouse struct { // 基础关联字段 PlayerID uint64 `gorm:"not null;index:idx_player_house;comment:'所属玩家ID'" json:"player_id"` - // 核心业务字段 - // ShowPokemon 基地展示精灵ID列表(支持展示多个精灵) - ShowPokemon []uint32 `gorm:"type:jsonb;default:'[]';comment:'基地展示精灵ID列表'" json:"show_pokemon"` + // // 核心业务字段 + // // ShowPokemon 基地展示精灵ID列表(支持展示多个精灵) + // ShowPokemon []uint32 `gorm:"type:jsonb;default:'[]';comment:'基地展示精灵ID列表'" json:"show_pokemon"` UsedItems string `gorm:"type:jsonb;default:'{}';comment:'用户物品列表(物品ID:数量)'" json:"used_items"` @@ -57,11 +57,6 @@ type FitmentShowInfo struct { Status uint32 `json:"status"` } -// UpdateShowPokemon 更新基地展示精灵列表 -func (bh *BaseHouse) UpdateShowPokemon(pokemonIDs []uint32) { - bh.ShowPokemon = pokemonIDs -} - // --------------- 初始化创建表 --------------- func init() { // 初始化时创建基地房型表(与现有Talk表初始化逻辑一致) diff --git a/modules/player/service/pet.go b/modules/player/service/pet.go index d88e61de..132acc55 100644 --- a/modules/player/service/pet.go +++ b/modules/player/service/pet.go @@ -76,11 +76,39 @@ func (s *PetService) PetCount(flag int) int { return ret } +// GetShowPets 获取基地展示的精灵列表(is_show=1) +func (s *PetService) GetShowPets() []model.Pet { + var tt []model.Pet + if err := s.dbm_fix(s.Model).Where("is_show", 1).Scan(&tt); err != nil { + return nil + } + for i := range tt { + tt[i].Data.CatchTime = tt[i].CatchTime + } + return tt +} + +// UpdateIsShow 更新精灵基地展示状态 +func (s *PetService) UpdateIsShow(catchTime uint32, isShow int) bool { + res, err := s.dbm(s.Model). + Where("catch_time", catchTime). + Data("is_show", isShow). + Update() + if err != nil { + return false + } + r, _ := res.RowsAffected() + return r > 0 +} + func (s *PetService) UpdateFree(catchTime, fromFree, toFree uint32) bool { res, err := s.dbm(s.Model). Where("catch_time", catchTime). Where("free", fromFree). - Data("free", toFree). + Data(g.Map{ + "free": toFree, + "is_show": 0, // 放回背包/放生时取消基地展示 + }). Update() if err != nil { return false @@ -109,6 +137,7 @@ func (s *PetService) UpdatePrice(catchTime, price, free uint32) error { res, _ := s.dbm(s.Model).Where("catch_time", catchTime).Data(g.Map{ "sale_price": price, "free": free, + "is_show": 0, // 上架/下架时取消基地展示 }).Update() affected, _ := res.RowsAffected() if affected > 0 && free != 2 && feeRate != 0 { diff --git a/modules/player/service/room.go b/modules/player/service/room.go index 4ae482ad..747c4332 100644 --- a/modules/player/service/room.go +++ b/modules/player/service/room.go @@ -41,19 +41,6 @@ func (s *RoomService) Set(id []model.FitmentShowInfo) { ttt.PlayerID = uint64(s.userid) m.Save(ttt) -} -func (s *RoomService) Show(cactime []uint32) { - - //todo待测试 - var ttt model.BaseHouseEx - m := s.dbm(s.Model) - - m.Scan(&ttt) - ttt.ShowPokemon = cactime - - ttt.PlayerID = uint64(s.userid) - m.Save(ttt) - } // /添加进来的物品一定是保证存在的