From 42d59026fd48f6685e3771be2e2a05f5af5855cd Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Tue, 30 Dec 2025 15:39:48 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B6=88=E6=81=AF=E6=97=A5=E5=BF=97=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/message_mgr.go | 66 +++++++++++++++++++++------------- 1 file changed, 41 insertions(+), 25 deletions(-) diff --git a/src/server/game/message_mgr.go b/src/server/game/message_mgr.go index 50fb737b..27e4987d 100644 --- a/src/server/game/message_mgr.go +++ b/src/server/game/message_mgr.go @@ -19,6 +19,12 @@ var id = 1 // 中间件函数类型 type MessageMiddleware func(MessageHandlerFunc) MessageHandlerFunc +var save_msg_type = []int{ + msg.HANDLE_MOD_PLAYER_MSG, + msg.HANDLE_MDO_CHAMPSHIP_INRANK, + msg.HANDLE_MOD_USER_VAR_SET, +} + type MessageMgr struct { *ServerMod middlewares []MessageMiddleware @@ -150,7 +156,7 @@ func NotifyAllPlayerMsg(m *msg.Msg) { messageMgrData := getMessageData() for PlayerId, node := range messageMgrData.PlayerList { m.To = int(PlayerId) - go SendMsgToNodeAsync(m, node) + SendMsgToNodeAsync(m, node) } } @@ -171,7 +177,7 @@ func ReplyPlayerMsgASync(m *msg.Msg, reply interface{}) (interface{}, error) { clone := m.Reply(reply) messageMgrData := getMessageData() if node, ok := messageMgrData.PlayerList[int64(m.From)]; ok { - go SendMsgToNodeAsync(clone, node) + SendMsgToNodeAsync(clone, node) } return nil, nil } @@ -212,7 +218,7 @@ func PlayerLoginHandler(data *msg.Msg) (interface{}, error) { // 发送离线消息 len := len(messages.Messages) for _, message := range messages.Messages { - go sendMessageAsync(message, node) + SendMsgToNodeAsync(message, node) } log.Debug("[Middleware] Player sync logout message player id: %v, len: %d", data.From, len) return nil, nil @@ -249,7 +255,7 @@ func CenterPlayerMsgHandler(data *msg.Msg) (interface{}, error) { defer messages.mu.Unlock() messages.Messages = append(messages.Messages, data) if node, ok := messageMgrData.PlayerList[int64(PlayerId)]; ok { - go SendMsgToNodeAsync(data, node) + SendMsgToNodeAsync(data, node) } return nil, nil } @@ -264,7 +270,7 @@ func PlayerMsgHandler(data *msg.Msg) (interface{}, error) { // 处理完后发送消费消息 if data.HandleType == msg.HANDLE_MOD_PLAYER_MSG { data.HandleType = msg.HANDLE_MOD_COMSUME_MSG - go SendMsgToCenterAsync(data) + SendMsgToCenterAsync(data) } return nil, nil } @@ -280,18 +286,6 @@ func PlayerReplyMsgHandler(data *msg.Msg) (interface{}, error) { return nil, nil } -func getMessge(PlayerId int64) *MessageList { - messageMgrData := getMessageData() - messageMgrData.mu.Lock() - defer messageMgrData.mu.Unlock() - if _, ok := messageMgrData.MessageList[int64(PlayerId)]; !ok { - messageMgrData.MessageList[int64(PlayerId)] = &MessageList{ - Messages: []*msg.Msg{}, - } - } - return messageMgrData.MessageList[int64(PlayerId)] -} - // 添加中间件 func (m *MessageMgr) Use(middleware MessageMiddleware) { m.middlewares = append(m.middlewares, middleware) @@ -715,20 +709,22 @@ func FriendMgrSend(m1 *msg.Msg) error { // 异步发送消息到指定节点 节点不在线则保存消息 func sendMessageAsync(m *msg.Msg, node int) error { err := mergeCluster.SendServerMsg(m, node) - if err != nil { + if err != nil && GoUtil.InArray(m.HandleType, save_msg_type) { saveMessage(m) return err } + deleteMessage(m) return nil } // 同步消息到指定节点 节点不在线则保存消息 func sendMessageSync(m *msg.Msg, node int) (*msg.Msg, error) { msg, err := mergeCluster.CallServerMsg(m, node) - if err != nil && conf.Server.ServerType == "center" { + if err != nil && conf.Server.ServerType == "center" && GoUtil.InArray(m.HandleType, save_msg_type) { saveMessage(m) return nil, err } + deleteMessage(m) return msg, nil } @@ -752,9 +748,29 @@ func GetUserData(PlayerId int64, Key string) (*msg.Msg, error) { }) } -// func GetServerData(Key string) (*msg.Msg, error) { -// return SendMsgToCenterSync(&msg.Msg{ -// HandleType: msg.HANDLE_MOD_VAR_GET, -// Extra: msg.VarData{Key: Key}, -// }) -// } +func getMessge(PlayerId int64) *MessageList { + messageMgrData := getMessageData() + messageMgrData.mu.Lock() + defer messageMgrData.mu.Unlock() + if _, ok := messageMgrData.MessageList[int64(PlayerId)]; !ok { + messageMgrData.MessageList[int64(PlayerId)] = &MessageList{ + Messages: []*msg.Msg{}, + } + } + return messageMgrData.MessageList[int64(PlayerId)] +} + +func deleteMessage(m *msg.Msg) error { + messages := getMessge(int64(m.To)) + messages.mu.Lock() + defer messages.mu.Unlock() + for i, msgItem := range messages.Messages { + if msgItem.UniKey == m.UniKey { + // 删除消息 + messages.Messages = append(messages.Messages[:i], messages.Messages[i+1:]...) + log.Debug("[Middleware] send message success; message: %v, player id: %v", msgItem, msgItem.From) + break + } + } + return nil +}