Files
bl/logic/service/space/space.go
昔念 0a8ef3d555 feat(fight_boss): 新增怪物ID处理逻辑,支持随机选择与过滤空值
新增 `processMonID` 函数用于处理 BOSS 战斗中怪物 ID 的字符串分割、
过滤空值,并在多个 ID 中随机选取一个。优化新手任务 BOSS 战逻辑,
使其更灵活地适配不同的配置输入。

---

refactor(map): 使用 ants 协程池优化地图进出逻辑并移除无用导入

将原本通过
2025-11-16 11:56:57 +08:00

156 lines
3.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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]{} //玩家数据