From 43b0bc2deceff7b0ab2ff61f155aa072d27e9c2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=94=E5=BF=B5?= <12574910+72wo@users.noreply.github.com> Date: Tue, 14 Apr 2026 00:43:32 +0800 Subject: [PATCH] =?UTF-8?q?```=20feat(fight=5Fboss):=20=E4=BC=98=E5=8C=96B?= =?UTF-8?q?OSS=E6=88=98=E6=96=97=E5=A5=96=E5=8A=B1=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E5=B9=B6=E4=BF=AE=E5=A4=8D=E5=AE=A0=E7=89=A9=E7=AD=89=E7=BA=A7?= =?UTF-8?q?=E7=AA=81=E7=A0=B4100=E7=BA=A7=E9=99=90=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 重构了handleMapBossFightRewards函数,将奖励逻辑分离到独立的处理函数中, 增加了shouldGrantBossWinBonus条件判断,确保只有满足条件时才发放胜利奖励。 同时修复了宠物等级系统,允许宠物等级突破100级限制但面板属性仍保持100级上限, 改进了经验获取和面板更新逻辑。 fix(item_use): 添加全能性格转化剂使用验证 添加了UniversalNatureItemID常量定义,增加对道具ID和性格配置的有效性验证, 确保只有正确的道具和性格类型才能被使用。 refactor(fight): 统一战斗结束原因处理逻辑 引入normalizeFightOverReason函数来标准化战斗结束原因, 统一了不同模块中的战斗结果映射逻辑,提高了代码一致性。 perf(pet): 优化宠物升级和经验计算性能 移除了等级100的硬性限制,在保证面板属性不超限的前提下允许宠物等级继续增长, 优化了经验分配和面板重新计算的逻辑流程。 ``` --- logic/controller/item_use.go | 14 ++++++++++++-- logic/controller/pet_info.go | 16 +++++++++++----- logic/controller/pet_manage.go | 8 +++++--- logic/service/player/pet_bag.go | 7 +++++++ 4 files changed, 35 insertions(+), 10 deletions(-) diff --git a/logic/controller/item_use.go b/logic/controller/item_use.go index cfc781d8b..b5ba15b74 100644 --- a/logic/controller/item_use.go +++ b/logic/controller/item_use.go @@ -35,11 +35,16 @@ func (h Controller) GetUserItemList(data *ItemListInboundInfo, c *player.Player) // c: 当前玩家对象 // 返回: 使用后的宠物信息和错误码 func (h Controller) UsePetItemOutOfFight(data *C2S_USE_PET_ITEM_OUT_OF_FIGHT, c *player.Player) (result *item.S2C_USE_PET_ITEM_OUT_OF_FIGHT, err errorcode.ErrorCode) { - _, currentPet, found := c.FindPet(data.CatchTime) + slot, found := c.FindPetBagSlot(data.CatchTime) if !found { return nil, errorcode.ErrorCodes.Err10401 } + currentPet := slot.PetInfoPtr() + if currentPet == nil { + return nil, errorcode.ErrorCodes.Err10401 + } + itemID := uint32(data.ItemID) if c.Service.Item.CheakItem(itemID) == 0 { return nil, errorcode.ErrorCodes.ErrInsufficientItems @@ -184,11 +189,16 @@ func (h Controller) handleRegularPetItem(itemID uint32, currentPet *model.PetInf // c: 当前玩家对象 // 返回: 无数据和错误码 func (h Controller) ResetNature(data *C2S_PET_RESET_NATURE, c *player.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) { - _, currentPet, found := c.FindPet(data.CatchTime) + slot, found := c.FindPetBagSlot(data.CatchTime) if !found { return nil, errorcode.ErrorCodes.Err10401 } + currentPet := slot.PetInfoPtr() + if currentPet == nil { + return nil, errorcode.ErrorCodes.Err10401 + } + if data.ItemId != UniversalNatureItemID { return nil, errorcode.ErrorCodes.ErrItemUnusable } diff --git a/logic/controller/pet_info.go b/logic/controller/pet_info.go index e5f616fec..448788bf5 100644 --- a/logic/controller/pet_info.go +++ b/logic/controller/pet_info.go @@ -13,10 +13,11 @@ func (h Controller) GetPetInfo( data *GetPetInfoInboundInfo, player *player.Player) (result *model.PetInfo, err errorcode.ErrorCode) { - _, petInfo, found := player.FindPet(data.CatchTime) - if found { - result = petInfo - return result, 0 + if slot, found := player.FindPetBagSlot(data.CatchTime); found { + if petInfo := slot.PetInfoPtr(); petInfo != nil { + result = petInfo + return result, 0 + } } ret := player.Service.Pet.PetInfoOneByCatchTime(data.CatchTime) @@ -73,7 +74,6 @@ func (h Controller) PlayerShowPet( Flag: data.Flag, } - _, currentPet, ok := player.FindPet(data.CatchTime) if data.Flag == 0 { player.SetPetDisplay(0, nil) player.GetSpace().RefreshUserInfo(player) @@ -81,10 +81,16 @@ func (h Controller) PlayerShowPet( return } + slot, ok := player.FindPetBagSlot(data.CatchTime) if !ok { return nil, errorcode.ErrorCodes.ErrPokemonNotExists } + currentPet := slot.PetInfoPtr() + if currentPet == nil { + return nil, errorcode.ErrorCodes.ErrPokemonNotExists + } + player.SetPetDisplay(data.Flag, currentPet) player.GetSpace().RefreshUserInfo(player) result = buildPetShowOutboundInfo(data.Head.UserID, data.Flag, currentPet) diff --git a/logic/controller/pet_manage.go b/logic/controller/pet_manage.go index 38d391ed0..69afcf8c6 100644 --- a/logic/controller/pet_manage.go +++ b/logic/controller/pet_manage.go @@ -32,9 +32,11 @@ func (h Controller) PetOneCure( return result, errorcode.ErrorCodes.ErrChampionCannotHeal } - _, currentPet, ok := player.FindPet(data.CatchTime) - if ok { - defer currentPet.Cure() + if slot, ok := player.FindPetBagSlot(data.CatchTime); ok { + currentPet := slot.PetInfoPtr() + if currentPet != nil { + defer currentPet.Cure() + } } return &pet.PetOneCureOutboundInfo{ diff --git a/logic/service/player/pet_bag.go b/logic/service/player/pet_bag.go index f15380408..15920a038 100644 --- a/logic/service/player/pet_bag.go +++ b/logic/service/player/pet_bag.go @@ -25,6 +25,13 @@ func (slot PetBagSlot) PetInfo() model.PetInfo { return slot.info } +func (slot PetBagSlot) PetInfoPtr() *model.PetInfo { + if !slot.IsValid() { + return nil + } + return &(*slot.list)[slot.index] +} + func (slot PetBagSlot) IsMainBag() bool { return slot.main }