Files
bl/logic/service/space/space.go

99 lines
2.4 KiB
Go
Raw Normal View History

package space
import (
"blazing/common/data/xmlres"
"blazing/common/utils"
2025-11-15 22:17:43 +00:00
"blazing/logic/service/common"
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 //地图名称
Owner ARENA
ARENA_Player common.PlayerI
}
// NewSyncMap 创建一个新的玩家同步map
func NewSpace() *Space {
2025-11-17 15:31:23 +00:00
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[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),
),
}
}
// 获取星球
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.Super = uint32(v.Super)
if t.Super == 0 {
t.Super = uint32(v.ID)
}
_, ok := maphot[t.Super]
if !ok {
var t1 int32
maphot[t.Super] = &t1
}
t.Name = v.Name
break
}
}
}
planetmap.Store(id, t)
return t
}
var planetmap = &utils.SyncMap[uint32, *Space]{} //玩家数据