From 34126d990acf88b3fae4feee06a4552cf9c81a8d Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Thu, 29 Jan 2026 20:02:40 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/cluster/cluster_func.go | 6 ++++ src/server/game/GameLogic.go | 2 +- src/server/game/message_mgr.go | 46 ++++++++++++++++++++++++++---- 3 files changed, 48 insertions(+), 6 deletions(-) diff --git a/src/server/cluster/cluster_func.go b/src/server/cluster/cluster_func.go index c99b9be2..3aebb14f 100644 --- a/src/server/cluster/cluster_func.go +++ b/src/server/cluster/cluster_func.go @@ -112,6 +112,9 @@ func SendServerMsg(m *msg.Msg, serverId int) error { if m.UniKey == "" { m.UniKey = GoUtil.UniKey(fmt.Sprintf("%v,Cluster Msg", m)) } + if m.SendT == 0 { + m.SendT = GoUtil.Now() + } if v, ok := serverAgent.Load(serverId); ok { data, err := GoUtil.GobMarshal(m) if err != nil { @@ -128,6 +131,9 @@ func CallServerMsg(m *msg.Msg, serverId int) (*msg.Msg, error) { if m.UniKey == "" { m.UniKey = GoUtil.UniKey(fmt.Sprintf("%v,Cluster Msg", m)) } + if m.SendT == 0 { + m.SendT = GoUtil.Now() + } v, ok := serverAgent.Load(serverId) // 之后再发送消息 if !ok { diff --git a/src/server/game/GameLogic.go b/src/server/game/GameLogic.go index 79e2b59c..e9732de5 100644 --- a/src/server/game/GameLogic.go +++ b/src/server/game/GameLogic.go @@ -894,7 +894,7 @@ func (ad *GameLogic) GetStartTime() int64 { func NotifyPlayer(Uid int, m *MsgMod.Msg) { m.To = Uid m.HandleType = MsgMod.HANDLE_MOD_PLAYER_MSG - CenterPlayerMsgHandler(m) + NotifyPlayerMsgAsync(m) } func Destroy() { diff --git a/src/server/game/message_mgr.go b/src/server/game/message_mgr.go index ed03fd8c..e4d1dab4 100644 --- a/src/server/game/message_mgr.go +++ b/src/server/game/message_mgr.go @@ -124,6 +124,25 @@ func (m *MessageMgr) MessageMgrInit() { m.Use(TimeoutMiddleware(5 * time.Second)) m.NodeRegister() m.CenterRegister() + FixBug() +} + +func FixBug() { + messageMgrData := getMessageData() + // 先更新 PlayerList(需要加锁) + messageMgrData.mu.Lock() + defer messageMgrData.mu.Unlock() + for k, v := range messageMgrData.MessageList { + if k < 100000 { + delete(messageMgrData.MessageList, k) + } + for i, msgItem := range v.Messages { + if msgItem.Type == msg.HANDLE_TYPE_CHAMPSHIP_NOTIFY { + // 删除消息 + v.Messages = append(v.Messages[:i], v.Messages[i+1:]...) + } + } + } } // 注册处理器 @@ -308,22 +327,39 @@ func ComsumerMsgHandler(data *msg.Msg) (interface{}, error) { return nil, nil } +func NotifyPlayerMsgAsync(m *msg.Msg) { + messageMgrData := getMessageData() + // 检查玩家是否在线(需要加锁) + messageMgrData.mu.Lock() + node, ok := messageMgrData.PlayerList[int64(m.To)] + messageMgrData.mu.Unlock() + // 在线则直接发送消息 + if ok { + SendMsgToNodeAsync(m, node) + } +} + +// 处理玩家消息 func CenterPlayerMsgHandler(data *msg.Msg) (interface{}, error) { PlayerId := int64(data.To) messageMgrData := getMessageData() // 遍历消息列表,发送消息给在线玩家 - messages := getMessge(PlayerId) - messages.mu.Lock() - messages.Messages = append(messages.Messages, data) - messages.mu.Unlock() // 检查玩家是否在线(需要加锁) messageMgrData.mu.Lock() node, ok := messageMgrData.PlayerList[int64(PlayerId)] messageMgrData.mu.Unlock() - + // 在线则直接发送消息 if ok { SendMsgToNodeAsync(data, node) + } else { + // 不在线则存储消息 + if !GoUtil.InArray(data.Type, notify_msg_type) { + messages := getMessge(PlayerId) + messages.mu.Lock() + messages.Messages = append(messages.Messages, data) + messages.mu.Unlock() + } } return nil, nil }