From 523d835ac03983a8b62c874cc91b76ecebd28e23 Mon Sep 17 00:00:00 2001 From: xinian Date: Wed, 15 Apr 2026 14:44:46 +0800 Subject: [PATCH 1/3] =?UTF-8?q?boss=E5=B1=9E=E6=80=A7=E4=B8=A2=E5=A4=B1?= =?UTF-8?q?=EF=BC=8C=E5=85=A8=E9=83=A8=E8=A2=AB=E9=99=90=E5=88=B6=E5=B1=9E?= =?UTF-8?q?=E6=80=A7=E4=B8=8D=E8=83=BD=E8=B6=85=E8=B6=8A=EF=BC=8C=E5=BA=94?= =?UTF-8?q?=E8=AF=A5=E7=BB=99ai=E5=92=8C=E7=8E=A9=E5=AE=B6=E6=96=BD?= =?UTF-8?q?=E5=8A=A0=E4=B8=8D=E5=90=8C=E7=9A=84getinfo=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 道具扣除判断,因为判断扣完大于0,所以导致只剩一个的时候,道具成功使用但是不会扣除数量 --- logic/service/player/ai.go | 8 ++++++++ modules/player/service/item.go | 2 +- modules/player/service/pet_fusion_tx.go | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/logic/service/player/ai.go b/logic/service/player/ai.go index aab9d3d79..8917f1edb 100644 --- a/logic/service/player/ai.go +++ b/logic/service/player/ai.go @@ -1,8 +1,16 @@ package player +import "blazing/modules/player/model" + type AI_player struct { baseplayer CanCapture int BossScript string } + +func (p *AI_player) GetPetInfo(_ uint32) []model.PetInfo { + ret := make([]model.PetInfo, 0, len(p.Info.PetList)) + ret = append(ret, p.Info.PetList...) + return ret +} diff --git a/modules/player/service/item.go b/modules/player/service/item.go index 470502a77..9f6222992 100644 --- a/modules/player/service/item.go +++ b/modules/player/service/item.go @@ -61,7 +61,7 @@ func (s *ItemService) UPDATE(id uint32, count int) error { if ok { updateModel := s.dbm(s.Model).Where("item_id", id) if count < 0 { - updateModel = updateModel.Where("item_cnt + ? > 0", count) + updateModel = updateModel.Where("item_cnt + ? >= 0", count) } result, err := updateModel.Increment("item_cnt", count) diff --git a/modules/player/service/pet_fusion_tx.go b/modules/player/service/pet_fusion_tx.go index 5f2c8e60c..5abc44dc5 100644 --- a/modules/player/service/pet_fusion_tx.go +++ b/modules/player/service/pet_fusion_tx.go @@ -173,7 +173,7 @@ func updateItemCountTx(tx gdb.TX, userID uint32, id uint32, count int) error { Where("is_vip", cool.Config.ServerInfo.IsVip). Where("item_id", id) if count < 0 { - updateModel = updateModel.Where("item_cnt + ? > 0", count) + updateModel = updateModel.Where("item_cnt + ? >= 0", count) } result, err := updateModel.Increment("item_cnt", count) From 5a81534e840137628f6eaed4c072fd418867a3dd Mon Sep 17 00:00:00 2001 From: xinian Date: Wed, 15 Apr 2026 15:07:27 +0800 Subject: [PATCH 2/3] 1 --- logic/controller/action_扭蛋.go | 2 +- logic/service/player/pet.go | 26 +++++++++++++++---- logic/service/player/pet_test.go | 35 ++++++++++++++++++++++++++ modules/player/controller/robot/egg.go | 2 +- 4 files changed, 58 insertions(+), 7 deletions(-) diff --git a/logic/controller/action_扭蛋.go b/logic/controller/action_扭蛋.go index 6defce712..32c475e64 100644 --- a/logic/controller/action_扭蛋.go +++ b/logic/controller/action_扭蛋.go @@ -26,7 +26,7 @@ func (h Controller) EggGamePlay(data1 *C2S_EGG_GAME_PLAY, c *player.Player) (res if data1.EggNum > 10 || data1.EggNum <= 0 { return nil, errorcode.ErrorCode(errorcode.ErrorCodes.ErrSystemError) } - if r <= 0 || data1.EggNum >= r { + if r <= 0 || data1.EggNum > r { return nil, errorcode.ErrorCode(errorcode.ErrorCodes.ErrGachaTicketsInsufficient) } if err := c.Service.Item.UPDATE(400501, int(-data1.EggNum)); err != nil { diff --git a/logic/service/player/pet.go b/logic/service/player/pet.go index 7408a9049..11d3dd9e5 100644 --- a/logic/service/player/pet.go +++ b/logic/service/player/pet.go @@ -35,15 +35,32 @@ func (p *Player) AddPetExp(petInfo *model.PetInfo, addExp int64) { petInfo.Hp = utils.Min(currentHP, petInfo.MaxHp) } addExp = utils.Min(addExp, p.Info.ExpPool) + if addExp <= 0 { + return + } originalLevel := petInfo.Level - exp := int64(petInfo.Exp) + addExp p.Info.ExpPool -= addExp //减去已使用的经验 - gainedExp := exp //已获得的经验 - for exp >= int64(petInfo.NextLvExp) { + + remainingExp := addExp + for remainingExp > 0 { + needExp := petInfo.NextLvExp - petInfo.Exp + if needExp <= 0 { + petInfo.Exp = petInfo.NextLvExp + petInfo.Level++ + petInfo.Update(true) + continue + } + if remainingExp < needExp { + petInfo.Exp += remainingExp + break + } + + petInfo.Exp += needExp + remainingExp -= needExp petInfo.Level++ petInfo.Update(true) } - petInfo.Exp = (exp) + // 重新计算面板 if originalLevel != petInfo.Level { petInfo.CalculatePetPane(panelLimit) @@ -78,7 +95,6 @@ func (p *Player) AddPetExp(petInfo *model.PetInfo, addExp int64) { var petUpdateInfo info.UpdatePropInfo copier.Copy(&petUpdateInfo, petInfo) - petUpdateInfo.Exp = uint32(gainedExp) updateOutbound.Data = append(updateOutbound.Data, petUpdateInfo) p.SendPack(header.Pack(updateOutbound)) //准备包由各自发,因为协议不一样 diff --git a/logic/service/player/pet_test.go b/logic/service/player/pet_test.go index c054a6fcb..eaefa014a 100644 --- a/logic/service/player/pet_test.go +++ b/logic/service/player/pet_test.go @@ -87,3 +87,38 @@ func TestAddPetExpRecalculatesPanelForLevelAbove100(t *testing.T) { t.Fatalf("expected exp pool to be consumed normally, got %d", player.Info.ExpPool) } } + +func TestAddPetExpSmallRewardDoesNotJumpToMaxLevel(t *testing.T) { + petID := firstPetIDForTest(t) + petInfo := playermodel.GenPetInfo(petID, 31, 0, 0, 20, nil, 0) + if petInfo == nil { + t.Fatalf("failed to generate test pet") + } + + player := &Player{ + baseplayer: baseplayer{ + Info: &playermodel.PlayerInfo{ + ExpPool: 1_000_000, + }, + }, + } + + addExp := int64(100) + originalLevel := petInfo.Level + nextLevelNeed := petInfo.NextLvExp - petInfo.Exp + if addExp >= nextLevelNeed { + t.Fatalf("test setup invalid: addExp=%d should be smaller than next level need=%d", addExp, nextLevelNeed) + } + + player.AddPetExp(petInfo, addExp) + + if petInfo.Level != originalLevel { + t.Fatalf("expected level to stay at %d, got %d", originalLevel, petInfo.Level) + } + if petInfo.Exp != addExp { + t.Fatalf("expected current exp to increase by %d, got %d", addExp, petInfo.Exp) + } + if player.Info.ExpPool != 1_000_000-addExp { + t.Fatalf("expected exp pool to decrease by %d, got %d", addExp, player.Info.ExpPool) + } +} diff --git a/modules/player/controller/robot/egg.go b/modules/player/controller/robot/egg.go index bd685828b..553b2da2b 100644 --- a/modules/player/controller/robot/egg.go +++ b/modules/player/controller/robot/egg.go @@ -48,7 +48,7 @@ func init() { } havs := itemService.CheakItem(400501) - if havs <= int64(count) { + if havs < int64(count) { ctx.Send("扭蛋币不足,当前扭蛋币数量:" + gconv.String(havs)) return } From 61a135b3a707d9d5fbfe9e8521c151d74a442523 Mon Sep 17 00:00:00 2001 From: xinian Date: Wed, 15 Apr 2026 15:34:16 +0800 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=AE=A0=E7=89=A9?= =?UTF-8?q?=E5=8D=87=E7=BA=A7=E7=BB=8F=E9=AA=8C=E6=98=BE=E7=A4=BA=E4=B8=8E?= =?UTF-8?q?=E5=8A=A8=E6=80=81=E7=BB=93=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- logic/controller/pet_manage.go | 21 +++++++++----------- logic/service/player/pet.go | 22 ++++++--------------- logic/service/player/pet_test.go | 33 ++++++++++++++++++++++++++++++++ modules/player/model/pet.go | 15 ++++++++++++--- 4 files changed, 60 insertions(+), 31 deletions(-) diff --git a/logic/controller/pet_manage.go b/logic/controller/pet_manage.go index 2c5dd5a14..1aad93ff5 100644 --- a/logic/controller/pet_manage.go +++ b/logic/controller/pet_manage.go @@ -15,21 +15,18 @@ func petSetExpLimit(currentPet *playermodel.PetInfo) int64 { } simulatedPet := *currentPet - var allowedExp int64 + allowedExp := simulatedPet.NextLvExp - simulatedPet.Exp + if allowedExp < 0 { + allowedExp = 0 + } - for simulatedPet.Level < 100 { - needExp := simulatedPet.NextLvExp - simulatedPet.Exp - if needExp <= 0 { - simulatedPet.Exp = simulatedPet.NextLvExp - simulatedPet.Level++ - simulatedPet.Update(true) - continue - } - - allowedExp += needExp - simulatedPet.Exp += needExp + for simulatedPet.Level < 100 && simulatedPet.NextLvExp > 0 { simulatedPet.Level++ simulatedPet.Update(true) + if simulatedPet.Level >= 100 { + break + } + allowedExp += simulatedPet.NextLvExp } return allowedExp diff --git a/logic/service/player/pet.go b/logic/service/player/pet.go index 11d3dd9e5..c9346a781 100644 --- a/logic/service/player/pet.go +++ b/logic/service/player/pet.go @@ -39,27 +39,16 @@ func (p *Player) AddPetExp(petInfo *model.PetInfo, addExp int64) { return } originalLevel := petInfo.Level + allocatedExp := addExp p.Info.ExpPool -= addExp //减去已使用的经验 - remainingExp := addExp - for remainingExp > 0 { - needExp := petInfo.NextLvExp - petInfo.Exp - if needExp <= 0 { - petInfo.Exp = petInfo.NextLvExp - petInfo.Level++ - petInfo.Update(true) - continue - } - if remainingExp < needExp { - petInfo.Exp += remainingExp - break - } - - petInfo.Exp += needExp - remainingExp -= needExp + currentExp := petInfo.Exp + addExp + for currentExp >= petInfo.NextLvExp && petInfo.NextLvExp > 0 { petInfo.Level++ petInfo.Update(true) + currentExp -= petInfo.LvExp } + petInfo.Exp = currentExp // 重新计算面板 if originalLevel != petInfo.Level { @@ -95,6 +84,7 @@ func (p *Player) AddPetExp(petInfo *model.PetInfo, addExp int64) { var petUpdateInfo info.UpdatePropInfo copier.Copy(&petUpdateInfo, petInfo) + petUpdateInfo.Exp = uint32(allocatedExp) updateOutbound.Data = append(updateOutbound.Data, petUpdateInfo) p.SendPack(header.Pack(updateOutbound)) //准备包由各自发,因为协议不一样 diff --git a/logic/service/player/pet_test.go b/logic/service/player/pet_test.go index eaefa014a..d68af6425 100644 --- a/logic/service/player/pet_test.go +++ b/logic/service/player/pet_test.go @@ -122,3 +122,36 @@ func TestAddPetExpSmallRewardDoesNotJumpToMaxLevel(t *testing.T) { t.Fatalf("expected exp pool to decrease by %d, got %d", addExp, player.Info.ExpPool) } } + +func TestAddPetExpUsesDynamicPerLevelRequirement(t *testing.T) { + petID := firstPetIDForTest(t) + petInfo := playermodel.GenPetInfo(petID, 31, 0, 0, 20, nil, 0) + if petInfo == nil { + t.Fatalf("failed to generate test pet") + } + + initialNeed := petInfo.NextLvExp + if initialNeed <= 0 { + t.Fatalf("expected positive exp requirement, got %d", initialNeed) + } + + player := &Player{ + baseplayer: baseplayer{ + Info: &playermodel.PlayerInfo{ + ExpPool: 1_000_000, + }, + }, + } + + player.AddPetExp(petInfo, initialNeed) + + if petInfo.Level != 21 { + t.Fatalf("expected pet level to become 21, got %d", petInfo.Level) + } + if petInfo.Exp != 0 { + t.Fatalf("expected level-up to reset current level exp, got %d", petInfo.Exp) + } + if petInfo.NextLvExp == initialNeed { + t.Fatalf("expected next level exp to change after leveling, still %d", petInfo.NextLvExp) + } +} diff --git a/modules/player/model/pet.go b/modules/player/model/pet.go index ef0b47fc5..3414d3427 100644 --- a/modules/player/model/pet.go +++ b/modules/player/model/pet.go @@ -532,18 +532,20 @@ func (petinfo *PetInfo) Update(isup bool) { if evolveCount >= maxEvolveTimes { break } - // 进化完成后,统一更新经验(原逻辑保留) - petinfo.LvExp = petinfo.NextLvExp // 获取当前宠物形态的配置 basic, ok := xmlres.PetMAP[int(petinfo.ID)] // 配置不存在,直接退出循环 if !ok { break } - petinfo.NextLvExp = calculateExperience(petinfo.Level, basic.GetBasic()) if !isup { + petinfo.LvExp = calculatePreviousLevelExperience(petinfo.Level, basic.GetBasic()) + petinfo.NextLvExp = calculateExperience(petinfo.Level, basic.GetBasic()) return } + // 升级时保留上一等级需求,供经验结算使用。 + petinfo.LvExp = petinfo.NextLvExp + petinfo.NextLvExp = calculateExperience(petinfo.Level, basic.GetBasic()) // 检查是否满足进化条件 canEvolve := basic.EvolvesTo != 0 && // 有明确的进化目标 int(petinfo.Level) >= basic.EvolvingLv && // 等级达到进化要求 @@ -561,6 +563,13 @@ func (petinfo *PetInfo) Update(isup bool) { } +func calculatePreviousLevelExperience(level uint32, baseValue uint32) int64 { + if level <= 1 { + return 0 + } + return calculateExperience(level-1, baseValue) +} + // calculateExperience 计算指定等级和种族值所需的经验值 // level: 当前等级 // baseValue: 种族值