feat(item): 出售物品后减少背包中对应物品数量

在处理物品出售逻辑时,增加调用 SubItem 方法以正确扣减玩家背包中的物品数量。

feat(map): 玩家离开地图时重置 Canmon 标志位

通过 atomic.StoreUint32 将玩家的 Canmon 状态设置为 0,确保线程安全。

fix(pet): 调整宠物经验增加逻辑并修复技能学习问题

重构 AddPetExp 方法逻辑,优化升级流程、技能学习机制,并修正经验显示
This commit is contained in:
2025-12-13 21:47:07 +08:00
parent 2ab7f59667
commit fe89620efb
11 changed files with 96 additions and 45 deletions

View File

@@ -270,8 +270,8 @@ func (pet *PetInfo) Downgrade(level uint32) {
}
// 执行进化逻辑
func (petinfo *PetInfo) Update() {
// 执行进化逻辑 ,是否进化
func (petinfo *PetInfo) Update(isup bool) {
// 最大进化次数限制(防止配置表闭环导致死循环)
maxEvolveTimes := 10
@@ -283,14 +283,18 @@ func (petinfo *PetInfo) Update() {
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 {
return
}
// 检查是否满足进化条件
canEvolve := basic.EvolvesTo != 0 && // 有明确的进化目标
int(petinfo.Level) >= basic.EvolvingLv && // 等级达到进化要求
@@ -308,19 +312,6 @@ func (petinfo *PetInfo) Update() {
}
// 传入bool则不升级
// Update 改造为循环进化:直到宠物无法再进化为止,再更新经验
// t ...bool原参数逻辑len(t)==0时触发进化检查否则仅更新经验
func (petinfo *PetInfo) Update_EXP() {
// 进化完成后,统一更新经验(原逻辑保留)
petinfo.LvExp = petinfo.NextLvExp
// 获取最终形态的宠物配置,计算下一等级经验
basic := xmlres.PetMAP[int(petinfo.ID)]
petinfo.NextLvExp = calculateExperience(petinfo.Level, basic.GetBasic())
}
// calculateExperience 计算指定等级和种族值所需的经验值
// level: 当前等级
// baseValue: 种族值
@@ -485,7 +476,7 @@ func GenPetInfo(
// ---- 属性计算 ----
p.CalculatePetPane(true)
p.Update_EXP()
p.Update(false)
return p
}

View File

@@ -2,7 +2,6 @@ package model
import (
"blazing/common/data/xmlres"
"blazing/common/utils"
)
// 实现获取等级范围内可学习的技能
@@ -35,7 +34,16 @@ func (c *PetInfo) calculatePetPanelSize(base, ev uint32, natureCorrect float64)
// 计算生成面板,只允许第一次生成超过100比如boss,不允许额外超过
func (p *PetInfo) CalculatePetPane(frist bool) {
if !frist {
p.Level = utils.Min(p.Level, 100)
if p.Level > 100 {
oldlveel := p.Level
p.Level = 100
defer func() {
p.Level = oldlveel
}()
}
}
naxml := xmlres.NatureRootMap[int(p.Nature)]
petxml := xmlres.PetMAP[int(p.ID)]

View File

@@ -158,7 +158,7 @@ type PlayerInfo struct {
AllPetNumber uint32 `struc:"uint32" json:"all_pet_number"` // 精灵数量
MonKingWin uint32 `struc:"uint32" json:"mon_king_win"` // 精灵王胜场
MessWin uint32 `struc:"skip" json:"mess_win"` // 大乱斗胜场
CurrentStage uint32 `struc:"uint32" json:"current_stage"` // 勇者之塔层数
CurrentStage uint32 `struc:"uint32" default:"1" json:"current_stage"` // 勇者之塔层数
MaxStage uint32 `struc:"uint32" json:"max_stage"` // 试炼之塔最高层
CurrentFreshStage uint32 `struc:"uint32" json:"current_fresh_stage"` // 当前试炼层数
MaxFreshStage uint32 `struc:"uint32" json:"max_fresh_stage"` // 最高试炼层

View File

@@ -151,6 +151,8 @@ func NewInfoService(id uint32) *InfoService {
Service: &cool.Service{Model: model.NewPlayer(), UniqueKey: map[string]string{
"player_id": "角色名称不能重复",
}, PageQueryOp: &cool.QueryOp{
FieldEQ: []string{"player_id"},
}},
},
}