From 4c21c4ac78bee36deaddff098ee1adf211642cac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=94=E5=BF=B5?= <1@72wo.cn> Date: Sun, 16 Nov 2025 12:10:27 +0800 Subject: [PATCH] =?UTF-8?q?```=20feat(maps):=20=E9=87=8D=E6=9E=84=E7=A7=BB?= =?UTF-8?q?=E5=8A=A8=E5=B9=BF=E6=92=AD=E9=80=BB=E8=BE=91=E5=B9=B6=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将 WalkOutInfo 结构体迁移至 maps/info 包,并调整相关引用。 移除旧广播逻辑,改用 Space.Walk 方法进行统一广播处理。 新增 PlayerI 接口方法 SendWalkMapInfo 以支持行走信息发送。 在 Player 和 AI_player 中实现 SendWalkMapInfo 方法。 引入限流器到 space 包,用于控制广播频率。 ``` --- logic/controller/walk.go | 19 +++++++---------- logic/service/common/playeri.go | 1 + logic/service/maps/info/info.go | 15 +++++++++++++ logic/service/maps/walk.go | 37 --------------------------------- logic/service/player/ai.go | 3 +++ logic/service/player/cmd.go | 7 +++++++ logic/service/space/in_out.go | 19 +++++++++++++++++ 7 files changed, 53 insertions(+), 48 deletions(-) diff --git a/logic/controller/walk.go b/logic/controller/walk.go index 32b71ec3..8872eeab 100644 --- a/logic/controller/walk.go +++ b/logic/controller/walk.go @@ -3,22 +3,19 @@ package controller import ( "blazing/common/socket/errorcode" "blazing/logic/service/maps" + "blazing/logic/service/maps/info" "blazing/logic/service/player" ) -func (h Controller) Walk(data *maps.WalkInInfo, c *player.Player) (result *maps.WalkOutInfo, err errorcode.ErrorCode) { - result = &maps.WalkOutInfo{ - Flag: data.Flag, - Point: data.Point, - Path: data.Path, - } +func (h Controller) Walk(data *maps.WalkInInfo, c *player.Player) (result *info.WalkOutInfo, err errorcode.ErrorCode) { - result.UserID = data.Head.UserID + go c.GetSpace().Walk(info.WalkOutInfo{ + Flag: data.Flag, + Point: data.Point, + Path: data.Path, + UserID: c.Info.UserID, + }) - //glog.Debug(context.Background(), err1) - if !c.Info.Pos.BothLessThan50(data.Point) { //距离超过50才广播 - data.Broadcast(c.Info.MapID, *result) //走路的广播 - } c.Info.Pos = data.Point return nil, -1 } diff --git a/logic/service/common/playeri.go b/logic/service/common/playeri.go index 7dd596cf..0ee36ca6 100644 --- a/logic/service/common/playeri.go +++ b/logic/service/common/playeri.go @@ -22,4 +22,5 @@ type PlayerI interface { SetFightC(FightI) SendLeaveMapInfo(b maps.LeaveMapOutboundInfo) SendEnterMapInfo(b maps.OutInfo) + SendWalkMapInfo(b maps.WalkOutInfo) } diff --git a/logic/service/maps/info/info.go b/logic/service/maps/info/info.go index e7654e63..d6f4111e 100644 --- a/logic/service/maps/info/info.go +++ b/logic/service/maps/info/info.go @@ -13,6 +13,21 @@ type ListMapPlayerOutboundInfo struct { Player []OutInfo ` json:"player"` } +// PeopleWalkOutboundInfo PeopleWalkOutboundInfo类,实现OutboundMessage接口 +type WalkOutInfo struct { + // Flag: 0为走,1为飞行模式 + Flag uint32 `fieldDesc:"0为走,1为飞行模式" codec:"uint"` + + // UserID: 走动的人的米米号 + UserID uint32 `fieldDesc:"走动的人的米米号" codec:"uint"` + + // Point: 直接给坐标x,y + Point model.Pos `fieldDesc:"直接给坐标x,y"` + + PathLen uint32 `struc:"sizeof=Path" ` + Path string +} + // 这里存储星球的map //var planetmap utils.SyncMap[] //= space.NewSyncMap() diff --git a/logic/service/maps/walk.go b/logic/service/maps/walk.go index 3acda65f..171bda59 100644 --- a/logic/service/maps/walk.go +++ b/logic/service/maps/walk.go @@ -1,13 +1,9 @@ package maps import ( - "blazing/logic/service/common" "blazing/logic/service/player" - "blazing/logic/service/space" "blazing/modules/blazing/model" - - "golang.org/x/time/rate" ) type WalkInInfo struct { @@ -21,36 +17,3 @@ type WalkInInfo struct { PathLen uint32 `struc:"sizeof=Path" ` Path string } - -var limiter = rate.NewLimiter(rate.Limit(10), 5) - -func (t *WalkInInfo) Broadcast(mapid uint32, o WalkOutInfo) { - // cool.Limiter.Take() - //r := cool.Limiter.Get("Broadcast"+gconv.String(mapid), rate.Limit(10), 5) - if !limiter.Allow() { - return - } - - space.GetSpace(mapid).User.Range(func(playerID uint32, player common.PlayerI) bool { - t.Head.Result = 0 - tt := t.Head.Pack(&o) - player.SendPack(tt) - return false - }) - -} - -// PeopleWalkOutboundInfo PeopleWalkOutboundInfo类,实现OutboundMessage接口 -type WalkOutInfo struct { - // Flag: 0为走,1为飞行模式 - Flag uint32 `fieldDesc:"0为走,1为飞行模式" codec:"uint"` - - // UserID: 走动的人的米米号 - UserID uint32 `fieldDesc:"走动的人的米米号" codec:"uint"` - - // Point: 直接给坐标x,y - Point model.Pos `fieldDesc:"直接给坐标x,y"` - - PathLen uint32 `struc:"sizeof=Path" ` - Path string -} diff --git a/logic/service/player/ai.go b/logic/service/player/ai.go index d884ba8d..74c2325a 100644 --- a/logic/service/player/ai.go +++ b/logic/service/player/ai.go @@ -16,6 +16,9 @@ type AI_player struct { func (f *AI_player) SendPack(b []byte) error { return nil +} +func (p *AI_player) SendWalkMapInfo(b maps.WalkOutInfo) { + } func (p *AI_player) SendLeaveMapInfo(b maps.LeaveMapOutboundInfo) { diff --git a/logic/service/player/cmd.go b/logic/service/player/cmd.go index 4e8042c4..a717ca13 100644 --- a/logic/service/player/cmd.go +++ b/logic/service/player/cmd.go @@ -23,6 +23,13 @@ func (p *Player) SendEnterMapInfo(b maps.OutInfo) { p.SendPack(t1.Pack(&b)) //准备包由各自发,因为协议不一样 } +func (p *Player) SendWalkMapInfo(b maps.WalkOutInfo) { + t1 := NewTomeeHeader(2101, p.Info.UserID) + + p.SendPack(t1.Pack(&b)) //准备包由各自发,因为协议不一样 + +} + func (p *Player) SendChangePet(b info.ChangePetInfo) { t1 := NewTomeeHeader(2407, p.Info.UserID) diff --git a/logic/service/space/in_out.go b/logic/service/space/in_out.go index 163d15b5..f639b6ef 100644 --- a/logic/service/space/in_out.go +++ b/logic/service/space/in_out.go @@ -7,6 +7,7 @@ import ( "sync/atomic" "github.com/jinzhu/copier" + "golang.org/x/time/rate" ) func (s *Space) LeaveMap(c common.PlayerI) { @@ -66,6 +67,24 @@ func (s *Space) GetInfo() []maps.OutInfo { return ret } + +var limiter = rate.NewLimiter(rate.Limit(10), 5) + +func (s *Space) Walk(b maps.WalkOutInfo) { + // cool.Limiter.Take() + //r := cool.Limiter.Get("Broadcast"+gconv.String(mapid), rate.Limit(10), 5) + if !limiter.Allow() { + return + } + + s.User.Range(func(playerID uint32, player common.PlayerI) bool { + player.SendWalkMapInfo(b) + + return false + }) + +} + func LastFourElements[T any](s []T) []T { n := len(s) if n <= 30 {