Files
bl/logic/service/space/in_out.go
xinian 9b344d3753
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
feat: 重构地图热度信息并添加地图提示功能
将地图热度信息从简单的计数器改为包含提示信息的结构体
添加矿物、BOSS、宠物和掉落等提示信息的收集功能
优化地图进入和离开时的计数逻辑
2026-03-01 10:44:31 +08:00

92 lines
1.8 KiB
Go

package space
import (
"blazing/logic/service/common"
"blazing/logic/service/space/info"
"sync/atomic"
"github.com/jinzhu/copier"
)
// 向其他人广播,不含自己
// 广播是c 为空就不特判,发给全体成员广播
func (s *Space) Broadcast(c common.PlayerI, cmd uint32, data any) {
s.User.Range(func(k uint32, v common.PlayerI) (stop bool) {
if c != nil {
if k != c.GetInfo().UserID {
v.SendPackCmd(cmd, data)
}
} else {
v.SendPackCmd(cmd, data)
}
return false
})
}
func (s *Space) LeaveMap(c common.PlayerI) {
info := &info.LeaveMapOutboundInfo{UserID: c.GetInfo().UserID}
c.SendPackCmd(2002, info)
s.User.Delete(c.GetInfo().UserID)
s.UserInfo.Delete(c.GetInfo().UserID)
s.Broadcast(c, 2002, info)
current, ok := maphot[s.Super]
if ok {
current.GetCount(-1)
}
if atomic.CompareAndSwapUint32(&s.Owner.UserID, c.GetInfo().UserID, 0) {
s.Owner.Reset()
s.Broadcast(c, 2419, &s.Owner)
}
}
func (s *Space) EnterMap(c common.PlayerI) {
out := info.NewOutInfo()
copier.CopyWithOption(out, c.GetInfo(), copier.Option{DeepCopy: true})
c.SendPackCmd(2001, out)
s.Broadcast(c, 2001, out)
s.User.Store(c.GetInfo().UserID, c)
s.UserInfo.Store(c.GetInfo().UserID, *out)
curmaps, ok := maphot[s.Super]
if ok {
curmaps.GetCount(1)
//atomic.AddInt32(maphot[s.Super], 1)
}
}
func (s *Space) GetInfo(c common.PlayerI) []info.SimpleInfo {
ret := make([]info.SimpleInfo, 0)
s.UserInfo.Range(func(k uint32, v info.SimpleInfo) (stop bool) {
ret = append(ret, v)
return len(ret) > 50
})
return ret
}
// var limiter = rate.NewLimiter(rate.Limit(10), 5)
func (s *Space) Walk(c common.PlayerI, info *info.WalkOutInfo) {
// cool.Limiter.Take()
//r := cool.Limiter.Get("Broadcast"+gconv.String(mapid), rate.Limit(10), 5)
// if !limiter.Allow() {
// return
// }
s.Broadcast(c, 2101, info)
}