diff --git a/common/socket/ServerEvent.go b/common/socket/ServerEvent.go index 592c75e67..4496ee289 100644 --- a/common/socket/ServerEvent.go +++ b/common/socket/ServerEvent.go @@ -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 } diff --git a/logic/service/player/pet.go b/logic/service/player/pet.go index 857b314da..6fa631247 100644 --- a/logic/service/player/pet.go +++ b/logic/service/player/pet.go @@ -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 diff --git a/logic/service/user/Login.go b/logic/service/user/Login.go index f53fa5900..3b0f7e5bc 100644 --- a/logic/service/user/Login.go +++ b/logic/service/user/Login.go @@ -40,7 +40,7 @@ type LoginMSInfo struct { func NewOutInfo() *LoginMSInfo { l := &LoginMSInfo{ - PlayerInfo: *model.NewPlayerInfo(), + PlayerInfo: model.NewPlayerInfo(), } return l diff --git a/modules/blazing/model/pet.go b/modules/blazing/model/pet.go index 6a5b5217c..df5ddba60 100644 --- a/modules/blazing/model/pet.go +++ b/modules/blazing/model/pet.go @@ -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 精灵特性信息结构 // diff --git a/modules/blazing/model/player.go b/modules/blazing/model/player.go index 16fce0cfd..06fdb61bf 100644 --- a/modules/blazing/model/player.go +++ b/modules/blazing/model/player.go @@ -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 设置错误 } diff --git a/modules/blazing/service/info.go b/modules/blazing/service/info.go index b819801bf..1500b2a14 100644 --- a/modules/blazing/service/info.go +++ b/modules/blazing/service/info.go @@ -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)