package stonehenge import ( "go_dreamfactory/comm" "go_dreamfactory/lego/core" "go_dreamfactory/lego/sys/event" "go_dreamfactory/lego/sys/mgo" "go_dreamfactory/modules" "go_dreamfactory/pb" "go_dreamfactory/utils" "sync" "go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/x/bsonx" ) const ( StoneBossKey = "StoneBossKey" ) // 石阵秘境 type MStonehenge struct { modules.MCompModel module *Stonehenge lock sync.RWMutex bossStage map[int32]*pb.StageData } //组件初始化接口 func (this *MStonehenge) Init(service core.IService, module core.IModule, comp core.IModuleComp, opt core.IModuleOptions) (err error) { this.TableName = comm.TableStonehenge this.MCompModel.Init(service, module, comp, opt) this.module = module.(*Stonehenge) this.bossStage = make(map[int32]*pb.StageData) //创建uid索引 this.DB.CreateIndex(core.SqlTable(this.TableName), mongo.IndexModel{ Keys: bsonx.Doc{{Key: "uid", Value: bsonx.Int32(1)}}, }) return } func (this *MStonehenge) Start() (err error) { err = this.MCompModel.Start() event.RegisterGO(core.Event_ServiceStartEnd, func() { err = this.reLoadStoneBoos() }) return } func (this *MStonehenge) GetStonehengeData(uid string) (info *pb.DBStonehenge, err error) { info = &pb.DBStonehenge{} if err = this.Get(uid, info); err != nil && mgo.MongodbNil != err { // 创建一条初始的数据 return } if mgo.MongodbNil == err { info = &pb.DBStonehenge{ Id: primitive.NewObjectID().Hex(), Uid: uid, Userbuff: make(map[int32]int32), Reward: make(map[int32]bool), Addweight: make(map[int32]int32), Etime: utils.WeekIntervalTime(), Hero: make(map[string]*pb.BattleRole), Talent: make(map[int32]bool), Talentproperty: make(map[string]int32), Privilege: make([]pb.StonehengePrivilege, 0), } err = this.Add(uid, info) } return } // 修改石阵信息 func (this *MStonehenge) ChangeStonehengeData(uid string, update map[string]interface{}) (err error) { return this.Change(uid, update) } func (this *MStonehenge) reLoadStoneBoos() (err error) { s := &pb.DBStoneBoss{} this.module.ModuleTools.GetGlobalData(StoneBossKey, s) if len(s.Bossstage) == 0 || utils.WeekIntervalTime() != s.Rtime { this.lock.Lock() this.bossStage = this.module.configure.CheckStage() this.lock.Unlock() this.module.ModuleTools.UpdateGlobalData(StoneBossKey, map[string]interface{}{ "BossStage": this.bossStage, "rtime": utils.WeekIntervalTime(), }) } else { this.lock.Lock() this.bossStage = s.Bossstage this.lock.Unlock() } return } func (this *MStonehenge) GetStoneBoosData(id int32) (bossstage *pb.StageData) { return this.bossStage[id] } func (this *MStonehenge) GetAllStoneBoosData() (bossstage map[int32]*pb.StageData) { return this.bossStage } // 获得新的事件 func (this *MStonehenge) AddNewEvent(event []int32, stone *pb.DBStonehenge) { for _, newEvent := range event { stone.Rooms.Eventid[newEvent] = false // newEventConf, err := this.module.configure.GetStoneEventDataById(newEvent) if err != nil { continue } switch newEventConf.EventType { case EventType25: // buff是3选1 for _, v := range stone.Addweight { ownerbuff := make(map[int32]struct{}, 0) for k := range stone.Userbuff { ownerbuff[k] = struct{}{} } stone.Rooms.Selectbuff = this.module.configure.GetBuffGroupDataByLottery(newEventConf.Value1, v, ownerbuff) } case EventType10: // 宝箱事件 if _, ok := stone.Rooms.Box[newEventConf.EventId]; !ok { stone.Rooms.Box[newEventConf.EventId] = 0 } } } }