147 lines
3.7 KiB
Go
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}
|
|
}
|