```
feat(item): 出售物品后减少背包中对应物品数量 在处理物品出售逻辑时,增加调用 SubItem 方法以正确扣减玩家背包中的物品数量。 feat(map): 玩家离开地图时重置 Canmon 标志位 通过 atomic.StoreUint32 将玩家的 Canmon 状态设置为 0,确保线程安全。 fix(pet): 调整宠物经验增加逻辑并修复技能学习问题 重构 AddPetExp 方法逻辑,优化升级流程、技能学习机制,并修正经验显示
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)]
|
||||
|
||||
@@ -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"` // 最高试炼层
|
||||
|
||||
@@ -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"},
|
||||
}},
|
||||
},
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user