diff --git a/logic/controller/CreatePlayer.go b/logic/controller/CreatePlayer.go index c737dac7..a8f428f8 100644 --- a/logic/controller/CreatePlayer.go +++ b/logic/controller/CreatePlayer.go @@ -4,8 +4,6 @@ import ( "blazing/common/socket/errorcode" "blazing/cool" - "blazing/logic/service/common" - "blazing/logic/service/player" "blazing/logic/service/space" "blazing/logic/service/user" @@ -28,10 +26,10 @@ func (h *Controller) ChangePlayerName(data *user.ChangePlayerNameInboundInfo, c Nickname: newnice, UserID: c.Info.UserID, } - space.GetSpace(c.Info.MapID).Range(func(playerID uint32, player common.PlayerI) bool { - + for _, player := range space.GetSpace(c.Info.MapID).User.Items() { player.SendPack(data.Head.Pack(&result)) - return true - }) + + } + return result, 0 } diff --git a/logic/controller/login.go b/logic/controller/login.go index 8364bd42..daae1756 100644 --- a/logic/controller/login.go +++ b/logic/controller/login.go @@ -5,7 +5,6 @@ import ( "blazing/common/socket/errorcode" - "blazing/logic/service/common" "blazing/logic/service/user" "blazing/logic/service/maps" @@ -72,7 +71,7 @@ func (h *Controller) Login(data *user.MAIN_LOGIN_IN, c *player.Conn) (result *us t.CompleteLogin() //通知客户端登录成功 - glog.Debug(context.Background(), "登录成功,初始地图 人数:", space.GetSpace(t.Info.MapID).Len()) + glog.Debug(context.Background(), "登录成功,初始地图 人数:", space.GetSpace(t.Info.MapID).User.Count()) result = user.NewOutInfo() //设置登录消息 @@ -81,12 +80,12 @@ func (h *Controller) Login(data *user.MAIN_LOGIN_IN, c *player.Conn) (result *us tt := maps.NewOutInfo() //copier.Copy(t.Info, tt) t1 := player.NewTomeeHeader(2001, t.Info.UserID) - defer space.GetSpace(t.Info.MapID).Set(t.Info.UserID, t).Range(func(playerID uint32, player common.PlayerI) bool { - - player.SendPack(t1.Pack(&tt)) - - return true - }) + defer space.GetSpace(t.Info.MapID).User.Set(t.Info.UserID, t) + defer func() { + for _, v := range space.GetSpace(t.Info.MapID).User.Items() { + v.SendPack(t1.Pack(&tt)) + } + }() return result, 0 diff --git a/logic/controller/map.go b/logic/controller/map.go index 112cc02e..b1f83aa2 100644 --- a/logic/controller/map.go +++ b/logic/controller/map.go @@ -3,7 +3,6 @@ package controller import ( "blazing/common/socket/errorcode" - "blazing/logic/service/common" "blazing/logic/service/maphot" "blazing/logic/service/maps" "blazing/logic/service/player" @@ -14,9 +13,9 @@ import ( func (h *Controller) MapEnter(data *maps.InInfo, c *player.Player) (result *maps.OutInfo, err errorcode.ErrorCode) { //这个时候player应该是空的 - c.Info.MapID = data.MapId //登录地图 - t := space.GetSpace(c.Info.MapID) - t.Set(c.Info.UserID, c) //添加玩家 + c.Info.MapID = data.MapId //登录地图 + space.GetSpace(c.Info.MapID).User.Set(c.Info.UserID, c) //添加玩家 + result = maps.NewOutInfo() c.Info.Pos = data.Point copier.Copy(result, c.Info) @@ -38,7 +37,7 @@ func (h *Controller) MapLeave(data *maps.LeaveMapInboundInfo, c *player.Player) //result = &maps.LeaveMapOutboundInfo{UserID: c.GetUserID()} c.Canmon = false //可以刷怪 data.Broadcast(c.Info.MapID, space.LeaveMapOutboundInfo{UserID: c.Info.UserID}) //同步广播 - space.GetSpace(c.Info.MapID).Delete(c.Info.UserID) + space.GetSpace(c.Info.MapID).User.Remove(c.Info.UserID) // 如果有正在运行的刷怪协程,发送停止信号 c.Info.MapID = 0 // 重置当前地图 @@ -49,12 +48,11 @@ func (h *Controller) MapList(data *maps.ListMapPlayerInboundInfo, c *player.Play result = &maps.ListMapPlayerOutboundInfo{} result.Player = make([]maps.OutInfo, 0) - space.GetSpace(c.Info.MapID).Range(func(userID uint32, player common.PlayerI) bool { + for _, v := range space.GetSpace(c.Info.MapID).User.Items() { result1 := maps.NewOutInfo() - copier.Copy(result1, player.GetInfo()) + copier.Copy(result1, v.GetInfo()) result.Player = append(result.Player, *result1) - return true - }) + } c.Canmon = true //可以刷怪 return } diff --git a/logic/service/maps/mapin.go b/logic/service/maps/mapin.go index a45fe76d..f975b528 100644 --- a/logic/service/maps/mapin.go +++ b/logic/service/maps/mapin.go @@ -1,7 +1,6 @@ package maps import ( - "blazing/logic/service/common" "blazing/logic/service/player" "blazing/logic/service/space" @@ -25,12 +24,11 @@ type InInfo struct { func (t *InInfo) Broadcast(mapid uint32, o OutInfo) { - space.GetSpace(mapid).Range(func(playerID uint32, player common.PlayerI) bool { + for _, v := range space.GetSpace(mapid).User.Items() { t.Head.Result = 0 - player.SendPack(t.Head.Pack(&o)) - return true - }) + v.SendPack(t.Head.Pack(&o)) + } } // 这里存储星球的map diff --git a/logic/service/maps/mapout.go b/logic/service/maps/mapout.go index 91d6b235..83a83070 100644 --- a/logic/service/maps/mapout.go +++ b/logic/service/maps/mapout.go @@ -1,7 +1,6 @@ package maps import ( - "blazing/logic/service/common" "blazing/logic/service/player" "blazing/logic/service/space" ) @@ -12,10 +11,9 @@ type LeaveMapInboundInfo struct { func (t *LeaveMapInboundInfo) Broadcast(mapid uint32, o space.LeaveMapOutboundInfo) { - space.GetSpace(mapid).Range(func(playerID uint32, player common.PlayerI) bool { + for _, v := range space.GetSpace(mapid).User.Items() { t.Head.Result = 0 - player.SendPack(t.Head.Pack(&o)) - return true - }) + v.SendPack(t.Head.Pack(&o)) + } } diff --git a/logic/service/maps/walk.go b/logic/service/maps/walk.go index c4688dc4..3596ef6b 100644 --- a/logic/service/maps/walk.go +++ b/logic/service/maps/walk.go @@ -1,7 +1,6 @@ package maps import ( - "blazing/logic/service/common" "blazing/logic/service/player" "blazing/logic/service/space" @@ -25,13 +24,12 @@ func (t *WalkInInfo) Broadcast(mapid uint32, o WalkOutInfo) { //tt := planetmap //g.Dump(GetSpace(mapid).Len()) - space.GetSpace(mapid).Range(func(playerID uint32, player common.PlayerI) bool { + for _, v := range space.GetSpace(mapid).User.Items() { t.Head.Result = 0 tt := t.Head.Pack(&o) - player.SendPack(tt) - //player.Cheak(err) - return true - }) + v.SendPack(tt) + + } } // PeopleWalkOutboundInfo PeopleWalkOutboundInfo类,实现OutboundMessage接口 diff --git a/logic/service/pet/pet.go b/logic/service/pet/pet.go index c3f12935..408e6369 100644 --- a/logic/service/pet/pet.go +++ b/logic/service/pet/pet.go @@ -1,7 +1,6 @@ package pet import ( - "blazing/logic/service/common" "blazing/logic/service/player" "blazing/logic/service/space" "blazing/modules/blazing/model" @@ -41,12 +40,11 @@ type PetShowInboundInfo struct { func (t *PetShowInboundInfo) Broadcast(mapid uint32, o PetShowOutboundInfo) { - space.GetSpace(mapid).Range(func(playerID uint32, player common.PlayerI) bool { + for _, v := range space.GetSpace(mapid).User.Items() { t.Head.Result = 0 - player.SendPack(t.Head.Pack(&o)) - return true - }) + v.SendPack(t.Head.Pack(&o)) + } } type PetShowOutboundInfo struct { diff --git a/logic/service/player/player.go b/logic/service/player/player.go index 4d5277f8..47584631 100644 --- a/logic/service/player/player.go +++ b/logic/service/player/player.go @@ -271,14 +271,13 @@ func LeaveMap(c common.PlayerI) { } t := NewTomeeHeader(2002, c.GetInfo().UserID) - space.GetSpace(c.GetInfo().MapID).Range(func(playerID uint32, player common.PlayerI) bool { - if playerID != c.GetInfo().UserID { - player.SendPack(t.Pack(&space.LeaveMapOutboundInfo{UserID: c.GetInfo().UserID})) + for k, v := range space.GetSpace(c.GetInfo().MapID).User.Items() { + if k != c.GetInfo().UserID { + v.SendPack(t.Pack(&space.LeaveMapOutboundInfo{UserID: c.GetInfo().UserID})) } - return true - }) - space.GetSpace(c.GetInfo().MapID).Delete(c.GetInfo().UserID) + } + space.GetSpace(c.GetInfo().MapID).User.Remove(c.GetInfo().UserID) } // Save 保存玩家数据 diff --git a/logic/service/space/hot.go b/logic/service/space/hot.go index f429ede5..87187526 100644 --- a/logic/service/space/hot.go +++ b/logic/service/space/hot.go @@ -23,10 +23,10 @@ func GetMapHot() []MapHotInfo { t1, ok := tt[uint32(v.Super)] if ok { - tt[uint32(v.Super)] = uint32(int(t1) + GetSpace(uint32(v.ID)).Len()) + tt[uint32(v.Super)] = uint32(int(t1) + GetSpace(uint32(v.ID)).User.Count()) } else { - tt[uint32(v.Super)] = uint32(GetSpace(uint32(v.ID)).Len()) + tt[uint32(v.Super)] = uint32(GetSpace(uint32(v.ID)).User.Count()) } } diff --git a/logic/service/space/space.go b/logic/service/space/space.go index 793ebe7c..ab0f7541 100644 --- a/logic/service/space/space.go +++ b/logic/service/space/space.go @@ -7,13 +7,11 @@ import ( "blazing/logic/service/common" "blazing/modules/blazing/model" - "sync" ) // Space 针对Player的并发安全map,键为uint32类型 type Space struct { - mu sync.RWMutex // 读写锁,读多写少场景更高效 - data utils.ConcurrentMap[uint32, common.PlayerI] // 存储玩家数据的map,键为玩家ID + User utils.ConcurrentMap[uint32, common.PlayerI] // 存储玩家数据的map,键为玩家ID CanRefresh bool //是否能够刷怪 ID uint32 // 地图ID Name string //地图名称 @@ -25,57 +23,24 @@ type Space struct { // NewSyncMap 创建一个新的玩家同步map func NewSpace() *Space { return &Space{ - data: make(map[uint32]common.PlayerI), + User: utils.NewWithCustomShardingFunction[uint32, common.PlayerI](func(key uint32) uint32 { + return key + }), } } -// Get 根据玩家ID获取玩家实例 -// 读操作使用RLock,允许多个goroutine同时读取 -func (m *Space) Get(playerID uint32) (common.PlayerI, bool) { - m.mu.RLock() - defer m.mu.RUnlock() - val, exists := m.data[playerID] - return val, exists -} - -// Set 存储玩家实例(按ID) -// 写操作使用Lock,独占锁保证数据一致性 -func (m *Space) Set(playerID uint32, player common.PlayerI) *Space { - m.mu.Lock() - defer m.mu.Unlock() - m.data[playerID] = player - - return m -} - -// Delete 根据玩家ID删除玩家实例 -// 写操作使用Lock -func (m *Space) Delete(playerID uint32) { - m.mu.Lock() - defer m.mu.Unlock() - delete(m.data, playerID) -} - -// Len 获取当前玩家数量 -// 读操作使用RLock -func (m *Space) Len() int { - m.mu.RLock() - defer m.mu.RUnlock() - return len(m.data) -} - -// Range 遍历所有玩家并执行回调函数 -// 读操作使用RLock,遍历过程中不会阻塞其他读操作 -func (m *Space) Range(f func(playerID uint32, player common.PlayerI) bool) { - m.mu.RLock() - defer m.mu.RUnlock() - for id, player := range m.data { - // 若回调返回false,则停止遍历 - if !f(id, player) { - break - } - } -} +// // Range 遍历所有玩家并执行回调函数 +// // 读操作使用RLock,遍历过程中不会阻塞其他读操作 +// func (m *Space) Range(f func(playerID uint32, player common.PlayerI) bool) { +// m.mu.RLock() +// defer m.mu.RUnlock() +// for id, player := range m.User { +// // 若回调返回false,则停止遍历 +// if !f(id, player) { +// break +// } +// } +// } // 获取星球 func GetSpace(id uint32) *Space {