2025-11-15 22:17:43 +00:00
|
|
|
|
package space
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
|
"blazing/logic/service/common"
|
|
|
|
|
|
"blazing/logic/service/maps/info"
|
2025-11-16 11:56:57 +08:00
|
|
|
|
maps "blazing/logic/service/maps/info"
|
|
|
|
|
|
"sync/atomic"
|
2025-11-15 22:17:43 +00:00
|
|
|
|
|
|
|
|
|
|
"github.com/jinzhu/copier"
|
2025-11-18 22:16:55 +00:00
|
|
|
|
"github.com/panjf2000/ants/v2"
|
2025-11-16 12:10:27 +08:00
|
|
|
|
"golang.org/x/time/rate"
|
2025-11-15 22:17:43 +00:00
|
|
|
|
)
|
|
|
|
|
|
|
2025-11-18 22:16:55 +00:00
|
|
|
|
var mappool, _ = ants.NewPool(-1)
|
|
|
|
|
|
|
2025-11-18 20:52:04 +00:00
|
|
|
|
// 向其他人广播,不含自己
|
2025-11-23 09:54:54 +00:00
|
|
|
|
// 广播是c为空就不特判,发给全体成员广播
|
2025-11-18 20:52:04 +00:00
|
|
|
|
func (s *Space) Broadcast(c common.PlayerI, cmd uint32, data any) {
|
2025-11-23 09:54:54 +00:00
|
|
|
|
mappool.Submit(func() {
|
2025-11-18 20:52:04 +00:00
|
|
|
|
|
2025-11-23 09:54:54 +00:00
|
|
|
|
s.User.Range(func(k uint32, v common.PlayerI) (stop bool) {
|
|
|
|
|
|
if c != nil {
|
|
|
|
|
|
if k != c.GetInfo().UserID {
|
|
|
|
|
|
v.SendPackCmd(cmd, data)
|
2025-11-18 20:52:04 +00:00
|
|
|
|
|
2025-11-23 09:54:54 +00:00
|
|
|
|
}
|
2025-12-09 14:52:55 +08:00
|
|
|
|
} else {
|
|
|
|
|
|
v.SendPackCmd(cmd, data)
|
2025-11-23 09:54:54 +00:00
|
|
|
|
}
|
2025-11-18 20:52:04 +00:00
|
|
|
|
|
2025-11-23 09:54:54 +00:00
|
|
|
|
return false
|
|
|
|
|
|
})
|
2025-11-18 20:52:04 +00:00
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-15 22:17:43 +00:00
|
|
|
|
func (s *Space) LeaveMap(c common.PlayerI) {
|
|
|
|
|
|
|
2025-11-19 16:11:02 +08:00
|
|
|
|
if atomic.CompareAndSwapUint32(&s.Owner.UserID, c.GetInfo().UserID, 0) {
|
2025-11-15 22:17:43 +00:00
|
|
|
|
|
2025-11-20 05:57:29 +08:00
|
|
|
|
s.Owner.Reset()
|
|
|
|
|
|
|
2025-11-19 16:11:02 +08:00
|
|
|
|
s.Broadcast(c, 2419, &s.Owner)
|
|
|
|
|
|
|
|
|
|
|
|
}
|
2025-11-20 21:37:37 +08:00
|
|
|
|
s.Broadcast(c, 2002, &info.LeaveMapOutboundInfo{UserID: c.GetInfo().UserID})
|
2025-11-15 22:17:43 +00:00
|
|
|
|
|
|
|
|
|
|
s.User.Delete(c.GetInfo().UserID)
|
2025-11-16 11:56:57 +08:00
|
|
|
|
s.UserInfo.Delete(c.GetInfo().UserID)
|
2025-11-26 01:33:48 +08:00
|
|
|
|
_, ok := maphot[s.Super]
|
|
|
|
|
|
if ok {
|
|
|
|
|
|
atomic.AddInt32(maphot[s.Super], -1)
|
|
|
|
|
|
}
|
2025-11-16 11:56:57 +08:00
|
|
|
|
|
2025-11-15 22:17:43 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (s *Space) EnterMap(c common.PlayerI) {
|
|
|
|
|
|
|
|
|
|
|
|
out := info.NewOutInfo()
|
|
|
|
|
|
copier.CopyWithOption(out, c.GetInfo(), copier.Option{DeepCopy: true})
|
2025-11-20 15:19:13 +08:00
|
|
|
|
|
2025-11-15 22:17:43 +00:00
|
|
|
|
s.User.Store(c.GetInfo().UserID, c)
|
2025-11-16 11:56:57 +08:00
|
|
|
|
s.UserInfo.Store(c.GetInfo().UserID, *out)
|
2025-11-19 16:11:02 +08:00
|
|
|
|
s.Broadcast(c, 2001, out)
|
2025-11-26 01:33:48 +08:00
|
|
|
|
_, ok := maphot[s.Super]
|
|
|
|
|
|
if ok {
|
|
|
|
|
|
atomic.AddInt32(maphot[s.Super], 1)
|
|
|
|
|
|
}
|
2025-11-16 11:56:57 +08:00
|
|
|
|
|
|
|
|
|
|
}
|
2025-12-09 16:14:47 +00:00
|
|
|
|
func (s *Space) GetInfo(c common.PlayerI) []maps.OutInfo {
|
|
|
|
|
|
|
|
|
|
|
|
if atomic.LoadUint32(&s.TimeBoss.Flag) == 1 {
|
|
|
|
|
|
defer c.SendPackCmd(2022, &s.TimeBoss)
|
|
|
|
|
|
}
|
|
|
|
|
|
if s.MapBossInfo.Id != 0 {
|
|
|
|
|
|
var t info.MapBossSInfo
|
|
|
|
|
|
t.INFO = append(t.INFO, s.MapBossInfo)
|
|
|
|
|
|
s.Broadcast(nil, 2021, &t)
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
defer c.SendPackCmd(50004, &info.S2C_50004{Id: uint32(s.Weather)}) //获取天气
|
2025-11-16 11:56:57 +08:00
|
|
|
|
ret := make([]maps.OutInfo, 0)
|
|
|
|
|
|
s.UserInfo.Range(func(k uint32, v maps.OutInfo) (stop bool) {
|
|
|
|
|
|
ret = append(ret, v)
|
|
|
|
|
|
return len(ret) > 30
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
return ret
|
|
|
|
|
|
|
|
|
|
|
|
}
|
2025-11-16 12:10:27 +08:00
|
|
|
|
|
|
|
|
|
|
var limiter = rate.NewLimiter(rate.Limit(10), 5)
|
|
|
|
|
|
|
2025-11-19 16:11:02 +08:00
|
|
|
|
func (s *Space) Walk(c common.PlayerI, info *info.WalkOutInfo) {
|
2025-11-16 12:10:27 +08:00
|
|
|
|
// cool.Limiter.Take()
|
|
|
|
|
|
//r := cool.Limiter.Get("Broadcast"+gconv.String(mapid), rate.Limit(10), 5)
|
|
|
|
|
|
if !limiter.Allow() {
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-18 21:03:00 +00:00
|
|
|
|
s.Broadcast(c, 2101, info)
|
2025-11-16 12:10:27 +08:00
|
|
|
|
|
|
|
|
|
|
}
|