package space import ( "blazing/common/data/xmlres" "blazing/common/utils" "blazing/cool" "blazing/logic/service/common" "blazing/logic/service/maps/info" maps "blazing/logic/service/maps/info" csmap "github.com/mhmtszr/concurrent-swiss-map" "github.com/tnnmigga/enum" ) // 定义天气状态枚举实例 var WeatherStatus = enum.New[struct { Normal uint32 `enum:"0"` // 正常 Rain uint32 `enum:"1"` // 下雨 Snow uint32 `enum:"2"` // 下雪 }]() // 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 //地图名称 Owner ARENA info.MapBossInfo TimeBoss info.S2C_2022 Weather uint32 CanWeather uint32 } // NewSyncMap 创建一个新的玩家同步map func NewSpace() *Space { ret := &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[uint32, common.PlayerI](func(key uint32) uint64 { return uint64(key) }), // 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), csmap.WithCustomHasher[uint32, maps.OutInfo](func(key uint32) uint64 { return uint64(key) }), // // 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), ), } return ret } // 获取星球 func GetSpace(id uint32) *Space { planet, ok := planetmap.Load(id) if ok { return planet } ret := NewSpace() if id < 10000 { //说明是玩家地图GetSpace for _, v := range xmlres.MapConfig.Maps { if v.ID == int(id) { //找到这个地图 ret.Super = uint32(v.Super) if ret.Super == 0 { ret.Super = uint32(v.ID) } ret.ID = uint32(v.ID) ret.getfixboss(uint32(v.ID)) //t.gettimeboss(uint32(v.ID)) _, ok := maphot[ret.Super] if !ok { var t1 int32 maphot[ret.Super] = &t1 } ret.Name = v.Name break } } } cool.Cron.CustomFunc(ret, func() { }) planetmap.Store(id, ret) return ret } var planetmap = &utils.SyncMap[uint32, *Space]{} //玩家数据