ecs/servers/game/logic/player_hero.go
2025-07-16 10:05:22 +08:00

147 lines
3.7 KiB
Go

package logic
import (
"ecs/proto/pb"
"github.com/oylshe1314/framework/util"
)
type Attrs [pb.AttrType_AttrNums]uint64
type PlayerHero struct {
Uid uint64 `json:"uid" key:"1"`
Id uint32 `bson:"id"`
Exp uint64 `bson:"exp"`
Level uint32 `bson:"level"`
BreakLevel uint32 `bson:"break_level"`
SoulLevel uint32 `bson:"soul_level"`
SoulSkill []uint32 `bson:"soul_skill"`
Awaken uint32 `bson:"awaken"`
InLineup uint32 `bson:"in_lineup"`
attrs Attrs
}
func (this *PlayerHero) BuildMsgHero(deleted ...bool) *pb.Hero {
if len(deleted) > 0 && deleted[0] {
return &pb.Hero{Uid: this.Uid}
}
return &pb.Hero{
Uid: this.Uid,
Id: this.Id,
Exp: this.Exp,
Level: this.Level,
BreakLevel: this.BreakLevel,
SoulLevel: this.SoulLevel,
SoulSkill: this.SoulSkill,
Awaken: this.Awaken,
InLineup: this.InLineup,
Attrs: this.attrs[:],
}
}
func (this *PlayerHero) Attrs() Attrs {
return this.attrs
}
func (this *Player) RoleHero() *PlayerHero {
var roleHeroId = uint32(this.manager.tables.ServerConfig.GetInitRole(int(this.RoleGender)))
return util.MapFindValue(this.Hero, func(hero *PlayerHero) bool {
return hero.Id == roleHeroId
})
}
func (this *Player) AddHero(heroId uint32) bool {
var heroTable = this.manager.tables.Hero.Find1(int(heroId))
if heroTable == nil {
this.manager.Logger().Error("Find hero table failed, heroId: ", heroId)
return false
}
var hero = &PlayerHero{
Uid: util.RandomUid(),
Id: uint32(heroTable.Id),
}
if heroTable.Level > 0 {
hero.Level = 1
}
this.updateHeroAttrs(hero, nil, nil)
this.Hero[hero.Uid] = hero
this.SaveModel(hero)
_ = this.Send(pb.ModId_ModuleHero, pb.MsgId_ModHeroChange, &pb.HeroChangeListAck{
ChangeList: []*pb.HeroChange{{ChangeType: pb.ChangeType_Add, Hero: hero.BuildMsgHero()}},
})
this.addHeroBook(uint32(heroTable.Id))
return true
}
func (this *Player) AddHeroes(heroId, nums uint32) bool {
var heroTable = this.manager.tables.Hero.Find1(int(heroId))
if heroTable == nil {
this.manager.Logger().Error("Find hero table failed, heroId: ", heroId)
return false
}
var level uint32 = 0
if heroTable.Level > 0 {
level = 1
}
var changeList []*pb.HeroChange
for range nums {
var hero = &PlayerHero{
Uid: util.RandomUid(),
Id: uint32(heroTable.Id),
Level: level,
}
this.updateHeroAttrs(hero, nil, nil)
this.Hero[hero.Uid] = hero
this.SaveModel(hero)
changeList = append(changeList, &pb.HeroChange{ChangeType: pb.ChangeType_Add, Hero: hero.BuildMsgHero()})
//this.CheckAchievement(proto.AchievementTypeEquipLevel, uint32(equipTable.Level), 1)
}
_ = this.Send(pb.ModId_ModuleHero, pb.MsgId_ModHeroChange, &pb.HeroChangeListAck{
ChangeList: changeList,
})
this.addHeroBook(uint32(heroTable.Id))
return true
}
func (this *Player) reduceHero(hero *PlayerHero, logType LogType) *pb.HeroChange {
delete(this.Hero, hero.Uid)
this.WipeModel(hero)
//if logType > LogTypeNone {
// this.manager.eventManager.PlayerHeroConsume(this, logType, hero.Id, itemNum)
//}
return &pb.HeroChange{ChangeType: pb.ChangeType_Delete, Hero: hero.BuildMsgHero()}
}
func (this *Player) ReduceHeroes(heroes map[uint64]*PlayerHero, logType LogType) {
var changeList = make([]*pb.HeroChange, 0, len(heroes))
for _, hero := range heroes {
changeList = append(changeList, this.reduceHero(hero, logType))
}
_ = this.Send(pb.ModId_ModuleHero, pb.MsgId_ModHeroChange, &pb.HeroChangeListAck{ChangeList: changeList})
}
func (this *Player) BuildMsgHeroListAck() *pb.HeroListAck {
var list = make([]*pb.Hero, 0, len(this.Hero))
for _, hero := range this.Hero {
list = append(list, hero.BuildMsgHero())
}
return &pb.HeroListAck{HeroList: list}
}