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))) for _, hero := range this.Hero { if hero.Id == roleHeroId { return hero } } return nil } 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} }