```
refactor(socket): 优化TCP数据包处理逻辑并增加调试日志 - 修复 handleTcp 中条件判断的空格格式问题 - 在解码失败时增加详细 Debug 日志输出 - 完善不完整数据包时手动唤醒连接的处理流程 refactor(pet): 重构宠物经验系统与升级逻辑 - 将经验计算函数移至 model 层统一管理 - 优化 AddPetExp 方法逻辑,避免直接修改原字段 - 升级过程中正确扣减经验池并防止溢出 - 抽离 Update 方法用于处理宠物进化和经验更新 refactor(model): 调整 PlayerInfo 结构体引用方式及相关初始化逻辑 - 修改
This commit is contained in:
@@ -156,7 +156,7 @@ func (s *Server) handleTcp(conn gnet.Conn) (action gnet.Action) {
|
||||
data, err := s.codec.Decode(conn)
|
||||
if err != nil {
|
||||
|
||||
if err == codec.ErrIncompletePacket&&conn.InboundBuffered()>0 {
|
||||
if err == codec.ErrIncompletePacket && conn.InboundBuffered() > 0 {
|
||||
t, _ := conn.Peek(conn.InboundBuffered())
|
||||
cool.Loger.Debug(context.Background(), "断包", err.Error(), conn.InboundBuffered(), t)
|
||||
if err := conn.Wake(nil); err != nil { // wake up the connection manually to avoid missing the leftover data
|
||||
@@ -164,6 +164,7 @@ func (s *Server) handleTcp(conn gnet.Conn) (action gnet.Action) {
|
||||
return gnet.Close
|
||||
}
|
||||
} else {
|
||||
cool.Loger.Debug(context.Background(), "数据错误", err.Error(), conn.InboundBuffered())
|
||||
action = gnet.Close
|
||||
return
|
||||
}
|
||||
|
||||
@@ -2,71 +2,44 @@ package player
|
||||
|
||||
import (
|
||||
"blazing/common/data/xmlres"
|
||||
"blazing/common/utils"
|
||||
"blazing/logic/service/fight/info"
|
||||
"math/rand"
|
||||
"time"
|
||||
|
||||
"blazing/modules/blazing/model"
|
||||
"math"
|
||||
|
||||
"github.com/gogf/gf/v2/util/gconv"
|
||||
"github.com/jinzhu/copier"
|
||||
)
|
||||
|
||||
// calculateExperience 计算指定等级和种族值所需的经验值
|
||||
// level: 当前等级
|
||||
// baseValue: 种族值
|
||||
func calculateExperience(level uint32, baseValue uint32) uint32 {
|
||||
// 计算 A 部分:向上取整(3.75 * a * (a + 1))
|
||||
partA := math.Ceil(3.75 * float64(level) * float64(level+1))
|
||||
|
||||
// 计算 B 部分:向上取整(b * log(1 + a / 100))
|
||||
// 这里使用自然对数 math.Log,如果想换底数可以用换底公式
|
||||
partB := math.Log(1.0 + float64(level)/100.0)
|
||||
partB = float64(baseValue) * partB
|
||||
partB = math.Ceil(partB)
|
||||
|
||||
// 总经验是两部分之和,并向上取整
|
||||
totalExp := math.Ceil(partA + partB)
|
||||
return uint32(totalExp)
|
||||
}
|
||||
|
||||
// 主函数实现
|
||||
// 添加经验
|
||||
// 禁止发包
|
||||
func (p *Player) AddPetExp(petinfo *model.PetInfo, addExp uint32, bro bool) {
|
||||
|
||||
addExp = utils.Min(addExp, p.Info.ExpPool)
|
||||
originalLevel := petinfo.Level
|
||||
|
||||
petinfo.Exp += addExp
|
||||
Exp := petinfo.Exp + addExp
|
||||
petinfo.Update()
|
||||
p.Info.ExpPool -= addExp //减去已使用的经验
|
||||
for petinfo.Exp >= petinfo.NextLvExp {
|
||||
|
||||
for Exp >= petinfo.NextLvExp {
|
||||
petinfo.Level++
|
||||
petinfo.Update()
|
||||
Exp -= petinfo.LvExp
|
||||
if originalLevel < 100 && petinfo.Level == 100 { //升到100了
|
||||
p.Info.ExpPool += (petinfo.Exp) //减去已使用的经验
|
||||
petinfo.Exp = 0
|
||||
p.Info.ExpPool += Exp //减去已使用的经验
|
||||
Exp = 0
|
||||
break //停止升级
|
||||
}
|
||||
basic := xmlres.PetMAP[int(petinfo.ID)]
|
||||
// 检查是否可以进化
|
||||
if basic.EvolvesTo != 0 && // 有明确的进化
|
||||
int(petinfo.Level) >= basic.EvolvingLv && // 有明确的进化等级
|
||||
basic.IsLarge == 0 { // 非最终形态
|
||||
|
||||
petinfo.ID = uint32(basic.EvolvesTo)
|
||||
|
||||
}
|
||||
|
||||
petinfo.Exp -= petinfo.NextLvExp
|
||||
petinfo.LvExp = petinfo.NextLvExp
|
||||
petinfo.NextLvExp = calculateExperience(petinfo.Level, basic.GetBasic())
|
||||
}
|
||||
|
||||
petinfo.Exp = Exp
|
||||
// 重新计算面板
|
||||
if originalLevel != petinfo.Level {
|
||||
petinfo.Cure()
|
||||
|
||||
petinfo.CalculatePetPane()
|
||||
petinfo.Cure()
|
||||
}
|
||||
if bro {
|
||||
return
|
||||
|
||||
@@ -40,7 +40,7 @@ type LoginMSInfo struct {
|
||||
func NewOutInfo() *LoginMSInfo {
|
||||
|
||||
l := &LoginMSInfo{
|
||||
PlayerInfo: *model.NewPlayerInfo(),
|
||||
PlayerInfo: model.NewPlayerInfo(),
|
||||
}
|
||||
|
||||
return l
|
||||
|
||||
@@ -3,6 +3,7 @@ package model
|
||||
import (
|
||||
"blazing/common/data/xmlres"
|
||||
"blazing/cool"
|
||||
"math"
|
||||
)
|
||||
|
||||
const TableNamePet = "pet"
|
||||
@@ -133,6 +134,38 @@ func (pet *PetInfo) Cure() {
|
||||
}
|
||||
}
|
||||
}
|
||||
func (petinfo *PetInfo) Update() {
|
||||
basic := xmlres.PetMAP[int(petinfo.ID)]
|
||||
// 检查是否可以进化
|
||||
if basic.EvolvesTo != 0 && // 有明确的进化
|
||||
int(petinfo.Level) >= basic.EvolvingLv && // 有明确的进化等级
|
||||
basic.IsLarge == 0 { // 非最终形态
|
||||
|
||||
petinfo.ID = uint32(basic.EvolvesTo)
|
||||
|
||||
}
|
||||
|
||||
petinfo.LvExp = petinfo.NextLvExp
|
||||
petinfo.NextLvExp = calculateExperience(petinfo.Level, basic.GetBasic())
|
||||
}
|
||||
|
||||
// calculateExperience 计算指定等级和种族值所需的经验值
|
||||
// level: 当前等级
|
||||
// baseValue: 种族值
|
||||
func calculateExperience(level uint32, baseValue uint32) uint32 {
|
||||
// 计算 A 部分:向上取整(3.75 * a * (a + 1))
|
||||
partA := math.Ceil(3.75 * float64(level) * float64(level+1))
|
||||
|
||||
// 计算 B 部分:向上取整(b * log(1 + a / 100))
|
||||
// 这里使用自然对数 math.Log,如果想换底数可以用换底公式
|
||||
partB := math.Log(1.0 + float64(level)/100.0)
|
||||
partB = float64(baseValue) * partB
|
||||
partB = math.Ceil(partB)
|
||||
|
||||
// 总经验是两部分之和,并向上取整
|
||||
totalExp := math.Ceil(partA + partB)
|
||||
return uint32(totalExp)
|
||||
}
|
||||
|
||||
// PetEffectInfo 精灵特性信息结构
|
||||
// <!-- NewSeIdx: 精灵特效索引 (默认0: 无效) -->
|
||||
|
||||
@@ -16,7 +16,7 @@ type Player struct {
|
||||
}
|
||||
type PlayerEX struct {
|
||||
Player
|
||||
Data *PlayerInfo `orm:"data" json:"data"`
|
||||
Data PlayerInfo `orm:"data" json:"data"`
|
||||
}
|
||||
type Pos struct {
|
||||
X uint32 `struc:"uint32" default:"0"`
|
||||
@@ -33,15 +33,15 @@ type PeopleItemInfo struct {
|
||||
func (p *PeopleItemInfo) InitDefaults() {
|
||||
p.Level = 1 // 未知字段默认值1,与Java的@Builder.Default保持一致
|
||||
}
|
||||
func NewPlayerInfo() *PlayerInfo {
|
||||
l := &PlayerInfo{
|
||||
func NewPlayerInfo() PlayerInfo {
|
||||
l := PlayerInfo{
|
||||
|
||||
Clothes: make([]PeopleItemInfo, 0),
|
||||
PetList: make([]PetInfo, 0),
|
||||
}
|
||||
|
||||
// 自动填充 struct tag 里的 default 值
|
||||
if err := defaults.Set(l); err != nil {
|
||||
if err := defaults.Set(&l); err != nil {
|
||||
panic(err) // 方便发现 default 设置错误
|
||||
}
|
||||
|
||||
|
||||
@@ -59,7 +59,7 @@ func (s *UserService) Person(userid uint32) *model.PlayerInfo {
|
||||
panic(err)
|
||||
}
|
||||
ret := tt.Data
|
||||
return ret
|
||||
return &ret
|
||||
|
||||
}
|
||||
func (s *UserService) Save(data *model.PlayerInfo) {
|
||||
@@ -67,7 +67,7 @@ func (s *UserService) Save(data *model.PlayerInfo) {
|
||||
m := s.Model(s.info.Model)
|
||||
var tt model.PlayerEX
|
||||
m.Scan(&tt)
|
||||
tt.Data = data
|
||||
tt.Data = *data
|
||||
_, err := m.Update(tt)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
|
||||
Reference in New Issue
Block a user