package logic import ( "ecs/proto/pb" "github.com/oylshe1314/framework/util" ) type PlayerTreasure struct { Uid uint64 `bson:"uid" key:"1"` Id uint32 `bson:"id"` Exp uint32 `bson:"exp"` Level uint32 `bson:"level"` RefineLevel uint32 `bson:"refine_level"` Holes1 []uint64 `bson:"holes"` Holes2 []uint64 `bson:"holes"` HeroUid uint64 `bson:"hero_id"` } func (this *PlayerTreasure) BuildMsgTreasure(deleted ...bool) *pb.Treasure { if len(deleted) > 0 && deleted[0] { return &pb.Treasure{Uid: this.Uid} } return &pb.Treasure{ Uid: this.Uid, Id: this.Id, Exp: this.Exp, Level: this.Level, RefineLevel: this.RefineLevel, Holes1: this.Holes1, Holes2: this.Holes2, HeroUid: this.HeroUid, } } func (this *Player) AddTreasures(treasureId, nums uint32, logType LogType) bool { var treasureTable = this.manager.tables.Treasure.Find1(int(treasureId)) if treasureTable == nil { this.manager.logger.Errorf("Table 'Treasure' was not found, treasureId: %d, level: %d", treasureId, 1) return false } var levelTable = this.manager.tables.TreasureLevel.Find3(treasureTable.Id, 1) if levelTable == nil { this.manager.logger.Errorf("Table 'TreasureLevel' was not found, treasureId %d, level: %d", treasureTable.Id, 1) return false } var refineTable = this.manager.tables.TreasureRefine.Find3(treasureTable.Id, 0) if refineTable == nil { this.manager.logger.Errorf("Table 'EquipRefine' was not fount, treasureId %d, level: %d", treasureTable.Id, 1) return false } if nums < 1 { nums = 1 } var changeList []*pb.TreasureChange for range nums { var treasure = &PlayerTreasure{ Uid: util.RandomUid(), Id: uint32(treasureTable.Id), Exp: 0, Level: uint32(levelTable.Level), RefineLevel: uint32(refineTable.RefineLevel), Holes1: make([]uint64, treasureTable.Holes1), Holes2: make([]uint64, treasureTable.Holes2), HeroUid: 0, } this.Treasure[treasure.Uid] = treasure this.SaveModel(treasure) changeList = append(changeList, &pb.TreasureChange{ChangeType: pb.ChangeType_Add, Treasure: treasure.BuildMsgTreasure()}) //this.CheckAchievement(proto.AchievementTypeEquipLevel, uint32(treasureTable.Level), 1) } _ = this.Send(uint16(pb.ModId_ModuleItem), uint16(pb.MsgId_ModItemTreasureChange), &pb.TreasureChangeListAck{ ChangeList: changeList, }) return true } func (this *Player) CheckTreasure(treasureId uint32, nums uint32) bool { for _, treasure := range this.Treasure { if treasure.Id == treasureId && treasure.Level <= 1 && treasure.RefineLevel == 0 && treasure.HeroUid == 0 { nums -= 1 if nums == 0 { return true } } } return false } func (this *Player) reduceTreasure(treasure *PlayerTreasure, logType LogType) *pb.TreasureChange { delete(this.Treasure, treasure.Uid) this.WipeModel(treasure) //if logType > LogTypeNone { // this.manager.eventManager.PlayerTreasureConsume(this, logType, treasure.Id, itemNum) //} return &pb.TreasureChange{ChangeType: pb.ChangeType_Delete, Treasure: treasure.BuildMsgTreasure()} } func (this *Player) ReduceTreasures(treasures map[uint64]*PlayerTreasure, logType LogType) { var changeList = make([]*pb.TreasureChange, 0, len(treasures)) for _, treasure := range treasures { changeList = append(changeList, this.reduceTreasure(treasure, logType)) } _ = this.Send(uint16(pb.ModId_ModuleItem), uint16(pb.MsgId_ModItemTreasureChange), &pb.TreasureChangeListAck{ChangeList: changeList}) } func (this *Player) ReduceTreasure(treasureId uint32, nums uint32, logType LogType) { var treasures = map[uint64]*PlayerTreasure{} for _, treasure := range this.Treasure { if treasure.Id == treasureId && treasure.Level <= 1 && treasure.RefineLevel == 0 && treasure.HeroUid == 0 { treasures[treasure.Uid] = treasure if uint32(len(treasures)) == nums { this.ReduceTreasures(treasures, logType) return } } } this.manager.logger.Error("Reduce treasure out of range, did not check before deducting?") } func (this *Player) BuildMsgTreasureListAck() *pb.TreasureListAck { var list []*pb.Treasure for _, treasure := range this.Treasure { list = append(list, treasure.BuildMsgTreasure()) } return &pb.TreasureListAck{TreasureList: list} }