package space import ( "blazing/common/data/xmlres" "blazing/common/utils" "blazing/logic/service/common" "blazing/logic/service/fight/info" maps "blazing/logic/service/maps/info" csmap "github.com/mhmtszr/concurrent-swiss-map" ) // Space 针对Player的并发安全map,键为uint32类型 type Space struct { User *csmap.CsMap[uint32, common.PlayerI] // 存储玩家数据的map,键为玩家ID UserInfo *csmap.CsMap[uint32, maps.OutInfo] CanRefresh bool //是否能够刷怪 Super uint32 SuperValue *int32 //ID uint32 // 地图ID Name string //地图名称 ARENA info.S2C_ARENA_GET_INFO ARENA_Player common.PlayerI // DefaultPos model.Pos //默认位置DefaultPos //Positions map[uint32]model.Pos //从上一个地图跳转后默认位置 无任何写操作 } func (s *Space) Can_ARENA(c common.PlayerI) common.PlayerI { if s.ARENA.Flag != 3 { s.ARENA.Flag = 3 s.ARENA.ChallengerID = c.GetInfo().UserID return s.ARENA_Player } return nil } // flag 0 取消 1为加入 3 为挑战 func (s *Space) UP_ARENA(c common.PlayerI, FLAG uint32) { switch FLAG { case 0: if s.ARENA.Id != c.GetInfo().UserID { //说明不是自己退出 return } s.ARENA = info.S2C_ARENA_GET_INFO{} s.ARENA_Player = nil case 1: if s.ARENA.Id != 0 { //说明已经有人了 return } s.ARENA.Flag = 1 s.ARENA.Id = c.GetInfo().UserID //添加用户ID s.ARENA.Nick = c.GetInfo().Nick s.ARENA_Player = c //添加用户 case 3: //胜利替换 if s.ARENA.Flag != 3 { //说明没进入挑战 return } if s.ARENA.Id != c.GetInfo().UserID && c.GetInfo().UserID != s.ARENA.ChallengerID { //说明已经有人了 return } if c.GetInfo().UserID == s.ARENA.Id { s.ARENA.HostWins += 1 //连胜+1 } s.ARENA.Flag = 1 s.ARENA.Id = c.GetInfo().UserID //添加用户ID s.ARENA.Nick = c.GetInfo().Nick s.ARENA_Player = c //添加用户 } s.User.Range(func(playerID uint32, p common.PlayerI) bool { p.Send_ARENA_GET_INFO(s.ARENA) return false }) } // NewSyncMap 创建一个新的玩家同步map func NewSpace() *Space { return &Space{ User: csmap.New[uint32, common.PlayerI]( // set the number of map shards. the default value is 32. csmap.WithShardCount[uint32, common.PlayerI](32), // // if don't set custom hasher, use the built-in maphash. // csmap.WithCustomHasher[string, int](func(key string) uint64 { // hash := fnv.New64a() // hash.Write([]byte(key)) // return hash.Sum64() // }), // set the total capacity, every shard map has total capacity/shard count capacity. the default value is 0. // csmap.WithSize[string, int](1000), ), UserInfo: csmap.New[uint32, maps.OutInfo]( // set the number of map shards. the default value is 32. csmap.WithShardCount[uint32, maps.OutInfo](32), // // if don't set custom hasher, use the built-in maphash. // csmap.WithCustomHasher[string, int](func(key string) uint64 { // hash := fnv.New64a() // hash.Write([]byte(key)) // return hash.Sum64() // }), // set the total capacity, every shard map has total capacity/shard count capacity. the default value is 0. // csmap.WithSize[string, int](1000), ), } } // 获取星球 func GetSpace(id uint32) *Space { planet, ok := planetmap.Load(id) if ok { return planet } t := NewSpace() if id < 10000 { //说明是玩家地图GetSpace for _, v := range xmlres.MapConfig.Maps { if v.ID == int(id) { //找到这个地图 t := NewSpace() t.Super = uint32(v.Super) ok := maphot.Has(t.Super) if !ok { var tt int32 = 0 maphot.Store(uint32(v.Super), &tt) t.SuperValue = &tt //创建一个 } else { t.SuperValue, _ = maphot.Load(uint32(v.Super)) } t.Name = v.Name } } } planetmap.Store(id, t) return t } var planetmap = &utils.SyncMap[uint32, *Space]{} //玩家数据