From 9a6587a2da510833f26862da2068a3a298f0669f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=94=E5=BF=B5?= <1@72wo.cn> Date: Sun, 17 Aug 2025 21:55:15 +0800 Subject: [PATCH] =?UTF-8?q?refactor(logic):=20=E9=87=8D=E6=9E=84=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E5=92=8C=E5=9C=B0=E5=9B=BE=E7=9B=B8=E5=85=B3=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 更新 Player 结构体,添加 Nick 字段 - 修改 ErrorCode 类型从 uint32 改为 int32 - 优化 SocketHandler 处理逻辑 - 重构 Controller 中的 Login 和地图相关方法 - 更新地图服务中的 MapIn 和 MapOut 方法 - 调整空间服务中的 Hot 和 Walk 方法 --- common/data/entity/player.go | 1 + common/socket/errorcode/error.go | 2 +- common/socket/handler/SocketHandler_Tomee.go | 3 +- logic/controller/controller.go | 10 +++- logic/controller/login.go | 17 +++++-- logic/controller/{mapin.go => map_enter.go} | 6 +-- logic/controller/{maphot.go => map_hot.go} | 40 ++++++++-------- logic/controller/{mapout.go => map_leave.go} | 6 ++- logic/controller/map_list.go | 20 ++++++++ logic/controller/walk.go | 8 ++-- logic/service/maps/mapin.go | 49 ++++++++++++++------ logic/service/maps/maplist.go | 16 +++++++ logic/service/maps/mapout.go | 3 +- logic/service/space/hot.go | 3 +- logic/service/space/walk.go | 9 +++- 15 files changed, 136 insertions(+), 57 deletions(-) rename logic/controller/{mapin.go => map_enter.go} (74%) rename logic/controller/{maphot.go => map_hot.go} (94%) rename logic/controller/{mapout.go => map_leave.go} (72%) create mode 100644 logic/controller/map_list.go create mode 100644 logic/service/maps/maplist.go diff --git a/common/data/entity/player.go b/common/data/entity/player.go index 822eb1090..2c9c382d7 100644 --- a/common/data/entity/player.go +++ b/common/data/entity/player.go @@ -17,6 +17,7 @@ type Player struct { MapId uint32 //当前所在的地图ID loginChan chan struct{} // 登录完成通知通道 + Nick string //昵称 context.Context } diff --git a/common/socket/errorcode/error.go b/common/socket/errorcode/error.go index 052fb6054..f196e370d 100644 --- a/common/socket/errorcode/error.go +++ b/common/socket/errorcode/error.go @@ -7,7 +7,7 @@ import ( ) // ErrorCode 错误码枚举类型 -type ErrorCode uint32 +type ErrorCode int32 func (t ErrorCode) Code() string { return fmt.Sprintf("%d", t) } diff --git a/common/socket/handler/SocketHandler_Tomee.go b/common/socket/handler/SocketHandler_Tomee.go index 5d616e271..d5c2de720 100644 --- a/common/socket/handler/SocketHandler_Tomee.go +++ b/common/socket/handler/SocketHandler_Tomee.go @@ -58,7 +58,7 @@ func (h *TomeeHandler) Handle(c gnet.Conn, data []byte) { //处理接收到的 header.Result, _ = tempdata.ReadUInt32() header.Data = tempdata.BytesAvailable() //fmt.Println("接收封包", header) - h.Callback( entity.NewConn(c), header) + h.Callback(entity.NewConn(c), header) //return header } @@ -69,6 +69,7 @@ func (h *TomeeHandler) Handle(c gnet.Conn, data []byte) { //处理接收到的 // 结构体类型使用struc库进行序列化。 // 最后,将数据长度、版本号、命令码、用户ID和结果代码一并打包进返回的字节切片中。 func (h *TomeeHeader) Pack(data any) []byte { //组包 + //h.Result = 0//默认置0 //t := reflect.TypeOf(data) tv := reflect.ValueOf(data) diff --git a/logic/controller/controller.go b/logic/controller/controller.go index de149e3d6..7107d6640 100644 --- a/logic/controller/controller.go +++ b/logic/controller/controller.go @@ -210,17 +210,23 @@ func Recv(c *entity.Conn, data handler.TomeeHeader) { } aa, ok := ret[1].Interface().(errorcode.ErrorCode) //判断错误 + data.Result = uint32(aa) + if aa == -1 { + return + + } if ok && aa != 0 { //这里实现回复错误包 cool.Loger.Error(context.Background(), aa.Code()) - data.Result = uint32(aa) c.SendPack(data.Pack(nil)) return } - data.Result = 0 //默认成功 + + data.Version = "7" + c.SendPack(data.Pack(ret[0].Interface())) } diff --git a/logic/controller/login.go b/logic/controller/login.go index 14c31af18..82bb09574 100644 --- a/logic/controller/login.go +++ b/logic/controller/login.go @@ -6,8 +6,12 @@ import ( "blazing/common/socket/errorcode" "blazing/logic/service" "blazing/logic/service/login" + "blazing/logic/service/space" "blazing/modules/blazing/model" + "context" "time" + + "github.com/gogf/gf/v2/os/glog" ) // 处理命令: 1001 @@ -22,17 +26,20 @@ func (h *Controller) Login(data *login.InInfo, c *entity.Conn) (result *login.Ou share.ShareManager.SetUserOnline(data.Head.UserID, h.Port) //设置用户登录服务器 t.CompleteLogin() //通知客户端登录成功 t.MapId = 1 + space.GetSpace(t.MapId).Set(t.UserID, t) //添加玩家 + glog.Debug(context.Background(), "登录成功,初始地图 人数:", space.GetSpace(1).Len()) - c.SendPack(data.Def()) - return + t.Nick = "测试" + // c.SendPack(data.Def()) + // return result = login.NewOutInfo() //设置登录消息 - result.UserID = 10002 //注释掉就能进入 + result.UserID = 10001 //注释掉就能进入 result.RegisterTime = uint32(time.Now().Unix()) result.Nick = "骄阳号" result.Color = 0x00FF00 - result.Pos = model.Pos{X: 100, Y: 200} + result.Pos = model.Pos{X: 500, Y: 400} result.Clothes = append(result.Clothes, model.PeopleItemInfo{ID: 100717, Level: 1}) - result.MapID = 1 + result.MapID = t.MapId result.TimeLimit = 43200 result.TimeToday = 339 diff --git a/logic/controller/mapin.go b/logic/controller/map_enter.go similarity index 74% rename from logic/controller/mapin.go rename to logic/controller/map_enter.go index 41391f54b..a1db6a525 100644 --- a/logic/controller/mapin.go +++ b/logic/controller/map_enter.go @@ -11,8 +11,8 @@ func (h *Controller) MapIn(data *maps.InInfo, c *entity.Player) (result *maps.Ou c.MapId = data.MapId //登录地图 space.GetSpace(c.MapId).Set(c.UserID, c) //添加玩家 - //result = &maps.OutInfo{UserID: c.UserID} //设置广播信息 - data.Broadcast(c.MapId, maps.OutInfo{UserID: c.UserID}) //同步广播 - return + data.Broadcast(c.MapId, maps.OutInfo{UserID: c.UserID, Nick: c.Nick}) //同步广播 + + return nil, -1 } diff --git a/logic/controller/maphot.go b/logic/controller/map_hot.go similarity index 94% rename from logic/controller/maphot.go rename to logic/controller/map_hot.go index 73ddcb5d5..582a0d88d 100644 --- a/logic/controller/maphot.go +++ b/logic/controller/map_hot.go @@ -1,20 +1,20 @@ -package controller - -import ( - "blazing/common/data/entity" - "blazing/common/socket/errorcode" - "blazing/logic/service/maphot" - "blazing/logic/service/space" -) - -func (h Controller) MapHot(data *maphot.InInfo, c *entity.Player) (result *maphot.OutInfo, err errorcode.ErrorCode) { - - result = &maphot.OutInfo{ - - HotInfos: space.GetMapHot(), - } - - - - return -} +package controller + +import ( + "blazing/common/data/entity" + "blazing/common/socket/errorcode" + "blazing/logic/service/maphot" + "blazing/logic/service/space" +) + +func (h Controller) MapHot(data *maphot.InInfo, c *entity.Player) (result *maphot.OutInfo, err errorcode.ErrorCode) { + + result = &maphot.OutInfo{ + + HotInfos: space.GetMapHot(), + } + + + + return +} diff --git a/logic/controller/mapout.go b/logic/controller/map_leave.go similarity index 72% rename from logic/controller/mapout.go rename to logic/controller/map_leave.go index 7d4e02690..917f25c15 100644 --- a/logic/controller/mapout.go +++ b/logic/controller/map_leave.go @@ -4,10 +4,12 @@ import ( "blazing/common/data/entity" "blazing/common/socket/errorcode" "blazing/logic/service/maps" + "blazing/logic/service/space" ) func (h *Controller) MapOut(data *maps.LeaveMapInboundInfo, c *entity.Player) (result *maps.LeaveMapOutboundInfo, err errorcode.ErrorCode) { //这个时候player应该是空的 - result = &maps.LeaveMapOutboundInfo{UserID: c.GetUserID()} + //result = &maps.LeaveMapOutboundInfo{UserID: c.GetUserID()} data.Broadcast(c.MapId, maps.LeaveMapOutboundInfo{UserID: c.GetUserID()}) //同步广播 - return + space.GetSpace(c.MapId).Delete(c.UserID) + return nil, -1 } diff --git a/logic/controller/map_list.go b/logic/controller/map_list.go new file mode 100644 index 000000000..360eabc63 --- /dev/null +++ b/logic/controller/map_list.go @@ -0,0 +1,20 @@ +package controller + +import ( + "blazing/common/data/entity" + "blazing/common/socket/errorcode" + "blazing/logic/service/maps" +) + +func (h *Controller) MapList(data *maps.ListMapPlayerInboundInfo, c *entity.Player) (result *maps.ListMapPlayerOutboundInfo, err errorcode.ErrorCode) { //这个时候player应该是空的 + + result = &maps.ListMapPlayerOutboundInfo{} + result.Player = make([]maps.OutInfo, 0) + result1 := maps.NewOutInfo() + + result1.UserID = c.UserID + //result.Pos = model.Pos{X: 500, Y: 400} + result1.Nick = c.Nick + result.Player = append(result.Player, *result1) + return +} diff --git a/logic/controller/walk.go b/logic/controller/walk.go index 3c18f9ace..0f5ac0bb2 100644 --- a/logic/controller/walk.go +++ b/logic/controller/walk.go @@ -8,12 +8,10 @@ import ( func (h Controller) Walk(data *space.InInfo, c *entity.Player) (result *space.OutInfo, err errorcode.ErrorCode) { - result = &space.OutInfo{Flag: data.Flag, + data.Broadcast(c.MapId, space.OutInfo{Flag: data.Flag, UserID: c.GetUserID(), Reserve2: data.Reverse2, - Point: data.Point} + Point: data.Point}) //走路的广播 - data.Broadcast(c.MapId, *result) //走路的广播 - - return + return nil, -1 } diff --git a/logic/service/maps/mapin.go b/logic/service/maps/mapin.go index a1c40f59d..c7b2c2544 100644 --- a/logic/service/maps/mapin.go +++ b/logic/service/maps/mapin.go @@ -5,6 +5,8 @@ import ( "blazing/common/socket/handler" "blazing/logic/service/space" "blazing/modules/blazing/model" + + "github.com/creasty/defaults" ) type InInfo struct { @@ -23,8 +25,9 @@ type InInfo struct { func (t *InInfo) Broadcast(mapid uint32, o OutInfo) { space.GetSpace(mapid).Range(func(playerID uint32, player *entity.Player) bool { + t.Head.Result = 0 - player.SendPack(t.Head.Pack(o)) + player.SendPack(t.Head.Pack(&o)) return true }) } @@ -34,10 +37,6 @@ func (t *InInfo) Broadcast(mapid uint32, o OutInfo) { // PeopleInfo 对应Java的PeopleInfo类,实现OutboundMessage接口 type OutInfo struct { - // 系统时间 - SystemTime uint32 `struc:"uint32" fieldDesc:"系统时间" json:"system_time"` - - // 米米号 UserID uint32 `struc:"uint32" fieldDesc:"米米号" json:"user_id"` // 16字节昵称 @@ -50,10 +49,10 @@ type OutInfo struct { Texture uint32 `struc:"uint32" fieldDesc:"固定值0" json:"texture"` // 暂时不明建议先给固定值0 - Vip uint16 `struc:"uint16" fieldDesc:"暂时不明建议先给固定值0" json:"vip"` + Vip uint32 `struc:"uint32" fieldDesc:"暂时不明建议先给固定值0" json:"vip"` // 暂时不明建议先给固定值15 - Viped uint16 `struc:"uint16" default:"15" fieldDesc:"暂时不明建议先给固定值15" json:"viped"` + Viped uint32 `struc:"uint32" default:"15" fieldDesc:"暂时不明建议先给固定值15" json:"viped"` // 暂时不明建议先给固定值1 VipStage uint32 `struc:"uint32" fieldDesc:"暂时不明建议先给固定值1" json:"vip_stage"` @@ -79,8 +78,18 @@ type OutInfo struct { // 暂时不明给0 SpiritID uint32 `struc:"uint32" fieldDesc:"暂时不明给0" json:"spirit_id"` - // 跟随精灵的个体值 - PetDV uint32 `struc:"uint32" fieldDesc:"跟随精灵的个体值" json:"pet_dv"` + // 宠物 ID 暂时无法测试,给 0 + PetDV uint32 `struc:"uint32" fieldDesc:"宠物ID暂时无法测试, 给0" json:"pet_dv"` + // 宠物闪光暂时无法测试,给 0 + PetShiny uint32 `struc:"uint32" fieldDesc:"宠物闪光暂时无法测试, 给0" json:"pet_shiny"` + // 宠物皮肤暂时无法测试,给 0 + PetSkin uint32 `struc:"uint32" fieldDesc:"宠物皮肤暂时无法测试, 给0" json:"pet_skin"` + // 填充字符 + Reserved uint32 `struc:"uint32" fieldDesc:"填充字符" json:"reserved"` + // 填充字符 + Reserved1 uint32 `struc:"uint32" fieldDesc:"填充字符" json:"reserved1"` + // 填充字符 + Reserved2 uint32 `struc:"uint32" fieldDesc:"填充字符" json:"reserved2"` // 暂时不明给0 FightFlag uint32 `struc:"uint32" fieldDesc:"暂时不明给0" json:"fight_flag"` @@ -116,20 +125,32 @@ type OutInfo struct { TeamIsShow uint32 `struc:"uint32" fieldDesc:"暂时不明给0" json:"team_is_show"` // 暂时不明给0 - LogoBg int16 `struc:"int16" fieldDesc:"暂时不明给0" json:"logo_bg"` + LogoBg uint16 `json:"logo_bg"` // 暂时不明给0 - LogoIcon int16 `struc:"int16" fieldDesc:"暂时不明给0" json:"logo_icon"` + LogoIcon uint16 ` json:"logo_icon"` // 暂时不明给0 - LogoColor int16 `struc:"int16" fieldDesc:"暂时不明给0" json:"logo_color"` + LogoColor uint16 `json:"logo_color"` // 暂时不明给0 - TxtColor int16 `struc:"int16" fieldDesc:"暂时不明给0" json:"txt_color"` + TxtColor uint16 `json:"txt_color"` // 4字节 - LogoWord [4]byte `struc:"[4]byte" fieldDesc:"4字节" json:"logo_word"` + LogoWord [4]byte `struc:"[4]byte" fieldDesc:"4字节" json:"logo_word"` + ClothesLen uint32 `struc:"sizeof=Clothes" fieldDesc:"穿戴装备的信息" json:"clothes_len"` // 穿戴装备的信息 Clothes []model.PeopleItemInfo `fieldDesc:"穿戴装备的信息" json:"clothes"` } + +func NewOutInfo() *OutInfo { + l := &OutInfo{} + + // 自动填充 struct tag 里的 default 值 + if err := defaults.Set(l); err != nil { + panic(err) // 方便发现 default 设置错误 + } + + return l +} diff --git a/logic/service/maps/maplist.go b/logic/service/maps/maplist.go new file mode 100644 index 000000000..5fc09943b --- /dev/null +++ b/logic/service/maps/maplist.go @@ -0,0 +1,16 @@ +package maps + +import ( + "blazing/common/socket/handler" +) + +type ListMapPlayerInboundInfo struct { + Head handler.TomeeHeader `cmd:"2003" struc:"[0]pad"` //切换地图 +} + +type ListMapPlayerOutboundInfo struct { + PlayersLen uint32 `struc:"sizeof=Player" json:"player_len"` + + // 穿戴装备的信息 + Player []OutInfo ` json:"player"` +} diff --git a/logic/service/maps/mapout.go b/logic/service/maps/mapout.go index 7f848c82b..a65a49497 100644 --- a/logic/service/maps/mapout.go +++ b/logic/service/maps/mapout.go @@ -18,8 +18,9 @@ type LeaveMapInboundInfo struct { func (t *LeaveMapInboundInfo) Broadcast(mapid uint32, o LeaveMapOutboundInfo) { space.GetSpace(mapid).Range(func(playerID uint32, player *entity.Player) bool { + t.Head.Result = 0 - player.SendPack(t.Head.Pack(o)) + player.SendPack(t.Head.Pack(&o)) return true }) } diff --git a/logic/service/space/hot.go b/logic/service/space/hot.go index 87397209a..f173f36d8 100644 --- a/logic/service/space/hot.go +++ b/logic/service/space/hot.go @@ -25,9 +25,10 @@ func GetMapHot() []MapHotInfo { } var result = make([]MapHotInfo, 0) for k, v := range tt { + result = append(result, MapHotInfo{ MapID: uint32(k), - Count: uint32(GetSpace(uint32(v)).Len()), + Count: uint32(v), }) } diff --git a/logic/service/space/walk.go b/logic/service/space/walk.go index 694b429da..720476081 100644 --- a/logic/service/space/walk.go +++ b/logic/service/space/walk.go @@ -20,9 +20,14 @@ type InInfo struct { func (t *InInfo) Broadcast(mapid uint32, o OutInfo) { - GetSpace(mapid).Range(func(playerID uint32, player *entity.Player) bool { + //tt := planetmap + //g.Dump(GetSpace(mapid).Len()) - player.SendPack(t.Head.Pack(o)) + GetSpace(mapid).Range(func(playerID uint32, player *entity.Player) bool { + t.Head.Result = 0 + tt := t.Head.Pack(&o) + err := player.SendPack(tt) + player.Cheak(err) return true }) }